From 7ceb697bf13fa1eebc9fc3bcebd02ef01ec585a1 Mon Sep 17 00:00:00 2001 From: KyleDOT Date: Mon, 10 Feb 2025 06:33:08 +0930 Subject: [PATCH] Installing htmly --- COPYRIGHT.txt | 57 + LICENSE.txt | 339 + README.md | 65 +- SECURITY.md | 5 + cache/installedVersion.json | 3 + composer.json | 27 + composer.lock | 718 ++ config/.htaccess | 1 + config/config.ini.example | 208 + config/users/username.ini.example | 11 + content/.gitkeep | 1 + favicon.png | Bin 0 -> 1414 bytes humans.txt | 14 + index.php | 6 + install.php | 446 ++ lang/ar_AR.ini | 326 + lang/da_DK.ini | 337 + lang/de_DE.ini | 326 + lang/de_DE_gender_doppelpunkt.ini | 326 + lang/de_DE_gender_dudenkonform.ini | 326 + lang/el_GR.ini | 328 + lang/en_US.ini | 326 + lang/eo_EO.ini | 327 + lang/es_ES.ini | 326 + lang/fa_IR.ini | 326 + lang/fr_FR.ini | 326 + lang/gu_GU.ini | 326 + lang/hi_HI.ini | 326 + lang/hr_HR.ini | 326 + lang/hu_HU.ini | 326 + lang/id_ID.ini | 326 + lang/it_IT.ini | 326 + lang/ko_KO.ini | 326 + lang/ms_MY.ini | 326 + lang/nl_NL.ini | 326 + lang/pl_PL.ini | 327 + lang/pt_BR.ini | 326 + lang/ru_RU.ini | 327 + lang/sv_SE.ini | 338 + lang/tr_TR.ini | 326 + lang/uk_UA.ini | 326 + lang/zh_CN.ini | 326 + lang/zh_TW.ini | 326 + old/README.md | 1 + {blog => old/blog}/2024-06-07_MFA-i.html | 0 {blog => old/blog}/2024-07-01_Plates.html | 0 .../blog}/2024-07-01_Plates_list.html | 0 .../blog}/2024-08-04_Vexillology-i.html | 0 {blog => old/blog}/home.html | 0 {blog => old/blog}/media/MFA-i.png | Bin {blog => old/blog}/style.css | 0 {blog => old/blog}/template.html | 0 index.html => old/index.html | 0 projects.html => old/projects.html | 0 resume.html => old/resume.html | 0 style.css => old/style.css | 0 robots.txt | 36 + system/admin/admin.php | 1833 +++++ system/admin/editor/LICENSE.txt | 32 + system/admin/editor/css/editor.css | 184 + system/admin/editor/js/Markdown.Converter.js | 1428 ++++ system/admin/editor/js/Markdown.Editor.js | 2489 +++++++ system/admin/editor/js/Markdown.Extra.js | 874 +++ system/admin/editor/js/Markdown.Sanitizer.js | 108 + system/admin/editor/js/editor.js | 73 + .../editor/js/local/Markdown.local.fr.js | 43 + system/admin/editor/js/node-pagedown-extra.js | 3 + system/admin/editor/js/node-pagedown.js | 2 + system/admin/editor/package.json | 19 + system/admin/views/.htaccess | 1 + system/admin/views/404.html.php | 21 + system/admin/views/add-content.html.php | 381 + system/admin/views/add-page.html.php | 201 + system/admin/views/add-user.html.php | 48 + system/admin/views/backup-start.html.php | 24 + system/admin/views/backup.html.php | 51 + system/admin/views/categories.html.php | 30 + system/admin/views/category-list.html.php | 53 + system/admin/views/clear-cache.html.php | 16 + system/admin/views/config-custom.html.php | 45 + system/admin/views/config-metatags.html.php | 254 + .../admin/views/config-performance.html.php | 131 + system/admin/views/config-reading.html.php | 173 + system/admin/views/config-security.html.php | 88 + system/admin/views/config-widget.html.php | 261 + system/admin/views/config-writing.html.php | 44 + system/admin/views/config.html.php | 199 + system/admin/views/content-type.html.php | 21 + system/admin/views/delete-category.html.php | 25 + system/admin/views/delete-page.html.php | 25 + system/admin/views/delete-post.html.php | 25 + system/admin/views/delete-user.html.php | 13 + system/admin/views/denied.html.php | 2 + system/admin/views/edit-content.html.php | 431 ++ system/admin/views/edit-mfa.html.php | 76 + system/admin/views/edit-page.html.php | 358 + system/admin/views/edit-password.html.php | 25 + system/admin/views/edit-user.html.php | 49 + system/admin/views/import.html.php | 16 + system/admin/views/layout.html.php | 394 ++ system/admin/views/login-mfa.html.php | 17 + system/admin/views/login.html.php | 38 + system/admin/views/logout.html.php | 8 + system/admin/views/main.html.php | 31 + system/admin/views/menu.html.php | 416 ++ system/admin/views/no-posts.html.php | 2 + system/admin/views/popular-posts.html.php | 37 + system/admin/views/posts-list.html.php | 55 + system/admin/views/scheduled.html.php | 49 + system/admin/views/static-pages.html.php | 72 + system/admin/views/static-subpages.html.php | 71 + system/admin/views/update.html.php | 63 + system/admin/views/updated-to.html.php | 13 + system/admin/views/user-draft.html.php | 93 + system/admin/views/user-posts.html.php | 55 + system/admin/views/users.html.php | 29 + system/configList.json | 99 + system/htmly.php | 5118 ++++++++++++++ system/includes/.htaccess | 1 + system/includes/dispatch.php | 720 ++ system/includes/functions.php | 4146 +++++++++++ system/includes/opml.php | 44 + system/includes/session.php | 26 + system/resources/css/adminlte.min.css | 16 + system/resources/css/fontawesome.min.css | 9 + system/resources/css/jquery-ui.css | 582 ++ system/resources/css/social-logos.css | 286 + system/resources/css/social-logos.ttf | Bin 0 -> 13240 bytes system/resources/css/social-logos.woff2 | Bin 0 -> 7392 bytes system/resources/css/solid.min.css | 6 + system/resources/css/toc.css | 52 + system/resources/css/toolbar.css | 83 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes system/resources/images/htmly-gray-bg.png | Bin 0 -> 54926 bytes system/resources/images/htmly-small.png | Bin 0 -> 3345 bytes system/resources/images/logo-big.png | Bin 0 -> 27185 bytes system/resources/images/logo-small.png | Bin 0 -> 1318 bytes system/resources/images/logo.png | Bin 0 -> 11436 bytes system/resources/images/share-facebook.png | Bin 0 -> 582 bytes system/resources/images/share-twitter.png | Bin 0 -> 668 bytes system/resources/js/adminlte.min.js | 6 + system/resources/js/bootstrap.min.js | 6 + system/resources/js/jquery-ui.min.js | 13 + system/resources/js/jquery.min.js | 5 + system/resources/js/jquery.nestable++.js | 194 + system/resources/js/jquery.nestable.js | 484 ++ system/resources/js/media.uploader.js | 70 + system/resources/js/save_draft.js | 64 + system/resources/js/toc.generator.js | 78 + system/resources/readme.txt | 1 + system/resources/webfonts/fa-solid-900.ttf | Bin 0 -> 423676 bytes system/resources/webfonts/fa-solid-900.woff2 | Bin 0 -> 157192 bytes system/vendor/autoload.php | 25 + system/vendor/bacon/bacon-qr-code/LICENSE | 22 + system/vendor/bacon/bacon-qr-code/README.md | 57 + .../vendor/bacon/bacon-qr-code/composer.json | 50 + .../bacon-qr-code/src/Common/BitArray.php | 364 + .../bacon-qr-code/src/Common/BitMatrix.php | 307 + .../bacon-qr-code/src/Common/BitUtils.php | 41 + .../src/Common/CharacterSetEci.php | 177 + .../bacon-qr-code/src/Common/EcBlock.php | 33 + .../bacon-qr-code/src/Common/EcBlocks.php | 66 + .../src/Common/ErrorCorrectionLevel.php | 57 + .../src/Common/FormatInformation.php | 196 + .../bacon/bacon-qr-code/src/Common/Mode.php | 69 + .../src/Common/ReedSolomonCodec.php | 454 ++ .../bacon-qr-code/src/Common/Version.php | 592 ++ .../bacon-qr-code/src/Encoder/BlockPair.php | 44 + .../bacon-qr-code/src/Encoder/ByteMatrix.php | 134 + .../bacon-qr-code/src/Encoder/Encoder.php | 679 ++ .../bacon-qr-code/src/Encoder/MaskUtil.php | 271 + .../bacon-qr-code/src/Encoder/MatrixUtil.php | 513 ++ .../bacon-qr-code/src/Encoder/QrCode.php | 108 + .../src/Exception/ExceptionInterface.php | 10 + .../Exception/InvalidArgumentException.php | 8 + .../src/Exception/OutOfBoundsException.php | 8 + .../src/Exception/RuntimeException.php | 8 + .../Exception/UnexpectedValueException.php | 8 + .../src/Exception/WriterException.php | 8 + .../src/Renderer/Color/Alpha.php | 44 + .../bacon-qr-code/src/Renderer/Color/Cmyk.php | 82 + .../src/Renderer/Color/ColorInterface.php | 22 + .../bacon-qr-code/src/Renderer/Color/Gray.php | 39 + .../bacon-qr-code/src/Renderer/Color/Rgb.php | 73 + .../src/Renderer/Eye/CompositeEye.php | 26 + .../src/Renderer/Eye/EyeInterface.php | 26 + .../src/Renderer/Eye/ModuleEye.php | 48 + .../src/Renderer/Eye/PointyEye.php | 56 + .../src/Renderer/Eye/SimpleCircleEye.php | 51 + .../src/Renderer/Eye/SquareEye.php | 50 + .../src/Renderer/GDLibRenderer.php | 238 + .../src/Renderer/Image/EpsImageBackEnd.php | 373 + .../Renderer/Image/ImageBackEndInterface.php | 87 + .../Renderer/Image/ImagickImageBackEnd.php | 318 + .../src/Renderer/Image/SvgImageBackEnd.php | 359 + .../Renderer/Image/TransformationMatrix.php | 68 + .../src/Renderer/ImageRenderer.php | 150 + .../src/Renderer/Module/DotsModule.php | 56 + .../src/Renderer/Module/EdgeIterator/Edge.php | 82 + .../Module/EdgeIterator/EdgeIterator.php | 160 + .../src/Renderer/Module/ModuleInterface.php | 18 + .../src/Renderer/Module/RoundnessModule.php | 124 + .../src/Renderer/Module/SquareModule.php | 44 + .../bacon-qr-code/src/Renderer/Path/Close.php | 34 + .../bacon-qr-code/src/Renderer/Path/Curve.php | 86 + .../src/Renderer/Path/EllipticArc.php | 264 + .../bacon-qr-code/src/Renderer/Path/Line.php | 42 + .../bacon-qr-code/src/Renderer/Path/Move.php | 42 + .../src/Renderer/Path/OperationInterface.php | 17 + .../bacon-qr-code/src/Renderer/Path/Path.php | 117 + .../src/Renderer/PlainTextRenderer.php | 80 + .../src/Renderer/RendererInterface.php | 11 + .../src/Renderer/RendererStyle/EyeFill.php | 61 + .../src/Renderer/RendererStyle/Fill.php | 129 + .../src/Renderer/RendererStyle/Gradient.php | 31 + .../Renderer/RendererStyle/GradientType.php | 22 + .../Renderer/RendererStyle/RendererStyle.php | 69 + .../vendor/bacon/bacon-qr-code/src/Writer.php | 63 + system/vendor/composer/ClassLoader.php | 579 ++ system/vendor/composer/InstalledVersions.php | 359 + system/vendor/composer/LICENSE | 21 + system/vendor/composer/autoload_classmap.php | 125 + system/vendor/composer/autoload_files.php | 15 + .../vendor/composer/autoload_namespaces.php | 11 + system/vendor/composer/autoload_psr4.php | 17 + system/vendor/composer/autoload_real.php | 48 + system/vendor/composer/autoload_static.php | 232 + system/vendor/composer/ca-bundle/LICENSE | 19 + system/vendor/composer/ca-bundle/README.md | 85 + .../vendor/composer/ca-bundle/composer.json | 54 + .../vendor/composer/ca-bundle/res/cacert.pem | 3581 ++++++++++ .../composer/ca-bundle/src/CaBundle.php | 325 + system/vendor/composer/installed.json | 734 ++ system/vendor/composer/installed.php | 131 + system/vendor/composer/platform_check.php | 26 + system/vendor/dasprid/enum/LICENSE | 22 + system/vendor/dasprid/enum/README.md | 164 + system/vendor/dasprid/enum/composer.json | 34 + .../vendor/dasprid/enum/src/AbstractEnum.php | 241 + system/vendor/dasprid/enum/src/EnumMap.php | 385 + .../Exception/CloneNotSupportedException.php | 10 + .../enum/src/Exception/ExceptionInterface.php | 10 + .../src/Exception/ExpectationException.php | 10 + .../Exception/IllegalArgumentException.php | 10 + .../enum/src/Exception/MismatchException.php | 10 + .../SerializeNotSupportedException.php | 10 + .../UnserializeNotSupportedException.php | 10 + system/vendor/dasprid/enum/src/NullValue.php | 55 + .../ircmaxell/password-compat/LICENSE.md | 7 + .../ircmaxell/password-compat/composer.json | 20 + .../password-compat/lib/password.php | 314 + .../password-compat/version-test.php | 6 + .../jbroadway/urlify/.github/workflows/ci.yml | 41 + system/vendor/jbroadway/urlify/.gitignore | 4 + system/vendor/jbroadway/urlify/.travis.yml | 16 + system/vendor/jbroadway/urlify/INSTALL | 13 + system/vendor/jbroadway/urlify/LICENSE | 27 + system/vendor/jbroadway/urlify/README.md | 108 + system/vendor/jbroadway/urlify/URLify.php | 591 ++ system/vendor/jbroadway/urlify/composer.json | 31 + system/vendor/jbroadway/urlify/phpunit.xml | 8 + .../jbroadway/urlify/scripts/downcode.php | 25 + .../jbroadway/urlify/scripts/filter.php | 25 + .../urlify/scripts/transliterate.php | 25 + .../jbroadway/urlify/tests/URLifyTest.php | 60 + .../jbroadway/urlify/tests/bootstrap.php | 9 + system/vendor/kanti/hub-updater/.travis.yml | 44 + system/vendor/kanti/hub-updater/LICENSE | 340 + system/vendor/kanti/hub-updater/composer.json | 45 + system/vendor/kanti/hub-updater/grumphp.yml | 20 + .../kanti/hub-updater/src/CacheOneFile.php | 58 + .../kanti/hub-updater/src/HelperClass.php | 28 + .../kanti/hub-updater/src/HubUpdater.php | 342 + .../kanti/hub-updater/src/ca_bundle.crt | 3952 +++++++++++ .../vendor/michelf/php-markdown/.editorconfig | 11 + system/vendor/michelf/php-markdown/.gitignore | 3 + .../michelf/php-markdown/.scrutinizer.yml | 36 + .../vendor/michelf/php-markdown/.travis.yml | 33 + system/vendor/michelf/php-markdown/License.md | 36 + .../php-markdown/Michelf/Markdown.inc.php | 10 + .../michelf/php-markdown/Michelf/Markdown.php | 1909 +++++ .../Michelf/MarkdownExtra.inc.php | 11 + .../php-markdown/Michelf/MarkdownExtra.php | 1924 +++++ .../Michelf/MarkdownInterface.inc.php | 9 + .../Michelf/MarkdownInterface.php | 38 + system/vendor/michelf/php-markdown/Readme.md | 448 ++ system/vendor/michelf/php-markdown/Readme.php | 33 + .../vendor/michelf/php-markdown/composer.json | 29 + .../michelf/php-markdown/phpunit.xml.dist | 24 + .../michelf/php-markdown/test/bootstrap.php | 6 + .../test/helpers/MarkdownTestHelper.php | 267 + .../test/integration/PhpMarkdownTest.php | 173 + .../Amps and angle encoding.text | 21 + .../Amps and angle encoding.xhtml | 17 + .../resources/markdown.mdtest/Auto links.text | 13 + .../markdown.mdtest/Auto links.xhtml | 18 + .../markdown.mdtest/Backslash escapes.text | 120 + .../markdown.mdtest/Backslash escapes.xhtml | 118 + .../Blockquotes with code blocks.text | 11 + .../Blockquotes with code blocks.xhtml | 15 + .../markdown.mdtest/Code Blocks.text | 14 + .../markdown.mdtest/Code Blocks.xhtml | 18 + .../resources/markdown.mdtest/Code Spans.text | 5 + .../markdown.mdtest/Code Spans.xhtml | 5 + ...apped paragraphs with list-like lines.text | 8 + ...pped paragraphs with list-like lines.xhtml | 8 + .../markdown.mdtest/Horizontal rules.text | 67 + .../markdown.mdtest/Horizontal rules.xhtml | 71 + .../resources/markdown.mdtest/Images.text | 26 + .../resources/markdown.mdtest/Images.xhtml | 21 + .../Inline HTML (Advanced).text | 30 + .../Inline HTML (Advanced).xhtml | 30 + .../markdown.mdtest/Inline HTML (Simple).html | 72 + .../markdown.mdtest/Inline HTML (Simple).text | 69 + .../markdown.mdtest/Inline HTML comments.html | 13 + .../markdown.mdtest/Inline HTML comments.text | 13 + .../markdown.mdtest/Links, inline style.text | 24 + .../markdown.mdtest/Links, inline style.xhtml | 23 + .../Links, reference style.text | 71 + .../Links, reference style.xhtml | 52 + .../Links, shortcut references.text | 20 + .../Links, shortcut references.xhtml | 9 + .../Literal quotes in titles.text | 7 + .../Literal quotes in titles.xhtml | 3 + .../Markdown Documentation - Basics.text | 306 + .../Markdown Documentation - Basics.xhtml | 314 + .../Markdown Documentation - Syntax.text | 888 +++ .../Markdown Documentation - Syntax.xhtml | 942 +++ .../markdown.mdtest/Nested blockquotes.text | 5 + .../markdown.mdtest/Nested blockquotes.xhtml | 9 + .../Ordered and unordered lists.text | 131 + .../Ordered and unordered lists.xhtml | 148 + .../Strong and em together.text | 7 + .../Strong and em together.xhtml | 7 + .../test/resources/markdown.mdtest/Tabs.text | 21 + .../test/resources/markdown.mdtest/Tabs.xhtml | 25 + .../resources/markdown.mdtest/Tidyness.text | 5 + .../resources/markdown.mdtest/Tidyness.xhtml | 8 + .../php-markdown-extra.mdtest/Abbr.text | 31 + .../php-markdown-extra.mdtest/Abbr.xhtml | 15 + ...tick Fenced Code Blocks Special Cases.text | 69 + ...ick Fenced Code Blocks Special Cases.xhtml | 61 + .../Backtick Fenced Code Blocks.text | 123 + .../Backtick Fenced Code Blocks.xhtml | 109 + .../Definition Lists.text | 115 + .../Definition Lists.xhtml | 155 + .../php-markdown-extra.mdtest/Emphasis.text | 100 + .../php-markdown-extra.mdtest/Emphasis.xhtml | 106 + .../php-markdown-extra.mdtest/Footnotes.text | 70 + .../php-markdown-extra.mdtest/Footnotes.xhtml | 103 + .../Headers with attributes.text | 41 + .../Headers with attributes.xhtml | 37 + .../Inline HTML with Markdown content.text | 110 + .../Inline HTML with Markdown content.xhtml | 131 + .../Link & Image Attributes.text | 10 + .../Link & Image Attributes.xhtml | 8 + .../php-markdown-extra.mdtest/Tables.text | 113 + .../php-markdown-extra.mdtest/Tables.xhtml | 333 + ...ilde Fenced Code Blocks Special Cases.text | 69 + ...lde Fenced Code Blocks Special Cases.xhtml | 61 + .../Tilde Fenced Code Blocks.text | 123 + .../Tilde Fenced Code Blocks.xhtml | 109 + .../php-markdown.mdtest/Adjacent Lists.text | 10 + .../php-markdown.mdtest/Adjacent Lists.xhtml | 19 + .../php-markdown.mdtest/Auto Links.text | 3 + .../php-markdown.mdtest/Auto Links.xhtml | 3 + .../Backslash escapes.text | 1 + .../Backslash escapes.xhtml | 1 + .../php-markdown.mdtest/Code Spans.text | 6 + .../php-markdown.mdtest/Code Spans.xhtml | 6 + .../Code block in a list item.text | 15 + .../Code block in a list item.xhtml | 18 + .../Code block on second line.text | 2 + .../Code block on second line.xhtml | 2 + .../Code block regressions.text | 15 + .../Code block regressions.xhtml | 18 + .../php-markdown.mdtest/Email auto links.text | 24 + .../Email auto links.xhtml | 23 + .../php-markdown.mdtest/Emphasis.text | 101 + .../php-markdown.mdtest/Emphasis.xhtml | 105 + .../php-markdown.mdtest/Empty List Item.text | 35 + .../php-markdown.mdtest/Empty List Item.xhtml | 47 + .../php-markdown.mdtest/Headers.text | 9 + .../php-markdown.mdtest/Headers.xhtml | 39 + .../php-markdown.mdtest/Horizontal Rules.text | 29 + .../Horizontal Rules.xhtml | 30 + .../Inline HTML (Simple).html | 32 + .../Inline HTML (Simple).text | 32 + .../Inline HTML (Span).text | 4 + .../Inline HTML (Span).xhtml | 4 + .../Inline HTML comments.html | 9 + .../Inline HTML comments.text | 9 + .../php-markdown.mdtest/Ins & del.text | 17 + .../php-markdown.mdtest/Ins & del.xhtml | 17 + .../Links, inline style.text | 9 + .../Links, inline style.xhtml | 7 + .../php-markdown.mdtest/MD5 Hashes.text | 11 + .../php-markdown.mdtest/MD5 Hashes.xhtml | 11 + .../Mixed OLs and ULs.text | 13 + .../Mixed OLs and ULs.xhtml | 21 + .../php-markdown.mdtest/Nesting.text | 11 + .../php-markdown.mdtest/Nesting.xhtml | 11 + .../PHP-Specific Bugs.text | 22 + .../PHP-Specific Bugs.xhtml | 17 + .../php-markdown.mdtest/Parens in URL.text | 14 + .../php-markdown.mdtest/Parens in URL.xhtml | 11 + .../Quotes in attributes.text | 5 + .../Quotes in attributes.xhtml | 5 + .../php-markdown.mdtest/Tight blocks.text | 1 + .../php-markdown.mdtest/Tight blocks.xhtml | 21 + .../php-markdown.mdtest/XML empty tag.text | 2 + .../php-markdown.mdtest/XML empty tag.xhtml | 2 + .../test/unit/MarkdownExtraTest.php | 51 + .../constant_time_encoding/LICENSE.txt | 48 + .../constant_time_encoding/README.md | 84 + .../constant_time_encoding/composer.json | 56 + .../constant_time_encoding/src/Base32.php | 541 ++ .../constant_time_encoding/src/Base32Hex.php | 111 + .../constant_time_encoding/src/Base64.php | 319 + .../src/Base64DotSlash.php | 88 + .../src/Base64DotSlashOrdered.php | 82 + .../src/Base64UrlSafe.php | 95 + .../constant_time_encoding/src/Binary.php | 93 + .../src/EncoderInterface.php | 52 + .../constant_time_encoding/src/Encoding.php | 298 + .../constant_time_encoding/src/Hex.php | 151 + .../constant_time_encoding/src/RFC4648.php | 206 + system/vendor/pragmarx/google2fa/CHANGELOG.md | 111 + system/vendor/pragmarx/google2fa/LICENSE.md | 7 + system/vendor/pragmarx/google2fa/README.md | 415 ++ .../vendor/pragmarx/google2fa/composer.json | 43 + .../src/Exceptions/Contracts/Google2FA.php | 9 + .../IncompatibleWithGoogleAuthenticator.php | 9 + .../Exceptions/Contracts/InvalidAlgorithm.php | 9 + .../Contracts/InvalidCharacters.php | 9 + .../Contracts/SecretKeyTooShort.php | 9 + .../src/Exceptions/Google2FAException.php | 10 + ...atibleWithGoogleAuthenticatorException.php | 11 + .../Exceptions/InvalidAlgorithmException.php | 11 + .../Exceptions/InvalidCharactersException.php | 11 + .../Exceptions/SecretKeyTooShortException.php | 11 + .../pragmarx/google2fa/src/Google2FA.php | 495 ++ .../pragmarx/google2fa/src/Support/Base32.php | 208 + .../google2fa/src/Support/Constants.php | 31 + .../pragmarx/google2fa/src/Support/QRCode.php | 34 + system/vendor/suin/php-rss-writer/.gitignore | 4 + system/vendor/suin/php-rss-writer/.travis.yml | 26 + system/vendor/suin/php-rss-writer/Makefile | 5 + system/vendor/suin/php-rss-writer/README.md | 148 + .../suin/php-rss-writer/Tests/.gitignore | 3 + .../suin/php-rss-writer/Tests/Bootstrap.php | 12 + .../suin/php-rss-writer/Tests/README.md | 27 + .../Tests/Suin/RSSWriter/ChannelTest.php | 259 + .../Tests/Suin/RSSWriter/FeedTest.php | 96 + .../Tests/Suin/RSSWriter/ItemTest.php | 310 + .../suin/php-rss-writer/Tests/composer.json | 8 + .../php-rss-writer/Tests/phpunit.xml.dist | 40 + .../vendor/suin/php-rss-writer/composer.json | 33 + .../docker-compose.development.yml | 1 + .../suin/php-rss-writer/docker-compose.yml | 25 + .../php-rss-writer/examples/simple-feed.php | 52 + .../suin/php-rss-writer/phpunit.xml.dist | 40 + .../src/Suin/RSSWriter/Channel.php | 243 + .../src/Suin/RSSWriter/ChannelInterface.php | 92 + .../src/Suin/RSSWriter/Feed.php | 55 + .../src/Suin/RSSWriter/FeedInterface.php | 29 + .../src/Suin/RSSWriter/Item.php | 181 + .../src/Suin/RSSWriter/ItemInterface.php | 90 + .../src/Suin/RSSWriter/SimpleXMLElement.php | 41 + .../vendor/voku/portable-ascii/CHANGELOG.md | 202 + system/vendor/voku/portable-ascii/LICENSE.txt | 19 + system/vendor/voku/portable-ascii/README.md | 451 ++ .../vendor/voku/portable-ascii/composer.json | 37 + .../portable-ascii/src/voku/helper/ASCII.php | 1501 ++++ .../voku/helper/data/ascii_by_languages.php | 2950 ++++++++ .../helper/data/ascii_extras_by_languages.php | 759 ++ .../helper/data/ascii_language_max_key.php | 65 + .../src/voku/helper/data/ascii_ord.php | 1 + .../src/voku/helper/data/x000.php | 16 + .../src/voku/helper/data/x001.php | 1 + .../src/voku/helper/data/x002.php | 1 + .../src/voku/helper/data/x003.php | 1 + .../src/voku/helper/data/x004.php | 1 + .../src/voku/helper/data/x005.php | 1 + .../src/voku/helper/data/x006.php | 1 + .../src/voku/helper/data/x007.php | 1 + .../src/voku/helper/data/x009.php | 1 + .../src/voku/helper/data/x00a.php | 1 + .../src/voku/helper/data/x00b.php | 1 + .../src/voku/helper/data/x00c.php | 1 + .../src/voku/helper/data/x00d.php | 1 + .../src/voku/helper/data/x00e.php | 1 + .../src/voku/helper/data/x00f.php | 1 + .../src/voku/helper/data/x010.php | 1 + .../src/voku/helper/data/x011.php | 1 + .../src/voku/helper/data/x012.php | 1 + .../src/voku/helper/data/x013.php | 1 + .../src/voku/helper/data/x014.php | 1 + .../src/voku/helper/data/x015.php | 1 + .../src/voku/helper/data/x016.php | 1 + .../src/voku/helper/data/x017.php | 1 + .../src/voku/helper/data/x018.php | 1 + .../src/voku/helper/data/x01d.php | 1 + .../src/voku/helper/data/x01e.php | 1 + .../src/voku/helper/data/x01f.php | 1 + .../src/voku/helper/data/x020.php | 4 + .../src/voku/helper/data/x021.php | 1 + .../src/voku/helper/data/x022.php | 1 + .../src/voku/helper/data/x023.php | 1 + .../src/voku/helper/data/x024.php | 1 + .../src/voku/helper/data/x025.php | 1 + .../src/voku/helper/data/x026.php | 1 + .../src/voku/helper/data/x027.php | 1 + .../src/voku/helper/data/x028.php | 1 + .../src/voku/helper/data/x029.php | 1 + .../src/voku/helper/data/x02a.php | 1 + .../src/voku/helper/data/x02c.php | 1 + .../src/voku/helper/data/x02e.php | 1 + .../src/voku/helper/data/x02f.php | 1 + .../src/voku/helper/data/x030.php | 9 + .../src/voku/helper/data/x031.php | 1 + .../src/voku/helper/data/x032.php | 1 + .../src/voku/helper/data/x033.php | 1 + .../src/voku/helper/data/x04d.php | 1 + .../src/voku/helper/data/x04e.php | 1 + .../src/voku/helper/data/x04f.php | 1 + .../src/voku/helper/data/x050.php | 1 + .../src/voku/helper/data/x051.php | 1 + .../src/voku/helper/data/x052.php | 1 + .../src/voku/helper/data/x053.php | 1 + .../src/voku/helper/data/x054.php | 1 + .../src/voku/helper/data/x055.php | 1 + .../src/voku/helper/data/x056.php | 1 + .../src/voku/helper/data/x057.php | 1 + .../src/voku/helper/data/x058.php | 1 + .../src/voku/helper/data/x059.php | 1 + .../src/voku/helper/data/x05a.php | 1 + .../src/voku/helper/data/x05b.php | 1 + .../src/voku/helper/data/x05c.php | 1 + .../src/voku/helper/data/x05d.php | 1 + .../src/voku/helper/data/x05e.php | 1 + .../src/voku/helper/data/x05f.php | 1 + .../src/voku/helper/data/x060.php | 1 + .../src/voku/helper/data/x061.php | 1 + .../src/voku/helper/data/x062.php | 1 + .../src/voku/helper/data/x063.php | 1 + .../src/voku/helper/data/x064.php | 1 + .../src/voku/helper/data/x065.php | 1 + .../src/voku/helper/data/x066.php | 1 + .../src/voku/helper/data/x067.php | 1 + .../src/voku/helper/data/x068.php | 1 + .../src/voku/helper/data/x069.php | 1 + .../src/voku/helper/data/x06a.php | 1 + .../src/voku/helper/data/x06b.php | 1 + .../src/voku/helper/data/x06c.php | 1 + .../src/voku/helper/data/x06d.php | 1 + .../src/voku/helper/data/x06e.php | 1 + .../src/voku/helper/data/x06f.php | 1 + .../src/voku/helper/data/x070.php | 1 + .../src/voku/helper/data/x071.php | 1 + .../src/voku/helper/data/x072.php | 1 + .../src/voku/helper/data/x073.php | 1 + .../src/voku/helper/data/x074.php | 1 + .../src/voku/helper/data/x075.php | 1 + .../src/voku/helper/data/x076.php | 1 + .../src/voku/helper/data/x077.php | 1 + .../src/voku/helper/data/x078.php | 1 + .../src/voku/helper/data/x079.php | 1 + .../src/voku/helper/data/x07a.php | 1 + .../src/voku/helper/data/x07b.php | 1 + .../src/voku/helper/data/x07c.php | 1 + .../src/voku/helper/data/x07d.php | 1 + .../src/voku/helper/data/x07e.php | 1 + .../src/voku/helper/data/x07f.php | 1 + .../src/voku/helper/data/x080.php | 1 + .../src/voku/helper/data/x081.php | 1 + .../src/voku/helper/data/x082.php | 1 + .../src/voku/helper/data/x083.php | 1 + .../src/voku/helper/data/x084.php | 1 + .../src/voku/helper/data/x085.php | 1 + .../src/voku/helper/data/x086.php | 1 + .../src/voku/helper/data/x087.php | 1 + .../src/voku/helper/data/x088.php | 1 + .../src/voku/helper/data/x089.php | 1 + .../src/voku/helper/data/x08a.php | 1 + .../src/voku/helper/data/x08b.php | 1 + .../src/voku/helper/data/x08c.php | 1 + .../src/voku/helper/data/x08d.php | 1 + .../src/voku/helper/data/x08e.php | 1 + .../src/voku/helper/data/x08f.php | 1 + .../src/voku/helper/data/x090.php | 1 + .../src/voku/helper/data/x091.php | 1 + .../src/voku/helper/data/x092.php | 1 + .../src/voku/helper/data/x093.php | 1 + .../src/voku/helper/data/x094.php | 1 + .../src/voku/helper/data/x095.php | 1 + .../src/voku/helper/data/x096.php | 1 + .../src/voku/helper/data/x097.php | 1 + .../src/voku/helper/data/x098.php | 1 + .../src/voku/helper/data/x099.php | 1 + .../src/voku/helper/data/x09a.php | 1 + .../src/voku/helper/data/x09b.php | 1 + .../src/voku/helper/data/x09c.php | 1 + .../src/voku/helper/data/x09d.php | 1 + .../src/voku/helper/data/x09e.php | 1 + .../src/voku/helper/data/x09f.php | 1 + .../src/voku/helper/data/x0a0.php | 1 + .../src/voku/helper/data/x0a1.php | 1 + .../src/voku/helper/data/x0a2.php | 1 + .../src/voku/helper/data/x0a3.php | 1 + .../src/voku/helper/data/x0a4.php | 1 + .../src/voku/helper/data/x0ac.php | 1 + .../src/voku/helper/data/x0ad.php | 1 + .../src/voku/helper/data/x0ae.php | 1 + .../src/voku/helper/data/x0af.php | 1 + .../src/voku/helper/data/x0b0.php | 1 + .../src/voku/helper/data/x0b1.php | 1 + .../src/voku/helper/data/x0b2.php | 1 + .../src/voku/helper/data/x0b3.php | 1 + .../src/voku/helper/data/x0b4.php | 1 + .../src/voku/helper/data/x0b5.php | 1 + .../src/voku/helper/data/x0b6.php | 1 + .../src/voku/helper/data/x0b7.php | 1 + .../src/voku/helper/data/x0b8.php | 1 + .../src/voku/helper/data/x0b9.php | 1 + .../src/voku/helper/data/x0ba.php | 1 + .../src/voku/helper/data/x0bb.php | 1 + .../src/voku/helper/data/x0bc.php | 1 + .../src/voku/helper/data/x0bd.php | 1 + .../src/voku/helper/data/x0be.php | 1 + .../src/voku/helper/data/x0bf.php | 1 + .../src/voku/helper/data/x0c0.php | 1 + .../src/voku/helper/data/x0c1.php | 1 + .../src/voku/helper/data/x0c2.php | 1 + .../src/voku/helper/data/x0c3.php | 1 + .../src/voku/helper/data/x0c4.php | 1 + .../src/voku/helper/data/x0c5.php | 1 + .../src/voku/helper/data/x0c6.php | 1 + .../src/voku/helper/data/x0c7.php | 1 + .../src/voku/helper/data/x0c8.php | 1 + .../src/voku/helper/data/x0c9.php | 1 + .../src/voku/helper/data/x0ca.php | 1 + .../src/voku/helper/data/x0cb.php | 1 + .../src/voku/helper/data/x0cc.php | 1 + .../src/voku/helper/data/x0cd.php | 1 + .../src/voku/helper/data/x0ce.php | 1 + .../src/voku/helper/data/x0cf.php | 1 + .../src/voku/helper/data/x0d0.php | 1 + .../src/voku/helper/data/x0d1.php | 1 + .../src/voku/helper/data/x0d2.php | 1 + .../src/voku/helper/data/x0d3.php | 1 + .../src/voku/helper/data/x0d4.php | 1 + .../src/voku/helper/data/x0d5.php | 1 + .../src/voku/helper/data/x0d6.php | 1 + .../src/voku/helper/data/x0d7.php | 1 + .../src/voku/helper/data/x0f9.php | 1 + .../src/voku/helper/data/x0fa.php | 1 + .../src/voku/helper/data/x0fb.php | 1 + .../src/voku/helper/data/x0fc.php | 1 + .../src/voku/helper/data/x0fd.php | 1 + .../src/voku/helper/data/x0fe.php | 1 + .../src/voku/helper/data/x0ff.php | 1 + .../src/voku/helper/data/x1d4.php | 1 + .../src/voku/helper/data/x1d5.php | 4 + .../src/voku/helper/data/x1d6.php | 1 + .../src/voku/helper/data/x1d7.php | 1 + .../src/voku/helper/data/x1f1.php | 2 + system/vendor/voku/stop-words/CHANGELOG.md | 25 + system/vendor/voku/stop-words/LICENSE | 22 + system/vendor/voku/stop-words/README.md | 73 + system/vendor/voku/stop-words/composer.json | 27 + .../stop-words/src/voku/helper/StopWords.php | 143 + .../helper/StopWordsLanguageNotExists.php | 14 + .../src/voku/helper/stopwords/ar.php | 172 + .../src/voku/helper/stopwords/bg.php | 269 + .../src/voku/helper/stopwords/ca.php | 104 + .../src/voku/helper/stopwords/cz.php | 266 + .../src/voku/helper/stopwords/da.php | 180 + .../src/voku/helper/stopwords/de.php | 1033 +++ .../src/voku/helper/stopwords/el.php | 275 + .../src/voku/helper/stopwords/en.php | 329 + .../src/voku/helper/stopwords/eo.php | 183 + .../src/voku/helper/stopwords/es.php | 323 + .../src/voku/helper/stopwords/et.php | 45 + .../src/voku/helper/stopwords/fi.php | 245 + .../src/voku/helper/stopwords/fr.php | 717 ++ .../src/voku/helper/stopwords/hi.php | 235 + .../src/voku/helper/stopwords/hr.php | 189 + .../src/voku/helper/stopwords/hu.php | 209 + .../src/voku/helper/stopwords/id.php | 367 + .../src/voku/helper/stopwords/it.php | 290 + .../src/voku/helper/stopwords/ka.php | 383 + .../src/voku/helper/stopwords/lt.php | 484 ++ .../src/voku/helper/stopwords/lv.php | 171 + .../src/voku/helper/stopwords/nl.php | 111 + .../src/voku/helper/stopwords/no.php | 186 + .../src/voku/helper/stopwords/pl.php | 148 + .../src/voku/helper/stopwords/pt.php | 214 + .../src/voku/helper/stopwords/ro.php | 268 + .../src/voku/helper/stopwords/ru.php | 161 + .../src/voku/helper/stopwords/sk.php | 183 + .../src/voku/helper/stopwords/sv.php | 124 + .../src/voku/helper/stopwords/tr.php | 63 + .../src/voku/helper/stopwords/uk.php | 395 ++ .../src/voku/helper/stopwords/vi.php | 655 ++ themes/blog/404-search.html.php | 17 + themes/blog/404.html.php | 15 + themes/blog/README.md | 11 + themes/blog/css/bootstrap-theme.min.css | 5 + themes/blog/css/bootstrap.min.css | 5 + themes/blog/css/font-awesome.min.css | 4 + themes/blog/css/styles.css | 643 ++ themes/blog/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes themes/blog/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes themes/blog/fonts/fontawesome-webfont.svg | 565 ++ themes/blog/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes themes/blog/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes themes/blog/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes themes/blog/images/logo.png | Bin 0 -> 4691 bytes themes/blog/js/bootstrap.min.js | 7 + themes/blog/js/jquery-latest.min.js | 5 + themes/blog/layout.html.php | 184 + themes/blog/main.html.php | 88 + themes/blog/no-posts.html.php | 2 + themes/blog/post.html.php | 112 + themes/blog/profile.html.php | 34 + themes/blog/static.html.php | 27 + themes/clean/404-search.html.php | 13 + themes/clean/404.html.php | 11 + themes/clean/css/style.css | 956 +++ themes/clean/layout.html.php | 50 + themes/clean/main.html.php | 74 + themes/clean/no-posts.html.php | 2 + themes/clean/post.html.php | 82 + themes/clean/profile.html.php | 34 + themes/clean/static.html.php | 22 + themes/doks/404-search.html.php | 10 + themes/doks/404.html.php | 10 + themes/doks/LICENSE.txt | 21 + themes/doks/README.md | 16 + themes/doks/css/style.css | 3583 ++++++++++ themes/doks/fonts/jost/jost-v4-latin-500.woff | Bin 0 -> 12888 bytes .../doks/fonts/jost/jost-v4-latin-500.woff2 | Bin 0 -> 9828 bytes .../fonts/jost/jost-v4-latin-500italic.woff | Bin 0 -> 14504 bytes .../fonts/jost/jost-v4-latin-500italic.woff2 | Bin 0 -> 11108 bytes themes/doks/fonts/jost/jost-v4-latin-700.woff | Bin 0 -> 12928 bytes .../doks/fonts/jost/jost-v4-latin-700.woff2 | Bin 0 -> 9820 bytes .../fonts/jost/jost-v4-latin-700italic.woff | Bin 0 -> 14616 bytes .../fonts/jost/jost-v4-latin-700italic.woff2 | Bin 0 -> 11112 bytes .../doks/fonts/jost/jost-v4-latin-italic.woff | Bin 0 -> 13580 bytes .../fonts/jost/jost-v4-latin-italic.woff2 | Bin 0 -> 10352 bytes .../fonts/jost/jost-v4-latin-regular.woff | Bin 0 -> 11820 bytes .../fonts/jost/jost-v4-latin-regular.woff2 | Bin 0 -> 8864 bytes themes/doks/img/soundcloud.jpg | Bin 0 -> 29258 bytes themes/doks/js/main.js | 11 + themes/doks/js/toc.js | 65 + themes/doks/layout--static.html.php | 90 + themes/doks/layout.html.php | 122 + themes/doks/main.html.php | 154 + themes/doks/no-posts.html.php | 9 + themes/doks/post.html.php | 110 + themes/doks/profile.html.php | 100 + themes/doks/static.html.php | 164 + themes/logs/404-search.html.php | 13 + themes/logs/404.html.php | 11 + themes/logs/css/style.css | 986 +++ themes/logs/layout.html.php | 98 + themes/logs/main.html.php | 73 + themes/logs/no-posts.html.php | 2 + themes/logs/post.html.php | 82 + themes/logs/profile.html.php | 34 + themes/logs/static.html.php | 23 + themes/readable/404-search.html.php | 13 + themes/readable/404.html.php | 11 + themes/readable/css/style.css | 1041 +++ themes/readable/img/facebook.png | Bin 0 -> 2490 bytes themes/readable/img/googleplus.png | Bin 0 -> 2769 bytes themes/readable/img/rss.png | Bin 0 -> 2764 bytes themes/readable/img/share-facebook.png | Bin 0 -> 582 bytes themes/readable/img/share-googleplus.png | Bin 0 -> 836 bytes themes/readable/img/share-twitter.png | Bin 0 -> 668 bytes themes/readable/img/tumblr.png | Bin 0 -> 2640 bytes themes/readable/img/twitter.png | Bin 0 -> 2730 bytes themes/readable/layout.html.php | 63 + themes/readable/main.html.php | 72 + themes/readable/no-posts.html.php | 2 + themes/readable/post.html.php | 80 + themes/readable/profile.html.php | 33 + themes/readable/static.html.php | 21 + themes/readme.txt | 1 + themes/tailwind/404-search.html.php | 19 + themes/tailwind/404.html.php | 19 + themes/tailwind/LICENSE.txt | 21 + themes/tailwind/README.md | 12 + themes/tailwind/css/style.css | 144 + themes/tailwind/css/tailwind.css | 2596 +++++++ themes/tailwind/css/typography.css | 866 +++ .../tailwind/fonts/2d141e1a38819612-s.p.woff2 | Bin 0 -> 22312 bytes .../tailwind/fonts/62328fecf9e80426-s.woff2 | Bin 0 -> 6628 bytes themes/tailwind/fonts/LICENSE.txt | 93 + .../tailwind/fonts/c7eb187887c48af6-s.woff2 | Bin 0 -> 18212 bytes themes/tailwind/img/soundcloud.jpg | Bin 0 -> 29258 bytes themes/tailwind/js/functions.js | 26 + themes/tailwind/layout.html.php | 164 + themes/tailwind/logo.png | Bin 0 -> 1318 bytes themes/tailwind/main.html.php | 140 + themes/tailwind/no-posts.html.php | 6 + themes/tailwind/post.html.php | 121 + themes/tailwind/profile.html.php | 128 + themes/tailwind/static--front.html.php | 111 + themes/tailwind/static.html.php | 12 + themes/twentyfifteen/404-search.html.php | 12 + themes/twentyfifteen/404.html.php | 10 + themes/twentyfifteen/LICENSE.txt | 22 + themes/twentyfifteen/README.md | 10 + themes/twentyfifteen/css/font.css | 60 + themes/twentyfifteen/css/ie.css | 948 +++ themes/twentyfifteen/css/ie7.css | 89 + themes/twentyfifteen/css/style.css | 6165 ++++++++++++++++ themes/twentyfifteen/css/style_v2.css | 6172 +++++++++++++++++ themes/twentyfifteen/genericons/COPYING.txt | 9 + .../twentyfifteen/genericons/Genericons.eot | Bin 0 -> 22760 bytes .../twentyfifteen/genericons/Genericons.svg | 543 ++ .../twentyfifteen/genericons/Genericons.ttf | Bin 0 -> 22576 bytes .../twentyfifteen/genericons/Genericons.woff | Bin 0 -> 14360 bytes themes/twentyfifteen/genericons/LICENSE.txt | 339 + themes/twentyfifteen/genericons/README.md | 152 + .../twentyfifteen/genericons/genericons.css | 209 + themes/twentyfifteen/images/avatar.png | Bin 0 -> 4691 bytes themes/twentyfifteen/js/functions.js | 178 + themes/twentyfifteen/js/html5.js | 9 + themes/twentyfifteen/js/jquery-migrate.js | 2 + themes/twentyfifteen/js/jquery.js | 4 + .../twentyfifteen/js/skip-link-focus-fix.js | 26 + themes/twentyfifteen/layout.html.php | 114 + themes/twentyfifteen/main.html.php | 108 + themes/twentyfifteen/no-posts.html.php | 8 + themes/twentyfifteen/post.html.php | 110 + themes/twentyfifteen/profile.html.php | 38 + themes/twentyfifteen/static.html.php | 21 + themes/twentysixteen/404-search.html.php | 18 + themes/twentysixteen/404.html.php | 16 + themes/twentysixteen/LICENSE.txt | 22 + themes/twentysixteen/README.md | 10 + themes/twentysixteen/css/ie.css | 48 + themes/twentysixteen/css/ie7.css | 176 + themes/twentysixteen/css/ie8.css | 226 + themes/twentysixteen/css/rtl.css | 754 ++ themes/twentysixteen/css/style.css | 4095 +++++++++++ themes/twentysixteen/genericons/COPYING.txt | 9 + .../twentysixteen/genericons/Genericons.eot | Bin 0 -> 22374 bytes .../twentysixteen/genericons/Genericons.svg | 537 ++ .../twentysixteen/genericons/Genericons.ttf | Bin 0 -> 22188 bytes .../twentysixteen/genericons/Genericons.woff | Bin 0 -> 13988 bytes themes/twentysixteen/genericons/LICENSE.txt | 339 + themes/twentysixteen/genericons/README.md | 218 + .../twentysixteen/genericons/genericons.css | 263 + themes/twentysixteen/img/avatar.png | Bin 0 -> 4691 bytes themes/twentysixteen/js/functions.js | 200 + themes/twentysixteen/js/html5.js | 326 + themes/twentysixteen/js/jquery-migrate.js | 2 + themes/twentysixteen/js/jquery.js | 6 + .../twentysixteen/js/skip-link-focus-fix.js | 36 + themes/twentysixteen/layout.html.php | 150 + themes/twentysixteen/main.html.php | 100 + themes/twentysixteen/no-posts.html.php | 6 + themes/twentysixteen/post.html.php | 108 + themes/twentysixteen/profile.html.php | 38 + themes/twentysixteen/static.html.php | 31 + upload.php | 73 + 877 files changed, 127408 insertions(+), 1 deletion(-) create mode 100644 COPYRIGHT.txt create mode 100644 LICENSE.txt mode change 100755 => 100644 README.md create mode 100644 SECURITY.md create mode 100644 cache/installedVersion.json create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/.htaccess create mode 100644 config/config.ini.example create mode 100644 config/users/username.ini.example create mode 100644 content/.gitkeep create mode 100644 favicon.png create mode 100644 humans.txt create mode 100644 index.php create mode 100644 install.php create mode 100644 lang/ar_AR.ini create mode 100644 lang/da_DK.ini create mode 100644 lang/de_DE.ini create mode 100644 lang/de_DE_gender_doppelpunkt.ini create mode 100644 lang/de_DE_gender_dudenkonform.ini create mode 100644 lang/el_GR.ini create mode 100644 lang/en_US.ini create mode 100644 lang/eo_EO.ini create mode 100644 lang/es_ES.ini create mode 100644 lang/fa_IR.ini create mode 100644 lang/fr_FR.ini create mode 100644 lang/gu_GU.ini create mode 100644 lang/hi_HI.ini create mode 100644 lang/hr_HR.ini create mode 100644 lang/hu_HU.ini create mode 100644 lang/id_ID.ini create mode 100644 lang/it_IT.ini create mode 100644 lang/ko_KO.ini create mode 100644 lang/ms_MY.ini create mode 100644 lang/nl_NL.ini create mode 100644 lang/pl_PL.ini create mode 100644 lang/pt_BR.ini create mode 100644 lang/ru_RU.ini create mode 100644 lang/sv_SE.ini create mode 100644 lang/tr_TR.ini create mode 100644 lang/uk_UA.ini create mode 100644 lang/zh_CN.ini create mode 100644 lang/zh_TW.ini create mode 100755 old/README.md rename {blog => old/blog}/2024-06-07_MFA-i.html (100%) rename {blog => old/blog}/2024-07-01_Plates.html (100%) rename {blog => old/blog}/2024-07-01_Plates_list.html (100%) rename {blog => old/blog}/2024-08-04_Vexillology-i.html (100%) rename {blog => old/blog}/home.html (100%) rename {blog => old/blog}/media/MFA-i.png (100%) rename {blog => old/blog}/style.css (100%) rename {blog => old/blog}/template.html (100%) rename index.html => old/index.html (100%) rename projects.html => old/projects.html (100%) rename resume.html => old/resume.html (100%) rename style.css => old/style.css (100%) create mode 100644 robots.txt create mode 100644 system/admin/admin.php create mode 100644 system/admin/editor/LICENSE.txt create mode 100644 system/admin/editor/css/editor.css create mode 100644 system/admin/editor/js/Markdown.Converter.js create mode 100644 system/admin/editor/js/Markdown.Editor.js create mode 100644 system/admin/editor/js/Markdown.Extra.js create mode 100644 system/admin/editor/js/Markdown.Sanitizer.js create mode 100644 system/admin/editor/js/editor.js create mode 100644 system/admin/editor/js/local/Markdown.local.fr.js create mode 100644 system/admin/editor/js/node-pagedown-extra.js create mode 100644 system/admin/editor/js/node-pagedown.js create mode 100644 system/admin/editor/package.json create mode 100644 system/admin/views/.htaccess create mode 100644 system/admin/views/404.html.php create mode 100644 system/admin/views/add-content.html.php create mode 100644 system/admin/views/add-page.html.php create mode 100644 system/admin/views/add-user.html.php create mode 100644 system/admin/views/backup-start.html.php create mode 100644 system/admin/views/backup.html.php create mode 100644 system/admin/views/categories.html.php create mode 100644 system/admin/views/category-list.html.php create mode 100644 system/admin/views/clear-cache.html.php create mode 100644 system/admin/views/config-custom.html.php create mode 100644 system/admin/views/config-metatags.html.php create mode 100644 system/admin/views/config-performance.html.php create mode 100644 system/admin/views/config-reading.html.php create mode 100644 system/admin/views/config-security.html.php create mode 100644 system/admin/views/config-widget.html.php create mode 100644 system/admin/views/config-writing.html.php create mode 100644 system/admin/views/config.html.php create mode 100644 system/admin/views/content-type.html.php create mode 100644 system/admin/views/delete-category.html.php create mode 100644 system/admin/views/delete-page.html.php create mode 100644 system/admin/views/delete-post.html.php create mode 100644 system/admin/views/delete-user.html.php create mode 100644 system/admin/views/denied.html.php create mode 100644 system/admin/views/edit-content.html.php create mode 100644 system/admin/views/edit-mfa.html.php create mode 100644 system/admin/views/edit-page.html.php create mode 100644 system/admin/views/edit-password.html.php create mode 100644 system/admin/views/edit-user.html.php create mode 100644 system/admin/views/import.html.php create mode 100644 system/admin/views/layout.html.php create mode 100644 system/admin/views/login-mfa.html.php create mode 100644 system/admin/views/login.html.php create mode 100644 system/admin/views/logout.html.php create mode 100644 system/admin/views/main.html.php create mode 100644 system/admin/views/menu.html.php create mode 100644 system/admin/views/no-posts.html.php create mode 100644 system/admin/views/popular-posts.html.php create mode 100644 system/admin/views/posts-list.html.php create mode 100644 system/admin/views/scheduled.html.php create mode 100644 system/admin/views/static-pages.html.php create mode 100644 system/admin/views/static-subpages.html.php create mode 100644 system/admin/views/update.html.php create mode 100644 system/admin/views/updated-to.html.php create mode 100644 system/admin/views/user-draft.html.php create mode 100644 system/admin/views/user-posts.html.php create mode 100644 system/admin/views/users.html.php create mode 100644 system/configList.json create mode 100644 system/htmly.php create mode 100644 system/includes/.htaccess create mode 100644 system/includes/dispatch.php create mode 100644 system/includes/functions.php create mode 100644 system/includes/opml.php create mode 100644 system/includes/session.php create mode 100644 system/resources/css/adminlte.min.css create mode 100644 system/resources/css/fontawesome.min.css create mode 100644 system/resources/css/jquery-ui.css create mode 100644 system/resources/css/social-logos.css create mode 100644 system/resources/css/social-logos.ttf create mode 100644 system/resources/css/social-logos.woff2 create mode 100644 system/resources/css/solid.min.css create mode 100644 system/resources/css/toc.css create mode 100644 system/resources/css/toolbar.css create mode 100644 system/resources/fonts/glyphicons-halflings-regular.eot create mode 100644 system/resources/fonts/glyphicons-halflings-regular.svg create mode 100644 system/resources/fonts/glyphicons-halflings-regular.ttf create mode 100644 system/resources/fonts/glyphicons-halflings-regular.woff create mode 100644 system/resources/images/htmly-gray-bg.png create mode 100644 system/resources/images/htmly-small.png create mode 100644 system/resources/images/logo-big.png create mode 100644 system/resources/images/logo-small.png create mode 100644 system/resources/images/logo.png create mode 100644 system/resources/images/share-facebook.png create mode 100644 system/resources/images/share-twitter.png create mode 100644 system/resources/js/adminlte.min.js create mode 100644 system/resources/js/bootstrap.min.js create mode 100644 system/resources/js/jquery-ui.min.js create mode 100644 system/resources/js/jquery.min.js create mode 100644 system/resources/js/jquery.nestable++.js create mode 100644 system/resources/js/jquery.nestable.js create mode 100644 system/resources/js/media.uploader.js create mode 100644 system/resources/js/save_draft.js create mode 100644 system/resources/js/toc.generator.js create mode 100644 system/resources/readme.txt create mode 100644 system/resources/webfonts/fa-solid-900.ttf create mode 100644 system/resources/webfonts/fa-solid-900.woff2 create mode 100644 system/vendor/autoload.php create mode 100644 system/vendor/bacon/bacon-qr-code/LICENSE create mode 100644 system/vendor/bacon/bacon-qr-code/README.md create mode 100644 system/vendor/bacon/bacon-qr-code/composer.json create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/BitArray.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/BitMatrix.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/BitUtils.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/CharacterSetEci.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/EcBlock.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/EcBlocks.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/ErrorCorrectionLevel.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/FormatInformation.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/Mode.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Common/Version.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/BlockPair.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/ByteMatrix.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/Encoder.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/MaskUtil.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/MatrixUtil.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Encoder/QrCode.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/ExceptionInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/InvalidArgumentException.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/OutOfBoundsException.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/RuntimeException.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/UnexpectedValueException.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Exception/WriterException.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Color/Alpha.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Color/Cmyk.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Color/ColorInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Color/Gray.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Color/Rgb.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/EyeInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/ModuleEye.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/PointyEye.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/SimpleCircleEye.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Eye/SquareEye.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/GDLibRenderer.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Image/EpsImageBackEnd.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Image/ImageBackEndInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Image/ImagickImageBackEnd.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Image/SvgImageBackEnd.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Image/TransformationMatrix.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/ImageRenderer.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/DotsModule.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/Edge.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/EdgeIterator.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/ModuleInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/RoundnessModule.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Module/SquareModule.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/Close.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/Curve.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/EllipticArc.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/Line.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/Move.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/OperationInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/Path/Path.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/PlainTextRenderer.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererInterface.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererStyle/EyeFill.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererStyle/Fill.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererStyle/Gradient.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererStyle/GradientType.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Renderer/RendererStyle/RendererStyle.php create mode 100644 system/vendor/bacon/bacon-qr-code/src/Writer.php create mode 100644 system/vendor/composer/ClassLoader.php create mode 100644 system/vendor/composer/InstalledVersions.php create mode 100644 system/vendor/composer/LICENSE create mode 100644 system/vendor/composer/autoload_classmap.php create mode 100644 system/vendor/composer/autoload_files.php create mode 100644 system/vendor/composer/autoload_namespaces.php create mode 100644 system/vendor/composer/autoload_psr4.php create mode 100644 system/vendor/composer/autoload_real.php create mode 100644 system/vendor/composer/autoload_static.php create mode 100644 system/vendor/composer/ca-bundle/LICENSE create mode 100644 system/vendor/composer/ca-bundle/README.md create mode 100644 system/vendor/composer/ca-bundle/composer.json create mode 100644 system/vendor/composer/ca-bundle/res/cacert.pem create mode 100644 system/vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 system/vendor/composer/installed.json create mode 100644 system/vendor/composer/installed.php create mode 100644 system/vendor/composer/platform_check.php create mode 100644 system/vendor/dasprid/enum/LICENSE create mode 100644 system/vendor/dasprid/enum/README.md create mode 100644 system/vendor/dasprid/enum/composer.json create mode 100644 system/vendor/dasprid/enum/src/AbstractEnum.php create mode 100644 system/vendor/dasprid/enum/src/EnumMap.php create mode 100644 system/vendor/dasprid/enum/src/Exception/CloneNotSupportedException.php create mode 100644 system/vendor/dasprid/enum/src/Exception/ExceptionInterface.php create mode 100644 system/vendor/dasprid/enum/src/Exception/ExpectationException.php create mode 100644 system/vendor/dasprid/enum/src/Exception/IllegalArgumentException.php create mode 100644 system/vendor/dasprid/enum/src/Exception/MismatchException.php create mode 100644 system/vendor/dasprid/enum/src/Exception/SerializeNotSupportedException.php create mode 100644 system/vendor/dasprid/enum/src/Exception/UnserializeNotSupportedException.php create mode 100644 system/vendor/dasprid/enum/src/NullValue.php create mode 100644 system/vendor/ircmaxell/password-compat/LICENSE.md create mode 100644 system/vendor/ircmaxell/password-compat/composer.json create mode 100644 system/vendor/ircmaxell/password-compat/lib/password.php create mode 100644 system/vendor/ircmaxell/password-compat/version-test.php create mode 100644 system/vendor/jbroadway/urlify/.github/workflows/ci.yml create mode 100644 system/vendor/jbroadway/urlify/.gitignore create mode 100644 system/vendor/jbroadway/urlify/.travis.yml create mode 100644 system/vendor/jbroadway/urlify/INSTALL create mode 100644 system/vendor/jbroadway/urlify/LICENSE create mode 100644 system/vendor/jbroadway/urlify/README.md create mode 100644 system/vendor/jbroadway/urlify/URLify.php create mode 100644 system/vendor/jbroadway/urlify/composer.json create mode 100644 system/vendor/jbroadway/urlify/phpunit.xml create mode 100644 system/vendor/jbroadway/urlify/scripts/downcode.php create mode 100644 system/vendor/jbroadway/urlify/scripts/filter.php create mode 100644 system/vendor/jbroadway/urlify/scripts/transliterate.php create mode 100644 system/vendor/jbroadway/urlify/tests/URLifyTest.php create mode 100644 system/vendor/jbroadway/urlify/tests/bootstrap.php create mode 100644 system/vendor/kanti/hub-updater/.travis.yml create mode 100644 system/vendor/kanti/hub-updater/LICENSE create mode 100644 system/vendor/kanti/hub-updater/composer.json create mode 100644 system/vendor/kanti/hub-updater/grumphp.yml create mode 100644 system/vendor/kanti/hub-updater/src/CacheOneFile.php create mode 100644 system/vendor/kanti/hub-updater/src/HelperClass.php create mode 100644 system/vendor/kanti/hub-updater/src/HubUpdater.php create mode 100644 system/vendor/kanti/hub-updater/src/ca_bundle.crt create mode 100644 system/vendor/michelf/php-markdown/.editorconfig create mode 100644 system/vendor/michelf/php-markdown/.gitignore create mode 100644 system/vendor/michelf/php-markdown/.scrutinizer.yml create mode 100644 system/vendor/michelf/php-markdown/.travis.yml create mode 100644 system/vendor/michelf/php-markdown/License.md create mode 100644 system/vendor/michelf/php-markdown/Michelf/Markdown.inc.php create mode 100644 system/vendor/michelf/php-markdown/Michelf/Markdown.php create mode 100644 system/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php create mode 100644 system/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php create mode 100644 system/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php create mode 100644 system/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php create mode 100644 system/vendor/michelf/php-markdown/Readme.md create mode 100644 system/vendor/michelf/php-markdown/Readme.php create mode 100644 system/vendor/michelf/php-markdown/composer.json create mode 100644 system/vendor/michelf/php-markdown/phpunit.xml.dist create mode 100644 system/vendor/michelf/php-markdown/test/bootstrap.php create mode 100644 system/vendor/michelf/php-markdown/test/helpers/MarkdownTestHelper.php create mode 100644 system/vendor/michelf/php-markdown/test/integration/PhpMarkdownTest.php create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Amps and angle encoding.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Amps and angle encoding.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Auto links.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Auto links.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Backslash escapes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Backslash escapes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Blockquotes with code blocks.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Blockquotes with code blocks.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Code Blocks.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Code Blocks.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Code Spans.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Code Spans.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Hard-wrapped paragraphs with list-like lines.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Hard-wrapped paragraphs with list-like lines.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Horizontal rules.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Horizontal rules.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Images.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Images.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML (Advanced).text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML (Advanced).xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML (Simple).html create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML (Simple).text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML comments.html create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Inline HTML comments.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, inline style.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, inline style.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, reference style.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, reference style.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, shortcut references.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Links, shortcut references.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Literal quotes in titles.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Literal quotes in titles.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Markdown Documentation - Basics.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Markdown Documentation - Basics.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Markdown Documentation - Syntax.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Markdown Documentation - Syntax.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Nested blockquotes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Nested blockquotes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Ordered and unordered lists.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Ordered and unordered lists.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Strong and em together.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Strong and em together.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Tabs.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Tabs.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Tidyness.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/markdown.mdtest/Tidyness.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Abbr.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Abbr.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Backtick Fenced Code Blocks Special Cases.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Backtick Fenced Code Blocks Special Cases.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Backtick Fenced Code Blocks.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Backtick Fenced Code Blocks.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Definition Lists.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Definition Lists.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Emphasis.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Emphasis.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Footnotes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Footnotes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Headers with attributes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Headers with attributes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Inline HTML with Markdown content.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Inline HTML with Markdown content.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Link & Image Attributes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Link & Image Attributes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tables.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tables.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tilde Fenced Code Blocks Special Cases.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tilde Fenced Code Blocks Special Cases.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tilde Fenced Code Blocks.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown-extra.mdtest/Tilde Fenced Code Blocks.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Adjacent Lists.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Adjacent Lists.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Auto Links.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Auto Links.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Backslash escapes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Backslash escapes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code Spans.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code Spans.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block in a list item.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block in a list item.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block on second line.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block on second line.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block regressions.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Code block regressions.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Email auto links.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Email auto links.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Emphasis.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Emphasis.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Empty List Item.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Empty List Item.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Headers.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Headers.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Horizontal Rules.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Horizontal Rules.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML (Simple).html create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML (Simple).text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML (Span).text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML (Span).xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML comments.html create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Inline HTML comments.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Ins & del.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Ins & del.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Links, inline style.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Links, inline style.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/MD5 Hashes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/MD5 Hashes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Mixed OLs and ULs.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Mixed OLs and ULs.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Nesting.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Nesting.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/PHP-Specific Bugs.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/PHP-Specific Bugs.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Parens in URL.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Parens in URL.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Quotes in attributes.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Quotes in attributes.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Tight blocks.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/Tight blocks.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/XML empty tag.text create mode 100644 system/vendor/michelf/php-markdown/test/resources/php-markdown.mdtest/XML empty tag.xhtml create mode 100644 system/vendor/michelf/php-markdown/test/unit/MarkdownExtraTest.php create mode 100644 system/vendor/paragonie/constant_time_encoding/LICENSE.txt create mode 100644 system/vendor/paragonie/constant_time_encoding/README.md create mode 100644 system/vendor/paragonie/constant_time_encoding/composer.json create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base32.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base32Hex.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base64.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Binary.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Encoding.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/Hex.php create mode 100644 system/vendor/paragonie/constant_time_encoding/src/RFC4648.php create mode 100644 system/vendor/pragmarx/google2fa/CHANGELOG.md create mode 100644 system/vendor/pragmarx/google2fa/LICENSE.md create mode 100644 system/vendor/pragmarx/google2fa/README.md create mode 100644 system/vendor/pragmarx/google2fa/composer.json create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Contracts/Google2FA.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Contracts/IncompatibleWithGoogleAuthenticator.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Contracts/InvalidAlgorithm.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Contracts/InvalidCharacters.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Contracts/SecretKeyTooShort.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/Google2FAException.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/IncompatibleWithGoogleAuthenticatorException.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/InvalidAlgorithmException.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php create mode 100644 system/vendor/pragmarx/google2fa/src/Exceptions/SecretKeyTooShortException.php create mode 100644 system/vendor/pragmarx/google2fa/src/Google2FA.php create mode 100644 system/vendor/pragmarx/google2fa/src/Support/Base32.php create mode 100644 system/vendor/pragmarx/google2fa/src/Support/Constants.php create mode 100644 system/vendor/pragmarx/google2fa/src/Support/QRCode.php create mode 100644 system/vendor/suin/php-rss-writer/.gitignore create mode 100644 system/vendor/suin/php-rss-writer/.travis.yml create mode 100644 system/vendor/suin/php-rss-writer/Makefile create mode 100644 system/vendor/suin/php-rss-writer/README.md create mode 100644 system/vendor/suin/php-rss-writer/Tests/.gitignore create mode 100644 system/vendor/suin/php-rss-writer/Tests/Bootstrap.php create mode 100644 system/vendor/suin/php-rss-writer/Tests/README.md create mode 100644 system/vendor/suin/php-rss-writer/Tests/Suin/RSSWriter/ChannelTest.php create mode 100644 system/vendor/suin/php-rss-writer/Tests/Suin/RSSWriter/FeedTest.php create mode 100644 system/vendor/suin/php-rss-writer/Tests/Suin/RSSWriter/ItemTest.php create mode 100644 system/vendor/suin/php-rss-writer/Tests/composer.json create mode 100644 system/vendor/suin/php-rss-writer/Tests/phpunit.xml.dist create mode 100644 system/vendor/suin/php-rss-writer/composer.json create mode 100644 system/vendor/suin/php-rss-writer/docker-compose.development.yml create mode 100644 system/vendor/suin/php-rss-writer/docker-compose.yml create mode 100644 system/vendor/suin/php-rss-writer/examples/simple-feed.php create mode 100644 system/vendor/suin/php-rss-writer/phpunit.xml.dist create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/Channel.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/ChannelInterface.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/Feed.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/FeedInterface.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/Item.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/ItemInterface.php create mode 100644 system/vendor/suin/php-rss-writer/src/Suin/RSSWriter/SimpleXMLElement.php create mode 100644 system/vendor/voku/portable-ascii/CHANGELOG.md create mode 100644 system/vendor/voku/portable-ascii/LICENSE.txt create mode 100644 system/vendor/voku/portable-ascii/README.md create mode 100644 system/vendor/voku/portable-ascii/composer.json create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/ASCII.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x000.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x001.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x002.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x003.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x004.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x005.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x006.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x007.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x009.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x010.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x011.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x012.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x013.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x014.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x015.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x016.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x017.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x018.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x020.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x021.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x022.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x023.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x024.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x025.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x026.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x027.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x028.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x029.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x030.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x031.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x032.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x033.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x050.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x051.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x052.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x053.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x054.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x055.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x056.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x057.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x058.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x059.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x060.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x061.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x062.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x063.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x064.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x065.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x066.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x067.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x068.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x069.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x070.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x071.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x072.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x073.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x074.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x075.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x076.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x077.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x078.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x079.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x080.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x081.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x082.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x083.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x084.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x085.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x086.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x087.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x088.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x089.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x090.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x091.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x092.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x093.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x094.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x095.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x096.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x097.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x098.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x099.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php create mode 100644 system/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php create mode 100644 system/vendor/voku/stop-words/CHANGELOG.md create mode 100644 system/vendor/voku/stop-words/LICENSE create mode 100644 system/vendor/voku/stop-words/README.md create mode 100644 system/vendor/voku/stop-words/composer.json create mode 100644 system/vendor/voku/stop-words/src/voku/helper/StopWords.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/ar.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/bg.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/ca.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/cz.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/da.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/de.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/el.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/en.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/eo.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/es.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/et.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/fi.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/fr.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/hi.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/hr.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/hu.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/id.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/it.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/ka.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/lt.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/lv.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/nl.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/no.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/pl.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/pt.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/ro.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/ru.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/sk.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/sv.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/tr.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/uk.php create mode 100644 system/vendor/voku/stop-words/src/voku/helper/stopwords/vi.php create mode 100644 themes/blog/404-search.html.php create mode 100644 themes/blog/404.html.php create mode 100644 themes/blog/README.md create mode 100644 themes/blog/css/bootstrap-theme.min.css create mode 100644 themes/blog/css/bootstrap.min.css create mode 100644 themes/blog/css/font-awesome.min.css create mode 100644 themes/blog/css/styles.css create mode 100644 themes/blog/fonts/FontAwesome.otf create mode 100644 themes/blog/fonts/fontawesome-webfont.eot create mode 100644 themes/blog/fonts/fontawesome-webfont.svg create mode 100644 themes/blog/fonts/fontawesome-webfont.ttf create mode 100644 themes/blog/fonts/fontawesome-webfont.woff create mode 100644 themes/blog/fonts/fontawesome-webfont.woff2 create mode 100644 themes/blog/fonts/glyphicons-halflings-regular.eot create mode 100644 themes/blog/fonts/glyphicons-halflings-regular.svg create mode 100644 themes/blog/fonts/glyphicons-halflings-regular.ttf create mode 100644 themes/blog/fonts/glyphicons-halflings-regular.woff create mode 100644 themes/blog/images/logo.png create mode 100644 themes/blog/js/bootstrap.min.js create mode 100644 themes/blog/js/jquery-latest.min.js create mode 100644 themes/blog/layout.html.php create mode 100644 themes/blog/main.html.php create mode 100644 themes/blog/no-posts.html.php create mode 100644 themes/blog/post.html.php create mode 100644 themes/blog/profile.html.php create mode 100644 themes/blog/static.html.php create mode 100644 themes/clean/404-search.html.php create mode 100644 themes/clean/404.html.php create mode 100644 themes/clean/css/style.css create mode 100644 themes/clean/layout.html.php create mode 100644 themes/clean/main.html.php create mode 100644 themes/clean/no-posts.html.php create mode 100644 themes/clean/post.html.php create mode 100644 themes/clean/profile.html.php create mode 100644 themes/clean/static.html.php create mode 100644 themes/doks/404-search.html.php create mode 100644 themes/doks/404.html.php create mode 100644 themes/doks/LICENSE.txt create mode 100644 themes/doks/README.md create mode 100644 themes/doks/css/style.css create mode 100644 themes/doks/fonts/jost/jost-v4-latin-500.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-500.woff2 create mode 100644 themes/doks/fonts/jost/jost-v4-latin-500italic.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-500italic.woff2 create mode 100644 themes/doks/fonts/jost/jost-v4-latin-700.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-700.woff2 create mode 100644 themes/doks/fonts/jost/jost-v4-latin-700italic.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-700italic.woff2 create mode 100644 themes/doks/fonts/jost/jost-v4-latin-italic.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-italic.woff2 create mode 100644 themes/doks/fonts/jost/jost-v4-latin-regular.woff create mode 100644 themes/doks/fonts/jost/jost-v4-latin-regular.woff2 create mode 100644 themes/doks/img/soundcloud.jpg create mode 100644 themes/doks/js/main.js create mode 100644 themes/doks/js/toc.js create mode 100644 themes/doks/layout--static.html.php create mode 100644 themes/doks/layout.html.php create mode 100644 themes/doks/main.html.php create mode 100644 themes/doks/no-posts.html.php create mode 100644 themes/doks/post.html.php create mode 100644 themes/doks/profile.html.php create mode 100644 themes/doks/static.html.php create mode 100644 themes/logs/404-search.html.php create mode 100644 themes/logs/404.html.php create mode 100644 themes/logs/css/style.css create mode 100644 themes/logs/layout.html.php create mode 100644 themes/logs/main.html.php create mode 100644 themes/logs/no-posts.html.php create mode 100644 themes/logs/post.html.php create mode 100644 themes/logs/profile.html.php create mode 100644 themes/logs/static.html.php create mode 100644 themes/readable/404-search.html.php create mode 100644 themes/readable/404.html.php create mode 100644 themes/readable/css/style.css create mode 100644 themes/readable/img/facebook.png create mode 100644 themes/readable/img/googleplus.png create mode 100644 themes/readable/img/rss.png create mode 100644 themes/readable/img/share-facebook.png create mode 100644 themes/readable/img/share-googleplus.png create mode 100644 themes/readable/img/share-twitter.png create mode 100644 themes/readable/img/tumblr.png create mode 100644 themes/readable/img/twitter.png create mode 100644 themes/readable/layout.html.php create mode 100644 themes/readable/main.html.php create mode 100644 themes/readable/no-posts.html.php create mode 100644 themes/readable/post.html.php create mode 100644 themes/readable/profile.html.php create mode 100644 themes/readable/static.html.php create mode 100644 themes/readme.txt create mode 100644 themes/tailwind/404-search.html.php create mode 100644 themes/tailwind/404.html.php create mode 100644 themes/tailwind/LICENSE.txt create mode 100644 themes/tailwind/README.md create mode 100644 themes/tailwind/css/style.css create mode 100644 themes/tailwind/css/tailwind.css create mode 100644 themes/tailwind/css/typography.css create mode 100644 themes/tailwind/fonts/2d141e1a38819612-s.p.woff2 create mode 100644 themes/tailwind/fonts/62328fecf9e80426-s.woff2 create mode 100644 themes/tailwind/fonts/LICENSE.txt create mode 100644 themes/tailwind/fonts/c7eb187887c48af6-s.woff2 create mode 100644 themes/tailwind/img/soundcloud.jpg create mode 100644 themes/tailwind/js/functions.js create mode 100644 themes/tailwind/layout.html.php create mode 100644 themes/tailwind/logo.png create mode 100644 themes/tailwind/main.html.php create mode 100644 themes/tailwind/no-posts.html.php create mode 100644 themes/tailwind/post.html.php create mode 100644 themes/tailwind/profile.html.php create mode 100644 themes/tailwind/static--front.html.php create mode 100644 themes/tailwind/static.html.php create mode 100644 themes/twentyfifteen/404-search.html.php create mode 100644 themes/twentyfifteen/404.html.php create mode 100644 themes/twentyfifteen/LICENSE.txt create mode 100644 themes/twentyfifteen/README.md create mode 100644 themes/twentyfifteen/css/font.css create mode 100644 themes/twentyfifteen/css/ie.css create mode 100644 themes/twentyfifteen/css/ie7.css create mode 100644 themes/twentyfifteen/css/style.css create mode 100644 themes/twentyfifteen/css/style_v2.css create mode 100644 themes/twentyfifteen/genericons/COPYING.txt create mode 100644 themes/twentyfifteen/genericons/Genericons.eot create mode 100644 themes/twentyfifteen/genericons/Genericons.svg create mode 100644 themes/twentyfifteen/genericons/Genericons.ttf create mode 100644 themes/twentyfifteen/genericons/Genericons.woff create mode 100644 themes/twentyfifteen/genericons/LICENSE.txt create mode 100644 themes/twentyfifteen/genericons/README.md create mode 100644 themes/twentyfifteen/genericons/genericons.css create mode 100644 themes/twentyfifteen/images/avatar.png create mode 100644 themes/twentyfifteen/js/functions.js create mode 100644 themes/twentyfifteen/js/html5.js create mode 100644 themes/twentyfifteen/js/jquery-migrate.js create mode 100644 themes/twentyfifteen/js/jquery.js create mode 100644 themes/twentyfifteen/js/skip-link-focus-fix.js create mode 100644 themes/twentyfifteen/layout.html.php create mode 100644 themes/twentyfifteen/main.html.php create mode 100644 themes/twentyfifteen/no-posts.html.php create mode 100644 themes/twentyfifteen/post.html.php create mode 100644 themes/twentyfifteen/profile.html.php create mode 100644 themes/twentyfifteen/static.html.php create mode 100644 themes/twentysixteen/404-search.html.php create mode 100644 themes/twentysixteen/404.html.php create mode 100644 themes/twentysixteen/LICENSE.txt create mode 100644 themes/twentysixteen/README.md create mode 100644 themes/twentysixteen/css/ie.css create mode 100644 themes/twentysixteen/css/ie7.css create mode 100644 themes/twentysixteen/css/ie8.css create mode 100644 themes/twentysixteen/css/rtl.css create mode 100644 themes/twentysixteen/css/style.css create mode 100644 themes/twentysixteen/genericons/COPYING.txt create mode 100644 themes/twentysixteen/genericons/Genericons.eot create mode 100644 themes/twentysixteen/genericons/Genericons.svg create mode 100644 themes/twentysixteen/genericons/Genericons.ttf create mode 100644 themes/twentysixteen/genericons/Genericons.woff create mode 100644 themes/twentysixteen/genericons/LICENSE.txt create mode 100644 themes/twentysixteen/genericons/README.md create mode 100644 themes/twentysixteen/genericons/genericons.css create mode 100644 themes/twentysixteen/img/avatar.png create mode 100644 themes/twentysixteen/js/functions.js create mode 100644 themes/twentysixteen/js/html5.js create mode 100644 themes/twentysixteen/js/jquery-migrate.js create mode 100644 themes/twentysixteen/js/jquery.js create mode 100644 themes/twentysixteen/js/skip-link-focus-fix.js create mode 100644 themes/twentysixteen/layout.html.php create mode 100644 themes/twentysixteen/main.html.php create mode 100644 themes/twentysixteen/no-posts.html.php create mode 100644 themes/twentysixteen/post.html.php create mode 100644 themes/twentysixteen/profile.html.php create mode 100644 themes/twentysixteen/static.html.php create mode 100644 upload.php diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt new file mode 100644 index 0000000..e9391db --- /dev/null +++ b/COPYRIGHT.txt @@ -0,0 +1,57 @@ +Copyright (c) 2014-2024 Danang Probo Sayekti. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program as the file LICENSE.txt; if not, please see +http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +HTMLy includes works under other copyright notices and distributed +according to the terms of the GNU General Public License or a compatible +license, including: + + Dispatch - (c) 2014 Jesus A. Domingo + + Composer - (c) 2011 Nils Adermann, Jordi Boggiano + + PHP Markdown & Extra - (c) 2004-2009 Michel Fortin + + Markdown - (c) 2003-2006 John Gruber + + RSSWriter - (c) Suin + + Showdown code - (c) 2007 John Fraser + + Pagedown modifications and bugfixes - (c) 2009 Dana Robinson + + Pagedown modifications and bugfixes - (c) 2009-2013 Stack Exchange Inc. + + jQuery - (c) The jQuery Foundation + + jQuery UI - (c) The jQuery Foundation + + Hub Updater - (c) Kanti.de + + Password Compat - (c) Anthony Ferrara + + URLify for PHP by jbroadway based on URLify.js - (c) Django Software Foundation and individual contributors + + Twenty Fifteen & Twenty Sixteen theme - (c) WordPress.org & Automattic.com + + Bootstrap - Copyright 2011-2019 The Bootstrap Authors + + AdminLTE - Copyright 2014-2020 Colorlib + + Font Awesome - @davegandy + + Nestable jQuery Plugin - Copyright (c) 2012 David Bushell + + Social Logos - (c) Automattic diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md old mode 100755 new mode 100644 index cc8afc8..4328b62 --- a/README.md +++ b/README.md @@ -1 +1,64 @@ -# kyledot.net +# [![HTMLy logo](https://raw.githubusercontent.com/danpros/htmly/master/system/resources/images/htmly-small.png)](https://www.htmly.com/) + +HTMLy is an open source databaseless blogging platform prioritizes simplicity and speed written in PHP. + +It uses a unique algorithm to find or list any content based on date, type, category, tag, or author, and it's performance remain fast even if we have ten thousand of posts and hundreds of tags. + +## Requirements + +HTMLy requires PHP 7.2 or greater, PHP-Mbstring, PHP-XML, PHP-INTL, PHP-GD, and PHP-ZIP package for backup feature. + +## Installations + +Install HTMLy using the source code: + + 1. Download the latest version from the [Github repo](https://github.com/danpros/htmly/releases/latest) + 2. Upload and extract the zip file to your web server. You can upload it in the root directory, or in subdirectory such as `htmly`. + 3. Visit your domain. If you extract it in root directory visit `https://www.example.com/install.php` and if in subdirectory visit `https://www.example.com/htmly/install.php`. + 4. Follow the installer to install HTMLy. + 5. The installer will try to delete itself. Please delete the installer manually if the `install.php` still exist. + +**Note:** If you don't need to log in to the dashboard, just rename `config.ini.example` to `config.ini`, delete `install.php`, and you are set. It's always good practice to set the `site.url` + +### Online install + +Install HTMLy without downloading the source code and use the online installer: + + 1. Download `online-installer.php` from the [latest release](https://github.com/danpros/htmly/releases/latest) + 2. If you upload it in root directory visit `https://www.example.com/online-installer.php` or if in subdirectory visit `https://www.example.com/subdirectory/online-installer.php`. + 3. Follow the installer to install HTMLy. + 4. Please delete the installer manually if the `online-installer.php` and `install.php` still exist. + +## Configurations + +Set written permission for the `cache` and `content` directories. + +Users assigned with the admin role can edit/delete all users posts. + +To access the admin panel, add `/login` to the end of your site's URL. +e.g. `www.yoursite.com/login` + +## Resources + + - Homepage: [HTMLy Homepage](https://www.htmly.com/) + - Documentation: [HTMLy Docs](https://docs.htmly.com/) + - Themes: [HTMLy Themes](https://www.htmly.com/theme/) + - Demo: [HTMLy Demo](http://demo.htmly.com/) + - Repository: [Github](https://github.com/danpros/htmly/) + +## Contribute + +1. Fork and edit +2. Submit pull request for consideration + +## Contributors + +Thank you to our [contributors](https://github.com/danpros/htmly/graphs/contributors) + +## Sponsors + +Support this project by becoming a [sponsor](https://github.com/sponsors/danpros) + +## Copyright / License + +For copyright notice please read [COPYRIGHT.txt](https://github.com/danpros/htmly/blob/master/COPYRIGHT.txt). HTMLy is licensed under the GNU General Public License Version 2.0 (or later). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..2f5ad6d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,5 @@ +## Security Policy + +### Reporting Vulnerability + +Please report any security vulnerabilities to **[dan@danpros.com](mailto:dan@danpros.com)**. If we can confirm the issue, we will release a patch as soon as possible. diff --git a/cache/installedVersion.json b/cache/installedVersion.json new file mode 100644 index 0000000..20e830a --- /dev/null +++ b/cache/installedVersion.json @@ -0,0 +1,3 @@ +{ + "tag_name": "v3.0.3" +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6394dcb --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "config": { + "vendor-dir": "system/vendor/", + "optimize-autoloader": true, + "platform": { + "php": "7.2" + } + }, + "require": { + "ircmaxell/password-compat": "1.*", + "michelf/php-markdown": "1.*", + "suin/php-rss-writer": "1.*", + "kanti/hub-updater": "0.*", + "jbroadway/urlify": "^1.0", + "pragmarx/google2fa": "^8.0", + "bacon/bacon-qr-code": "^3.0" + }, + "autoload": { + "files": [ + "system/includes/dispatch.php", + "system/includes/functions.php", + "system/admin/admin.php", + "system/includes/session.php", + "system/includes/opml.php" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..dfd36fe --- /dev/null +++ b/composer.lock @@ -0,0 +1,718 @@ +{ + "_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#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "2628919cda4d7c16d0e4281811334ad7", + "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "510de6eca6248d77d31b339d62437cc995e2fb41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/510de6eca6248d77d31b339d62437cc995e2fb41", + "reference": "510de6eca6248d77d31b339d62437cc995e2fb41", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^8.1" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.12", + "phpunit/phpunit": "^10.5.11 || 11.0.4", + "spatie/phpunit-snapshot-assertions": "^5.1.5", + "squizlabs/php_codesniffer": "^3.9" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.0" + }, + "time": "2024-04-18T11:16:25+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-03-15T14:00:32+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + }, + "time": "2023-08-25T16:18:39+00:00" + }, + { + "name": "ircmaxell/password-compat", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/ircmaxell/password_compat.git", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "files": [ + "lib/password.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthony Ferrara", + "email": "ircmaxell@php.net", + "homepage": "http://blog.ircmaxell.com" + } + ], + "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", + "homepage": "https://github.com/ircmaxell/password_compat", + "keywords": [ + "hashing", + "password" + ], + "support": { + "issues": "https://github.com/ircmaxell/password_compat/issues", + "source": "https://github.com/ircmaxell/password_compat/tree/v1.0" + }, + "time": "2014-11-20T16:49:30+00:00" + }, + { + "name": "jbroadway/urlify", + "version": "1.2.4-stable", + "source": { + "type": "git", + "url": "https://github.com/jbroadway/urlify.git", + "reference": "d0fafbaa1dc14e8039cdf5c72a932a8d1de1750e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jbroadway/urlify/zipball/d0fafbaa1dc14e8039cdf5c72a932a8d1de1750e", + "reference": "d0fafbaa1dc14e8039cdf5c72a932a8d1de1750e", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "voku/portable-ascii": "^2.0", + "voku/stop-words": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "URLify": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause-Clear" + ], + "authors": [ + { + "name": "Johnny Broadway", + "email": "johnny@johnnybroadway.com", + "homepage": "http://www.johnnybroadway.com/" + } + ], + "description": "A fast PHP slug generator and transliteration library that converts non-ascii characters for use in URLs.", + "homepage": "https://github.com/jbroadway/urlify", + "keywords": [ + "ascii", + "blogging", + "blogs", + "downcode", + "encode", + "iconv", + "link", + "seo", + "slug", + "slugify", + "slugs", + "translit", + "transliterate", + "transliteration", + "unicode", + "url", + "urlify" + ], + "support": { + "issues": "https://github.com/jbroadway/urlify/issues", + "source": "https://github.com/jbroadway/urlify/tree/1.2.4-stable" + }, + "time": "2022-06-15T16:46:46+00:00" + }, + { + "name": "kanti/hub-updater", + "version": "v0.5.1", + "source": { + "type": "git", + "url": "https://github.com/Kanti/hub-updater.git", + "reference": "014b33c1e3880bd8e037a960a89e7116eb08a26e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Kanti/hub-updater/zipball/014b33c1e3880bd8e037a960a89e7116eb08a26e", + "reference": "014b33c1e3880bd8e037a960a89e7116eb08a26e", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "php": ">=5.3.6" + }, + "require-dev": { + "codeclimate/php-test-reporter": "0.*", + "friendsofphp/php-cs-fixer": "1.*", + "phpro/grumphp": "0.*", + "phpunit/phpunit": "4.*", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Kanti\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Kanti", + "email": "git@kanti.de", + "homepage": "https://kanti.de", + "role": "Developer" + } + ], + "description": "Simple Github Updater for Web Projects", + "support": { + "forum": "https://github.com/Kanti/hub-updater/issues", + "issues": "https://github.com/Kanti/hub-updater/issues", + "source": "https://github.com/Kanti/hub-updater" + }, + "abandoned": true, + "time": "2016-08-02T19:12:55+00:00" + }, + { + "name": "michelf/php-markdown", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/michelf/php-markdown.git", + "reference": "5024d623c1a057dcd2d076d25b7d270a1d0d55f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michelf/php-markdown/zipball/5024d623c1a057dcd2d076d25b7d270a1d0d55f3", + "reference": "5024d623c1a057dcd2d076d25b7d270a1d0d55f3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.3 <5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Michelf\\": "Michelf/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Michel Fortin", + "email": "michel.fortin@michelf.ca", + "homepage": "https://michelf.ca/", + "role": "Developer" + }, + { + "name": "John Gruber", + "homepage": "https://daringfireball.net/" + } + ], + "description": "PHP Markdown", + "homepage": "https://michelf.ca/projects/php-markdown/", + "keywords": [ + "markdown" + ], + "support": { + "issues": "https://github.com/michelf/php-markdown/issues", + "source": "https://github.com/michelf/php-markdown/tree/1.9.1" + }, + "time": "2021-11-24T02:52:38+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2024-05-08T12:18:48+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + }, + "time": "2022-06-13T21:57:56+00:00" + }, + { + "name": "suin/php-rss-writer", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/suin/php-rss-writer.git", + "reference": "78f45e44a2a7cb0d82e4b9efb6f7b7a075b9051c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/suin/php-rss-writer/zipball/78f45e44a2a7cb0d82e4b9efb6f7b7a075b9051c", + "reference": "78f45e44a2a7cb0d82e4b9efb6f7b7a075b9051c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "eher/phpunit": ">=1.6", + "mockery/mockery": ">=0.7.2", + "suin/xoopsunit": ">=1.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Suin\\RSSWriter": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "suin", + "email": "suinyeze@gmail.com" + } + ], + "description": "Yet another simple RSS writer library for PHP 5.4 or later.", + "homepage": "https://github.com/suin/php-rss-writer", + "keywords": [ + "feed", + "generator", + "php", + "rss", + "writer" + ], + "support": { + "issues": "https://github.com/suin/php-rss-writer/issues", + "source": "https://github.com/suin/php-rss-writer/tree/master" + }, + "time": "2017-07-13T10:47:50+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "voku/stop-words", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/stop-words.git", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Stop-Words via PHP", + "keywords": [ + "stop words", + "stop-words" + ], + "support": { + "issues": "https://github.com/voku/stop-words/issues", + "source": "https://github.com/voku/stop-words/tree/master" + }, + "time": "2018-11-23T01:37:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "platform-overrides": { + "php": "7.2" + }, + "plugin-api-version": "2.6.0" +} diff --git a/config/.htaccess b/config/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/config/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/config/config.ini.example b/config/config.ini.example new file mode 100644 index 0000000..972f790 --- /dev/null +++ b/config/config.ini.example @@ -0,0 +1,208 @@ +; The URL of your blog. +site.url = "" + +; Your timezone +timezone = "Asia/Jakarta" + +; Date format. +date.format = "d F Y" + +; Your language (example "en_US" for English or "de_DE" for German. +; See lang directory for available language) +language = "en_US" + +; Blog info +blog.title = "HTMLy" +blog.tagline = "Just another HTMLy blog" +blog.description = "Proudly powered by HTMLy, a databaseless blogging platform." +blog.copyright = "(c) Your name." + +; Set permalink type. "default" using /year/month/title. "post" using /post/title +permalink.type = "default" + +; Make the frontpage static. Options "false" and "true" +static.frontpage = "false" + +; Show the /blog url as the blog homepage. Options "false" and "true" +blog.enable = "false" +blog.path = "blog" +blog.string = "Blog" + +; Social account +social.bluesky = "" +social.twitter = "" +social.facebook = "" +social.instagram = "" +social.linkedin = "" +social.github = "" +social.youtube = "" +social.mastodon = "" +social.tiktok = "" + +; Breadcrumb home text. Useful when installed on subfolder. +breadcrumb.home = "Home" + +; Comment system. Choose "facebook", "disqus", or "disable". +comment.system = "disable" + +; Facebook comments +fb.appid = "" +fb.num = "5" +fb.color = "light" + +; Disqus comments +disqus.shortname = "" + +; Google Web Master Tool ID verification +google.wmt.id = "" + +; Google analytics +google.analytics.id = "" + +; Google gtag analytics +google.gtag.id = "" + +; Login protection system Choose "google", "cloudflare", or "disable". +; https://www.google.com/recaptcha/admin +; https://developers.cloudflare.com/turnstile/ + +login.protect.system = "disable" +login.protect.public = "" +login.protect.private = "" + +; Multi-factor authentication +mfa.state = "false" + +; Pagination, RSS, and JSON +posts.perpage = "10" +category.perpage = "10" +tag.perpage = "10" +archive.perpage = "10" +search.perpage = "10" +profile.perpage = "10" +type.perpage = "10" +json.count = "10" + +; Category info +category.info = "true" + +; Related posts +related.count = "3" + +; Recent posts +recent.count = "5" + +; Popular posts +popular.count = "5" + +; Tagcloud +tagcloud.count = "40" + +; Read more link text for "full" teaser type +read.more = "Read more" + +; Teaser type: set "trimmed" or "full". +teaser.type = "full" + +; In summary mode, whether check the shortcode first or not before trim the content to x char +; Options: "default" and "check" +teaser.behave = "default" + +; Teaser character count +teaser.char = "200" + +; Description character count +description.char = "150" + +; rss description type. body or meta +rss.description = "body" + +; RSS feed count +rss.count = "10" + +; RSS feed description length. If left empty we will use full page. +rss.char = "200" + +; Enable views Counter, the options is "true" and "false". +; If set to "true", you can see the Counts in Admin page and popular posts. +views.counter = "false" + +; Sitemap priorities between "0.0" and "1.0". +; Set "-1" (minus one) to disable a sitemap for the given type. (See /sitemap.xml) +sitemap.priority.base = "1.0" +sitemap.priority.post = "0.5" +sitemap.priority.static = "0.5" +sitemap.priority.category = "0.5" +sitemap.priority.tag = "0.5" +sitemap.priority.archiveMonth = "0.5" +sitemap.priority.archiveYear = "0.5" +sitemap.priority.author = "0.5" +sitemap.priority.type = "0.5" + +; Also install pre-release +prerelease = "false" + +; Cache expiration in hour. Eg. "6", "12". Default 6 hours. +cache.expiration = "6" + +; Switch on and off the file cache for development purposes. Options "false" and "true" +cache.off = "false" + +; Switch on and off the page generation time. Options "false" and "true" +generation.time = "false" + +; Switch on and off the cache timestamp. Options "false" and "true" +cache.timestamp = "false" + +; The site.url depends on where you are visiting from. Same installation +multi.site = "false" + +; TOC label +toc.label = "Table of Contents" + +; TOC inital state. Option "close and "open" +toc.state = "close" + +; Load the default style or not. Option "default" and "theme" +toc.style = "default" + +; Automatically add TOC, but first it check if the shortcode available or not +; Option "true" and "false" +toc.automatic = "false" + +; Automatically insert the TOC after x paragraph +toc.position = "1" + +; Title formats +home.title.format = "%blog_title% - %blog_tagline%" +post.title.format = "%post_title% - %blog_title%" +page.title.format = "%page_title% - %blog_title%" +category.title.format = "%category_title% - %blog_title%" +tag.title.format = "%tag_title% - %blog_title%" +archive.title.format = "%archive_title% - %blog_title%" +search.title.format = "%search_title% - %blog_title%" +type.title.format = "%type_title% - %blog_title%" +profile.title.format = "%author_name% - %blog_title%" +blog.title.format = "Blog - %blog_title%" +default.title.format = "%page_title% - %blog_title%" + +; Default image for Open Graph +default.image = "" + +; Favicon image +favicon.image = "" + +; Autosave +autosave.enable = "true" + +; Show HTMLy version +show.version = "true" + +; Set the theme here +views.root = "themes/tailwind" + +; Framework config. No need to edit. +views.layout = "layout" + +; Admin theme mode: light or dark +admin.theme = "light" \ No newline at end of file diff --git a/config/users/username.ini.example b/config/users/username.ini.example new file mode 100644 index 0000000..86edf40 --- /dev/null +++ b/config/users/username.ini.example @@ -0,0 +1,11 @@ +;Password +password = yourpassword + +;Encryption. Set to clear, and later it will changed to password_hash automatically during login +encryption = clear + +;Role +role = admin + +;MFA Secret - This is generated inside of the admin area, set to "disabled" to turn off MFA for a user. +mfa_secret = disabled \ No newline at end of file diff --git a/content/.gitkeep b/content/.gitkeep new file mode 100644 index 0000000..da65661 --- /dev/null +++ b/content/.gitkeep @@ -0,0 +1 @@ +This folder must writeable by your server. diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..631d8c017729b97014017a179e8d9968f6f62bd8 GIT binary patch literal 1414 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Mv>2~2MaLa#GUy`Y4UTL84#CABECEH%ZgC_h&L>|v`++-|YNX&zK> z3U0SJ;?%1Tbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWps-5t%dih+UgkEe@cNX4x; zGxz#2ISL#vpVr+eqEZ$yuB?2>o(@SdD=F=`67o7Pwflah6MqQSF(70cpSEB zt>-sc+qi!&V`{77HW9BH(J1CMjQ?yIw#p{3Ok+O4m7x&6>q-8C4Ka&f?fm?ALKuVn z-otz4uFlZC?DJxJ)aKKBjURbvNm~nEc-(#5cJE>KO;4k%6Xvq1^>_Zf_hQk#sD;*C zv(i$n_I@b4pZ<0BiM^>CrL*Lx{Mutv>0sov^O4d+*LPnh{t$OxP`+F9u99cIq^IlN z-%Imi4LK?s7Ig>S*?H!fPsLVe1BO*WW_9%kGGFDqZsmISMmYbqZPJoUk3?>63CmNu zTya60{X+ewnk6!~?1a1jFn*fksnO8U;Jn+~WYweA?0)#Y)%?Gqw>AgDrbHcvIGPi z_Yleq*|PAQRX!)Hz!nQFpQ0+oy;2UR8S}K#f|y0`vn>zqShlGChh0FhUG(lO&ZtU- e)d};Nco>|2O}b`u<*^#5Wb}0Pb6Mw<&;$U@k_3VP literal 0 HcmV?d00001 diff --git a/humans.txt b/humans.txt new file mode 100644 index 0000000..a3e54cb --- /dev/null +++ b/humans.txt @@ -0,0 +1,14 @@ +/* TEAM */ +Owner: danpros +Github: https://github.com/danpros +Weblog: https://www.danpros.com + +Contributor: Kanti +Github: https://github.com/Kanti +Weblog: https://kanti.de +Location: Stuttgart - Germany + +Full contributor: https://github.com/danpros/htmly/graphs/contributors + +/* SITE */ +Software: HTMLy diff --git a/index.php b/index.php new file mode 100644 index 0000000..1171256 --- /dev/null +++ b/index.php @@ -0,0 +1,6 @@ +errors[] = $message; + } + + protected $warnings = array(); + + public function warning($message) { + $this->warnings[] = $message; + } + + public function run() { + $string = ""; + if (!empty($this->errors)) { + foreach ($this->errors as $error) { + $string .= '

' . $error . "

"; + } + } + if (!empty($this->warnings)) { + foreach ($this->warnings as $warning) { + $string .= '

' . $warning . "

"; + } + } + return $string; + } + +} + +class Settings +{ + + protected $user = ""; + protected $userPassword = ""; + protected $siteUrl = ""; + + protected $overwriteEmptyForm = array( + "social.twitter" => "", + "social.facebook" => "", + ); + + protected function extractUser() + { + $this->user = (string)$_REQUEST["user_name"]; + unset($_REQUEST["user_name"]); + $this->userPassword = (string)$_REQUEST["user_password"]; + unset($_REQUEST["user_password"]); + } + + protected function convertRequestToConfig() + { + $array = array(); + foreach ($_REQUEST as $name => $value) { + if (!is_string($value) || empty($value)) + continue; + $name = str_replace("_", ".", $name); + $array[$name] = $value; + } + foreach ($this->overwriteEmptyForm as $name => $value) { + if (!isset($array[$name])) { + $array[$name] = $value; + } + } + return $array; + } + + protected function generateSiteUrl() + { + $dir = trim(dirname(substr($_SERVER["SCRIPT_FILENAME"], strlen($_SERVER["DOCUMENT_ROOT"]))), '/'); + if ($dir == '.' || $dir == '..') { + $dir = ''; + } + $port = ''; + if ($_SERVER["SERVER_PORT"] != "80" && $_SERVER["SERVER_PORT"] != "443") { + $port = ':' . $_SERVER["SERVER_PORT"]; + } + $scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http'; + if ($dir === '') { + $this->siteUrl = $scheme . '://' . trim($_SERVER['SERVER_NAME'], "/") . $port . "/"; + return; + } + $this->siteUrl = $scheme . '://' . trim($_SERVER['SERVER_NAME'], "/") . $port . "/" . $dir . '/'; + } + + protected function overwriteINI($data, $string) + { + foreach ($data as $word => $value) { + $string = preg_replace("/^" . $word . " = .+$/m", $word . ' = "' . $value . '"', $string); + } + return $string; + } + + protected function saveConfigs() + { + $this->extractUser(); + //save config.ini + $config = array( + "site.url" => $this->siteUrl, + "timezone" => $this->getTimeZone(), + ); + $config += $this->convertRequestToConfig(); + $configFile = file_get_contents("config/config.ini.example"); + $configFile = $this->overwriteINI($config, $configFile); + file_put_contents("config/config.ini", $configFile, LOCK_EX); + + //save users/[Username].ini + $userFile = file_get_contents("config/users/username.ini.example"); + $parsed = parse_ini_string($userFile); + if (isset($parsed['encryption'])) { + $userFile = $this->overwriteINI(array( + 'encryption' => 'sha512', + 'password' => hash('sha512', $this->userPassword), + 'role' => 'admin', + 'mfa_secret' => 'disabled', + ), $userFile); + } else { + $userFile = $this->overwriteINI(array( + "password" => $this->userPassword, + 'role' => 'admin', + 'mfa_secret' => 'disabled', + ), $userFile); + } + file_put_contents("config/users/" . $this->user . ".ini", $userFile, LOCK_EX); + } + + protected function testTheEnvironment() + { + $message = new Message; + + if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) { + $message->error('HTMLy requires at least PHP 5.3 to run.'); + } + if (!in_array('https', stream_get_wrappers())) { + $message->error('Installer needs the https wrapper, please install openssl.'); + } + if (function_exists('apache_get_modules') && !in_array('mod_rewrite', apache_get_modules())) { + $message->warning('mod_rewrite must be enabled if you use Apache.'); + } + if (!is__writable("./")) { + $message->error('no permission to write in the Directory.'); + } + return $message->run(); + } + + public function __construct() + { + $message = $this->testTheEnvironment(); + + $this->generateSiteUrl(); + if (!empty($message)) { + echo $message; + } elseif ($this->runForm()) { + unlink(__FILE__); + header("Location:" . $this->siteUrl . "add/content?type=post"); + exit(); + } + } + + protected function getTimeZone() + { + static $ip; + if (empty($ip)) { + $ip = @file_get_contents("http://ipecho.net/plain"); + if (!is_string($ip)) { + $ip = $_SERVER['REMOTE_ADDR']; + } + } + $json = @json_decode(@file_get_contents("http://ip-api.com/json/" . $ip), true); + if (isset($json['timezone'])) + return $json['timezone']; + return 'Europe/Berlin'; + } + + protected function runForm() + { + if (from($_REQUEST, 'user_name') && from($_REQUEST, 'user_password')) { + $this->saveConfigs(); + $_SESSION[$this->siteUrl]["user"] = $this->user; + return true; + } else { + unset($_SESSION[$this->siteUrl]["user"]); + return false; + } + } + +} + +if(from($_SERVER,'QUERY_STRING') == "rewriteRule.html") +{ + echo "YES!"; + die(); +} + +$samesite = 'strict'; +if(PHP_VERSION_ID < 70300) { + session_set_cookie_params('samesite='.$samesite); +} else { + session_set_cookie_params(['samesite' => $samesite]); +} + +session_start(); +new Settings; + +?> + + + + + + +HTMLy Installer + + +
+
+ +
+
+
+
+ +
+ + +
+ + +
+
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ + +
+ + +
+ + + + +
+
+

+
Based on HTMLy installer (https://github.com/Kanti/htmly-installer) by Matthias Vogel
+
+
+ + + diff --git a/lang/ar_AR.ini b/lang/ar_AR.ini new file mode 100644 index 0000000..132fedb --- /dev/null +++ b/lang/ar_AR.ini @@ -0,0 +1,326 @@ +about = "حول" +add_category = "إضافة فئة" +add_content = "إضافة محتوى" +add_link = "إضافة ارتباط" +add_menu = "إضافة قائمة" +add_new_page = "إضافة صفحة جديدة" +add_new_post = "إضافة منشور جديد" +add_source_link_optional = "إضافة رابط المصدر (اختياري)" +add_sub = "إضافة صفحة فرعية" +address_url = "العنوان (URL)" +admin = "المسؤول" +admin_panel_style_based_on = "نمط لوحة المشرف يعتمد على" +all_blog_posts = "كافة منشورات المدونة" +all_cache_has_been_deleted = "تم حذف كل ذاكرة التخزين المؤقت!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "أرشيفات" +are_you_sure_you_want_to_delete_ = "هل أنت متأكد أنك تريد حذف ٪ s ؟" +at_the_moment_you_are_using_auto_generated_menu = "في الوقت الحالي أنت تستخدم قائمة تم إنشاؤها تلقائيًا." +audio_post = "مشاركة صوتية" +audio_post_comment = "إنشاء منشور مدونة بصوت مميز" +author = "المؤلف" +author_description = "Just another HTMLy user" +back_to = "رجوع إلى" +backup = "النسخ الاحتياطي" +blog_description = "في فقرة واحدة ، أخبرنا بالمزيد عن مدونتك." +blog_theme = "سمة المدونة" +blog_title = "عنوان المدونة" +blog_title_placeholder = "مدونة HTMLy الخاصة بي" +blog_posts_displayed_as = "تم عرض مشاركات المدونة على شكل" +breadcrumb_home_text = "نص الصفحة الرئيسية لمسار التنقل" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "باستخدام هذا المستورد ، فأنت توافق على ما إذا كانت الخلاصة ملكك أو على الأقل لديك الصلاحية لنشرها." +css_class_optional = "فئة CSS (اختياري)" +cache_expiration = "انتهاء صلاحية ذاكرة التخزين المؤقت (بالساعات)" +cache_off = "إيقاف ذاكرة التخزين المؤقت" +cache_timestamp = "الطابع الزمني لذاكرة التخزين المؤقت" +cancel = "إلغاء" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "فئات" +category = "فئة" +check_update = "تحقق من التحديث" +clear_cache = "مسح ذاكرة التخزين المؤقت" +comma_separated_values = "قيم مفصولة بفواصل" +comment_system = "نظام التعليق" +comments = "تعليقات" +config = "التكوين" +congrats_you_have_the_latest_version_of_htmly = "تهانينا! لديك أحدث إصدار من HTMLy." +content = "المحتوى" +contents = "المحتويات" +copyright_line = "خط حقوق النشر" +copyright_line_placeholder = "(ج) اسمك." +create_backup = "إنشاء نسخة احتياطية" +created = "تم إنشاؤه" +custom = "مخصص" +custom_settings = "إعدادات مخصصة" +dashboard = "لوحة المعلومات" +date = "التاريخ" +date_format = "تنسيق التاريخ" +delete = "حذف" +description = "الوصف" +disable = "تعطيل" +disabled = "معطل" +disqus_shortname = "اسم قصير لمناقصة" +disqus_shortname_placeholder = "htmly" +draft = "مسودة" +edit = "تحرير" +edit_category = "تحرير فئة" +edit_post = "Edit" +edit_profile = "تحرير ملف التعريف" +enable = "تمكين" +enable_blog_url = "تمكين عنوان URL للمدونة" +enter_image_url = "أدخل عنوان URL للصورة" +facebook_app_id = "معرف تطبيق Facebook" +facebook_page = "صفحة Facebook" +featured_audio = "صوت مميز" +featured_image = "صورة مميزة" +featured_link = "رابط مميز" +featured_quote = "اقتباس مميز" +featured_video = "فيديو مميز" +feed_url = "موجز URL" +filename = "اسم الملف" +follow = "متابعة" +for_google_site_verification_meta = "بالنسبة إلى تعريف موقع google-site-verification" +front_page_displays = "الصفحة الأولى تعرض" +full_post = "مشاركة كاملة" +general = "عام" +general_settings = "إعدادات عامة" +get_one_here = "احصل على واحد هنا" +github_pre_release = "الإصدار التجريبي من Github" +google_analytics = "تحليلات Google" +google_analytics_legacy = "Google Analytics (قديم)" +google_search_console = "Google Search Console" +home = "الصفحة الرئيسية" +if_left_empty_we_will_excerpt_it_from_the_content_below = "إذا تركت فارغة ، فسنقتطفها من المحتوى أدناه" +if_the_url_is_left_empty_we_will_use_the_page_title = "إذا ترك عنوان url فارغًا ، فسنستخدم عنوان الصفحة" +if_the_url_is_left_empty_we_will_use_the_post_title = "إذا ترك عنوان url فارغًا ، فسنستخدم عنوان المنشور" +image_post = "مشاركة صورة" +image_post_comment = "إنشاء منشور مدونة بصورة مميزة" +import = "استيراد" +import_feed = "بدء استيراد موجز ويب" +import_rss = "استيراد RSS" +import_rss_feed_2.0 = "استيراد موجز RSS 2.0" +insert_image = "إدراج صورة" +invalid_error = "ERROR: Invalid username or password" +language = "لغة النظام" +link_name = "اسم الرابط" +link_post = "رابط المنشور" +link_post_comment = "إنشاء منشور مدونة مع ارتباط مميز" +login = "تسجيل الدخول" +login_page = "صفحة تسجيل الدخول" +logout = "تسجيل الخروج" +menu = "Menu" +menus = "محرر القائمة" +meta_description = "وصف التعريف" +meta_description_character = "حرف وصف التعريف" +metatags = "العلامات الوصفية" +metatags_settings = "إعدادات العلامات الوصفية" +mine = "ملكي" +more = "المزيد" +my_draft = "مسودتي" +my_posts = "مشاركاتي" +name = "الاسم" +newer = "أحدث" +next = "التالي" +next_post = "المنشور التالي" +no_available_backup = "لا يوجد نسخ احتياطي متوفر في الوقت الحالي." +no_draft_found = "لم يتم العثور على مسودة" +no_posts_found = "لم يتم العثور على أية مشاركات" +no_related_post_found = "لم يتم العثور على منشور ذي صلة" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "لا" +not = "لا" +older = "أقدم" +only = "فقط" +operations = "العمليات" +page = "Page" +page_generation_time = "وقت إنشاء الصفحة" +pages = "Pages" +pass_error = "Password field is required" +password = "كلمة المرور" +performance = "أداء" +performance_settings = "إعدادات الأداء" +permalink = "الرابط الثابت" +popular = "Popular" +popular_posts = "المشاركات الشائعة" +popular_posts_widget = "أداة المشاركات الشائعة" +popular_posts_widget_at_most = "أداة المشاركات الشائعة على الأكثر" +popular_tags = "العلامات الشائعة" +post_by_author = "Posts by this author" +posted_in = "تم النشر في" +posted_on = "تم النشر في" +posts = "المشاركات" +posts_by = "Posts by" +posts_draft = "مسودة المشاركات" +posts_in_archive_page_at_most = "المشاركات في صفحة الأرشيف على الأكثر" +posts_in_category_page_at_most = "المشاركات في صفحة الفئات على الأكثر" +posts_in_front_page_show_at_most = "تظهر المشاركات في الصفحة الأولى على الأكثر" +posts_in_profile_page_at_most = "المشاركات في صفحة الملف الشخصي على الأكثر" +posts_in_search_result_at_most = "المشاركات في نتائج البحث على الأكثر" +posts_in_tag_page_at_most = "المشاركات في صفحة العلامة على الأكثر" +posts_in_type_page_at_most = "المشاركات في صفحة النوع على الأكثر" +posts_index_settings = "إعدادات فهرس المشاركات" +posts_list = "قائمة المشاركات" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "الإصدار التجريبي" +prev = "قديم" +prev_post = "المنشور السابق" +preview = "معاينة" +profile_for = "Profile for" +proudly_powered_by = "مدعوم بفخر بواسطة" +publish = "نشر" +publish_draft = "نشر المسودة" +published = "منشور" +quote_post = "مشاركة مقتبسة" +quote_post_comment = "إنشاء منشور مدونة باقتباس مميز" +rss_character = "شخصية RSS" +rss_feeds_show_the_most_recent = "تظهر موجزات RSS الأحدث" +rss_settings = "إعدادات RSS" +read_more_text = "قراءة المزيد من النص" +read_more_text_placeholder = "قراءة المزيد" +reading = "جارٍ القراءة" +reading_settings = "إعدادات القراءة" +recaptcha = "reCAPTCHA" +recent_posts = "المشاركات الأخيرة" +recent_posts_widget_at_most = "أداة المشاركات الأخيرة على الأكثر" +regular_post = "مشاركة عادية" +regular_post_comment = "إنشاء منشور مدونة عادي" +related_posts = "منشورات ذات صلة" +related_widget_posts_at_most = "منشورات الأدوات ذات الصلة على الأكثر" +revert_to_draft = "عودة إلى المسودة" +save = "حفظ" +save_config = "حفظ التكوين" +save_edit = "حفظ التحرير" +save_menu = "حفظ القائمة" +save_as_draft = "حفظ كمسودة" +save_category = "حفظ فئة" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "بحث" +search_for = "بحث عن" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "المفتاح السري" +settings = "الإعدادات" +sign_in_to_start_your_session = "قم بتسجيل الدخول لبدء جلستك" +site_key = "مفتاح الموقع" +sitemap = "خريطة الموقع" +slug = "سبيكة" +social_media = "وسائل التواصل الاجتماعي" +static_page = "صفحة ثابتة" +static_page_comment = "إنشاء صفحة ثابتة" +static_pages = "صفحات ثابتة" +summary = "ملخص" +summary_character = "شخصية الملخص" +tag = "علامة" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "سطر الوصف" +tagline_placeholder = "منصة تدوين PHP بدون قاعدة بيانات" +tagline_description = "في بضع كلمات ، اشرح موضوع هذه المدونة." +tags = "علامات" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "هذا رمز قديم. عادةً ما يتم إنشاء تحليلات جديدة باستخدام gtag.js" +this_page_doesnt_exist = "هذه الصفحة غير موجودة!" +time = "الوقت" +timezone = "المنطقة الزمنية" +title = "العنوان" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "لاستخدام Disqus أو Facebook ، تحتاج إلى تقديم اسم قصير لـ Disqus أو معرّف تطبيق Facebook." +token_error = "CSRF Token not correct" +tools = "أدوات" +twitter_account = "حساب Twitter" +type_to_search = "اكتب للبحث" +uncategorized = "غير مصنف" +uncategorized_comment = "الموضوعات التي لا تحتاج إلى فئة أو لا تتناسب مع أي فئة أخرى موجودة" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "تحديث" +update_available = "التحديث متاح" +update_draft = "تحديث المسودة" +update_post = "تحديث المنشور" +update_to = "تحديث إلى" +upload = "تحميل" +user = "مستخدم" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "تتراوح القيم الصالحة من 0.0 إلى 1.0. راجع" +video_post = "مشاركة فيديو" +video_post_comment = "إنشاء منشور مدونة بفيديو مميز" +view = "عرض" +view_post = "View" +views = "المشاهدات" +widget = "أداة" +widget_settings = "إعدادات الأداة" +would_you_like_to_try_our = "هل ترغب في تجربة" +yes_im_in = "نعم أنا موجود" +yes_not_recommended = "نعم (غير مستحسن)" +you_dont_have_permission_to_access_this_page = "ليس لديك إذن للوصول إلى هذه الصفحة" +your_new_config_key = "مفتاح التكوين الجديد الخاص بك" +your_new_value = "قيمتك الجديدة" +your_backups = "نُسخك الاحتياطية" +your_latest_blog_posts = "أحدث مشاركات المدونة الخاصة بك" +your_recent_posts = "مشاركاتك الأخيرة" +by = "بقلم" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = " تلميح: استخدم Ctrl / CMD + F للبحث عن مفتاح التهيئة أو القيمة." +homepage = "الصفحة الرئيسية" +instead = "بدلاً من ذلك" +item_class = "إدراج فئة CSS" +item_slug = "إدراج عنوان URL للرابط" +now = "الآن" +of = "of" +optional = "اختياري" +post_your_post_slug = "/ نشر / your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = " نصائح احترافية: يمكنك إنشاء مفتاح تهيئة مخصص وطباعة قيمة مفتاح التهيئة في أي مكان في القالب." +read_more = "اقرأ المزيد" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/ سنة / شهر / your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/da_DK.ini b/lang/da_DK.ini new file mode 100644 index 0000000..94499f9 --- /dev/null +++ b/lang/da_DK.ini @@ -0,0 +1,337 @@ +about = "Om" +add_category = "Tilføj kategori" +add_content = "Tilføj" +add_link = "Tilføj link" +add_menu = "Tilføj menu" +add_new_page = "Tilføj ny side" +add_new_post = "Tilføj nyt indlæg" +add_source_link_optional = "Tilføj link til kilde (valgfrit)" +add_sub = "Ny underside" +address_url = "Adresse (URL)" +admin = "Admin" +admin_panel_style_based_on = "Admin-panelets design er baseret på" +all_blog_posts = "Alle blogindlæg" +all_cache_has_been_deleted = "Hele cachen er blevet ryddet!" +all_posts_tagged = "Alle indlæg tagget" +archive = "Arkiv" +archive_for = "Arkiv for" +archive_page_for = "Arkivside for" +archives = "Arkiver" +are_you_sure_you_want_to_delete_ = "Er du sikker på, at du ønsker at slette %s?" +at_the_moment_you_are_using_auto_generated_menu = "Lige nu bruger du den autogenererede menu." +audio_post = "Lydindlæg" +audio_post_comment = "Opret indlæg med lydklip" +author = "Forfatter" +author_description = "Bare endnu en HTMLy-bruger" +back_to = "Tilbage til" +backup = "Backup" +blog_description = "Skriv et par linier om din blog." +blog_theme = "Blog-tema" +blog_title = "Blogtitel" +blog_title_placeholder = "Min HTMLy-blog" +blog_posts_displayed_as = "Blogindlæg vist som" +breadcrumb_home_text = "Breadcrumb-tekst for Hjem" +by = "af" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Ved at bruge importværktøjet angiver du, at dette feed er dit, eller du har ret til at videreudgive det." +css_class_optional = "CSS-klasse (valgfrit)" +cache_expiration = "Cache-udløb (i timer)" +cache_off = "Cache deaktiveret" +cache_timestamp = "Cache-tidsstempel" +cancel = "Afbryd" +cannot_read_feed_content = "Kan ikke indlæse feed-indhold" +captcha_error = "reCaptcha ikke korrekt" +categories = "Kategorier" +category = "Kategori" +check_update = "Check opdateringer" +clear_cache = "Ryd cache" +comma_separated_values = "Kommaseparerede værdier (CSV)" +comment_system = "Kommentarsystem" +comments = "kommentarer" +config = "Konfiguration" +congrats_you_have_the_latest_version_of_htmly = "Tillykke! Du har den seneste version af HTMLy." +content = "Indhold" +contents = "Indhold" +continue_reading = "Læs videre" +copyright_line = "Copyright-linje" +copyright_line_placeholder = "(c) Dit navn." +create_backup = "Opret backup" +created = "Oprettet" +custom = "Særligt defineret" +custom_settings = "Særligt definerede indstillinger" +dashboard = "Dashboard" +date = "Dato" +date_format = "Datoformat" +delete = "Slet" +description = "Beskrivelse" +design_by = "Designet af" +disable = "Deaktiver" +disabled = "Deaktiveret" +disqus_shortname = "Disqus-navn (shortname)" +disqus_shortname_placeholder = "htmly" +draft = "Udkast" +edit = "Rediger" +edit_category = "Rediger kategori" +edit_post = "Rediger indlæg" +edit_profile = "Rediger profil" +enable = "Aktiver" +enable_blog_url = "Aktiver blog-URL" +enter_image_url = "Indtast billede-URL" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook-side" +featured_audio = "Fremhævet lydklip" +featured_image = "Fremhævet billede" +featured_link = "Fremhævet link" +featured_quote = "Fremhævet citat" +featured_video = "Fremhævet videoklip" +feed_url = "Feed-URL" +filename = "Filnavn" +follow = "Følg" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Visning på forside" +full_post = "Fuldt indlæg" +general = "Generelt" +general_settings = "Generelle indstillinger" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Hjem" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Hvis denne ikke udfyldes, vil der blive indsat et uddrag fra indlægget nedenfor" +if_the_url_is_left_empty_we_will_use_the_page_title = "Hvis URL ikke udfyldes, vil sidens navn blive anvendt" +if_the_url_is_left_empty_we_will_use_the_post_title = "Hvis URL ikke udfyldes, vil indlæggets titel blive anvendt" +image_post = "Billedindlæg" +image_post_comment = "Opret indlæg med billede" +import = "Importer" +import_feed = "Start import af feed" +import_rss = "Importer RSS" +import_rss_feed_2.0 = "Importer RSS Feed 2.0" +insert_image = "Indsæt billede" +invalid_error = "FEJL: Ugyldigt navn og adgangskode" +language = "Systemsprog" +link_name = "Navn på link" +link_post = "Linkindlæg" +link_post_comment = "Opret indlæg med link" +login = "Login" +login_page = "Login-side" +logout = "Log ud" +menu = "Menu" +menus = "Menu-editor" +meta_description = "Metabeskrivelse" +meta_description_character = "Metabeskrivelse - antal tegn" +metatags = "Metatags" +metatags_settings = "Metatag-indstillinger" +mine = "Mine" +more = "Mere" +my_draft = "Mine udkast" +my_posts = "Mine indlæg" +name = "Navn" +newer = "Nyere" +newer_posts = "Nyere indlæg" +next = "Næste" +next_post = "Næste indlæg" +no_available_backup = "Der er ingen backups til rådighed." +no_draft_found = "Der er ikke fundet nogen udkast" +no_newer_posts = "Ingen nyere indlæg" +no_older_posts = "Ingen ældre indlæg" +no_posts_found = "Der er ikke fundet nogen indlæg" +no_related_post_found = "Der er ikke fundet nogen relaterede indlæg" +no_scheduled_posts_found = "Der er ikke fundet nogen planlagte indlæg" +no_search_results = "Ingen søgeresultater" +nope = "Nej" +not = "Ikke deaktiveret" +older = "Ældre" +older_posts = "Ældre indlæg" +only = "Kun" +operations = "Operationer" +page = "Side" +page_generation_time = "Tid til at generere side" +pages = "Sider" +pass_error = "Adgangskode påkrævet" +password = "Adgangskode" +performance = "Ydelse" +performance_settings = "Indstillinger for ydelse" +permalink = "Permalink" +popular = "Populært" +popular_posts = "Populære indlæg" +popular_posts_widget = "Widget med populære indlæg" +popular_posts_widget_at_most = "Widget med populære indlæg maksimalt" +popular_tags = "Populære tags" +post_by_author = "Indlæg af denne forfatter" +posted_in = "Indlæg i" +posted_on = "Indlæg den" +posts = "Indlæg" +posts_by = "Indlæg af" +posts_draft = "Udkast til indlæg" +posts_in_archive_page_at_most = "Indlæg på Arkivsiden maksimalt" +posts_in_category_page_at_most = "Indlæg på Kategorisiden maksimalt" +posts_in_front_page_show_at_most = "Indlæg på forsiden maksimalt" +posts_in_profile_page_at_most = "Indlæg på profilsiden maksimalt" +posts_in_search_result_at_most = "Indlæg på listen over søgeresultater maksimalt" +posts_in_tag_page_at_most = "Indlæg på tag-side maksimalt" +posts_in_type_page_at_most = "Indlæg på type-side maksimalt" +posts_index_settings = "Indstillinger for indlægsoversigt" +posts_list = "Liste over indlæg" +posts_tagged = "Indlæg tagget" +posts_with_type = "Indlæg med type" +pre_release = "Pre-release" +prev = "Foregående" +prev_post = "Foregående indlæg" +preview = "Forhåndsvisning" +previous = "Foregående" +profile_for = "Profil for" +proudly_powered_by = "Drives med stolthed på" +publish = "Udgiv" +publish_draft = "Udgiv udkast" +published = "Udgivet" +published_by = "Udgivet af" +quote_post = "Citatindlæg" +quote_post_comment = "Opret indlæg med citat" +rss_character = "RSS - antal tegn" +rss_feeds_show_the_most_recent = "RSS-feeds viser seneste" +rss_settings = "RSS-Indstillinger" +read_more = "Læs mere" +read_more_text = "Læs mere tekst" +read_more_text_placeholder = "Læs mere" +reading = "Læsning" +reading_settings = "Indstillinger for læsning" +recaptcha = "reCAPTCHA" +recent_comments = "Seneste kommentarer" +recent_posts = "Seneste indlæg" +recent_posts_widget_at_most = "Widget med seneste indlæg maksimalt" +regular_post = "Standardindlæg" +regular_post_comment = "Opret standardindlæg" +related_posts = "Relaterade indlæg" +related_widget_posts_at_most = "Widget med relaterede indlæg maksimalt" +return_to_home = "Tibage til forsiden" +revert_to_draft = "Tilbage til udkast" +save = "Gem" +save_config = "Gem konfiguration" +save_menu = "Save menu" +save_as_draft = "Gem som udkast" +save_category = "Gem kategori" +scheduled = "Planlagte indlæg" +scheduled_posts = "Planlagte indlæg" +scheduled_tips = "Hvis man udgiver et indlæg med fremtidig dato eller tidspunkt, vil det komme in under planlage indlæg" +search = "Søg" +search_for = "Søg efter" +search_results_for = "søgeresultater for" +search_results_not_found = "Ingen søgeresultater fundet!" +secret_key = "Hemmelig nøgle" +settings = "Indstillinger" +share_this_post = "Del indlæg" +sign_in_to_start_your_session = "Log ind for at starte din session" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Sociale medier" +static_page = "Statisk side" +static_page_comment = "Opret statisk side" +static_pages = "Statiske sider" +summary = "Resummé" +summary_character = "Resummé - antal tegn" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud maksimalt" +tagline = "Tagline" +tagline_placeholder = "Database-løs PHP-Blogging-Platform" +tagline_description = "Forklar med få ord, hvad denne blog handler om." +tags = "Tags" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "Denne side findes ikke!" +time = "Tid" +timezone = "Tidszone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "For at bruge Disqus eller Facebook til at kommentere, skal de bruge dit Disqus-kortnavn eller Facebook App ID." +token_error = "CSRF Token ikke korrekt" +tools = "Værktøjer" +twitter_account = "Twitter-konto" +type_to_search = "Type at søge efter" +uncategorized = "Ingen kategori" +uncategorized_comment = "Indlæg, som ikke behøver en kategori eller ikke passer i de øvrige kategorier." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Ukendt feed-format" +update = "Opdater" +update_available = "Opdatering tilgængelig" +update_draft = "Opdater udkast" +update_post = "Opdater indlæg" +update_to = "Opdater til" +upload = "Upload" +user = "Bruger" +user_error = "Bruger-felt påkrævet" +valid_values_range_from_0_to_1.0._see = "Gyldige værdier er fra 0.0 til 1.0. Se" +video_post = "Videindlæg" +video_post_comment = "Opret indlæg med video" +view = "Vis" +view_post = "Vis indlæg" +views = "Visninger" +widget = "Widget" +widget_settings = "Widget-indstillinger" +would_you_like_to_try_our = "Vil du gerne prøve vores " +yes_im_in = "Yes, jeg er med" +yes_not_recommended = "Ja (Anbefales ikke)" +you_dont_have_permission_to_access_this_page = "Du har ikke rettigheder til at tilgå denne side" +your_new_config_key = "Din nye konfigurationsnøgle" +your_new_value = "Din nye værdi" +your_backups = "Dine backups" +your_latest_blog_posts = "Dine seneste blogindlæg" +your_recent_posts = "Dine seneste indlæg" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "Hint: Brug Ctrl/CMD + F for at søge efter din konfigurationsnøgle eller -værdi." +homepage = "Hjemmeside" +instead = "i stedet" +item_class = "Indsæt CSS-klasse" +item_slug = "Indsæt Link-URL" +now = "nu" +of = "af" +optional = "valgfri" +post_your_post_slug = "/indlæg/din-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Pro-tips: Du kan oprette egen konfigurationsnøgle og få vist værdien, hvor du vil i din skabelon." +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/år/måned/din-slug" +your_key = "din.nøgle" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/de_DE.ini b/lang/de_DE.ini new file mode 100644 index 0000000..2ac54ed --- /dev/null +++ b/lang/de_DE.ini @@ -0,0 +1,326 @@ +about = "Über" +add_category = "Kategorie hinzufügen" +add_content = "Inhalt hinzufügen" +add_link = "Link hinzufügen" +add_menu = "Menü hinzufügen" +add_new_page = "Neue Seite hinzufügen" +add_new_post = "Neuen Beitrag hinzufügen" +add_source_link_optional = "Quell-Link hinzufügen (optional)" +add_sub = "Unterseite hinzufügen" +address_url = "Adresse (URL)" +admin = "Administrator" +admin_panel_style_based_on = "Admin-Panel-Stil basierend auf" +all_blog_posts = "Alle Beiträge" +all_cache_has_been_deleted = "Der gesamte Cache wurde gelöscht!" +all_posts_tagged = "Alle Beiträge getaggten" +archive_for = "Archiv für" +archive_page_for = "Archivseite für" +archives = "Archiv" +are_you_sure_you_want_to_delete_ = "Sind Sie sicher, dass Sie %s löschen wollen?" +at_the_moment_you_are_using_auto_generated_menu = "Im Moment verwenden Sie ein automatisch generiertes Menü." +audio_post = "Audio-Beitrag" +audio_post_comment = "Einen Beitrag zur Präsentation eines Audios erstellen" +author = "Autor" +author_description = "Nur ein weiterer HTMLy-Benutzer" +back_to = "Zurück zu" +backup = "Backup" +blog_description = "Beschreiben Sie in einem Absatz die Ausrichtung Ihres Blogs." +blog_posts_displayed_as = "Blog-Beiträge anzeigen als" +blog_theme = "Blog-Theme (Design)" +blog_title = "Blog-Titel" +blog_title_placeholder = "Ein HTMLy-Blog" +breadcrumb_home_text = "Bezeichnung für die Startseite im Breadcrumb-Menü" +by = "von" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Durch die Verwendung dieses Importeurs bestätigen Sie, dass der importierte Feed Ihnen gehört oder Sie berechtigt sind, seine Inhalte zu veröffentlichen." +cache_expiration = "Cache-Gültigkeitsdauer (in Stunden)" +cache_off = "Caching ausschalten" +cache_timestamp = "Cache-Zeitstempel" +cancel = "Abbrechen" +cannot_read_feed_content = "Feedinhalt kann nicht gelesen werden" +captcha_error = "reCAPTCHA nicht korrekt" +categories = "Kategorien" +category = "Kategorie" +check_shortcode = "Berücksichtige shortcode" +check_update = "Aktualisierung suchen" +clear_cache = "Cache löschen" +comma_separated_values = "Komma-getrennte Werte" +comment_system = "Kommentarsystem" +comments = "Kommentare" +config = "Konfiguration" +congrats_you_have_the_latest_version_of_htmly = "Herzlichen Glückwunsch! Sie haben die neueste Version von HTMLy." +content = "Inhalt" +contents = "Inhalt" +copyright_line = "Copyright-Zeile" +copyright_line_placeholder = "(c) Ihr Name." +create_backup = "Ein Backup erstellen" +created = "Erstellungsdatum" +css_class_optional = "CSS-Klasse (optional) " +custom = "Benutzerdefiniert" +custom_settings = "Benutzerdefinierte Einstellungen" +dashboard = "Übersicht" +date = "Datum" +date_format = "Datumsformat" +default = "Standard" +delete = "Löschen" +description = "Beschreibung" +disable = "Deaktivieren" +disabled = "Ausgeschaltet" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Entwurf" +edit = "Bearbeiten" +edit_category = "Kategorie bearbeiten" +edit_post = "Bearbeiten" +edit_profile = "Profil bearbeiten" +enable = "Aktivieren" +enable_blog_url = "URL blog aktivieren" +enter_image_url = "Bild-URL eingeben" +facebook_app_id = "Facebook App-ID" +facebook_page = "Facebook-Seite" +featured_audio = "Ausgewähltes Audio" +featured_image = "Ausgewähltes Bild" +featured_link = "Ausgewählter Link" +featured_quote = "Ausgewähltes Zitat" +featured_video = "Ausgewähltes Video" +feed_url = "Feed-URL" +filename = "Dateiname" +follow = "Folgen" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Startseite zeigt" +full_post = "Vollständiger Beitrag" +general = "Allgemeines" +general_settings = "Allgemeine Einstellungen" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "Hinweis: Nutzen Sie STRG/CMD + F, um nach einem Konfigurationsschlüssel oder Wert zu suchen." +home = "Startseite" +homepage = "Startseite" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Wenn das Feld leer bleibt, wird es aus dem folgenden Inhalt extrahiert" +if_the_url_is_left_empty_we_will_use_the_page_title = "Wenn die URL leer bleibt, wird der Seitentitel verwendet" +if_the_url_is_left_empty_we_will_use_the_post_title = "Wenn die URL leer bleibt, wird der Beitragstitel verwendet" +image_post = "Bild-Beitrag" +image_post_comment = "Einen Beitrag zur Präsentation eines Bildes erstellen" +import = "Importieren" +import_feed = "Feed importieren" +import_rss = "RSS importieren" +import_rss_feed_2.0 = "RSS-Feed 2.0 importieren" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = 'Bei Anzeige als Zusammenfassung wird entweder ein vorhandener shortcode ignoriert und die Zusammenfassung auf die angegebene Anzahl von Zeichen gekürzt (Standard) oder bis zum shortcode angezeigt (Berücksichtige shortcode).' +insert_image = "Bild einfügen" +instead = "stattdessen" +invalid_error = "FEHLER: Ungültiger Benutzername oder Passwort" +item_class = "CSS-Klasse" +item_slug = "Link-URL" +language = "Systemsprache" +link_name = "Name des Links" +link_post = "Link-Beitrag" +link_post_comment = "Einen Beitrag zur Präsentation eines Links erstellen" +login = "Anmeldung" +login_page = "Anmeldeseite" +logout = "Abmelden" +menu = "Menüs" +menus = "Menü-Editor" +meta_description = "Meta-Beschreibung" +meta_description_character = "Anzahl von Zeichen, die vom Inhalt übernommen werden, wenn das Feld Meta-Beschreibung leer gelassen wird" +metatags = "Metatags" +metatags_settings = "Metatags-Einstellungen" +mine = "Eigene Beiträge" +more = "Mehr" +my_draft = "Eigene Entwürfe" +my_posts = "Eigene Beiträge" +name = "Name" +newer = "Neuere" +next = "Nächster" +next_post = "Nächster Beitrag" +no_available_backup = "Derzeit ist kein Backup verfügbar." +no_draft_found = "Keine Entwürfe gefunden!" +no_posts_found = "Keine Beiträge gefunden!" +no_related_post_found = "Kein ähnlicher Beitrag gefunden!" +no_scheduled_posts_found = "Keine geplanten Beiträge gefunden!" +no_search_results = "Keine Suchergebnisse!" +nope = "Nein, danke." +not = "Nein" +now = "jetzt" +of = "von" +older = "Ältere" +only = "Nur" +operations = "Operationen" +optional = "optional" +page = "Seite" +page_generation_time = "Dauer der Seitenerzeugung" +pages = "Seiten" +pass_error = "Passwortfeld ist erforderlich!" +password = "Passwort" +performance = "Leistung" +performance_settings = "Leistungseinstellungen" +permalink = "Permalink" +popular = "Zugriffe" +popular_posts = "Beliebte Beiträge" +popular_posts_widget = "Zugriffszähler aktivieren und Widget Beliebte Beiträge einblenden" +popular_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Beliebte Beiträge" +popular_tags = "Beliebte Tags" +post_by_author = "Beiträge dieses Autors" +post_your_post_slug = "/post/your-post-slug" +posted_in = "Veröffentlicht unter" +posted_on = "Veröffentlicht am" +posts = "Inhalte" +posts_by = "Beiträge von" +posts_draft = "Entwürfe" +posts_in_archive_page_at_most = "Maximale Anzahl von Beiträgen auf Archiv-Seiten" +posts_in_category_page_at_most = "Maximale Anzahl von Beiträgen auf Kategorien-Seiten" +posts_in_front_page_show_at_most = "Maximale Anzahl von Beiträgen auf der Startseite" +posts_in_profile_page_at_most = "Maximale Anzahl von Beiträgen auf Profil-Seiten" +posts_in_search_result_at_most = "Maximale Anzahl von Beiträgen in Suchergebnissen" +posts_in_tag_page_at_most = "Maximale Anzahl von Beiträgen auf tag-Seiten" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Einstellungen zur Anzahl von Beiträgen" +posts_list = "Beiträge" +posts_tagged = "Beiträge mit Stichwort" +posts_with_type = "Beiträge mit Typ" +pre_release = "Pre-release" +prev = "Voriger" +prev_post = "Vorheriger Beitrag" +preview = "Vorschau" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Profi-Tipp: Sie können einen eigenen Konfigurationsschlüssel erzeugen und dessen Wert überall im Template anzeigen lassen." +profile_for = "Profil von" +proudly_powered_by = "Powered by" +publish = "Veröffentlichen" +publish_draft = "Veröffentlichen" +published = "Veröffentlicht" +quote_post = "Zitat-Beitrag" +quote_post_comment = "Einen Beitrag zur Präsentation eines Zitats erstellen" +read_more = "weiterlesen" +read_more_text = "Weiterlesen-Text" +read_more_text_placeholder = "Mehr ..." +reading = "Lesen" +reading_settings = "Leseeinstellungen" +recaptcha = "reCAPTCHA" +recent_posts = "Letzte Beiträge" +recent_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Letzte Beiträge" +regular_post = "Normaler Beitrag" +regular_post_comment = "Einen normalen Beitrag erstellen" +related_posts = "Ähnliche Beiträge" +related_widget_posts_at_most = "Maximale Anzahl von Beiträgen im Widget Ähnliche Beiträge" +revert_to_draft = "Als Entwurf speichern" +rss_character = "Länge eines RSS-Beitrags (in Zeichen)" +rss_feeds_show_the_most_recent = "RSS-Feeds zeigen die folgende Anzahl der aktuellsten Beiträge" +rss_settings = "RSS-Einstellungen" +save = "Speichern" +save_as_draft = "Speichern als Entwurf" +save_category = "Kategorie speichern" +save_config = "Konfiguration speichern" +save_edit = "Änderungen speichern" +save_menu = "Menü speichern" +scheduled = "Geplant" +scheduled_posts = "Geplante Beiträge" +scheduled_tips = "Veröffentlichen eines Beitrags mit Zeitpunkt in der Zukunft, fügt ihn bei Geplante Beiträge hinzu" +search = "Suche" +search_for = "Suche nach" +search_results_for = "Suchergebnisse für" +search_results_not_found = "Suchergebnisse nicht gefunden!" +secret_key = "Secret Key" +settings = "Einstellungen" +sign_in_to_start_your_session = "Melden Sie sich an, um Ihre Sitzung zu starten" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "Statische Seite" +static_page_comment = "Eine statische Seite erstellen" +static_pages = "Statische Seiten" +summary = "Zusammenfassung" +summary_behavior = 'Generieren der Zusammenfassung' +summary_character = "Länge der Zusammenfassung (in Zeichen)" +tag = "Schlagwort" +tagcloud_widget_at_most = "Höchstzahl Schlagwörter in Tag-Cloud" +tagline = "Slogan" +tagline_description = "Erklären Sie in wenigen Worten, worum es in diesem Blog geht." +tagline_placeholder = "Datenbanklose PHP-Blogging-Plattform" +tags = "Schlagworte" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Dies ist veralteter Code. Normalerweise wird gtag.js verwendet." +this_page_doesnt_exist = "Diese Seite existiert nicht!" +time = "Zeit" +timezone = "Zeitzone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Um Disqus- oder Facebook-Kommentare einzubinden, geben Sie den Disqus-Kurznamen oder die Facebook App-ID an." +token_error = "CSRF-Token nicht korrekt" +tools = "Werkzeuge" +twitter_account = "Twitter-Konto" +type_to_search = "Tippen Sie, um zu suchen" +uncategorized = "Unkategorisiert" +uncategorized_comment = "Beiträge, die in keine Kategorie passen (sollen)." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unbekanntes Feedformat" +update = "Aktualisieren" +update_available = "Update verfügbar" +update_draft = "Entwurf aktualisieren" +update_post = "Beitrag aktualisieren" +update_to = "Aktualisieren auf" +upload = "Upload" +user = "Benutzer" +user_error = "Benutzerfeld ist erforderlich" +valid_values_range_from_0_to_1.0._see = "Gültige Werte nur zwischen 0.0 und 1.0. Siehe" +video_post = "Video-Beitrag" +video_post_comment = "Einen Beitrag zur Präsentation eines Videos erstellen" +view = "Ansicht" +view_post = "Ansicht" +views = "Ansichten" +widget = "Widget" +widget_key_placeholder = "12345abcde" +widget_settings = "Widget-Einstellungen" +would_you_like_to_try_our = "Besuchen Sie doch unsere " +year_month_your_post_slug = "/year/month/your-post-slug" +yes_im_in = "Ja, ich bin dabei!" +yes_not_recommended = "Ja (nicht empfohlen)" +you_dont_have_permission_to_access_this_page = "Sie haben keine Berechtigung, auf diese Seite zuzugreifen." +your_backups = "Ihre Backups" +your_key = "your.key" +your_latest_blog_posts = "Neueste Blog-Beiträge" +your_new_config_key = "Neuer Konfigurations-Schlüssel" +your_new_value = "Neuer Wert" +your_recent_posts = "Ihre letzten Beiträge" +manage_users = "Benutzerverwaltung" +add_user = "Benutzer hinzufügen" +username = "Benutzername" +role = "Rolle" +change_password = "Passwort ändern" +config_mfa = "MFA konfigurieren" +mfacode = "MFA Code" +verify_code = "MFA code verifizieren" +verify_password = "Aktuelles Passwort verifizieren" +manualsetupkey = "Der setup key kann auch manuell hinzugefügt werden" +mfa_error = "MFA code ist nicht korrekt" +disablemfa = "MFA deaktivieren" +enable_auto_save = "Automatisches Speichern aktivieren" +explain_autosave = "Neue Inhalte oder Entwürfe werden automatisch alle 60 Sekunden gespeichert, wenn aktiviert." +login_protect_system = "Login-Schutz" +cloudflare_info = "Sehen Sie sich die Turnstile-Dokumentation von Cloudflare an: " +mfa_config = "Multi-Faktor-Authentifizierung (MFA)" +set_mfa_globally = "MFA ermöglichen" +explain_mfa = "Wenn aktiviert, ist MFA für alle Benutzer optional. Wenn deaktiviert, kann MFA nicht verwendet werden und das Feld wird auf der Anmeldeseite ausgeblendet." +set_version_publicly = "Version öffentlich sichtbar" +explain_version = "Standardmäßig ist die Version von HTMLy öffentlich im Quellcode sichtbar. Einige Administratoren ziehen es möglicherweise vor, dies auszublenden." +focus_mode = "Fokus-Modus umschalten" +writing = "Schreiben" +writing_settings = "Schreibeinstellungen" +security = "Sicherheit" +security_settings = "Sicherheitseinstellungen" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/de_DE_gender_doppelpunkt.ini b/lang/de_DE_gender_doppelpunkt.ini new file mode 100644 index 0000000..68ca949 --- /dev/null +++ b/lang/de_DE_gender_doppelpunkt.ini @@ -0,0 +1,326 @@ +about = "Über" +add_category = "Kategorie hinzufügen" +add_content = "Inhalt hinzufügen" +add_link = "Link hinzufügen" +add_menu = "Menü hinzufügen" +add_new_page = "Neue Seite hinzufügen" +add_new_post = "Neuen Beitrag hinzufügen" +add_source_link_optional = "Quell-Link hinzufügen (optional)" +add_sub = "Unterseite hinzufügen" +address_url = "Adresse (URL)" +admin = "Administrator:in" +admin_panel_style_based_on = "Admin-Panel-Stil basierend auf" +all_blog_posts = "Alle Beiträge" +all_cache_has_been_deleted = "Der gesamte Cache wurde gelöscht!" +all_posts_tagged = "Alle Beiträge getaggten" +archive_for = "Archiv für" +archive_page_for = "Archivseite für" +archives = "Archiv" +are_you_sure_you_want_to_delete_ = "Sind Sie sicher, dass Sie %s löschen wollen?" +at_the_moment_you_are_using_auto_generated_menu = "Im Moment verwenden Sie ein automatisch generiertes Menü." +audio_post = "Audio-Beitrag" +audio_post_comment = "Einen Beitrag zur Präsentation eines Audios erstellen" +author = "Autor:in" +author_description = "Nur ein:e weitere:r HTMLy-Benutzer:in" +back_to = "Zurück zu" +backup = "Backup" +blog_description = "Beschreiben Sie in einem Absatz die Ausrichtung Ihres Blogs." +blog_posts_displayed_as = "Blog-Beiträge anzeigen als" +blog_theme = "Blog-Theme (Design)" +blog_title = "Blog-Titel" +blog_title_placeholder = "Ein HTMLy-Blog" +breadcrumb_home_text = "Bezeichnung für die Startseite im Breadcrumb-Menü" +by = "von" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Durch die Verwendung dieses Importeurs bestätigen Sie, dass der importierte Feed Ihnen gehört oder Sie berechtigt sind, seine Inhalte zu veröffentlichen." +cache_expiration = "Cache-Gültigkeitsdauer (in Stunden)" +cache_off = "Caching ausschalten" +cache_timestamp = "Cache-Zeitstempel" +cancel = "Abbrechen" +cannot_read_feed_content = "Feedinhalt kann nicht gelesen werden" +captcha_error = "reCAPTCHA nicht korrekt" +categories = "Kategorien" +category = "Kategorie" +check_shortcode = "Berücksichtige shortcode" +check_update = "Aktualisierung suchen" +clear_cache = "Cache löschen" +comma_separated_values = "Komma-getrennte Werte" +comment_system = "Kommentarsystem" +comments = "Kommentare" +config = "Konfiguration" +congrats_you_have_the_latest_version_of_htmly = "Herzlichen Glückwunsch! Sie haben die neueste Version von HTMLy." +content = "Inhalt" +contents = "Inhalt" +copyright_line = "Copyright-Zeile" +copyright_line_placeholder = "(c) Ihr Name." +create_backup = "Ein Backup erstellen" +created = "Erstellungsdatum" +css_class_optional = "CSS-Klasse (optional) " +custom = "Benutzerdefiniert" +custom_settings = "Benutzerdefinierte Einstellungen" +dashboard = "Übersicht" +date = "Datum" +date_format = "Datumsformat" +default = "Standard" +delete = "Löschen" +description = "Beschreibung" +disable = "Deaktivieren" +disabled = "Ausgeschaltet" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Entwurf" +edit = "Bearbeiten" +edit_category = "Kategorie bearbeiten" +edit_post = "Bearbeiten" +edit_profile = "Profil bearbeiten" +enable = "Aktivieren" +enable_blog_url = "URL blog aktivieren" +enter_image_url = "Bild-URL eingeben" +facebook_app_id = "Facebook App-ID" +facebook_page = "Facebook-Seite" +featured_audio = "Ausgewähltes Audio" +featured_image = "Ausgewähltes Bild" +featured_link = "Ausgewählter Link" +featured_quote = "Ausgewähltes Zitat" +featured_video = "Ausgewähltes Video" +feed_url = "Feed-URL" +filename = "Dateiname" +follow = "Folgen" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Startseite zeigt" +full_post = "Vollständiger Beitrag" +general = "Allgemeines" +general_settings = "Allgemeine Einstellungen" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "Hinweis: Nutzen Sie STRG/CMD + F, um nach einem Konfigurationsschlüssel oder Wert zu suchen." +home = "Startseite" +homepage = "Startseite" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Wenn das Feld leer bleibt, wird es aus dem folgenden Inhalt extrahiert" +if_the_url_is_left_empty_we_will_use_the_page_title = "Wenn die URL leer bleibt, wird der Seitentitel verwendet" +if_the_url_is_left_empty_we_will_use_the_post_title = "Wenn die URL leer bleibt, wird der Beitragstitel verwendet" +image_post = "Bild-Beitrag" +image_post_comment = "Einen Beitrag zur Präsentation eines Bildes erstellen" +import = "Importieren" +import_feed = "Feed importieren" +import_rss = "RSS importieren" +import_rss_feed_2.0 = "RSS-Feed 2.0 importieren" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "Bei Anzeige als Zusammenfassung wird entweder ein vorhandener shortcode ignoriert und die Zusammenfassung auf die angegebene Anzahl von Zeichen gekürzt (Standard) oder bis zum shortcode angezeigt (Berücksichtige shortcode)." +insert_image = "Bild einfügen" +instead = "stattdessen" +invalid_error = "FEHLER: Ungültiger Benutzer:innen-Name oder Passwort" +item_class = "CSS-Klasse" +item_slug = "Link-URL" +language = "Systemsprache" +link_name = "Name des Links" +link_post = "Link-Beitrag" +link_post_comment = "Einen Beitrag zur Präsentation eines Links erstellen" +login = "Anmeldung" +login_page = "Anmeldeseite" +logout = "Abmelden" +menu = "Menüs" +menus = "Menü-Editor" +meta_description = "Meta-Beschreibung" +meta_description_character = "Anzahl von Zeichen, die vom Inhalt übernommen werden, wenn das Feld Meta-Beschreibung leer gelassen wird" +metatags = "Metatags" +metatags_settings = "Metatags-Einstellungen" +mine = "Eigene Beiträge" +more = "Mehr" +my_draft = "Eigene Entwürfe" +my_posts = "Eigene Beiträge" +name = "Name" +newer = "Neuere" +next = "Nächster" +next_post = "Nächster Beitrag" +no_available_backup = "Derzeit ist kein Backup verfügbar." +no_draft_found = "Keine Entwürfe gefunden!" +no_posts_found = "Keine Beiträge gefunden!" +no_related_post_found = "Kein ähnlicher Beitrag gefunden!" +no_scheduled_posts_found = "Keine geplanten Beiträge gefunden!" +no_search_results = "Keine Suchergebnisse!" +nope = "Nein, danke." +not = "Nein" +now = "jetzt" +of = "von" +older = "Ältere" +only = "Nur" +operations = "Operationen" +optional = "optional" +page = "Seite" +page_generation_time = "Dauer der Seitenerzeugung" +pages = "Seiten" +pass_error = "Passwortfeld ist erforderlich!" +password = "Passwort" +performance = "Leistung" +performance_settings = "Leistungseinstellungen" +permalink = "Permalink" +popular = "Zugriffe" +popular_posts = "Beliebte Beiträge" +popular_posts_widget = "Zugriffszähler aktivieren und Widget Beliebte Beiträge einblenden" +popular_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Beliebte Beiträge" +popular_tags = "Beliebte Tags" +post_by_author = "Beiträge dieser Autorin oder dieses Autors" +post_your_post_slug = "/post/your-post-slug" +posted_in = "Veröffentlicht unter" +posted_on = "Veröffentlicht am" +posts = "Inhalte" +posts_by = "Beiträge von" +posts_draft = "Entwürfe" +posts_in_archive_page_at_most = "Maximale Anzahl von Beiträgen auf Archiv-Seiten" +posts_in_category_page_at_most = "Maximale Anzahl von Beiträgen auf Kategorien-Seiten" +posts_in_front_page_show_at_most = "Maximale Anzahl von Beiträgen auf der Startseite" +posts_in_profile_page_at_most = "Maximale Anzahl von Beiträgen auf Profil-Seiten" +posts_in_search_result_at_most = "Maximale Anzahl von Beiträgen in Suchergebnissen" +posts_in_tag_page_at_most = "Maximale Anzahl von Beiträgen auf tag-Seiten" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Einstellungen zur Anzahl von Beiträgen" +posts_list = "Beiträge" +posts_tagged = "Beiträge mit Stichwort" +posts_with_type = "Beiträge mit Typ" +pre_release = "Pre-release" +prev = "Voriger" +prev_post = "Vorheriger Beitrag" +preview = "Vorschau" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Profi-Tipp: Sie können einen eigenen Konfigurationsschlüssel erzeugen und dessen Wert überall im Template anzeigen lassen." +profile_for = "Profil von" +proudly_powered_by = "Powered by" +publish = "Veröffentlichen" +publish_draft = "Veröffentlichen" +published = "Veröffentlicht" +quote_post = "Zitat-Beitrag" +quote_post_comment = "Einen Beitrag zur Präsentation eines Zitats erstellen" +read_more = "weiterlesen" +read_more_text = "Weiterlesen-Text" +read_more_text_placeholder = "Mehr ..." +reading = "Lesen" +reading_settings = "Leseeinstellungen" +recaptcha = "reCAPTCHA" +recent_posts = "Letzte Beiträge" +recent_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Letzte Beiträge" +regular_post = "Normaler Beitrag" +regular_post_comment = "Einen normalen Beitrag erstellen" +related_posts = "Ähnliche Beiträge" +related_widget_posts_at_most = "Maximale Anzahl von Beiträgen im Widget Ähnliche Beiträge" +revert_to_draft = "Als Entwurf speichern" +rss_character = "Länge eines RSS-Beitrags (in Zeichen)" +rss_feeds_show_the_most_recent = "RSS-Feeds zeigen die folgende Anzahl der aktuellsten Beiträge" +rss_settings = "RSS-Einstellungen" +save = "Speichern" +save_as_draft = "Speichern als Entwurf" +save_category = "Kategorie speichern" +save_config = "Konfiguration speichern" +save_edit = "Änderungen speichern" +save_menu = "Menü speichern" +scheduled = "Geplant" +scheduled_posts = "Geplante Beiträge" +scheduled_tips = "Veröffentlichen eines Beitrags mit Zeitpunkt in der Zukunft, fügt ihn bei Geplante Beiträge hinzu" +search = "Suche" +search_for = "Suche nach" +search_results_for = "Suchergebnisse für" +search_results_not_found = "Suchergebnisse nicht gefunden!" +secret_key = "Secret Key" +settings = "Einstellungen" +sign_in_to_start_your_session = "Melden Sie sich an, um Ihre Sitzung zu starten" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "Statische Seite" +static_page_comment = "Eine statische Seite erstellen" +static_pages = "Statische Seiten" +summary = "Zusammenfassung" +summary_behavior = "Generieren der Zusammenfassung" +summary_character = "Länge der Zusammenfassung (in Zeichen)" +tag = "Schlagwort" +tagcloud_widget_at_most = "Höchstzahl Schlagwörter in Tag-Cloud" +tagline = "Slogan" +tagline_description = "Erklären Sie in wenigen Worten, worum es in diesem Blog geht." +tagline_placeholder = "Datenbanklose PHP-Blogging-Plattform" +tags = "Schlagworte" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Dies ist veralteter Code. Normalerweise wird gtag.js verwendet." +this_page_doesnt_exist = "Diese Seite existiert nicht!" +time = "Zeit" +timezone = "Zeitzone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Um Disqus- oder Facebook-Kommentare einzubinden, geben Sie den Disqus-Kurznamen oder die Facebook App-ID an." +token_error = "CSRF-Token nicht korrekt" +tools = "Werkzeuge" +twitter_account = "Twitter-Konto" +type_to_search = "Tippen Sie, um zu suchen" +uncategorized = "Unkategorisiert" +uncategorized_comment = "Beiträge, die in keine Kategorie passen (sollen)." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unbekanntes Feedformat" +update = "Aktualisieren" +update_available = "Update verfügbar" +update_draft = "Entwurf aktualisieren" +update_post = "Beitrag aktualisieren" +update_to = "Aktualisieren auf" +upload = "Upload" +user = "Benutzer:in" +user_error = "Benutzer:innen-Feld ist erforderlich" +valid_values_range_from_0_to_1.0._see = "Gültige Werte nur zwischen 0.0 und 1.0. Siehe" +video_post = "Video-Beitrag" +video_post_comment = "Einen Beitrag zur Präsentation eines Videos erstellen" +view = "Ansicht" +view_post = "Ansicht" +views = "Ansichten" +widget = "Widget" +widget_key_placeholder = "12345abcde" +widget_settings = "Widget-Einstellungen" +would_you_like_to_try_our = "Besuchen Sie doch unsere " +year_month_your_post_slug = "/year/month/your-post-slug" +yes_im_in = "Ja, ich bin dabei!" +yes_not_recommended = "Ja (nicht empfohlen)" +you_dont_have_permission_to_access_this_page = "Sie haben keine Berechtigung, auf diese Seite zuzugreifen." +your_backups = "Ihre Backups" +your_key = "your.key" +your_latest_blog_posts = "Neueste Blog-Beiträge" +your_new_config_key = "Neuer Konfigurations-Schlüssel" +your_new_value = "Neuer Wert" +your_recent_posts = "Ihre letzten Beiträge" +manage_users = "Benutzer:innen-Verwaltung" +add_user = "Benutzer:in hinzufügen" +username = "Benutzer:innen-Name" +role = "Rolle" +change_password = "Passwort ändern" +config_mfa = "MFA konfigurieren" +mfacode = "MFA Code" +verify_code = "MFA code verifizieren" +verify_password = "Aktuelles Passwort verifizieren" +manualsetupkey = "Der setup key kann auch manuell hinzugefügt werden" +mfa_error = "MFA code ist nicht korrekt" +disablemfa = "MFA deaktivieren" +enable_auto_save = "Automatisches Speichern aktivieren" +explain_autosave = "Neue Inhalte oder Entwürfe werden automatisch alle 60 Sekunden gespeichert, wenn aktiviert." +login_protect_system = "Login-Schutz" +cloudflare_info = "Sehen Sie sich die Turnstile-Dokumentation von Cloudflare an: " +mfa_config = "Multi-Faktor-Authentifizierung (MFA)" +set_mfa_globally = "MFA ermöglichen" +explain_mfa = "Wenn aktiviert, ist MFA für alle Benutzer:innen optional. Wenn deaktiviert, kann MFA nicht verwendet werden und das Feld wird auf der Anmeldeseite ausgeblendet." +set_version_publicly = "Version öffentlich sichtbar" +explain_version = "Standardmäßig ist die Version von HTMLy öffentlich im Quellcode sichtbar. Einige Administrator:innen ziehen es möglicherweise vor, dies auszublenden." +focus_mode = "Fokus-Modus umschalten" +writing = "Schreiben" +writing_settings = "Schreibeinstellungen" +security = "Sicherheit" +security_settings = "Sicherheitseinstellungen" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/de_DE_gender_dudenkonform.ini b/lang/de_DE_gender_dudenkonform.ini new file mode 100644 index 0000000..4a8d720 --- /dev/null +++ b/lang/de_DE_gender_dudenkonform.ini @@ -0,0 +1,326 @@ +about = "Über" +add_category = "Kategorie hinzufügen" +add_content = "Inhalt hinzufügen" +add_link = "Link hinzufügen" +add_menu = "Menü hinzufügen" +add_new_page = "Neue Seite hinzufügen" +add_new_post = "Neuen Beitrag hinzufügen" +add_source_link_optional = "Quell-Link hinzufügen (optional)" +add_sub = "Unterseite hinzufügen" +address_url = "Adresse (URL)" +admin = "Administrator/-in" +admin_panel_style_based_on = "Admin-Panel-Stil basierend auf" +all_blog_posts = "Alle Beiträge" +all_cache_has_been_deleted = "Der gesamte Cache wurde gelöscht!" +all_posts_tagged = "Alle Beiträge getaggten" +archive_for = "Archiv für" +archive_page_for = "Archivseite für" +archives = "Archiv" +are_you_sure_you_want_to_delete_ = "Sind Sie sicher, dass Sie %s löschen wollen?" +at_the_moment_you_are_using_auto_generated_menu = "Im Moment verwenden Sie ein automatisch generiertes Menü." +audio_post = "Audio-Beitrag" +audio_post_comment = "Einen Beitrag zur Präsentation eines Audios erstellen" +author = "Autor/-in" +author_description = "Nur ein/-e weitere/-r HTMLy-Benutzer/-in" +back_to = "Zurück zu" +backup = "Backup" +blog_description = "Beschreiben Sie in einem Absatz die Ausrichtung Ihres Blogs." +blog_posts_displayed_as = "Blog-Beiträge anzeigen als" +blog_theme = "Blog-Theme (Design)" +blog_title = "Blog-Titel" +blog_title_placeholder = "Ein HTMLy-Blog" +breadcrumb_home_text = "Bezeichnung für die Startseite im Breadcrumb-Menü" +by = "von" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Durch die Verwendung dieses Importeurs bestätigen Sie, dass der importierte Feed Ihnen gehört oder Sie berechtigt sind, seine Inhalte zu veröffentlichen." +cache_expiration = "Cache-Gültigkeitsdauer (in Stunden)" +cache_off = "Caching ausschalten" +cache_timestamp = "Cache-Zeitstempel" +cancel = "Abbrechen" +cannot_read_feed_content = "Feedinhalt kann nicht gelesen werden" +captcha_error = "reCAPTCHA nicht korrekt" +categories = "Kategorien" +category = "Kategorie" +check_shortcode = "Berücksichtige shortcode" +check_update = "Aktualisierung suchen" +clear_cache = "Cache löschen" +comma_separated_values = "Komma-getrennte Werte" +comment_system = "Kommentarsystem" +comments = "Kommentare" +config = "Konfiguration" +congrats_you_have_the_latest_version_of_htmly = "Herzlichen Glückwunsch! Sie haben die neueste Version von HTMLy." +content = "Inhalt" +contents = "Inhalt" +copyright_line = "Copyright-Zeile" +copyright_line_placeholder = "(c) Ihr Name." +create_backup = "Ein Backup erstellen" +created = "Erstellungsdatum" +css_class_optional = "CSS-Klasse (optional) " +custom = "Benutzerdefiniert" +custom_settings = "Benutzerdefinierte Einstellungen" +dashboard = "Übersicht" +date = "Datum" +date_format = "Datumsformat" +default = "Standard" +delete = "Löschen" +description = "Beschreibung" +disable = "Deaktivieren" +disabled = "Ausgeschaltet" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Entwurf" +edit = "Bearbeiten" +edit_category = "Kategorie bearbeiten" +edit_post = "Bearbeiten" +edit_profile = "Profil bearbeiten" +enable = "Aktivieren" +enable_blog_url = "URL blog aktivieren" +enter_image_url = "Bild-URL eingeben" +facebook_app_id = "Facebook App-ID" +facebook_page = "Facebook-Seite" +featured_audio = "Ausgewähltes Audio" +featured_image = "Ausgewähltes Bild" +featured_link = "Ausgewählter Link" +featured_quote = "Ausgewähltes Zitat" +featured_video = "Ausgewähltes Video" +feed_url = "Feed-URL" +filename = "Dateiname" +follow = "Folgen" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Startseite zeigt" +full_post = "Vollständiger Beitrag" +general = "Allgemeines" +general_settings = "Allgemeine Einstellungen" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "Hinweis: Nutzen Sie STRG/CMD + F, um nach einem Konfigurationsschlüssel oder Wert zu suchen." +home = "Startseite" +homepage = "Startseite" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Wenn das Feld leer bleibt, wird es aus dem folgenden Inhalt extrahiert" +if_the_url_is_left_empty_we_will_use_the_page_title = "Wenn die URL leer bleibt, wird der Seitentitel verwendet" +if_the_url_is_left_empty_we_will_use_the_post_title = "Wenn die URL leer bleibt, wird der Beitragstitel verwendet" +image_post = "Bild-Beitrag" +image_post_comment = "Einen Beitrag zur Präsentation eines Bildes erstellen" +import = "Importieren" +import_feed = "Feed importieren" +import_rss = "RSS importieren" +import_rss_feed_2.0 = "RSS-Feed 2.0 importieren" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "Bei Anzeige als Zusammenfassung wird entweder ein vorhandener shortcode ignoriert und die Zusammenfassung auf die angegebene Anzahl von Zeichen gekürzt (Standard) oder bis zum shortcode angezeigt (Berücksichtige shortcode)." +insert_image = "Bild einfügen" +instead = "stattdessen" +invalid_error = "FEHLER: Ungültiger Benutzer/-innen-Name oder Passwort" +item_class = "CSS-Klasse" +item_slug = "Link-URL" +language = "Systemsprache" +link_name = "Name des Links" +link_post = "Link-Beitrag" +link_post_comment = "Einen Beitrag zur Präsentation eines Links erstellen" +login = "Anmeldung" +login_page = "Anmeldeseite" +logout = "Abmelden" +menu = "Menüs" +menus = "Menü-Editor" +meta_description = "Meta-Beschreibung" +meta_description_character = "Anzahl von Zeichen, die vom Inhalt übernommen werden, wenn das Feld Meta-Beschreibung leer gelassen wird" +metatags = "Metatags" +metatags_settings = "Metatags-Einstellungen" +mine = "Eigene Beiträge" +more = "Mehr" +my_draft = "Eigene Entwürfe" +my_posts = "Eigene Beiträge" +name = "Name" +newer = "Neuere" +next = "Nächster" +next_post = "Nächster Beitrag" +no_available_backup = "Derzeit ist kein Backup verfügbar." +no_draft_found = "Keine Entwürfe gefunden!" +no_posts_found = "Keine Beiträge gefunden!" +no_related_post_found = "Kein ähnlicher Beitrag gefunden!" +no_scheduled_posts_found = "Keine geplanten Beiträge gefunden!" +no_search_results = "Keine Suchergebnisse!" +nope = "Nein, danke." +not = "Nein" +now = "jetzt" +of = "von" +older = "Ältere" +only = "Nur" +operations = "Operationen" +optional = "optional" +page = "Seite" +page_generation_time = "Dauer der Seitenerzeugung" +pages = "Seiten" +pass_error = "Passwortfeld ist erforderlich!" +password = "Passwort" +performance = "Leistung" +performance_settings = "Leistungseinstellungen" +permalink = "Permalink" +popular = "Zugriffe" +popular_posts = "Beliebte Beiträge" +popular_posts_widget = "Zugriffszähler aktivieren und Widget Beliebte Beiträge einblenden" +popular_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Beliebte Beiträge" +popular_tags = "Beliebte Tags" +post_by_author = "Beiträge dieser Autorin oder dieses Autors" +post_your_post_slug = "/post/your-post-slug" +posted_in = "Veröffentlicht unter" +posted_on = "Veröffentlicht am" +posts = "Inhalte" +posts_by = "Beiträge von" +posts_draft = "Entwürfe" +posts_in_archive_page_at_most = "Maximale Anzahl von Beiträgen auf Archiv-Seiten" +posts_in_category_page_at_most = "Maximale Anzahl von Beiträgen auf Kategorien-Seiten" +posts_in_front_page_show_at_most = "Maximale Anzahl von Beiträgen auf der Startseite" +posts_in_profile_page_at_most = "Maximale Anzahl von Beiträgen auf Profil-Seiten" +posts_in_search_result_at_most = "Maximale Anzahl von Beiträgen in Suchergebnissen" +posts_in_tag_page_at_most = "Maximale Anzahl von Beiträgen auf tag-Seiten" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Einstellungen zur Anzahl von Beiträgen" +posts_list = "Beiträge" +posts_tagged = "Beiträge mit Stichwort" +posts_with_type = "Beiträge mit Typ" +pre_release = "Pre-release" +prev = "Voriger" +prev_post = "Vorheriger Beitrag" +preview = "Vorschau" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Profi-Tipp: Sie können einen eigenen Konfigurationsschlüssel erzeugen und dessen Wert überall im Template anzeigen lassen." +profile_for = "Profil von" +proudly_powered_by = "Powered by" +publish = "Veröffentlichen" +publish_draft = "Veröffentlichen" +published = "Veröffentlicht" +quote_post = "Zitat-Beitrag" +quote_post_comment = "Einen Beitrag zur Präsentation eines Zitats erstellen" +read_more = "weiterlesen" +read_more_text = "Weiterlesen-Text" +read_more_text_placeholder = "Mehr ..." +reading = "Lesen" +reading_settings = "Leseeinstellungen" +recaptcha = "reCAPTCHA" +recent_posts = "Letzte Beiträge" +recent_posts_widget_at_most = "Maximale Anzahl von Beiträgen im Widget Letzte Beiträge" +regular_post = "Normaler Beitrag" +regular_post_comment = "Einen normalen Beitrag erstellen" +related_posts = "Ähnliche Beiträge" +related_widget_posts_at_most = "Maximale Anzahl von Beiträgen im Widget Ähnliche Beiträge" +revert_to_draft = "Als Entwurf speichern" +rss_character = "Länge eines RSS-Beitrags (in Zeichen)" +rss_feeds_show_the_most_recent = "RSS-Feeds zeigen die folgende Anzahl der aktuellsten Beiträge" +rss_settings = "RSS-Einstellungen" +save = "Speichern" +save_as_draft = "Speichern als Entwurf" +save_category = "Kategorie speichern" +save_config = "Konfiguration speichern" +save_edit = "Änderungen speichern" +save_menu = "Menü speichern" +scheduled = "Geplant" +scheduled_posts = "Geplante Beiträge" +scheduled_tips = "Veröffentlichen eines Beitrags mit Zeitpunkt in der Zukunft, fügt ihn bei Geplante Beiträge hinzu" +search = "Suche" +search_for = "Suche nach" +search_results_for = "Suchergebnisse für" +search_results_not_found = "Suchergebnisse nicht gefunden!" +secret_key = "Secret Key" +settings = "Einstellungen" +sign_in_to_start_your_session = "Melden Sie sich an, um Ihre Sitzung zu starten" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "Statische Seite" +static_page_comment = "Eine statische Seite erstellen" +static_pages = "Statische Seiten" +summary = "Zusammenfassung" +summary_behavior = "Generieren der Zusammenfassung" +summary_character = "Länge der Zusammenfassung (in Zeichen)" +tag = "Schlagwort" +tagcloud_widget_at_most = "Höchstzahl Schlagwörter in Tag-Cloud" +tagline = "Slogan" +tagline_description = "Erklären Sie in wenigen Worten, worum es in diesem Blog geht." +tagline_placeholder = "Datenbanklose PHP-Blogging-Plattform" +tags = "Schlagworte" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Dies ist veralteter Code. Normalerweise wird gtag.js verwendet." +this_page_doesnt_exist = "Diese Seite existiert nicht!" +time = "Zeit" +timezone = "Zeitzone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Um Disqus- oder Facebook-Kommentare einzubinden, geben Sie den Disqus-Kurznamen oder die Facebook App-ID an." +token_error = "CSRF-Token nicht korrekt" +tools = "Werkzeuge" +twitter_account = "Twitter-Konto" +type_to_search = "Tippen Sie, um zu suchen" +uncategorized = "Unkategorisiert" +uncategorized_comment = "Beiträge, die in keine Kategorie passen (sollen)." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unbekanntes Feedformat" +update = "Aktualisieren" +update_available = "Update verfügbar" +update_draft = "Entwurf aktualisieren" +update_post = "Beitrag aktualisieren" +update_to = "Aktualisieren auf" +upload = "Upload" +user = "Benutzer/-in" +user_error = "Benutzer/-innen-Feld ist erforderlich" +valid_values_range_from_0_to_1.0._see = "Gültige Werte nur zwischen 0.0 und 1.0. Siehe" +video_post = "Video-Beitrag" +video_post_comment = "Einen Beitrag zur Präsentation eines Videos erstellen" +view = "Ansicht" +view_post = "Ansicht" +views = "Ansichten" +widget = "Widget" +widget_key_placeholder = "12345abcde" +widget_settings = "Widget-Einstellungen" +would_you_like_to_try_our = "Besuchen Sie doch unsere " +year_month_your_post_slug = "/year/month/your-post-slug" +yes_im_in = "Ja, ich bin dabei!" +yes_not_recommended = "Ja (nicht empfohlen)" +you_dont_have_permission_to_access_this_page = "Sie haben keine Berechtigung, auf diese Seite zuzugreifen." +your_backups = "Ihre Backups" +your_key = "your.key" +your_latest_blog_posts = "Neueste Blog-Beiträge" +your_new_config_key = "Neuer Konfigurations-Schlüssel" +your_new_value = "Neuer Wert" +your_recent_posts = "Ihre letzten Beiträge" +manage_users = "Benutzer/-innen-Verwaltung" +add_user = "Benutzer/-in hinzufügen" +username = "Benutzer/-innen-Name" +role = "Rolle" +change_password = "Passwort ändern" +config_mfa = "MFA konfigurieren" +mfacode = "MFA Code" +verify_code = "MFA code verifizieren" +verify_password = "Aktuelles Passwort verifizieren" +manualsetupkey = "Der setup key kann auch manuell hinzugefügt werden" +mfa_error = "MFA code ist nicht korrekt" +disablemfa = "MFA deaktivieren" +enable_auto_save = "Automatisches Speichern aktivieren" +explain_autosave = "Neue Inhalte oder Entwürfe werden automatisch alle 60 Sekunden gespeichert, wenn aktiviert." +login_protect_system = "Login-Schutz" +cloudflare_info = "Sehen Sie sich die Turnstile-Dokumentation von Cloudflare an: " +mfa_config = "Multi-Faktor-Authentifizierung (MFA)" +set_mfa_globally = "MFA ermöglichen" +explain_mfa = "Wenn aktiviert, ist MFA für alle Benutzer/-innen optional. Wenn deaktiviert, kann MFA nicht verwendet werden und das Feld wird auf der Anmeldeseite ausgeblendet." +set_version_publicly = "Version öffentlich sichtbar" +explain_version = "Standardmäßig ist die Version von HTMLy öffentlich im Quellcode sichtbar. Einige Administrator/-innen ziehen es möglicherweise vor, dies auszublenden." +focus_mode = "Fokus-Modus umschalten" +writing = "Schreiben" +writing_settings = "Schreibeinstellungen" +security = "Sicherheit" +security_settings = "Sicherheitseinstellungen" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/el_GR.ini b/lang/el_GR.ini new file mode 100644 index 0000000..bf5ed33 --- /dev/null +++ b/lang/el_GR.ini @@ -0,0 +1,328 @@ +about = "Σχετικά" +add_category = "Προσθήκη Κατηγορίας" +add_content = "Προσθήκη Περιεχομένου" +add_link = "Προσθήκη συνδέσμου" +add_menu = "Προσθήκη μενού" +add_new_page = "Προσθήκη νέας σελίδας" +add_new_post = "Προσθήκη νέας ανάρτησης" +add_source_link_optional = "Προσθήκη συνδέσμου πηγής (προαιρετικό)" +add_sub = "Προσθήκη Υποσελίδας" +address_url = "Διεύθυνση (URL)" +admin = "Διαχειριστής" +admin_panel_style_based_on = "Στιλ πίνακα διαχειριστή με βάση" +all_blog_posts = "Όλες οι αναρτήσεις ιστολογίου" +all_cache_has_been_deleted = "Όλη η προσωρινή μνήμη έχει διαγραφεί !" +all_posts_tagged = "Όλες οι αναρτήσεις με ετικέτα" +archive_for = "Αρχείο για" +archive_page_for = "Αρχειοθέτηση σελίδας για" +archives = "Αρχειοθέτηση" +are_you_sure_you_want_to_delete_ = "Είστε βέβαιοι ότι θέλετε να διαγράψετε %s;" +at_the_moment_you_are_using_auto_generated_menu = "Αυτή τη στιγμή χρησιμοποιείτε το μενού που δημιουργείται αυτόματα." +audio_post = "Ηχητική ανάρτηση" +audio_post_comment = "Δημιουργία ανάρτησης ιστολογίου με επιλεγμένο ήχο" +author = "Συγγραφέας" +author_description = " " +back_to = "Επιστροφή στο" +backup = "Αντίγραφα ασφαλείας" +blog_description = "Σε μία παράγραφο, πείτε μας περισσότερα για το ιστολόγιό σας." +blog_theme = "Θέμα ιστολογίου" +blog_title = "Τίτλος ιστολογίου" +blog_title_placeholder = "Το ιστολόγιό μου HTMLy" +blog_posts_displayed_as = "Οι αναρτήσεις ιστολογίου εμφανίζονται ως" +breadcrumb_home_text = "Αρχικό κείμενο ψωμιού" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Χρησιμοποιώντας αυτόν τον εισαγωγέα συμφωνείτε εάν η ροή είναι δική σας ή τουλάχιστον έχετε την εξουσία να τη δημοσιεύσετε." +css_class_optional = "Κλάση CSS (προαιρετικό)" +cache_expiration = "Λήξη προσωρινής μνήμης (σε ώρες)" +cache_off = "Απενεργοποίηση προσωρινής μνήμης" +cache_timestamp = "Cache timestamp" +cancel = "Άκυρο" +cannot_read_feed_content = "Δεν είναι δυνατή η ανάγνωση της ροής" +captcha_error = "το reCaptcha δεν είναι σωστό" +categories = "Κατηγορίες" +category = "Κατηγορία" +check_update = "Έλεγχος έκδοσης" +clear_cache = "Εκκαθάριση προσωρινής μνήμης" +comma_separated_values = "Τιμές διαχωρισμένες με κόμμα" +comment_system = "Σύστημα σχολίων" +comments = "Σχόλια" +config = "Διαμόρφωση" +congrats_you_have_the_latest_version_of_htmly = "Συγχαρητήρια! Έχετε την πιο πρόσφατη έκδοση του HTMLy." +content = "Περιεχόμενο" +contents = "Περιεχόμενα" +copyright_line = "Γραμμή πνευματικών δικαιωμάτων" +copyright_line_placeholder = "(γ) Το όνομά σας." +create_backup = "Δημιουργία αντιγράφου ασφαλείας" +created = "Δημιουργήθηκε" +custom = "Προσαρμοσμένο" +custom_settings = "Προσαρμοσμένες ρυθμίσεις" +dashboard = "Πίνακας ελέγχου" +date = "Ημερομηνία" +date_format = "Μορφή ημερομηνίας" +delete = "Διαγραφή" +description = "Περιγραφή" +disable = "Απενεργοποίηση" +disabled = "Απενεργοποιημένο" +disqus_shortname = "Σύντομο όνομα Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Προσχέδιο" +edit = "Επεξεργασία" +edit_category = "Επεξεργασία κατηγορίας" +edit_post = "Επεξεργασία" +edit_profile = "Επεξεργασία προφίλ" +enable = "Ενεργοποίηση" +enable_blog_url = "Ενεργοποίηση διεύθυνσης URL blog" +enter_image_url = "Εισαγωγή διεύθυνσης URL εικόνας" +facebook_app_id = "Αναγνωριστικό εφαρμογής Facebook" +facebook_page = "Σελίδα Facebook" +featured_audio = "Επιλεγμένος ήχος" +featured_image = "Επιλεγμένη εικόνα" +featured_link = "Επιλεγμένος σύνδεσμος" +featured_quote = "Επιλεγμένη προσφορά" +featured_video = "Επιλεγμένο βίντεο" +feed_url = "Διεύθυνση URL ροής" +filename = "Όνομα αρχείου" +follow = "Ακολούθησε" +for_google_site_verification_meta = "Για meta google-site-verification" +front_page_displays = "Εμφάνιση πρώτης σελίδας" +full_post = "Πλήρης ανάρτηση" +general = "Γενικά" +general_settings = "Γενικές ρυθμίσεις" +get_one_here = "Αποκτήστε ένα εδώ" +github_pre_release = "Github προέκδοση" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (κληρονομιά)" +google_search_console = "Google Search Console" +home = "Αρχική" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Αν αφήσουμε κενό, θα το αποσπάσουμε από το παρακάτω περιεχόμενο" +if_the_url_is_left_empty_we_will_use_the_page_title = "Εάν το url μείνει κενό, θα χρησιμοποιήσουμε τον τίτλο της σελίδας" +if_the_url_is_left_empty_we_will_use_the_post_title = "Εάν το url μείνει κενό, θα χρησιμοποιήσουμε τον τίτλο της ανάρτησης" +image_post = "Ανάρτηση εικόνας" +image_post_comment = "Δημιουργία ανάρτησης ιστολογίου με επιλεγμένη εικόνα" +import = "Εισαγωγή" +import_feed = "Έναρξη εισαγωγής ροής" +import_rss = "Εισαγωγή RSS" +import_rss_feed_2.0 = "Εισαγωγή RSS Feed 2.0" +insert_image = "Εισαγωγή εικόνας" +invalid_error = "ΣΦΑΛΜΑ: Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης" +language = "Γλώσσα συστήματος" +link_name = "Όνομα συνδέσμου" +link_post = "Ανάρτηση συνδέσμου" +link_post_comment = "Δημιουργία ανάρτησης ιστολογίου με επιλεγμένο σύνδεσμο" +login = "Είσοδος" +login_page = "Σελίδα σύνδεσης" +logout = "Αποσύνδεση" +menu = "Μενού" +menus = "Επεξεργαστής μενού" +meta_description = "Meta περιγραφή" +meta_description_character = "Χαρακτήρας μετα περιγραφής" +metatags = "Metatags" +metatags_settings = "Ρυθμίσεις Metatags" +mine = "Δικά μου" +more = "Περισσότερα" +my_draft = "Τα προσχέδιά μου" +my_posts = "Οι αναρτήσεις μου" +name = "Όνομα" +newer = "Νεότερα" +next = "Επόμενο" +next_post = "Επόμενο post" +no_available_backup = "Δεν υπάρχει διαθέσιμο αντίγραφο ασφαλείας αυτή τη στιγμή." +no_draft_found = "Δεν βρέθηκε προσχέδιο" +no_posts_found = "Δεν βρέθηκαν δημοσιεύσεις" +no_related_post_found = "Δεν βρέθηκε σχετική ανάρτηση" +no_scheduled_posts_found = "Δεν υπάρχουν προγραμματισμένες αναρτήσεις!" +no_search_results = "Δεν υπάρχουν αποτελέσματα αναζήτησης" +nope = "Όχι" +not = "Όχι" +older = "Παλαιότερα" +only = "Μόνο" +operations = "Λειτουργίες" +page = "Σελίδα" +page_generation_time = "Χρόνος δημιουργίας σελίδας" +pages = "Σελίδες" +pass_error = "Απαιτείται το πεδίο κωδικού πρόσβασης" +password = "Κωδικός πρόσβασης" +performance = "Απόδοση" +performance_settings = "Ρυθμίσεις απόδοσης" +permalink = "Permalink" +popular = "Δημοφιλές" +popular_posts = "Δημοφιλείς αναρτήσεις" +popular_posts_widget = "Γραφικό στοιχείο δημοφιλών αναρτήσεων" +popular_posts_widget_at_most = "Γραφικό στοιχείο δημοφιλών αναρτήσεων το πολύ" +popular_tags = "Δημοφιλείς ετικέτες" +post_by_author = "Αναρτήσεις από αυτόν τον συγγραφέα" +posted_in = "Δημοσιεύτηκε στο" +posted_on = "Δημοσιεύτηκε στις" +posts = "Αναρτήσεις" +posts_by = "Αναρτήσεις από" +posts_draft = "Προσχέδιο αναρτήσεων" +posts_in_archive_page_at_most = "Το πολύ δημοσιεύσεις στη σελίδα αρχείου" +posts_in_category_page_at_most = "Το πολύ δημοσιεύσεις στη σελίδα κατηγορίας" +posts_in_front_page_show_at_most = "Οι αναρτήσεις στην πρώτη σελίδα εμφανίζονται το πολύ" +posts_in_profile_page_at_most = "Το πολύ δημοσιεύσεις στη σελίδα προφίλ" +posts_in_search_result_at_most = "Το πολύ δημοσιεύσεις στο αποτέλεσμα αναζήτησης" +posts_in_tag_page_at_most = "Το πολύ δημοσιεύσεις στη σελίδα ετικέτας" +posts_in_type_page_at_most = "Το πολύ δημοσιεύσεις στη σελίδα τύπου" +posts_index_settings = "Ρυθμίσεις ευρετηρίου αναρτήσεων" +posts_list = "Λίστα αναρτήσεων" +posts_tagged = "Δημοσιεύσεις με ετικέτα" +posts_with_type = "Δημοσιεύσεις με τύπο" +pre_release = "Προκυκλοφορία" +prev = "Προηγούμενο" +prev_post = "Προηγούμενη ανάρτηση" +preview = "Προεπισκόπηση" +profile_for = "Προφίλ για" +proudly_powered_by = "Περήφανα τροφοδοτείται από" +publish = "Δημοσίευση" +publish_draft = "Δημοσίευση προχείρου" +published = "Δημοσιεύτηκε" +quote_post = "Παράθεση ανάρτησης" +quote_post_comment = "Δημιουργία ανάρτησης ιστολογίου με επιλεγμένο απόσπασμα" +rss_character = "χαρακτήρας RSS" +rss_feeds_show_the_most_recent = "Οι ροές RSS εμφανίζουν τις πιο πρόσφατες" +rss_settings = "Ρυθμίσεις RSS" +read_more_text = "Διαβάστε περισσότερα κείμενο" +read_more_text_placeholder = "Διαβάστε περισσότερα" +reading = "Διαβάζοντας" +reading_settings = "Ρυθμίσεις ανάγνωσης" +recaptcha = "reCAPTCHA" +recent_posts = "Πρόσφατες δημοσιεύσεις" +recent_posts_widget_at_most = "Γραφικό στοιχείο πρόσφατων αναρτήσεων το πολύ" +regular_post = "Κανονική ανάρτηση" +regular_post_comment = "Δημιουργία κανονικής ανάρτησης ιστολογίου" +related_posts = "Σχετικές αναρτήσεις" +related_widget_posts_at_most = "Σχετικές αναρτήσεις widget το πολύ" +revert_to_draft = "Επαναφορά στο πρόχειρο" +save = "Αποθήκευση" +save_config = "Αποθήκευση διαμόρφωσης" +save_edit = "Αποθήκευση επεξεργασίας" +save_menu = "Αποθήκευση μενού" +save_as_draft = "Αποθήκευση ως πρόχειρο" +save_category = "Αποθήκευση κατηγορίας" +scheduled = "Προγραμματισμένες" +scheduled_posts = "Προγραμματισμένες αναρτήσεις" +scheduled_tips = "Δημοσιεύοντας μια ανάρτηση με μελλοντική ημερομηνία ή ώρα, θα μεταφερθεί στις προγραμματισμένες αναρτήσεις" +search = "Αναζήτηση" +search_for = "Αναζήτηση" +search_results_for = "Αποτελέσματα αναζήτησης για" +search_results_not_found = "Δεν βρέθηκαν αποτελέσματα αναζήτησης!" +secret_key = "Μυστικό κλειδί" +settings = "Ρυθμίσεις" +sign_in_to_start_your_session = "Συνδεθείτε για επεξεργασία περιεχομένου" +site_key = "Κλειδί τοποθεσίας" +sitemap = "Χάρτης ιστότοπου" +slug = "Slug" +social_media = "Μέσα κοινωνικής δικτύωσης" +static_page = "Στατική σελίδα" +static_page_comment = "Δημιουργία στατικής σελίδας" +static_pages = "Στατικές σελίδες" +summary = "Σύνοψη" +summary_character = "Σύνοψη χαρακτήρα" +tag = "Ετικέτα" +tagcloud_widget_at_most = "TagCloud το πολύ" +tagline = "Tagline" +tagline_placeholder = "Πλατφόρμα ιστολογίων PHP χωρίς βάση δεδομένων" +tagline_description = "Με λίγα λόγια, εξηγήστε τι είναι αυτό το ιστολόγιο." +tags = "Ετικέτες" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Αυτός είναι κώδικας παλαιού τύπου. Συνήθως νέα αναλυτικά στοιχεία που δημιουργούνται χρησιμοποιώντας gtag.js" +this_page_doesnt_exist = "Αυτή η σελίδα δεν υπάρχει!" +time = "Ώρα" +timezone = "Ζώνη ώρας" +title = "Τίτλος" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Για να χρησιμοποιήσετε τα σχόλια του Disqus ή του Facebook, πρέπει να δώσετε το σύντομο όνομα του Disqus ή το αναγνωριστικό εφαρμογής του Facebook." +token_error = "Το CSRF Token δεν είναι σωστό" +tools = "Εργαλεία" +twitter_account = "Λογαριασμός Twitter" +type_to_search = "Aναζήτηση" +uncategorized = "Χωρίς κατηγορία" +uncategorized_comment = "Θέματα που δεν χρειάζονται κατηγορία ή δεν ταιριάζουν σε καμία άλλη υπάρχουσα κατηγορία" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Άγνωστη μορφή ροής" +update = "Ενημέρωση" +update_available = "Ενημέρωση διαθεσιμότητας" +update_draft = "Ενημέρωση σχεδίου" +update_post = "Ενημέρωση ανάρτησης" +update_to = "Ενημέρωση σε" +upload = "Μεταφόρτωση" +user = "Χρήστης" +user_error = "Απαιτείται πεδίο χρήστη" +valid_values_range_from_0_to_1.0._see = "Οι έγκυρες τιμές κυμαίνονται από 0,0 έως 1,0. Δείτε" +video_post = "Βίντεο ανάρτηση" +video_post_comment = "Δημιουργία ανάρτησης ιστολογίου με επιλεγμένο βίντεο" +view = "Προβολή" +view_post = "Προβολή" +views = "Προβολές" +widget = "Widget" +widget_settings = "Ρυθμίσεις widget" +would_you_like_to_try_our = "Θα θέλατε να δοκιμάσετε το " +yes_im_in = "Ναι, είμαι μέσα" +yes_not_recommended = "Ναι (δεν συνιστάται)" +you_dont_have_permission_to_access_this_page = "Δεν έχετε άδεια πρόσβασης σε αυτήν τη σελίδα" +your_new_config_key = "Το νέο κλειδί διαμόρφωσης" +your_new_value = "Η νέα σας αξία" +your_backups = "Τα αντίγραφα ασφαλείας σας (Backup)" +your_latest_blog_posts = "Οι πιο πρόσφατες αναρτήσεις ιστολογίου σας" +your_recent_posts = "Οι πρόσφατες αναρτήσεις σας" +by = "από" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Χρησιμοποιήστε Ctrl/CMD + F για να αναζητήσετε το κλειδί ή την τιμή διαμόρφωσης." +homepage = "αρχική σελίδα" +instead = "αντί" +item_class = "Εισαγωγή κλάσης CSS" +item_slug = "Εισαγωγή URL συνδέσμου" +now = "τώρα" +of = "από" +optional = "προαιρετικό" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "επαγγελματικές συμβουλές: Μπορείτε να δημιουργήσετε προσαρμοσμένα κλειδιά διαμόρφωσης και να εκτυπώσετε την τιμή του κλειδιού διαμόρφωσης οπουδήποτε στο πρότυπό σας." +read_more = "διαβάστε περισσότερα" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +security = "Security" +security_settings = "Security Settings" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/en_US.ini b/lang/en_US.ini new file mode 100644 index 0000000..dd0c96c --- /dev/null +++ b/lang/en_US.ini @@ -0,0 +1,326 @@ +about = "About" +add_category = "Add category" +add_content = "Add content" +add_link = "Add link" +add_menu = "Add menu" +add_new_page = "Add new page" +add_new_post = "Add new post" +add_source_link_optional = "Add source link (optional)" +add_sub = "Add sub page" +address_url = "Address (URL)" +admin = "Admin" +admin_panel_style_based_on = "Admin panel style based on" +all_blog_posts = "All blog posts" +all_cache_has_been_deleted = "All cache has been deleted !" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Archives" +are_you_sure_you_want_to_delete_ = "Are you sure you want to delete %s?" +at_the_moment_you_are_using_auto_generated_menu = "At the moment you are using auto generated menu." +audio_post = "Audio post" +audio_post_comment = "Creating blog post with featured audio" +author = "Author" +author_description = "Just another HTMLy user" +back_to = "Back to" +backup = "Backup" +blog_description = "In one paragraph, tell us more about your blog." +blog_theme = "Blog theme" +blog_title = "Blog title" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "Blog posts displayed as" +breadcrumb_home_text = "Breadcrumb home text" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "By using this importer you are agree if the feed is yours or at least you have the authority to publish it." +css_class_optional = "CSS Class (optional)" +cache_expiration = "Cache expiration (in hours)" +cache_off = "Cache off" +cache_timestamp = "Cache timestamp" +cancel = "Cancel" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "Captcha failed" +categories = "Categories" +category = "Category" +check_update = "Check for update" +clear_cache = "Clear cache" +comma_separated_values = "Comma separated values" +comment_system = "Comment system" +comments = "Comments" +config = "Config" +congrats_you_have_the_latest_version_of_htmly = "Congrats! You have the latest version of HTMLy." +content = "Content" +contents = "Contents" +copyright_line = "Copyright line" +copyright_line_placeholder = "(c) Your name." +create_backup = "Create backup" +created = "Created" +custom = "Custom" +custom_settings = "Custom Settings" +dashboard = "Dashboard" +date = "Date" +date_format = "Date Format" +delete = "Delete" +description = "Description" +disable = "Disable" +disabled = "Disabled" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Draft" +edit = "Edit" +edit_category = "Edit category" +edit_post = "Edit" +edit_profile = "Edit profile" +enable = "Enable" +enable_blog_url = "Enable blog URL" +enter_image_url = "Enter image URL" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook page" +featured_audio = "Featured Audio" +featured_image = "Featured Image" +featured_link = "Featured Link" +featured_quote = "Featured Quote" +featured_video = "Featured Video" +feed_url = "Feed URL" +filename = "Filename" +follow = "Follow" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Front page displays" +full_post = "Full post" +general = "General" +general_settings = "General Settings" +get_one_here = "Obtain your reCaptcha keys here: " +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Home" +if_left_empty_we_will_excerpt_it_from_the_content_below = "If leave empty we will excerpt it from the content below" +if_the_url_is_left_empty_we_will_use_the_page_title = "If the url leave empty we will use the page title" +if_the_url_is_left_empty_we_will_use_the_post_title = "If the url leave empty we will use the post title" +image_post = "Image post" +image_post_comment = "Creating blog post with featured image" +import = "Import" +import_feed = "Start Import Feed" +import_rss = "Import RSS" +import_rss_feed_2.0 = "Import RSS Feed 2.0" +insert_image = "Insert Image" +invalid_error = "ERROR: Invalid username or password" +language = "System Language" +link_name = "Link name" +link_post = "Link post" +link_post_comment = "Creating blog post with featured link" +login = "Login" +login_page = "Login page" +logout = "Logout" +menu = "Menu" +menus = "Menu Editor" +meta_description = "Meta description" +meta_description_character = "Meta description character" +metatags = "Metatags" +metatags_settings = "Metatags Settings" +mine = "Mine" +more = "More" +my_draft = "My draft" +my_posts = "My posts" +name = "Name" +newer = "Newer" +next = "Next" +next_post = "Next post" +no_available_backup = "No available backup at this time." +no_draft_found = "No draft found" +no_posts_found = "No posts found" +no_related_post_found = "No related post found" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Nope" +not = "No" +older = "Older" +only = "Only" +operations = "Operations" +page = "Page" +page_generation_time = "Page generation time" +pages = "Pages" +pass_error = "Password field is required" +password = "Password" +performance = "Performance" +performance_settings = "Performance Settings" +permalink = "Permalink" +popular = "Popular" +popular_posts = "Popular posts" +popular_posts_widget = "Popular posts widget" +popular_posts_widget_at_most = "Popular posts widget at most" +popular_tags = "Popular tags" +post_by_author = "Posts by this author" +posted_in = "Posted in" +posted_on = "Posted on" +posts = "Posts" +posts_by = "Post by" +posts_draft = "Posts draft" +posts_in_archive_page_at_most = "Posts in archive page at most" +posts_in_category_page_at_most = "Posts in category page at most" +posts_in_front_page_show_at_most = "Posts in front page show at most" +posts_in_profile_page_at_most = "Posts in profile page at most" +posts_in_search_result_at_most = "Posts in search result at most" +posts_in_tag_page_at_most = "Posts in tag page at most" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Posts index settings" +posts_list = "Posts list" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "Previous" +prev_post = "Previous Post" +preview = "Preview" +profile_for = "Profile for" +proudly_powered_by = "Proudly powered by" +publish = "Publish" +publish_draft = "Publish draft" +published = "Published" +quote_post = "Quote post" +quote_post_comment = "Creating blog post with featured quote" +rss_character = "RSS character" +rss_feeds_show_the_most_recent = "RSS feeds show the most recent" +rss_settings = "RSS settings" +read_more_text = "Read more text" +read_more_text_placeholder = "Read more" +reading = "Reading" +reading_settings = "Reading Settings" +recaptcha = "Login Protection" +recent_posts = "Recent posts" +recent_posts_widget_at_most = "Recent posts widget at most" +regular_post = "Regular post" +regular_post_comment = "Creating regular blog post" +related_posts = "Related posts" +related_widget_posts_at_most = "Related widget posts at most" +revert_to_draft = "Revert to draft" +save = "Save" +save_config = "Save config" +save_edit = "Save Edit" +save_menu = "Save menu" +save_as_draft = "Save as draft" +save_category = "Save category" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Search" +search_for = "Search for" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Secret Key" +settings = "Settings" +sign_in_to_start_your_session = "Sign in to start your session" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "Static page" +static_page_comment = "Creating static page" +static_pages = "Static pages" +summary = "Summary" +summary_character = "Summary character" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Tagline" +tagline_placeholder = "Databaseless PHP Blogging Platform" +tagline_description = "In a few words, explain what this blog is about." +tags = "Tags" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "This page doesn't exist !" +time = "Time" +timezone = "Timezone" +title = "Title" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "To use Disqus or Facebook comments you need to provide your Disqus shortname or your Facebook App ID." +token_error = "CSRF Token not correct" +tools = "Tools" +twitter_account = "Twitter account" +type_to_search = "Type to search" +uncategorized = "Uncategorized" +uncategorized_comment = "Topics that don't need a category, or don't fit into any other existing category" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Update" +update_available = "Update Available" +update_draft = "Update draft" +update_post = "Update post" +update_to = "Update to" +upload = "Upload" +user = "User" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Valid values range from 0.0 to 1.0. See" +video_post = "Video post" +video_post_comment = "Creating blog post with featured video" +view = "View" +view_post = "View" +views = "Views" +widget = "Widget" +widget_settings = "Widget Settings" +would_you_like_to_try_our = "Would you like to try our " +yes_im_in = "Yes I'm in" +yes_not_recommended = "Yes (not recommended)" +you_dont_have_permission_to_access_this_page = "You don't have permission to access this page" +your_new_config_key = "Your New Config Key" +your_new_value = "Your New Value" +your_backups = "Your backups" +your_latest_blog_posts = "Your latest blog posts" +your_recent_posts = "Your recent posts" +by = "by" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Use Ctrl/CMD + F to search for your config key or value." +homepage = "homepage" +instead = "instead" +item_class = "Insert CSS class" +item_slug = "Insert Link URL" +now = "now" +of = "of" +optional = "optional" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro tips: You can create custom config keys and print out your config key value anywhere in your template." +read_more = "read more" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/eo_EO.ini b/lang/eo_EO.ini new file mode 100644 index 0000000..72d7fe8 --- /dev/null +++ b/lang/eo_EO.ini @@ -0,0 +1,327 @@ +about = "Pri" +add_category = "Aldoni kategorion" +add_content = "Aldoni enhavon" +add_link = "Aldoni ligilon" +add_menu = "Aldoni menuon" +add_new_page = "Aldoni novan paĝon" +add_new_post = "Aldoni novan afiŝon" +add_source_link_optional = "Aldoni fontligilon (nedeviga)" +add_sub = "Aldoni subpaĝon" +address_url = "Adreso (URL)" +admin = "Administranto" +admin_panel_style_based_on = "Aspekto de la administrpanelo bazita sur" +all_blog_posts = "Ĉiuj blogafiŝoj" +all_cache_has_been_deleted = "Ĉiuj kaŝmemoraĵoj forigitaj!" +all_posts_tagged = "Ĉiuj afiŝoj etikeditaj" +archive_for = "Arkivo por" +archive_page_for = "Arkiva paĝo por" +archives = "Arkivoj" +are_you_sure_you_want_to_delete_ = "Ĉu vi certas, ke vi volas forigi %s?" +at_the_moment_you_are_using_auto_generated_menu = "Nuntempe vi uzas aŭtomate generitan menuon." +audio_post = "Sonafiŝo" +audio_post_comment = "Krei blogafiŝon kun elstarigita sono" +author = "Aŭtoro" +author_description = "Nur alia HTMLy-uzanto" +back_to = "Reen al" +backup = "Sekurkopio" +blog_description = "En unu paragrafo, rakontu pli pri via blogo." +blog_theme = "Bloga etoso" +blog_title = "Bloga titolo" +blog_title_placeholder = "Mia HTMLy Blogo" +blog_posts_displayed_as = "Blogafiŝoj montritaj kiel" +breadcrumb_home_text = "Hejma teksto por navigilo" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Per uzo de ĉi tiu enportilo vi konfirmas, ke la fluo apartenas al vi aŭ ke vi almenaŭ havas la rajton publikigi ĝin." +css_class_optional = "CSS-klaso (nedeviga)" +cache_expiration = "Kaŝmemora eksvalidiĝo (en horoj)" +cache_off = "Kaŝmemoro malŝaltita" +cache_timestamp = "Kaŝmemora tempindiko" +cancel = "Nuligi" +cannot_read_feed_content = "Ne eblas legi la enhavon de la fluo" +captcha_error = "Captcha malsukcesis" +categories = "Kategorioj" +category = "Kategorio" +check_update = "Kontroli ĝisdatigon" +clear_cache = "Forigi kaŝmemoron" +comma_separated_values = "Valoroj disigitaj per komo" +comment_system = "Komenta sistemo" +comments = "Komentoj" +config = "Agordoj" +congrats_you_have_the_latest_version_of_htmly = "Gratulon! Vi havas la plej novan version de HTMLy." +content = "Enhavo" +contents = "Enhavoj" +copyright_line = "Kopirajta linio" +copyright_line_placeholder = "(c) Via nomo." +create_backup = "Krei sekurkopion" +created = "Kreita" +custom = "Propraj" +custom_settings = "Propraj agordoj" +dashboard = "Stirpanelo" +date = "Dato" +date_format = "Data formato" +delete = "Forigi" +description = "Priskribo" +disable = "Malebligi" +disabled = "Malebligita" +disqus_shortname = "Disqus mallongnomo" +disqus_shortname_placeholder = "htmly" +draft = "Malneto" +edit = "Redakti" +edit_category = "Redakti kategorion" +edit_post = "Redakti" +edit_profile = "Redakti profilon" +enable = "Ebligi" +enable_blog_url = "Ebligi blogan URL" +enter_image_url = "Enigi bildan URL" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook paĝo" +featured_audio = "Elstarigita sono" +featured_image = "Elstarigita bildo" +featured_link = "Elstarigita ligilo" +featured_quote = "Elstarigita citaĵo" +featured_video = "Elstarigita filmeto" +feed_url = "Flua URL" +filename = "Dosiernomo" +follow = "Sekvi" +for_google_site_verification_meta = "Por google-site-verification meta" +front_page_displays = "Ĉefpaĝo montras" +full_post = "Plena afiŝo" +general = "Ĝenerala" +general_settings = "Ĝeneralaj agordoj" +get_one_here = "Akiru viajn reCaptcha-ŝlosilojn ĉi tie: " +github_pre_release = "GitHub antaŭeldono" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (malnova)" +google_search_console = "Google Search Console" +home = "Hejmo" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Se lasite malplena, ni eltiros ĝin el la malsupra enhavo" +if_the_url_is_left_empty_we_will_use_the_page_title = "Se la URL restas malplena, ni uzos la paĝan titolon" +if_the_url_is_left_empty_we_will_use_the_post_title = "Se la URL restas malplena, ni uzos la afiŝan titolon" +image_post = "Bilda afiŝo" +image_post_comment = "Krei blogafiŝon kun elstarigita bildo" +import = "Importi" +import_feed = "Komenci importi fluon" +import_rss = "Importi RSS" +import_rss_feed_2.0 = "Importi RSS-fluon 2.0" +insert_image = "Enmeti bildon" +invalid_error = "ERARO: Malĝusta uzantnomo aŭ pasvorto" +language = "Sistema lingvo" +link_name = "Ligila nomo" +link_post = "Ligila afiŝo" +link_post_comment = "Krei blogafiŝon kun elstarigita ligilo" +login = "Ensaluti" +login_page = "Ensaluta paĝo" +logout = "Elsaluti" +menu = "Menuo" +menus = "Menua redaktilo" +meta_description = "Metapriskribo" +meta_description_character = "Signoj por metapriskribo" +metatags = "Meta-etikedoj" +metatags_settings = "Meta-etikedaj agordoj" +mine = "Mia" +more = "Pli" +my_draft = "Mia malneto" +my_posts = "Miaj afiŝoj" +name = "Nomo" +newer = "Pli novaj" +next = "Sekva" +next_post = "Sekva afiŝo" +no_available_backup = "Neniu disponebla sekurkopio nuntempe." +no_draft_found = "Neniu malneto trovita" +no_posts_found = "Neniu afiŝo trovita" +no_related_post_found = "Neniu rilata afiŝo trovita" +no_scheduled_posts_found = "Neniu planita afiŝo trovita!" +no_search_results = "Neniuj serĉrezultoj" +nope = "Ne" +not = "Ne" +older = "Pli malnova" +only = "Nur" +operations = "Operacioj" +page = "Paĝo" +page_generation_time = "Generotempo de la paĝo" +pages = "Paĝoj" +pass_error = "La pasvorta kampo estas deviga" +password = "Pasvorto" +performance = "Rendimento" +performance_settings = "Rendimentaj agordoj" +permalink = "Fiksligilo" +popular = "Populara" +popular_posts = "Popularaj afiŝoj" +popular_posts_widget = "Fenestreto pri popularaj afiŝoj" +popular_posts_widget_at_most = "Popularaj afiŝoj fenestreto maksimume" +popular_tags = "Popularaj etikedoj" +post_by_author = "Afiŝoj de tiu aŭtoro" +posted_in = "Afiŝita en" +posted_on = "Afiŝita je" +posts = "Afiŝoj" +posts_by = "Afiŝoj de" +posts_draft = "Malnetaj afiŝoj" +posts_in_archive_page_at_most = "Afiŝoj en arkiva paĝo maksimume" +posts_in_category_page_at_most = "Afiŝoj en kategoria paĝo maksimume" +posts_in_front_page_show_at_most = "Afiŝoj en ĉefpaĝo maksimume" +posts_in_profile_page_at_most = "Afiŝoj en profilpaĝo maksimume" +posts_in_search_result_at_most = "Afiŝoj en serĉrezultoj maksimume" +posts_in_tag_page_at_most = "Afiŝoj en etikedpaĝo maksimume" +posts_in_type_page_at_most = "Afiŝoj en tipa paĝo maksimume" +posts_index_settings = "Agordoj de afiŝindekso" +posts_list = "Listo de afiŝoj" +posts_tagged = "Afiŝoj etikeditaj" +posts_with_type = "Afiŝoj kun tipo" +pre_release = "Antaŭeldono" +prev = "Antaŭa" +prev_post = "Antaŭa afiŝo" +preview = "Antaŭrigardo" +profile_for = "Profilo por" +proudly_powered_by = "Fiere funkciigita de" +publish = "Publikigi" +publish_draft = "Publikigi malneton" +published = "Publikigita" +quote_post = "Citaĵa afiŝo" +quote_post_comment = "Krei blogafiŝon kun elstarigita citaĵo" +rss_character = "RSS-signo" +rss_feeds_show_the_most_recent = "RSS-fluoj montras la plej freŝajn" +rss_settings = "RSS-agordoj" +read_more_text = "Legu pli teksto" +read_more_text_placeholder = "Legu pli" +reading = "Legado" +reading_settings = "Legadaj agordoj" +recaptcha = "Protekto de ensaluto" +recent_posts = "Lastatempaj afiŝoj" +recent_posts_widget_at_most = "Lastatempaj afiŝoj fenestreto maksimume" +regular_post = "Ordinara afiŝo" +regular_post_comment = "Krei ordinaran blogafiŝon" +related_posts = "Rilataj afiŝoj" +related_widget_posts_at_most = "Rilataj afiŝoj fenestreto maksimume" +revert_to_draft = "Reveni al malneto" +save = "Konservi" +save_config = "Konservi agordojn" +save_edit = "Konservi redakton" +save_menu = "Konservi menuon" +save_as_draft = "Konservi kiel malneto" +save_category = "Konservi kategorion" +scheduled = "Planita" +scheduled_posts = "Planitaj afiŝoj" +scheduled_tips = "Se afiŝo havas estontan daton/horon, ĝi aperos en planitaj afiŝoj" +search = "Serĉi" +search_for = "Serĉi por" +search_results_for = "Serĉrezultoj por" +search_results_not_found = "Neniuj serĉrezultoj trovita!" +secret_key = "Sekreta ŝlosilo" +settings = "Agordoj" +sign_in_to_start_your_session = "Ensalutu por komenci vian sesion" +site_key = "Retej-ŝlosilo" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Sociaj retoj" +static_page = "Statika paĝo" +static_page_comment = "Krei statikan paĝon" +static_pages = "Statikaj paĝoj" +summary = "Resumo" +summary_character = "Resumo signo" +tag = "Etikedo" +tagcloud_widget_at_most = "Etikednubo maksimume" +tagline = "Subtitolo" +tagline_placeholder = "Sendatumbaza PHP Bloga Platformo" +tagline_description = "En kelkaj vortoj, klarigu pri kio temas via blogo." +tags = "Etikedoj" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Tio estas malnova kodo; kutime novkreita Analytics uzas gtag.js" +this_page_doesnt_exist = "Ĉi tiu paĝo ne ekzistas!" +time = "Tempo" +timezone = "Horzono" +title = "Titolo" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Por uzi Disqus aŭ Facebook-komentojn, vi devas provizi vian Disqus-mallongnomon aŭ Facebook App ID." +token_error = "CSRF-ĵetono ne ĝustas" +tools = "Iloj" +twitter_account = "Twitter-konto" +type_to_search = "Tajpu por serĉi" +uncategorized = "Senkategoriaj" +uncategorized_comment = "Temoj, kiuj ne bezonas kategorion aŭ ne konvenas al ajna alia ekzistanta kategorio" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Nekonata flua formato" +update = "Ĝisdatigi" +update_available = "Disponeblas ĝisdatigo" +update_draft = "Ĝisdatigi malneton" +update_post = "Ĝisdatigi afiŝon" +update_to = "Ĝisdatigi al" +upload = "Alŝuti" +user = "Uzanto" +user_error = "La uzanta kampo estas deviga" +valid_values_range_from_0_to_1.0._see = "Validaj valoroj intervalas de 0.0 ĝis 1.0. Vidu" +video_post = "Filmeta afiŝo" +video_post_comment = "Krei blogafiŝon kun elstarigita filmeto" +view = "Vidi" +view_post = "Vidi" +views = "Vidoj" +widget = "Fenestreto" +widget_settings = "Fenestreta agordo" +would_you_like_to_try_our = "Ĉu vi ŝatus provi nian " +yes_im_in = "Jes, mi ŝatus" +yes_not_recommended = "Jes (ne rekomendita)" +you_dont_have_permission_to_access_this_page = "Vi ne rajtas aliri ĉi tiun paĝon" +your_new_config_key = "Via nova agordo-ŝlosilo" +your_new_value = "Via nova valoro" +your_backups = "Viaj sekurkopioj" +your_latest_blog_posts = "Viaj plej novaj blogafiŝoj" +your_recent_posts = "Viaj lastatempaj afiŝoj" +by = "de" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "rimarko: Uzu Ctrl/CMD+F por serĉi vian agordo-ŝlosilon aŭ valoron." +homepage = "Hejmpaĝo" +instead = "anstataŭ" +item_class = "Enmetu CSS-klason" +item_slug = "Enmetu URL-on por la ligilo" +now = "nun" +of = "de" +optional = "nedeviga" +post_your_post_slug = "/post/via-afiŝ-limako" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "profesiaj konsiloj: Vi povas krei proprajn agordo-ŝlosilojn kaj printi ilian valoron ie ajn en via ŝablono." +read_more = "Legu pli" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/jaro/monato/via-afiŝ-limako" +your_key = "via.ŝlosilo" +summary_behavior = "Konduto de resumo" +default = "Defaŭlta" +check_shortcode = "Kontroli la mallongigon" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "En resumreĝimo, ĉu unue kontroli la mallongigon antaŭ ol mallongigi la enhavon ĝis x signoj" +manage_users = "Administri uzantojn" +add_user = "Aldoni uzanton" +username = "Uzantnomo" +role = "Rolo" +change_password = "Ŝanĝi pasvorton" +config_mfa = "Agordi MFA" +mfacode = "MFA-kodo" +verify_code = "Kontroli la MFA-kodon" +verify_password = "Kontroli la nunan pasvorton" +manualsetupkey = "Vi ankaŭ povas mane enmeti la agordan ŝlosilon" +mfa_error = "MFA-kodo estas malĝusta" +disablemfa = "Malebligi MFA" +enable_auto_save = "Ebligi aŭtomatan konservadon" +explain_autosave = "Kiam ebligita, nova enhavo aŭ malneto estos aŭtomate konservita ĉiun 60 sekundojn." +login_protect_system = "Ensaluta protekta sistemo" +cloudflare_info = "Rigardu la dokumentaron de Cloudflare pri Turnstile: " +mfa_config = "Plurpaŝa Aŭtentikigo (MFA)" +set_mfa_globally = "Agordi la staton de MFA" +explain_mfa = "Kiam ebligita, MFA estas nedeviga por ĉiuj uzantoj. Kiam malebligita, neniu povas uzi ĝin kaj la kampo en la ensaluta paĝo kaŝiĝas." +set_version_publicly = "Versio videbleco" +explain_version = "Defaŭlte la versio de HTMLy videblas en la fontkodo, sed iuj administrantoj eble preferas kaŝi ĝin." +focus_mode = "Ŝalti fokuson" +writing = "Verkado" +writing_settings = "Verkadaj agordoj" +security = "Sekureco" +security_settings = "Sekurecaj agordoj" +msg_error_field_req_username = "La kampo Uzantnomo estas deviga." +msg_error_field_req_password = "La kampo Pasvorto estas deviga." +msg_error_field_req_title = "La kampo Titolo estas deviga." +msg_error_field_req_content = "La kampo Enhavo estas deviga." +msg_error_field_req_tag = "La kampo Etikedo estas deviga." +msg_error_field_req_image = "La kampo Bildo estas deviga." +msg_error_field_req_video = "La kampo Filmeto estas deviga." +msg_error_field_req_link = "La kampo Ligilo estas deviga." +msg_error_field_req_quote = "La kampo Citaĵo estas deviga." +msg_error_field_req_audio = "La kampo Sono estas deviga." +msg_error_field_req_feedurl = "Vi devas precizigi la fluan URL-on." +rss_feeds_description_select = "RSS-priskribo" +rss_description_body = "Korpo de afiŝo" +rss_description_meta = "Metapriskribo de afiŝo" +admin_theme = "Admin-etoso" +admin_theme_light = "Hela" +admin_theme_dark = "Malhela" + diff --git a/lang/es_ES.ini b/lang/es_ES.ini new file mode 100644 index 0000000..830ae2c --- /dev/null +++ b/lang/es_ES.ini @@ -0,0 +1,326 @@ +about = "Acerca de" +add_category = "Añadir categoría" +add_content = "Agregar contenido" +add_link = "Agregar enlace" +add_menu = "Agregar menú" +add_new_page = "Agregar nueva página" +add_new_post = "Agregar nueva publicación" +add_source_link_optional = "Agregar enlace de origen (opcional)" +add_sub = "Agregar sub categoría" +address_url = "Address (URL)" +admin = "Administración" +admin_panel_style_based_on = "Estilo del panel de administración basado en" +all_blog_posts = "Todas las publicaciones del blog" +all_cache_has_been_deleted = "¡Se ha eliminado todo el caché!" +all_posts_tagged = "Todas las publicaciones etiquetadas" +archive_for = "Archivar para" +archive_page_for = "Página de archivo para" +archives = "Archivo" +are_you_sure_you_want_to_delete_ = "Está seguro de que desea eliminar % s ?" +at_the_moment_you_are_using_auto_generated_menu = "En este momento estás utilizando el menú generado automáticamente." +audio_post = "Publicación de audio" +audio_post_comment = "Creación de una publicación de blog con audio destacado" +author = "Autor" +author_description = "Sólo otro usuario HTMLy" +back_to = "Volver a" +backup = "Respaldo" +blog_description = "En un párrafo, cuéntanos más sobre tu blog." +blog_theme = "Tema del blog" +blog_title = "Título del blog" +blog_title_placeholder = "Mi HTMLy Blog" +blog_posts_displayed_as = "Las publicaciones del blog se muestran como" +breadcrumb_home_text = "Texto de inicio de ruta de navegación" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Al utilizar este importador, aceptas si el feed es tuyo o al menos tienes la autoridad para publicarlo." +css_class_optional = "Clase CSS (opcional)" +cache_expiration = "Caducidad de la caché (en horas)" +cache_off = "Caché desactivado" +cache_timestamp = "Marca de tiempo de caché" +cancel = "Cancelar" +cannot_read_feed_content = "No se puede leer el contenido del feed" +captcha_error = "reCaptcha no es correcto" +categories = "Categorías" +category = "Categoría" +check_update = "Buscar actualizaciones" +clear_cache = "Limpiar cache" +comma_separated_values = "Valores separados por comas" +comment_system = "Sistema de comentarios" +comments = "Comentarios" +config = "Configuración" +congrats_you_have_the_latest_version_of_htmly = "¡Felicidades! Tienes la última versión de HTMLy." +content = "Contenido" +contents = "Contenido" +copyright_line = "Línea de derechos de autor" +copyright_line_placeholder = "(c) Su nombre." +create_backup = "Crear copia de seguridad" +created = "Creado" +custom = "Personalizado" +custom_settings = "Configuración personalizada" +dashboard = "Panel de control" +date = "Fecha" +date_format = "Formato de fecha" +delete = "Eliminar" +description = "Descripción" +disable = "Desactivar" +disabled = "Desactivado" +disqus_shortname = "Nombre corto de Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Borrador" +edit = "Editar" +edit_category = "Editar categoría" +edit_post = "Editar" +edit_profile = "Editar perfil" +enable = "Habilitar" +enable_blog_url = "Habilitar URL del blog" +enter_image_url = "Ingrese la URL de la imagen" +facebook_app_id = "ID de aplicación de Facebook" +facebook_page = "página de Facebook" +featured_audio = "Audio destacado" +featured_image = "Imagen destacada" +featured_link = "Enlace destacado" +featured_quote = "Cita destacada" +featured_video = "Vídeo destacado" +feed_url = "URL de la fuente" +filename = "Nombre del archivo" +follow = "Seguir" +for_google_site_verification_meta = "Para meta de verificación del sitio de Google" +front_page_displays = "Visualizaciones de la página principal" +full_post = "Publicación completa" +general = "Generales" +general_settings = "Configuración general" +get_one_here = "Consigue uno aquí" +github_pre_release = "Prelanzamiento de Github" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (heredado)" +google_search_console = "Consola de búsqueda de Google" +home = "Inicio" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Si lo dejamos vacío, lo extraeremos del contenido siguiente" +if_the_url_is_left_empty_we_will_use_the_page_title = "Si la URL se deja vacía usaremos el título de la página" +if_the_url_is_left_empty_we_will_use_the_post_title = "Si la URL se deja vacía usaremos el título de la publicación" +image_post = "Publicación de imagen" +image_post_comment = "Crear publicación de blog con imagen destacada" +import = "Importar" +import_feed = "Iniciar importación de feed" +import_rss = "Importar RSS" +import_rss_feed_2.0 = "Importar fuente RSS 2.0" +insert_image = "Insertar imagen" +invalid_error = "ERROR: nombre de usuario o contraseña no válidos" +language = "Idioma del sistema" +link_name = "Nombre del enlace" +link_post = "Enlace de la Publicación" +link_post_comment = "Creación de una publicación de blog con un enlace destacado" +login = "acceso" +login_page = "Página de inicio de sesión" +logout = "Cerrar sesión" +menu = "menú" +menus = "Editora de menús" +meta_description = "Meta descripción" +meta_description_character = "Carácter de meta descripción" +metatags = "Metaetiquetas" +metatags_settings = "Configuración de metaetiquetas" +mine = "Mía" +more = "Más" +my_draft = "Mi borrador" +my_posts = "Mis publicaciones" +name = "Nombre" +newer = "Más nuevo" +next = "Próximo" +next_post = "Publicación siguiente" +no_available_backup = "No hay copia de seguridad disponible en este momento." +no_draft_found = "No se encontró ningún borrador" +no_posts_found = "No se han encontrado publicaciones" +no_related_post_found = "No se encontró ninguna publicación relacionada" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "Sin resultados de búsqueda" +nope = "Nope" +not = "No" +older = "Mayor" +only = "Only" +operations = "Operaciones" +page = "Página" +page_generation_time = "Tiempo de generación de página" +pages = "Paginas" +pass_error = "El campo de contraseña es obligatorio" +password = "Contraseña" +performance = "Rendimiento" +performance_settings = "Configuración de rendimiento" +permalink = "enlace permanente" +popular = "populares" +popular_posts = "Entradas populares" +popular_posts_widget = "Widget de publicaciones populares" +popular_posts_widget_at_most = "Widget de publicaciones populares como máximo" +popular_tags = "Etiquetas Populares" +post_by_author = "Publicaciones de este autor" +posted_in = "Publicado en" +posted_on = "Publicado en" +posts = "Publicaciones" +posts_by = "Publicaciones por" +posts_draft = "Borrador de publicaciones" +posts_in_archive_page_at_most = "Publicaciones en la página de archivo como máximo" +posts_in_category_page_at_most = "Publicaciones en la página de categoría como máximo" +posts_in_front_page_show_at_most = "Las publicaciones en la página principal se muestran como máximo" +posts_in_profile_page_at_most = "Publicaciones en la página de perfil como máximo" +posts_in_search_result_at_most = "Publicaciones en el resultado de búsqueda como máximo" +posts_in_tag_page_at_most = "Publicaciones en la página de etiquetas como máximo" +posts_in_type_page_at_most = "Publicaciones en la página tipo como máximo" +posts_index_settings = "Configuración del índice de publicaciones" +posts_list = "Lista de publicaciones" +posts_tagged = "Publicaciones etiquetadas" +posts_with_type = "Publicaciones con tipo" +pre_release = "Prelanzamiento" +prev = "Antiguo" +prev_post = "Publicación anterior" +preview = "Vista anticipada" +profile_for = "Perfil para" +proudly_powered_by = "Orgullosamente impulsado por" +publish = "Publicar" +publish_draft = "Publicar borrador" +published = "Publicado" +quote_post = "Publicación de cotización" +quote_post_comment = "Crear publicación de blog con cita destacada" +rss_character = "carácter RSS" +rss_feeds_show_the_most_recent = "Los canales RSS muestran los más recientes" +rss_settings = "Configuración RSS" +read_more_text = "Leer más texto" +read_more_text_placeholder = "Leer más" +reading = "Leyendo" +Reading_settings = "Configuración de lectura" +recaptcha = "reCAPTCHA" +recent_posts = "Mensajes recientes" +recientes_posts_widget_at_most = "Widget de publicaciones recientes como máximo" +regular_post = "Correo ordinario" +regular_post_comment = "Crear una publicación de blog regular" +related_posts = "Artículos Relacionados" +related_widget_posts_at_most = "Publicaciones de widgets relacionados como máximo" +revert_to_draft = "Volver a borrador" +save = "Salvar" +save_config = "Guardar configuración" +save_edit = "Guardar edición" +save_menu = "Guardar menú" +save_as_draft = "Guardar como borrador" +save_category = "Guardar categoría" +scheduled = "Programado" +scheduled_posts = "Publicaciones programadas" +scheduled_tips = "Al publicar una publicación con fecha u hora futura, irá a las publicaciones programadas" +search = "Buscar" +search_for = "Buscar" +search_results_for = "Resultados de búsqueda para" +search_results_not_found = "¡No se encontraron resultados de búsqueda!" +secret_key = "Clave secreta" +settings = "Configuración" +sign_in_to_start_your_session = "Inicia sesión para iniciar tu sesión" +site_key = "Clave del sitio" +sitestamp = "Mapa del sitio" +slug = "Babosa" +social_media = "Medios sociales" +static_page = "Página estática" +static_page_comment = "Creando página estática" +static_pages = "Páginas estáticas" +summary = "Sumario" +summary_character = "Carácter sumario" +tag = "Etiqueta" +tagcloud_widget_at_most = "TagCloud como máximo" +tagline = "Tagline" +tagline_placeholder = "Plataforma de blogs PHP sin base de datos" +tagline_description = "En pocas palabras, explica de qué trata este blog." +tags = "Etiquetas" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Este es el código heredado. Generalmente se crean nuevos análisis usando gtag.js." +this_page_doesnt_exist = "¡Esta página no existe!" +time = "Tiempo" +timezone = "Zona horaria" +title = "Título" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Para utilizar Disqus o comentarios de Facebook, debe proporcionar el nombre corto de Disqus o el ID de la aplicación de Facebook." +token_error = "El token CSRF no es correcto" +tools = "Útiles" +twitter_account = "cuenta de Twitter" +type_to_search = "Escriba para buscar" +uncategorized = "Sin categorizar" +uncategorized_comment = "Temas que no necesitan una categoría o que no encajan en ninguna otra categoría existente" +universal_analytics = "Análisis universal (gtag.js)" +unknown_feed_format = "Formato de alimentación desconocido" +update = "Actualizar" +update_available = "Actualización disponible" +update_draft = "Actualizar borrador" +update_post = "Actualizar publicación" +update_to = "Update to" +upload = "subir" +user = "Usuario" +user_error = "El campo de usuario es obligatorio" +valid_values_range_from_0_to_1.0._see = "Los valores válidos varían de 0,0 a 1,0. Ver" +video_post = "Publicación de video" +video_post_comment = "Creación de una publicación de blog con video destacado" +view = "Ver" +view_post = "Ver" +views = "Puntos de vista" +widget = "Widget" +widget_settings = "Configuración de widgets" +would_you_like_to_try_our = "¿Te gustaría probar nuestra " +yes_im_in = "Sí, estoy en" +yes_not_recommended = "Sí (no recomendado)" +you_dont_have_permission_to_access_this_page = "No tienes permiso para acceder a esta pagina" +your_new_config_key = "Su nueva clave de configuración" +your_new_value = "Tu nuevo valor" +your_backups = "Tus copias de seguridad" +your_latest_blog_posts = "Tus últimas publicaciones de blog" +your_recent_posts = "Tus publicaciones recientes" +by = "por" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "sugerencia: Utilice Ctrl/CMD + F para buscar su clave o valor de configuración." +homepage = "página de inicio" +instead = "en lugar" +item_class = "Insertar clase CSS" +item_slug = "Insertar URL del enlace" +now = "ahora" +of = "de" +optional = "opcional" +post_your_post_slug = "/post/tu-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "consejos profesionales: Puede crear una clave de configuración personalizada e imprimir el valor de su clave de configuración en cualquier lugar de su plantilla." +read_more = "Lee mas" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Comportamiento resumido" +default = "Predeterminado" +check_shortcode = "comprobar el código corto" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "En el modo resumen, verifique el código abreviado primero o no antes de recortar el contenido a x char" +manage_users = "Administrar usuarios" +add_user = "Agregar usuario" +username = "nombre de usuario" +role = "rol" +change_password = "Cambiar contraseña" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/fa_IR.ini b/lang/fa_IR.ini new file mode 100644 index 0000000..7a2b523 --- /dev/null +++ b/lang/fa_IR.ini @@ -0,0 +1,326 @@ +about = "درباره ما" +add_category = "افزودن دسته بندی" +add_content = "افزودن محتوا" +add_link = "افزودن لینک" +add_menu = "افزودن منو" +add_new_page = "افزودن صفحه جدید" +add_new_post = "افزودن پست جدید" +add_source_link_optional = "Add source link (optional)" +add_sub = "افزودن صفحه فرعی" +address_url = "Address (URL)" +admin = "ادمین" +admin_panel_style_based_on = "Admin panel style based on" +all_blog_posts = "تمام ارسالی ها" +all_cache_has_been_deleted = "حافظه کش پاک شد!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "آرشیو" +are_you_sure_you_want_to_delete_ = "Are you sure you want to delete %s?" +at_the_moment_you_are_using_auto_generated_menu = "At the moment you are using auto generated menu." +audio_post = "پست های صوتی" +audio_post_comment = "Creating blog post with featured audio" +author = "نویسنده" +author_description = "Just another HTMLy user" +back_to = "برگشت به" +backup = "پشتیبان" +blog_description = "In one paragraph, tell us more about your blog." +blog_theme = "تم وبلاگ" +blog_title = "عنوان وبلاگ" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "Blog posts displayed as" +breadcrumb_home_text = "Breadcrumb home text" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "By using this importer you are agree if the feed is yours or at least you have the authority to publish it." +css_class_optional = "CSS Class (optional)" +cache_expiration = "Cache expiration (in hours)" +cache_off = "Cache off" +cache_timestamp = "Cache timestamp" +cancel = "انصراف" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "دسته بندی ها" +category = "دسته بندی" +check_update = "بررسی به روزرسانی" +clear_cache = "پاک کردن حافظه کش" +comma_separated_values = "Comma separated values" +comment_system = "Comment system" +comments = "نظرات" +config = "تنظیمات" +congrats_you_have_the_latest_version_of_htmly = "Congrats! You have the latest version of HTMLy." +content = "محتوا" +contents = "فهرست" +copyright_line = "خط کپی رایت" +copyright_line_placeholder = "(c) Your name." +create_backup = "ساجاد نسخه پشتیبان" +created = "ایجاد شد" +custom = "سفارشی" +custom_settings = "تنظیمات سفارشی" +dashboard = "داشبورد" +date = "تاریخ" +date_format = "فرمت تاریخ" +delete = "حذف" +description = "توضیحات" +disable = "غیر فعال" +disabled = "غیرفعال شد" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "پیش نویس" +edit = "ویرایش" +edit_category = "ویرایش دسته بندی" +edit_post = "ویرایش" +edit_profile = "ویرایش پروفایل" +enable = "فعال" +enable_blog_url = "Enable blog URL" +enter_image_url = "ورود آدرس تصویر" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook page" +featured_audio = "Featured Audio" +featured_image = "Featured Image" +featured_link = "Featured Link" +featured_quote = "Featured Quote" +featured_video = "Featured Video" +feed_url = "Feed URL" +filename = "نام فایل" +follow = "دنبال کردن" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "نمایش صفحه اول" +full_post = "پست کامل" +general = "عمومی" +general_settings = "تنظیمات عمومی" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "صفحه اصلی" +if_left_empty_we_will_excerpt_it_from_the_content_below = "If leave empty we will excerpt it from the content below" +if_the_url_is_left_empty_we_will_use_the_page_title = "If the url leave empty we will use the page title" +if_the_url_is_left_empty_we_will_use_the_post_title = "If the url leave empty we will use the post title" +image_post = "ارسال تصویر" +image_post_comment = "ایجاد پست وبلاگ به همراه تصویر" +import = "وارد كردن" +import_feed = "Start Import Feed" +import_rss = "Import RSS" +import_rss_feed_2.0 = "Import RSS Feed 2.0" +insert_image = "درج تصویر" +invalid_error = "ERROR: Invalid username or password" +language = "زیان سیستم" +link_name = "نام لینک" +link_post = "لینک پست" +link_post_comment = "ایجاد پست وبلگ به همراه لینک" +login = "ورود" +login_page = "صفحه ورود" +logout = "خروج" +menu = "منو" +menus = "Menu Editor" +meta_description = "توضیحات متا" +meta_description_character = "Meta description character" +metatags = "متاتگ" +metatags_settings = "Metatags Settings" +mine = "Mine" +more = "بیشتر" +my_draft = "پیش نویس های من" +my_posts = "پست های من" +name = "نام" +newer = "جدیدتر" +next = "بعد" +next_post = "پست بعدی" +no_available_backup = "هیچ نسخه پشتیبانی وجود ندارد" +no_draft_found = "پیش نویس یافت نشد" +no_posts_found = "هیچ پستی ارسال نشده است" +no_related_post_found = "پست مرتبطی یافت نشد" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Nope" +not = "No" +older = "قدیمی ترها" +only = "فقط" +operations = "عملیات" +page = "صفحه" +page_generation_time = "Page generation time" +pages = "صفحه ها" +pass_error = "Password field is required" +password = "کلمه عبور" +performance = "پرفورمنس" +performance_settings = "Performance Settings" +permalink = "پیوند ثابت" +popular = "محبوب" +popular_posts = "پست های محبوب" +popular_posts_widget = "Popular posts widget" +popular_posts_widget_at_most = "Popular posts widget at most" +popular_tags = "تگ های محبوب" +post_by_author = "Posts by this author" +posted_in = "ارسال شده" +posted_on = "Posted on" +posts = "پست ها" +posts_by = "ارسال توسط" +posts_draft = "Posts draft" +posts_in_archive_page_at_most = "Posts in archive page at most" +posts_in_category_page_at_most = "Posts in category page at most" +posts_in_front_page_show_at_most = "Posts in front page show at most" +posts_in_profile_page_at_most = "Posts in profile page at most" +posts_in_search_result_at_most = "Posts in search result at most" +posts_in_tag_page_at_most = "Posts in tag page at most" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Posts index settings" +posts_list = "لیست پست ها" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "قدیمی" +prev_post = "پست قبلی" +preview = "مشاهده" +profile_for = "Profile for" +proudly_powered_by = "Proudly powered by" +publish = "انتشار" +publish_draft = "انتشار پیش نویس" +published = "منتشر شد" +quote_post = "Quote post" +quote_post_comment = "Creating blog post with featured quote" +rss_character = "RSS character" +rss_feeds_show_the_most_recent = "RSS feeds show the most recent" +rss_settings = "RSS settings" +read_more_text = "Read more text" +read_more_text_placeholder = "ادامه مطلب" +reading = "خواندن" +reading_settings = "Reading Settings" +recaptcha = "reCAPTCHA" +recent_posts = "پست های اخیر" +recent_posts_widget_at_most = "Recent posts widget at most" +regular_post = "پست عادی" +regular_post_comment = "ایجاد پست عادی وبلاگ" +related_posts = "پست های مرتبط" +related_widget_posts_at_most = "Related widget posts at most" +revert_to_draft = "Revert to draft" +save = "ذخیره" +save_config = "ذخیره تنظیمات" +save_edit = "Save Edit" +save_menu = "Save menu" +save_as_draft = "Save as draft" +save_category = "دخیره دسته بندی" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "جستجو" +search_for = "جستجو برای" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Secret Key" +settings = "تنظیمات" +sign_in_to_start_your_session = "Sign in to start your session" +site_key = "Site Key" +sitemap = "نقشه سایت" +slug = "Slug" +social_media = "رسانه های اجتماعی" +static_page = "صفحه ایستا" +static_page_comment = "ایجاد صفحه ایستا" +static_pages = "صفحه های ایستا" +summary = "خلاصه" +summary_character = "Summary character" +tag = "تگ" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Tagline" +tagline_placeholder = "Databaseless PHP Blogging Platform" +tagline_description = "In a few words, explain what this blog is about." +tags = "تگ ها" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "این صفحه وجود ندارد" +time = "ساعت" +timezone = "Timezone" +title = "عنوان" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "To use Disqus or Facebook comments you need to provide your Disqus shortname or your Facebook App ID." +token_error = "CSRF Token not correct" +tools = "ابزار" +twitter_account = "Twitter account" +type_to_search = "برای جستجو تایپ کنید" +uncategorized = "دسته بندی نشده" +uncategorized_comment = "Topics that don't need a category, or don't fit into any other existing category" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "به روز رسانی" +update_available = "Update Available" +update_draft = "به روز رسانی پیش نویس" +update_post = "به روز رسانی پست" +update_to = "به روزرسانی به" +upload = "ارسال" +user = "نام کاربری" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Valid values range from 0.0 to 1.0. See" +video_post = "پست ویدیویی" +video_post_comment = "Creating blog post with featured video" +view = "View" +view_post = "View" +views = "Views" +widget = "ویجت" +widget_settings = "Widget Settings" +would_you_like_to_try_our = "Would you like to try our " +yes_im_in = "Yes I'm in" +yes_not_recommended = "Yes (not recommended)" +you_dont_have_permission_to_access_this_page = "You don't have permission to access this page" +your_new_config_key = "Your New Config Key" +your_new_value = "Your New Value" +your_backups = "Your backups" +your_latest_blog_posts = "آخرین پست های وبلاگ" +your_recent_posts = "آخرین پست ها" +by = "توسط" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Use Ctrl/CMD + F to search for your config key or value." +homepage = "صفحه اصلی" +instead = "به جای" +item_class = "Insert CSS class" +item_slug = "افزودن لینک" +now = "now" +of = "of" +optional = "اختیاری" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro tips: You can create custom config keys and print out your config key value anywhere in your template." +read_more = "read more" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/fr_FR.ini b/lang/fr_FR.ini new file mode 100644 index 0000000..c2e341f --- /dev/null +++ b/lang/fr_FR.ini @@ -0,0 +1,326 @@ +about = "À propos" +add_category = "Ajouter une catégorie" +add_content = "Ajouter du contenu" +add_link = "Ajouter le lien" +add_menu = "Ajouter un menu" +add_new_page = "Ajouter une page" +add_new_post = "Ajouter un billet" +add_source_link_optional = "Ajouter le lien source (optionnel)" +add_sub = "Ajouter une sous-page" +address_url = "Adresse (URL)" +admin = "Administrateur" +admin_panel_style_based_on = "Style du panneau d'administration basé sur" +all_blog_posts = "Tous les billets de blog" +all_cache_has_been_deleted = "Le cache a été vidé !" +all_posts_tagged = "Tous les billets taggués" +archive_for = "Archive pour" +archive_page_for = "Page d'archive pour" +archives = "Archives" +are_you_sure_you_want_to_delete_ = "Êtes-vous sûr de vouloir supprimer %s ?" +at_the_moment_you_are_using_auto_generated_menu = "Pour le moment, vous utilisez le menu généré automatiquement." +audio_post = "Billet audio" +audio_post_comment = "Créer un billet de blog avec un fichier audio" +author = "Auteur" +author_description = "Un autre utilisateur de HTMLy" +back_to = "Retourner vers" +backup = "Sauvegarde" +blog_description = "En un paragraphe, dites-nous en plus sur votre blog." +blog_theme = "Thème graphique du blog" +blog_title = "Titre du blog" +blog_title_placeholder = "Mon blog HTMLy" +blog_posts_displayed_as = "Billets affichés comme" +breadcrumb_home_text = "Texte d'accueil du fil d'Ariane" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "En utilisant cet importateur, vous devez vous assurer qu'il s'agit de votre flux RSS ou que vous ayez l'autorisation de publier son contenu." +css_class_optional = "Classe CSS (optionnel)" +cache_expiration = "Durée avant l'expiration du cache (en heures)" +cache_off = "Désactiver le cache" +cache_timestamp = "Horodatage du cache" +cancel = "Annuler" +cannot_read_feed_content = "Impossible de lire le contenu du flux" +captcha_error = "reCaptcha incorrect" +categories = "Catégories" +category = "Catégorie" +check_update = "Rechercher des mises à jour" +clear_cache = "Nettoyer le cache" +comma_separated_values = "Valeurs séparées par des virgules" +comment_system = "Système de commentaires" +comments = "Commentaires" +config = "Configuration" +congrats_you_have_the_latest_version_of_htmly = "Félicitations ! Vous disposez de la dernière version de HTMLy." +content = "Contenu" +contents = "Contenus" +copyright_line = "Ligne de copyright" +copyright_line_placeholder = "(c) Votre nom." +create_backup = "Créer une sauvegarde" +created = "Créé" +custom = "Personnalisé" +custom_settings = "Paramètres personnalisés" +dashboard = "Tableau de bord" +date = "Date" +date_format = "Format des dates" +delete = "Supprimer" +description = "Description" +disable = "Désactiver" +disabled = "Désactivé" +disqus_shortname = "Nom abrégé (shortname) Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Brouillon" +edit = "Éditer" +edit_category = "Éditer la catégorie" +edit_post = "Éditer" +edit_profile = "Éditer le profil" +enable = "Activer" +enable_blog_url = "Activer l'URL blog" +enter_image_url = "Entrer l'URL de l'image" +facebook_app_id = "ID d'application Facebook" +facebook_page = "Page Facebook" +featured_audio = "Audio en vedette" +featured_image = "Image en vedette" +featured_link = "Lien en vedette" +featured_quote = "Citation en vedette" +featured_video = "Vidéo en vedette" +feed_url = "Adresse du flux" +filename = "Nom du fichier" +follow = "Suivre" +for_google_site_verification_meta = "Pour le méta-tag google-site-verification" +front_page_displays = "Affichage en première page" +full_post = "Billet entier" +general = "Général" +general_settings = "Paramètres généraux" +get_one_here = "Obtenez vos clés reCaptcha ici :" +github_pre_release = "Pré-release Github" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Accueil" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Si vous laissez vide, nous l'extrairons du contenu ci-dessous" +if_the_url_is_left_empty_we_will_use_the_page_title = "Si l'URL est laissée vide, nous utiliserons le titre de la page" +if_the_url_is_left_empty_we_will_use_the_post_title = "Si l'URL est laissée vide, nous utiliserons le titre du billet" +image_post = "Billet avec une image" +image_post_comment = "Créer un billet de blog avec une image" +import = "Importer" +import_feed = "Démarrer l'importation du flux" +import_rss = "Importer un flux RSS" +import_rss_feed_2.0 = "Importer le flux RSS 2.0" +insert_image = "Insérer l'image" +invalid_error = "Erreur : nom d'utilisateur ou mot de passe incorrect" +language = "Langue du système" +link_name = "Nom du lien" +link_post = "Billet avec un lien" +link_post_comment = "Créer un billet de blog avec un lien" +login = "Connexion" +login_page = "Page de connexion" +logout = "Déconnexion" +menu = "Menu" +menus = "Éditeur de menu" +meta_description = "Meta-description" +meta_description_character = "Nombre de caractères des méta-description" +metatags = "Méta-tags" +metatags_settings = "Paramètres des méta-tags" +mine = "Mes billets" +more = "Plus" +my_draft = "Mes brouillons" +my_posts = "Mes billets" +name = "Nom" +newer = "Plus récent" +next = "Suivant" +next_post = "Billet suivant" +no_available_backup = "Aucune sauvegarde disponible." +no_draft_found = "Aucun brouillon trouvé" +no_posts_found = "Aucun billet trouvé" +no_related_post_found = "Aucun billet en rapport trouvé" +no_scheduled_posts_found = "Aucun billet programmé trouvé !" +no_search_results = "Aucun résultat de recherche" +nope = "Non !" +not = "Non" +older = "Plus ancien" +only = "Seulement" +operations = "Opérations" +page = "Page" +page_generation_time = "Temps de génération de la page" +pages = "Pages" +pass_error = "Le champ Mot de passe est requis" +password = "Mot de passe" +performance = "Performance" +performance_settings = "Paramètres des performances" +permalink = "Lien permanent" +popular = "Populaire" +popular_posts = "Billets populaires" +popular_posts_widget = "Widget des billets populaires" +popular_posts_widget_at_most = "Nombre de billets maximum affichés dans le widget des billets populaires" +popular_tags = "Tags populaires" +post_by_author = "Billets de cet auteur" +posted_in = "Posté en" +posted_on = "Posté le" +posts = "Billets" +posts_by = "Billets par" +posts_draft = "Billets à l'état brouillon" +posts_in_archive_page_at_most = "Nombre de billets maximum dans la page des archives" +posts_in_category_page_at_most = "Nombre de billets maximum dans la page des catégories" +posts_in_front_page_show_at_most = "Nombre de billets maximum en première page" +posts_in_profile_page_at_most = "Nombre de billets maximum dans la page des profils" +posts_in_search_result_at_most = "Nombre de billets maximum dans les résultats de recherche" +posts_in_tag_page_at_most = "Nombre de billets maximum dans la page des tags" +posts_in_type_page_at_most = "Nombre de billets maximum dans la page des types" +posts_index_settings = "Paramètres d'indexation des articles" +posts_list = "Liste des billets" +posts_tagged = "Billets taggués" +posts_with_type = "Billets avec type" +pre_release = "Pré-release" +prev = "Ancien" +prev_post = "Billet précédent" +preview = "Pré-visualisation" +profile_for = "Profil de" +proudly_powered_by = "Fièrement propulsé par" +publish = "Publier" +publish_draft = "Publier le brouillon" +published = "Publié" +quote_post = "Billet avec une citation" +quote_post_comment = "Créer un billet avec un citation" +rss_character = "Caractères maximum des contenus du flux RSS" +rss_feeds_show_the_most_recent = "Nombre de billets maximum les plus récents du flux RSS" +rss_settings = "Paramètres du flux RSS" +read_more_text = "Texte Continuer à lire" +read_more_text_placeholder = "Continuer à lire" +reading = "Lecture" +reading_settings = "Paramètres de lecture" +recaptcha = "reCAPTCHA" +recent_posts = "Billets récents" +recent_posts_widget_at_most = "Nombre de billets maximum affichés dans le widget des billets récents" +regular_post = "Billet simple" +regular_post_comment = "Créer un billet de blog simple" +related_posts = "Billets en rapport" +related_widget_posts_at_most = "Nombre de billets maximum affichés dans le widget des billets similaires" +revert_to_draft = "Retourner en brouillon" +save = "Enregistrer" +save_config = "Sauvegarder la configuration" +save_edit = "Sauvegarder la modification" +save_menu = "Sauvegarder le menu" +save_as_draft = "Enregistrer en brouillon" +save_category = "Catégorie de la sauvegarde" +scheduled = "Programmés" +scheduled_posts = "Billets programmés" +scheduled_tips = "La publication d'un billet avec une date ou une heure future sera intégrée dans les billets programmés." +search = "Recherche" +search_for = "Rechercher pour" +search_results_for = "Résultats de recherche pour" +search_results_not_found = "Résultats de recherche non trouvés !" +secret_key = "Clé secrète" +settings = "Paramètres" +sign_in_to_start_your_session = "Connectez-vous pour démarrer votre session" +site_key = "Clé de site" +sitemap = "Plan du site" +slug = "Jeton" +social_media = "Réseaux sociaux" +static_page = "Page statique" +static_page_comment = "Créer une page statique" +static_pages = "Pages statiques" +summary = "Résumé" +summary_character = "Nombre de caractères du résumé" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud au maximum" +tagline = "Slogan" +tagline_placeholder = "Plateforme de blog PHP sans base de données" +tagline_description = "En quelques mots, expliquez de quoi parle ce blog." +tags = "Tags" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Il s'agit d'un code hérité (legacy). Généralement, gtag.js est utilisé" +this_page_doesnt_exist = "Cette page n'existe pas !" +time = "Temps" +timezone = "Fuseau horaire" +title = "Titre" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Pour utiliser Disqus ou les commentaires Facebook, vous devez fournir le nom abrégé (shortname) Disqus ou l'ID d'application Facebook." +token_error = "Jeton CSRF incorrect" +tools = "Outils" +twitter_account = "Compte Twitter" +type_to_search = "Tapez pour rechercher" +uncategorized = "Sans catégorie" +uncategorized_comment = "Sujets qui n'ont pas besoin de catégorie, ou qui ne conviennent à aucune catégorie existante" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Format de flux inconnu" +update = "Mise à jour" +update_available = "Mise à jour disponible" +update_draft = "Mettre à jour le brouillon" +update_post = "Mettre à jour le billet" +update_to = "Mettre à jour vers" +upload = "Envoyer" +user = "Utilisateur" +user_error = "Le champ Utilisateur est requis" +valid_values_range_from_0_to_1.0._see = "Les valeurs valides vont de 0,0 à 1,0. Voir" +video_post = "Billet vidéo" +video_post_comment = "Créer un billet de blog avec une vidéo" +view = "Voir" +view_post = "Consulter" +views = "Vues" +widget = "Widget" +widget_settings = "Paramètres des widgets" +would_you_like_to_try_our = "Souhaitez-vous essayer notre " +yes_im_in = "Oui, je suis prêt" +yes_not_recommended = "Oui (déconseillé)" +you_dont_have_permission_to_access_this_page = "Vous n'êtes pas autorisé à accéder à cette page" +your_new_config_key = "Votre nouvelle clé de configuration" +your_new_value = "Votre nouvelle valeur" +your_backups = "Vos sauvegardes" +your_latest_blog_posts = "Vos derniers billets" +your_recent_posts = "Vos billets récents" +by = "par" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "astuce : Utilisez Ctrl/CMD + F pour rechercher votre clé ou valeur de configuration." +homepage = "page d'accueil" +instead = "à la place" +item_class = "Insérer la classe CSS" +item_slug = "Insérer le jeton" +now = "maintenant" +of = "de" +optional = "optionnel" +post_your_post_slug = "/billet/jeton-du-billet" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "astuce de pro : Vous pouvez créer une clé de configuration personnalisée et afficher la valeur de votre clé de configuration n'importe où dans votre modèle." +read_more = "lire plus" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/annee/mois/jeton-du-billet" +your_key = "votre.cle" +summary_behavior = "Comportement du résumé" +default = "Défaut" +check_shortcode = "Vérifier le shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "En mode résumé, il est possible de vérifier le shortcode avant de réduire le contenu à x caractères." +manage_users = "Gérer les utilisateurs" +add_user = "Ajouter un utilisateur" +username = "Nom d'utilisateur" +role = "Rôle" +change_password = "Changer le mot de passe" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/gu_GU.ini b/lang/gu_GU.ini new file mode 100644 index 0000000..b9daa30 --- /dev/null +++ b/lang/gu_GU.ini @@ -0,0 +1,326 @@ +about = "વિશે" +add_category = "વર્ગ ઉમેરો" +add_content = "સામગ્રી ઉમેરો" +add_link = "એડ_લિંક" +add_menu = "મેનુ ઉમેરો" +add_new_page = "નવું પૃષ્ઠ ઉમેરો" +add_new_post = "નવી પોસ્ટ ઉમેરો" +add_source_link_optional = "સ્રોત લિંક ઉમેરો (વૈકલ્પિક)" +add_sub = "પેટા પૃષ્ઠ ઉમેરો" +address_url = "સરનામું (URL)" +admin ="એડમિન" +admin_panel_style_based_on = "એડમિન પેનલ શૈલી પર આધારિત" +all_blog_posts = "બધી બ્લોગ પોસ્ટ્સ" +all_cache_has_been_deleted = "બધી કેશ કાઢી નાખવામાં આવી છે." +all_posts_tagged = "બધી પોસ્ટ ટૅગ કરેલી" +archive_for = "આર્કાઇવ માટે" +archive_page_for = "માટે પૃષ્ઠ આર્કાઇવ" +archives = "આર્કાઇવ્સ" +are_you_sure_you_want_to_delete_ = "શું તમે ખરેખર %s ને કાઢી નાખવા માંગો છો?" +at_the_moment_you_are_using_auto_generated_menu = "આ ક્ષણે તમે સ્વતઃ જનરેટેડ મેનૂનો ઉપયોગ કરી રહ્યાં છો." +audio_post = "ઓડિયો પોસ્ટ" +audio_post_comment = "વિશિષ્ટ ઓડિયો સાથે બ્લોગ પોસ્ટ બનાવવી" +author = "લેખક" +author_description = "માત્ર અન્ય HTMLy વપરાશકર્તા" +back_to = "પાછળ" +backup = "બેકઅપ" +blog_description = "એક ફકરામાં, અમને તમારા બ્લોગ વિશે વધુ માહિતી આપો." +blog_theme = "બ્લોગ થીમ (શૈલી)" +blog_title = "બ્લોગ શીર્ષક" +blog_title_placeholder = "મારો HTMLy બ્લોગ" +blog_posts_displayed_as = "બ્લોગ પોસ્ટ કેવી રીતે પ્રદર્શિત થાય છે" +breadcrumb_home_text = "બ્રેડક્રમ્બ હોમ ટેક્સ્ટ" +by_using_this_importer_you_are_agree_if_the_feed_is_yours_or_at_least_you_have_the_authority_to_publish_it = "આ આયાતકારનો ઉપયોગ કરીને તમે સંમત થાઓ છો કે ફીડ તમારું છે અથવા ઓછામાં ઓછું તમારી પાસે તેને પ્રકાશિત કરવાની સત્તા છે." +css_class_optional = "CSS વર્ગ (વૈકલ્પિક)" +cache_expiration = "કેશ સમાપ્તિ (કલાકોમાં)" +cache_off = "કેશ બંધ" +cache_timestamp = "કેશ ટાઇમસ્ટેમ્પ" +cancel = "રદ કરો" +can_read_feed_content = "ફીડ સામગ્રી વાંચી શકાતી નથી" +captcha_error = "ReCAPTCHA ખોટું છે" +categories = "શ્રેણીઓ" +category = "શ્રેણી" +check_update = "અપડેટ તપાસો" +clear_cache = "કેશ સાફ કરો (દ્રુતિકા)" +comma_separated_values = "અલ્પવિરામથી અલગ કરેલ મૂલ્યો" +comment_system = "ટિપ્પણી સિસ્ટમ" +comments = "ટિપ્પણીઓ" +config= "config" +congrats_you_have_the_latest_version_of_htmly = "અભિનંદન! તમારી પાસે HTMLy નું નવીનતમ સંસ્કરણ છે." +content = "સામગ્રી" +contents = "સામગ્રીનું કોષ્ટક" +copyright_line = "કૉપિરાઇટ લાઇન" +copyright_line_placeholder = "(C) તમારું નામ." +create_backup = "બેકઅપ બનાવો" +created = "બનાવ્યું હતું" +custom = "કસ્ટમ" +custom_settings = "કસ્ટમ સેટિંગ્સ" +dashboard = "ડેશબોર્ડ" +date = "તારીખ" +date_format = "તારીખ ફોર્મેટ" +delete = "કાઢી નાખો" +description = "વર્ણન" +disable = "અક્ષમ કરો" +disabled = "અક્ષમ" +disqus_shortname = "ડિસ્કસ નામ" +disqus_shortname_placeholder = "htmly" +draft = "ડ્રાફ્ટ" +edit = "સંપાદિત કરો" +edit_category = "શ્રેણી સંપાદિત કરો" +edit_post = "સંપાદિત કરો" +edit_profile = "પ્રોફાઇલ સંપાદિત કરો" +enable = "સક્ષમ કરો" +enable_blog_url = "/બ્લોગ URL સક્ષમ કરો" +enter_image_url = "છબી URL દાખલ કરો" +facebook_app_id = "ફેસબુક એપ ID" +facebook_page = "ફેસબુક પેજ" +featured_audio = "ફીચર્ડ ઓડિયો" +featured_image = "વિશિષ્ટ છબી" +featured_link = "વિશિષ્ટ લિંક" +featured_quote = "ફીચર્ડ ક્વોટ" +featured_video = "વિશિષ્ટ વિડિઓ" +feed_url = "ફીડ URL" +filename = "ફાઈલનામ" +follow = "અનુસરી રહ્યા છીએ" +for_google_site_verification_meta = "Google સાઇટ ચકાસણી મેટા માટે" +front_page_displays = "ફ્રન્ટ પેજ ડિસ્પ્લે" +full_post = "સંપૂર્ણ પોસ્ટ" +general = "સામાન્ય" +general_settings = "સામાન્ય સેટિંગ્સ" +get_one_here = "એક અહીં મેળવો" +github_pre_release = "ગીથબ પ્રી-રીલીઝ" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (લેગસી)" +google_search_console = "Google શોધ કન્સોલ" +home = "ઘર" +if_leave_empty_we_will_excerpt_it_from_the_content_below = "જો ખાલી છોડીએ તો અમે નીચેની સામગ્રીમાંથી તેનો અંશો લઈશું" +if_the_url_leave_empty_we_will_use_the_page_title = "જો URL ખાલી રહેશે તો અમે પૃષ્ઠ શીર્ષકનો ઉપયોગ કરીશું" +if_the_url_leave_empty_we_will_use_the_post_title = "જો URL ખાલી રહેશે તો અમે પોસ્ટ શીર્ષકનો ઉપયોગ કરીશું" +image_post = "છબી પોસ્ટ" +image_post_comment = "વિશિષ્ટ છબી સાથે બ્લોગ પોસ્ટ બનાવવી" +import = "આયાત કરો" +import_feed = "ફીડ આયાત શરૂ કરો" +import_rss = "આરએસએસ આયાત કરો" +import_rss_feed_2.0 = "RSS ફીડ 2.0 આયાત કરો" +insert_image = "છબી દાખલ કરો" +invalid_error = "ભૂલ! અમાન્ય વપરાશકર્તાનામ અથવા પાસવર્ડ" +language = "સિસ્ટમ ભાષા" +link_name = "લિંક નામ" +link_post = "લિંક પોસ્ટ" +link_post_comment = "વિશિષ્ટ લિંક સાથે બ્લોગ પોસ્ટ બનાવવી" +login = "લોગ ઇન" +login_page = "લોગિન પૃષ્ઠ" +logout = "લોગ આઉટ" +menu = "મેનુ" +menus = "મેનુ એડિટર" +meta_description = "મેટા વર્ણન" +meta_description_character = "મેટા વર્ણન અક્ષર" +metatags = "મેટા ટૅગ્સ" +metatags_settings = "મેટાટેગ સેટિંગ્સ" +mine = "મારું" +more = "વધુ" +my_draft = "મારો ડ્રાફ્ટ" +my_posts = "મારી પોસ્ટ્સ" +name = "નામ" +newer = "નવું" +next = "આગલું" +next_post = "આગલી પોસ્ટ" +no_available_backup = "આ સમયે કોઈ બેકઅપ ઉપલબ્ધ નથી." +no_draft_found = "કોઈ ડ્રાફ્ટ નથી મળ્યું" +no_posts_found = "કોઈ પોસ્ટ મળી નથી" +no_related_post_found = "કોઈ સંબંધિત પોસ્ટ મળી નથી" +no_scheduled_posts_found = "કોઈ સુનિશ્ચિત પોસ્ટ્સ મળી નથી!" +no_search_results = "કોઈ શોધ પરિણામો મળ્યા નથી" +nope =" ના" +not = "ના" +older = "જૂની" +only = "માત્ર" +operations = "ઓપરેશન્સ" +page = "પાનું" +page_generation_time = "પેજ જનરેશન સમય" +pages = "પૃષ્ઠો" +pass_error = "પાસવર્ડ ફીલ્ડ જરૂરી છે" +password= "પાસવર્ડ" +performance = "પ્રદર્શન" +performance_settings = "પ્રદર્શન સેટિંગ્સ" +permalink = "પરમાલિંક" +popular = "લોકપ્રિય" +popular_posts = "લોકપ્રિય પોસ્ટ્સ" +popular_posts_widget = "લોકપ્રિય પોસ્ટ્સ વિજેટ" +popular_posts_widget_at_most = "સૌથી વધુ લોકપ્રિય પોસ્ટ્સ વિજેટ" +popular_tags = "પ્રખ્યાત ટૅગ્સ" +post_by_author = "આ લેખક દ્વારા પોસ્ટ" +posted_in = "માં પ્રકાશિત થયું હતું" +posted_on = "પ્રકાશિત" +posts = "પોસ્ટ્સ" +posts_by = "પોસ્ટ્સ દ્વારા" +posts_draft = "પોસ્ટ ડ્રાફ્ટ" +posts_in_archive_page_at_most = "વધુમાં વધુ આર્કાઇવ પૃષ્ઠમાં પોસ્ટ્સ" +posts_in_category_page_at_most = "વધુમાં વધુ કેટેગરી પૃષ્ઠમાં પોસ્ટ્સ" +posts_in_front_page_show_at_most = "ફ્રન્ટ પેજ પરની પોસ્ટ્સ વધુમાં વધુ બતાવવામાં આવે છે" +posts_in_profile_page_at_most = "પ્રોફાઇલ પૃષ્ઠ પર વધુમાં વધુ પોસ્ટ કરો" +posts_in_search_result_at_most = "શોધ પરિણામમાં વધુમાં વધુ પોસ્ટ્સ" +posts_in_tag_page_at_most = "મોટા ભાગના ટેગ પેજમાં પોસ્ટ્સ" +posts_in_type_page_at_most = "વધુમાં વધુ પૃષ્ઠ પ્રકારમાં પોસ્ટ્સ" +posts_index_settings = "પોસ્ટ અનુક્રમણિકા સેટિંગ્સ" +posts_list = "પોસ્ટની યાદી" +posts_tagged = "ટૅગ કરેલી પોસ્ટ્સ" +posts_with_type = "પ્રકાર સાથેની પોસ્ટ" +pre_release = "પ્રી-રીલીઝ" +prev = "અગાઉ" +prev_post = "પહેલાની પોસ્ટ" +preview = "ઝલકી" +profile_for = "માટે પ્રોફાઇલ" +proudly_powered_by = "ગર્વથી સંચાલિત" +publish = "પ્રકાશિત કરો" +publish_draft = "ડ્રાફ્ટ પ્રકાશિત કરો" +published = "પ્રકાશિત" +quote_post = "અવતરણ પોસ્ટ" +quote_post_comment = "ખાસ અવતરણ સાથે બ્લોગ પોસ્ટ બનાવવી" +rss_character = "RSS અક્ષર" +rss_feeds_show_the_most_recent = "RSS ફીડ્સ સૌથી તાજેતરનું દર્શાવે છે" +rss_settings = "RSS સેટિંગ્સ" +read_more_text = "વધુ ટેક્સ્ટ વાંચો" +read_more_text_placeholder = "વધુ વાંચો" +reading = "વાંચન" +read_settings = "વાંચન સેટિંગ્સ" +recaptcha = "રીકેપ્ચા" +fresh_posts = "તાજેતરની પોસ્ટ્સ" +fresh_posts_widget_at_most = "મોટાભાગે તાજેતરની પોસ્ટ્સ વિજેટ" +regular_post = "નિયમિત પોસ્ટ" +regular_post_comment = "નિયમિત બ્લોગ પોસ્ટ બનાવવી" +related_posts = "સંબંધિત પોસ્ટ્સ" +related_widget_posts_at_most = "વધુમાં વધુ સંબંધિત વિજેટ પોસ્ટ્સ" +revert_to_draft = "ડ્રાફ્ટ પર પાછા ફરો" +save = "સાચવો" +save_config = "રૂપરેખાંકન સાચવો" +save_edit = "સંપાદન સાચવો" +save_menu = "સેવ મેનુ" +save_as_draft = "ડ્રાફ્ટ તરીકે સાચવો" +save_category = "વર્ગ સાચવો" +scheduled = "સુનિશ્ચિત" +scheduled_posts = "અનુસૂચિત પોસ્ટ્સ" +scheduled_tips = "ભવિષ્યની તારીખ અથવા સમય સાથે પોસ્ટ પ્રકાશિત કરવાથી તે શેડ્યૂલ કરેલી પોસ્ટમાં ખસેડવામાં આવશે" +search = "શોધ" +search_for = "માટે શોધો" +search_results_for = "શોધ પરિણામો" +search_results_not_found = "શોધ પરિણામો મળ્યા નથી!" +secret_key = "ગુપ્ત ચાવી" +settings="સેટિંગ્સ" +sign_in_to_start_your_session = "તમારું સત્ર શરૂ કરવા માટે સાઇન ઇન કરો" +site_key = "સાઇટ_કી" +sitemap = "સાઇટ મેપ" +slug = "કાઉન્ટર" +social_media = "સોશિયલ મીડિયા" +static_page = "સ્થિર પૃષ્ઠ" +static_page_comment = "સ્થિર પૃષ્ઠ બનાવવું" +static_pages = "સ્થિર પૃષ્ઠો" +summary = "સારાંશ" +summary_character = "સારાંશ અક્ષર" +tag = "ટેગ" +tagcloud_widget_at_most = "વધુમાં વધુ ટેગક્લાઉડ" +tagline = "ટેગ લાઇન" +tagline_placeholder = "ડેટાબેઝલેસ PHP બ્લોગિંગ પ્લેટફોર્મ" +tagline_description = "થોડા શબ્દોમાં વર્ણન કરો કે આ બ્લોગ શેના વિશે છે." +tags = "ટૅગ્સ" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "આ લેગસી કોડ છે. નવા એનાલિટિક્સ સામાન્ય રીતે gtag.js નો ઉપયોગ કરીને બનાવવામાં આવે છે" +this_page_doesnt_exist = "આ પૃષ્ઠ અસ્તિત્વમાં નથી!" +time = "સમય" +timezone = "સમય ઝોન" +title = "શીર્ષક" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Disqus અથવા Facebook ટિપ્પણીઓનો ઉપયોગ કરવા માટે તમારે તમારું Disqus ટૂંકું નામ અથવા તમારી Facebook એપ્લિકેશન ID પ્રદાન કરવાની જરૂર છે." +token_error = "CSRF ટોકન અમાન્ય છે" +tools = "ટૂલ્સ" +twitter_account = "Twitter એકાઉન્ટ" +type_to_search = "શોધવા માટે લખો" +uncategorized = "અવર્ગીકૃત" +uncategorized_comment = "વિષયો કે જેને શ્રેણીની જરૂર નથી, અથવા અન્ય અસ્તિત્વમાંની શ્રેણીમાં બંધબેસતી નથી" +universal_analytics = "યુનિવર્સલ એનાલિટિક્સ (gtag.js)" +unknown_feed_format = "અજ્ઞાત ફીડ ફોર્મેટ" +update = "અપડેટ" +update_available = "અપડેટ્સ ઉપલબ્ધ" +update_draft = "ડ્રાફ્ટ અપડેટ કરો" +update_post = "અપડેટ પોસ્ટ" +update_to = "આને અપડેટ કરો" +upload = "અપલોડ કરો" +user = "વપરાશકર્તા" +user_error = "વપરાશકર્તા ફીલ્ડ જરૂરી છે" +valid_values_range_from_0_to_1.0._see = "માન્ય મૂલ્યો 0 થી 1.0 સુધીની છે. જુઓ ..." +video_post = "વિડિયો પોસ્ટ" +video_post_comment = "વિશિષ્ટ વિડિઓ સાથે બ્લોગ પોસ્ટ બનાવવી" +view = "જુઓ" +view_post = "જુઓ" +views = "જોયું" +widget = "વિજેટ" +widget_settings = "વિજેટ સેટિંગ્સ" +will_you_like_to_try_our = "શું તમે અમારું પ્રયાસ કરવા માંગો છો" +yes_im_in = "હા, હું સંમત છું" +yes_not_recommended = "હા (ભલામણ કરેલ નથી)" +you_dont_have_permission_to_access_this_page = "તમને આ પૃષ્ઠને ઍક્સેસ કરવાની પરવાનગી નથી" +your_new_config_key = "તમારી નવી રૂપરેખાંકન કી" +your_new_value = "તમારું નવું મૂલ્ય" +your_backups = "તમારા બેકઅપ્સ" +your_latest_blog_posts = "તમારી નવીનતમ બ્લોગ પોસ્ટ્સ" +your_recent_posts = "તમારી તાજેતરની પોસ્ટ્સ" +દby = "દ્વારા" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "સંકેત: તમારી રૂપરેખાંકન કી અથવા મૂલ્ય શોધવા માટે Ctrl/CMD + F નો ઉપયોગ કરો." +homepage = "હોમપેજ" +instead = "ને બદલે" +item_class = "CSS વર્ગ દાખલ કરો" +item_slug = "લિંક URL દાખલ કરો" +now = "હવે" +of = "માંથી" +optional = "વૈકલ્પિક" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "પ્રો ટીપ્સ:તમે કસ્ટમ રૂપરેખા કી બનાવી શકો છો અને તમારા નમૂનામાં ગમે ત્યાં તમારી રૂપરેખા કી મૂલ્ય છાપી શકો છો." +read_more = "વધુ વાંચો" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "સારાંશ વર્તન" +default = "મૂળભૂત" +check_shortcode = "શોર્ટકોડ તપાસો" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "સારાંશ મોડમાં, સામગ્રીને x char પર ટ્રિમ કરતા પહેલા શોર્ટકોડ તપાસવો કે કેમ" +manage_users = "વપરાશકર્તાઓને મેનેજ કરો" +add_user = "વપરાશકર્તા ઉમેરો" +username = "વપરાશકર્તા નામ" +role = "ભૂમિકા" +change_password = "પાસવર્ડ બદલો" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/hi_HI.ini b/lang/hi_HI.ini new file mode 100644 index 0000000..acec68c --- /dev/null +++ b/lang/hi_HI.ini @@ -0,0 +1,326 @@ +about = "के बारे में" +add_category = "श्रेणी जोड़ना" +add_content = "सामग्री जोड़ें" +add_link = "लिंक_जोड़ें" +add_menu = "मेनू जोड़ें" +add_new_page = "नया पेज जोड़ें" +add_new_post = "नई पोस्ट जोड़ें" +add_source_link_optional = "स्रोत लिंक जोड़ें (वैकल्पिक)" +add_sub = "उप पृष्ठ जोड़ें" +address_url = "पता (URL)" +admin = "व्यवस्थापक" +admin_panel_style_based_on = "व्यवस्थापक पैनल शैली पर आधारित" +all_blog_posts = "सभी ब्लॉग पोस्ट" +all_cache_has_been_deleted = "सारा कैश (द्रुतिका) हटा दिया गया है|" +all_posts_tagged = "सभी पोस्ट टैग किए गए" +archive_for = "पुरालेख के लिए" +archive_page_for = "पृष्ठ पुरालेख के लिए" +archives = "अभिलेखागार" +are_you_sure_you_want_to_delete_ = "क्या आप आश्वस्त है कि आपको डिलीट करना है %s?" +at_the_moment_you_are_using_auto_generated_menu = "फिलहाल आप ऑटो जेनरेटेड मेनू का उपयोग कर रहे हैं।" +audio_post = "ऑडियो पोस्ट" +audio_post_comment = "फ़ीचर्ड ऑडियो के साथ ब्लॉग पोस्ट बनाया जा रहा है" +author = "लेखक" +author_description = "केवल एक और HTMLy उपयोगकर्ता" +back_to = "वापस" +backup = "बैकअप" +blog_description = "एक पैराग्राफ में, हमें अपने ब्लॉग के बारे में और जानकारी दे।" +blog_theme = "ब्लॉग थीम (शैली)" +blog_title = "ब्लॉग का शीर्षक" +blog_title_placeholder = "मेरा HTMLy ब्लॉग" +blog_posts_displayed_as = "ब्लॉग पोस्ट के प्रदर्शन का तरीका" +breadcrumb_home_text = "ब्रेडक्रंब होम टेक्स्ट" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_itv = "इस आयातक का उपयोग करके आप पुष्टि करते हैं कि फ़ीड आपकी है या कम से कम आपके पास इसे प्रकाशित करने का अधिकार है।" +css_class_optional = "सीएसएस क्लास (वैकल्पिक)" +cache_expiration = "कैश (द्रुतिका) समाप्ति (घंटे में)" +cache_off = "कैश द(्रुतिका) बंद" +cache_timestamp = "कैश (द्रुतिका) समयमोहर" +cancel = "रद्द करना" +cannot_read_feed_content = "फ़ीड सामग्री नहीं पढ़ सकता" +captcha_error = "रीकैप्चा सही नहीं है" +categories = "श्रेणियाँ" +category = "वर्ग" +check_update = "अपडेट जांचें" +clear_cache = "कैश (द्रुतिका) को साफ़ करें" +comma_separated_values = "अल्पविराम से अलग किये गए मान" +comment_system = "टिप्पणी प्रणाली" +comments = "टिप्पणियाँ" +config = "कॉन्फ़िग" +congrats_you_have_the_latest_version_of_htmly = "बधाई! आपके पास HTMLy का नवीनतम संस्करण है|" +content = "विषय" +contents = "विषय-सूची" +copyright_line = "कॉपीराइट लाइन" +copyright_line_placeholder = "(C) आपका नाम|" +create_backup = "बैकअप बनाना" +created = "बनाया था" +custom = "स्वनिर्धारित" +custom_settings = "कस्टम सेटिंग्स" +dashboard = "डैशबोर्ड" +date = "तारीख" +date_format = "तारिख का प्रारूप" +delete = "मिटाना" +description = "विवरण" +disable = "अक्षम करना" +disabled = "अक्षम" +disqus_shortname = "डिस्कस का नाम" +disqus_shortname_placeholder = "htmly" +draft = "ड्राफ्ट" +edit = "संपादन करें" +edit_category = "श्रेणी संपादित करें" +edit_post = "संपादन करें" +edit_profile = "प्रोफ़ाइल संपादित करें" +enable = "सक्षम करें" +enable_blog_url = "सक्षम करे ब्लॉग URL" +enter_image_url = "छवि URL दर्ज करें" +facebook_app_id = "फेसबुक ऐप आईडी" +facebook_page = "फेसबुक पेज" +featured_audio = "विशेष रुप से प्रदर्शित ऑडियो" +featured_image = "फीचर्ड चित्र" +featured_link = "विशेष रुप से प्रदर्शित लिंक" +featured_quote = "विशेष उद्धरण" +featured_video = "विशेष रुप से प्रदर्शित वीडियो" +feed_url = "फीड URL" +filename = "फ़ाइल का नाम" +follow = "अनुसरण करना" +for_google_site_verification_meta = "Google साइट सत्यापन मेटा के लिए" +front_page_displays = "फ्रंट पेज प्रदर्शित करता है" +full_post = "पूरी पोस्ट" +general = "सामान्य" +general_settings = "सामान्य सेटिंग्स" +get_one_here = "यहां एक प्राप्त करें" +github_pre_release = "Github प्री-रिलीज़" +google_analytics = "Google एनालिटिक्स" +google_analytics_legacy = "Google एनालिटिक्स (प्राचीन)" +google_search_console = "Google खोज कंसोल" +home = "घर" +if_left_empty_we_will_excerpt_it_from_the_content_below = "यदि खाली छोड़ दिया जाए तो हम इसे नीचे दी गई सामग्री से उद्धृत करेंगे" +if_the_url_is_left_empty_we_will_use_the_page_title = "यदि URL खाली छोड़ दिया जाए तो हम पृष्ठ शीर्षक का उपयोग करेंगे" +if_the_url_is_left_empty_we_will_use_the_post_title = "यदि URL खाली छोड़ दिया जाए तो हम पोस्ट शीर्षक का उपयोग करेंगे" +image_post = "छवि पोस्ट" +image_post_comment = "विशेष रुप से प्रदर्शित छवि के साथ ब्लॉग पोस्ट बनाया जा रहा है" +import = "आयात" +import_feed = "फ़ीड आयात प्रारंभ करें" +import_rss = "RSS आयात करें" +import_rss_feed_2.0 = "RSS फ़ीड 2.0 आयात करें" +insert_image = "चित्र डालें" +invalid_error = "त्रुटि! अमान्य उपयोगकर्ता नाम या पासवर्ड" +language = "सिस्टम भाषा" +link_name = "लिंक नाम" +link_post = "लिंक पोस्ट" +link_post_comment = "विशेष रुप से प्रदर्शित लिंक के साथ ब्लॉग पोस्ट बनाया जा रहा है" +login = "लॉग इन करें" +login_page = "लोग इन वाला पन्ना" +logout = "लॉग आउट" +menu = "मेन्यू" +menus = "मेनू संपादक" +meta_description = "मेटा विवरण" +meta_description_character = "मेटा विवरण अक्षर" +metatags = "मेटा टैग" +metatags_settings = "मेटाटैग सेटिंग्स" +mine = "मेरा" +more = "अधिक" +my_draft = "मेरा ड्राफ्ट" +my_posts = "मेरी पोस्ट" +name = "नाम" +newer = "नया" +next = "अगला" +next_post = "अगली पोस्ट" +no_available_backup = "इस समय कोई बैकअप उपलब्ध नहीं है|" +no_draft_found = "कोई ड्राफ्ट नहीं मिला" +no_posts_found = "कोई प्रकाशन नहीं मिला" +no_related_post_found = "कोई संबंधित पोस्ट नहीं मिली" +no_scheduled_posts_found = "कोई निर्धारित पोस्ट नहीं मिली!" +no_search_results = "खोजने पर कोई परिणाम नहीं मिला" +nope = "नहीं" +not = "नहीं" +older = "पुराने" +only = "केवल" +operations = "संचालन" +page = "पृष्ठ" +page_generation_time = "पेज निर्माण का समय" +pages = "पृष्ठों" +pass_error = "पासवर्ड फ़ील्ड आवश्यक है" +password = "पासवर्ड" +performance = "प्रदर्शन" +performance_settings = "प्रदर्शन समायोजन" +permalink = "स्थायी लिंक" +popular = "लोकप्रिय" +popular_posts = "लोकप्रिय लेख" +popular_posts_widget = "लोकप्रिय पोस्ट विजेट" +popular_posts_widget_at_most = "अधिक से अधिक लोकप्रिय पोस्ट विजेट" +popular_tags = "प्रसिद्ध टग्स" +post_by_author = "इस लेखक द्वारा पोस्ट" +posted_in = "में प्रकाशित किया गया था" +posted_on = "प्रकाशित किया गया" +posts = "पोस्ट" +posts_by = "द्वारा पोस्ट" +posts_draft = "पोस्ट ड्राफ्ट" +posts_in_archive_page_at_most = "अधिकतम संग्रह पृष्ठ में पोस्ट" +posts_in_category_page_at_most = "अधिकतम श्रेणी पृष्ठ में पोस्ट" +posts_in_front_page_show_at_most = "पहले पन्ने पर पोस्ट अधिकतम दिखाई देती हैं" +posts_in_profile_page_at_most = "अधिकतम प्रोफ़ाइल पृष्ठ पर पोस्ट करें" +posts_in_search_result_at_most = "अधिकतम खोज परिणाम में पोस्ट" +posts_in_tag_page_at_most = "अधिकतम टैग पेज में पोस्ट" +posts_in_type_page_at_most = "अधिक से अधिक टाइप पेज में पोस्ट करें" +posts_index_settings = "इंडेक्स सेटिंग्स पोस्ट करें" +posts_list = "पोस्ट सूची" +posts_tagged = "टैग किए गए पोस्ट" +posts_with_type = "प्रकार सहित पोस्ट" +pre_release = "पूर्व-रिलीज़" +prev = "पिछला" +prev_post = "पिछला पोस्ट" +preview = "झलकी" +profile_for = "के लिए प्रोफाइल" +proudly_powered_by = "गर्व से संचालित" +publish = "प्रकाशित करना" +publish_draft = "ड्राफ्ट प्रकाशित करें" +published = "प्रकाशित" +quote_post = "उद्धरण पोस्ट" +quote_post_comment = "विशेष उद्धरण के साथ ब्लॉग पोस्ट बनाया जा रहा है" +rss_character = "RSS अक्षर" +rss_feeds_show_the_most_recent = "RSS फ़ीड नवीनतम दिखाते हैं " +rss_settings = "RSS समायोजन" +read_more_text = "और अधिक पाठ पढ़ें" +read_more_text_placeholder = "अधिक पढ़े" +reading = "पढ़ना" +reading_settings = "सेटिंग पढ़ना" +recaptcha = "रीकैप्चा" +recent_posts = "हाल के पोस्ट" +recent_posts_widget_at_most = "अधिक से अधिक हालिया पोस्ट विजेट" +regular_post = "नियमित पोस्ट" +regular_post_comment = "नियमित ब्लॉग पोस्ट बनाया जा रहा है" +related_posts = "संबंधित पोस्ट" +related_widget_posts_at_most = "अधिक से अधिक संबंधित विजेट पोस्ट" +revert_to_draft = "ड्राफ्ट पर वापस लौटें" +save = "सहेजें" +save_config = "कॉन्फ़िगरेशन सहेजें" +save_edit = "संपादित सहेजें" +save_menu = "मेनू सहेजें" +save_as_draft = "ड्राफ्ट के रूप में सेव करें" +save_category = "श्रेणी सहेजें" +scheduled = "अनुसूचित" +scheduled_posts = "अनुसूचित पोस्ट" +scheduled_tips = "किसी पोस्ट को भविष्य की तारीख या समय के साथ प्रकाशित करने पर वह निर्धारित पोस्ट में चला जाएगा" +search = "खोज" +search_for = "निम्न को खोजें" +search_results_for = "खोजे गए परिणाम" +search_results_not_found = "खोज परिणाम नहीं मिले!" +secret_key = "गुप्त कुंजी" +settings = "समायोजन" +sign_in_to_start_your_session = "अपना सत्र शुरू करने के लिए साइन इन करें" +site_key = "कार्यस्थल की कुंजी" +sitemap = "साइट मैप" +slug = "काउंटर" +social_media = "सामाजिक मीडिया" +static_page = "स्टेटिक पृष्ठ" +static_page_comment = "स्टेटिक पेज बनाया जा रहा है" +static_pages = "स्टेटिक पेज" +summary = "सारांश" +summary_character = "सारांश अक्षर" +tag = "टैग" +tagcloud_widget_at_most = "अधिक से अधिक टैगक्लाउड" +tagline = "टैग लाइन" +tagline_placeholder = "डेटाबेस रहित PHP ब्लॉगिंग प्लेटफ़ॉर्म" +tagline_description = "कुछ शब्दों में बताएं कि यह ब्लॉग किस बारे में है।" +tags = "टैग" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "यह लीगेसी कोड है. आमतौर पर gtag.js का उपयोग करके नए विश्लेषण तैयार किए जाते हैं" +this_page_doesnt_exist = "यह पेज मौजूद नहीं है!" +time = "समय" +timezone = "समय क्षेत्र" +title = "शीर्षक" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "डिस्कस या फेसबुक टिप्पणियों का उपयोग करने के लिए आपको अपना डिस्कस संक्षिप्त नाम या अपनी फेसबुक ऐप आईडी प्रदान करनी होगी।" +token_error = "CSRF टोकन सही नहीं है" +tools = "औजार" +twitter_account = "ट्विटर खाता" +type_to_search = "खोजने के लिए लिखें" +uncategorized = "अवर्गीकृत" +uncategorized_comment = "ऐसे विषय जिन्हें किसी श्रेणी की आवश्यकता नहीं है, या किसी अन्य मौजूदा श्रेणी में फिट नहीं बैठते हैं" +universal_analytics = "यूनिवर्सल एनालिटिक्स (gtag.js)" +unknown_feed_format = "अज्ञात फ़ीड प्रारूप" +update = "अद्यतन" +update_available = "उपलब्ध अद्यतन" +update_draft = "ड्राफ्ट अद्यतन करें" +update_post = "पोस्ट अपडेट करें" +update_to = "इसे अपडेट करें" +upload = "अपलोड" +user = "उपयोगकर्ता" +user_error = "उपयोगकर्ता फ़ील्ड आवश्यक है" +valid_values_range_from_0_to_1.0._see = "वैध मूल्यों 0 से 1.0 की रेंज में है| आगे देखिये ..." +video_post = "वीडियो पोस्ट" +video_post_comment = "विशेष रुप से प्रदर्शित वीडियो के साथ ब्लॉग पोस्ट बनाया जा रहा है" +view = "देखिए" +view_post = "देखिए" +views = "देखा गया" +widget = "विजेट" +widget_settings = "विजेट सेटिंग्स" +would_you_like_to_try_our = "क्या आप आज़माना चाहेंगे हमारा " +yes_im_in = "हा मुझे मंजूर है" +yes_not_recommended = "हाँ (अनुशंसित नहीं)" +you_dont_have_permission_to_access_this_page = "आपको इस पृष्ठ तक पहुंचने की अनुमति नहीं है" +your_new_config_key = "आपकी नई कॉन्फ़िगरेशन कुंजी" +your_new_value = "आपका नया मूल्य" +your_backups = "आपके बैकअप" +your_latest_blog_posts = "आपके नवीनतम ब्लॉग पोस्ट" +your_recent_posts = "आपकी हाल की पोस्ट" +by = "द्वारा" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "संकेत: अपनी कॉन्फ़िगरेशन कुंजी या मान खोजने के लिए Ctrl/CMD + F का उपयोग करें।" +homepage = "मुखपृष्ठ" +instead = "के बजाय" +item_class = "CSS क्लास डालें" +item_slug = "लिंक URL डालें" +now = "अब" +of = "का" +optional = "वैकल्पिक" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "प्रो युक्तियाँ:आप कस्टम कॉन्फिग कुंजी बना सकते हैं और अपने टेम्पलेट में कहीं भी अपनी कॉन्फिग कुंजी मान प्रिंट कर सकते हैं|" +read_more = "और पढ़ें" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "सारांश व्यवहार" +default = "Default" +check_shortcode = "शॉर्टकोड जांचें" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "सारांश मोड में, सामग्री को x वर्ण में ट्रिम करने से पहले शॉर्टकोड की जांच करें या नहीं" +manage_users = "उपयोगकर्ताओं को प्रबंधित करें" +add_user = "उपयोगकर्ता जोड़ें" +username = "उपयोगकर्ता नाम" +role = "भूमिका" +change_password = "पासवर्ड बदलें" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/hr_HR.ini b/lang/hr_HR.ini new file mode 100644 index 0000000..0a93dd9 --- /dev/null +++ b/lang/hr_HR.ini @@ -0,0 +1,326 @@ +about = "O nama" +add_category = "Dodaj kategoriju" +add_content = "Dodaj sadržaj" +add_link = "Dodaj link" +add_menu = "Dodaj izbornik" +add_new_page = "Dodaj novu stranicu" +add_new_post = "Dodaj novi post" +add_source_link_optional = "Dodaj izvorni link (opcionalno)" +add_sub = "Dodaj podstranicu" +address_url = "Adresa (URL)" +admin = "Admin" +admin_panel_style_based_on = "Stil admin panela temeljen na" +all_blog_posts = "Svi blog zapisi" +all_cache_has_been_deleted = "Sva memorija predmemorije je izbrisana!" +all_posts_tagged = "Svi označeni zapisi" +archive_for = "Arhiva za" +archive_page_for = "Stranica arhive za" +archives = "Arhive" +are_you_sure_you_want_to_delete_ = "Jeste li sigurni da želite izbrisati %s?" +at_the_moment_you_are_using_auto_generated_menu = "Trenutno koristite automatski generirani izbornik." +audio_post = "Audio post" +audio_post_comment = "Stvaranje blog zapisa s istaknutim audio zapisom" +author = "Autor" +author_description = "Samo još jedan korisnik HTMLy-ja" +back_to = "Povratak na" +backup = "Backup" +blog_description = "U jednom odlomku, recite nam više o svom blogu." +blog_theme = "Tema bloga" +blog_title = "Naslov bloga" +blog_title_placeholder = "Moj HTMLy Blog" +blog_posts_displayed_as = "Blog zapisi prikazani kao" +breadcrumb_home_text = "Tekst početne stranice" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Korištenjem ovog uvoznika pristajete ako je feed vaš ili barem imate ovlasti za objavljivanje." +css_class_optional = "CSS razred (opcionalno)" +cache_expiration = "Istjecanje predmemorije (u satima)" +cache_off = "Isključi predmemoriju" +cache_timestamp = "Oznaka vremena predmemorije" +cancel = "Otkaži" +cannot_read_feed_content = "Ne mogu pročitati sadržaj feeda" +captcha_error = "reCaptcha nije ispravna" +categories = "Kategorije" +category = "Kategorija" +check_update = "Provjeri ažuriranje" +clear_cache = "Očisti predmemoriju" +comma_separated_values = "Vrijednosti odvojene zarezom" +comment_system = "Sustav komentara" +comments = "Komentari" +config = "Konfiguracija" +congrats_you_have_the_latest_version_of_htmly = "Čestitamo! Imate najnoviju verziju HTMLy-ja." +content = "Sadržaj" +contents = "Sadržaji" +copyright_line = "Linija autorskog prava" +copyright_line_placeholder = "(c) Vaše ime." +create_backup = "Kreiraj backup" +created = "Stvoreno" +custom = "Prilagođeno" +custom_settings = "Prilagođene postavke" +dashboard = "Kontrolna ploča" +date = "Datum" +date_format = "Format datuma" +delete = "Izbriši" +description = "Opis" +disable = "Onemogući" +disabled = "Onemogućeno" +disqus_shortname = "Disqus kratko ime" +disqus_shortname_placeholder = "htmly" +draft = "Skica" +edit = "Uredi" +edit_category = "Uredi kategoriju" +edit_post = "Uredi" +edit_profile = "Uredi profil" +enable = "Omogući" +enable_blog_url = "Omogući blog URL" +enter_image_url = "Unesite URL slike" +facebook_app_id = "Facebook ID aplikacije" +facebook_page = "Facebook stranica" +featured_audio = "Istaknuti audio" +featured_image = "Istaknuta slika" +featured_link = "Istaknuti link" +featured_quote = "Istaknuta citat" +featured_video = "Istaknuti video" +feed_url = "URL feeda" +filename = "Naziv datoteke" +follow = "Prati" +for_google_site_verification_meta = "Za meta provjeru Google stranice" +front_page_displays = "Početna stranica prikazuje" +full_post = "Cijeli post" +general = "Općenito" +general_settings = "Opće postavke" +get_one_here = "Dobiti jedan ovdje" +github_pre_release = "Github pretpregled" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (stari)" +google_search_console = "Google konzola za pretraživanje" +home = "Početna" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Ako ostavite prazno, izvat ćemo ga iz sadržaja ispod" +if_the_url_is_left_empty_we_will_use_the_page_title = "Ako URL ostavite prazno, koristit ćemo naslov stranice" +if_the_url_is_left_empty_we_will_use_the_post_title = "Ako URL ostavite prazno, koristit ćemo naslov posta" +image_post = "Slični post" +image_post_comment = "Stvaranje blog posta s istaknutom slikom" +import = "Uvoz" +import_feed = "Započni uvoz feeda" +import_rss = "Uvezi RSS" +import_rss_feed_2.0 = "Uvoz RSS feeda 2.0" +insert_image = "Umetni sliku" +invalid_error = "GREŠKA: Neispravno korisničko ime ili lozinka" +language = "Jezik sustava" +link_name = "Naziv linka" +link_post = "Link post" +link_post_comment = "Stvaranje blog posta s istaknutim linkom" +login = "Prijava" +login_page = "Stranica prijave" +logout = "Odjava" +menu = "Izbornik" +menus = "Uređivač izbornika" +meta_description = "Meta opis" +meta_description_character = "Meta opis znakova" +metatags = "Metatagi" +metatags_settings = "Postavke metataga" +mine = "Moje" +more = "Više" +my_draft = "Moja skica" +my_posts = "Moji postovi" +name = "Ime" +newer = "Novije" +next = "Sljedeće" +next_post = "Sljedeći post" +no_available_backup = "Nema dostupnih sigurnosnih kopija trenutno." +no_draft_found = "Nema pronađenih skica" +no_posts_found = "Nema pronađenih postova" +no_related_post_found = "Nema pronađenih srodnih postova" +no_scheduled_posts_found = "Nema zakazanih postova!" +no_search_results = "Nema rezultata pretraživanja" +nope = "Ne" +not = "Ne" +older = "Starije" +only = "Samo" +operations = "Operacije" +page = "Stranica" +page_generation_time = "Vrijeme generiranja stranice" +pages = "Stranice" +pass_error = "Polje lozinke je obavezno" +password = "Lozinka" +performance = "Performanse" +performance_settings = "Postavke performansi" +permalink = "Trajna poveznica" +popular = "Popularno" +popular_posts = "Popularni postovi" +popular_posts_widget = "Widget popularnih postova" +popular_posts_widget_at_most = "Widget popularnih postova najviše" +popular_tags = "Popularne oznake" +post_by_author = "Postovi ovog autora" +posted_in = "Objavljeno u" +posted_on = "Objavljeno" +posts = "Postovi" +posts_by = "Postovi od" +posts_draft = "Skice postova" +posts_in_archive_page_at_most = "Postovi na stranici arhive najviše" +posts_in_category_page_at_most = "Postovi na stranici kategorije najviše" +posts_in_front_page_show_at_most = "Postovi na početnoj stranici prikazuju najviše" +posts_in_profile_page_at_most = "Postovi na stranici profila najviše" +posts_in_search_result_at_most = "Postovi u rezultatima pretraživanja najviše" +posts_in_tag_page_at_most = "Postovi na stranici oznake najviše" +posts_in_type_page_at_most = "Postovi na stranici tipa najviše" +posts_index_settings = "Postavke indeksa postova" +posts_list = "Popis postova" +posts_tagged = "Postovi označeni" +posts_with_type = "Postovi s tipom" +pre_release = "Predačka verzija" +prev = "Prethodno" +prev_post = "Prethodni post" +preview = "Pregled" +profile_for = "Profil za" +proudly_powered_by = "Ponosno pokreće" +publish = "Objavi" +publish_draft = "Objavi skicu" +published = "Objavljeno" +quote_post = "Citirani post" +quote_post_comment = "Stvaranje blog posta s istaknutim citatom" +rss_character = "RSS znakova" +rss_feeds_show_the_most_recent = "RSS feedovi prikazuju najnovije" +rss_settings = "Postavke RSS-a" +read_more_text = "Tekst za pročitaj više" +read_more_text_placeholder = "Pročitaj više" +reading = "Čitanje" +reading_settings = "Postavke čitanja" +recaptcha = "reCAPTCHA" +recent_posts = "Nedavni postovi" +recent_posts_widget_at_most = "Widget nedavnih postova najviše" +regular_post = "Redoviti post" +regular_post_comment = "Stvaranje redovitog blog posta" +related_posts = "Srodni postovi" +related_widget_posts_at_most = "Widget srodnih postova najviše" +revert_to_draft = "Vrati u skicu" +save = "Spremi" +save_config = "Spremi konfiguraciju" +save_edit = "Spremi uređivanje" +save_menu = "Spremi izbornik" +save_as_draft = "Spremi kao skicu" +save_category = "Spremi kategoriju" +scheduled = "Zakazano" +scheduled_posts = "Zakazani postovi" +scheduled_tips = "Objavljivanje posta s budućim datumom ili vremenom, bit će dodano u zakazane postove" +search = "Pretraži" +search_for = "Pretraži" +search_results_for = "Rezultati pretrage za" +search_results_not_found = "Nisu pronađeni rezultati pretrage!" +secret_key = "Tajni ključ" +settings = "Postavke" +sign_in_to_start_your_session = "Prijavite se kako biste započeli svoju sesiju" +site_key = "Ključ web stranice" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Društveni mediji" +static_page = "Statička stranica" +static_page_comment = "Stvaranje statičke stranice" +static_pages = "Statičke stranice" +summary = "Sažetak" +summary_character = "Sažetak znakova" +tag = "Oznaka" +tagcloud_widget_at_most = "Tag oblak najviše" +tagline = "Slogan" +tagline_placeholder = "Platforma za blogovanje bez baze podataka u PHP-u" +tagline_description = "U nekoliko riječi, objasnite o čemu se radi u ovom blogu." +tags = "Oznake" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Ovo je stari kod. Obično se novi stvoreni analitički podaci koriste pomoću gtag.js" +this_page_doesnt_exist = "Ova stranica ne postoji!" +time = "Vrijeme" +timezone = "Vremenska zona" +title = "Naslov" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Za korištenje Disqus ili Facebook komentara morate pružiti svoje Disqus kratko ime ili vaš Facebook App ID." +token_error = "CSRF token nije ispravan" +tools = "Alati" +twitter_account = "Twitter račun" +type_to_search = "Upišite za pretraživanje" +uncategorized = "Nekategorizirano" +uncategorized_comment = "Teme koje ne trebaju kategoriju ili ne odgovaraju bilo kojoj drugoj postojećoj kategoriji" +universal_analytics = "Univerzalna analitika (gtag.js)" +unknown_feed_format = "Nepoznat format feeda" +update = "Ažuriraj" +update_available = "Dostupno ažuriranje" +update_draft = "Ažuriraj skicu" +update_post = "Ažuriraj post" +update_to = "Ažuriraj na" +upload = "Učitaj" +user = "Korisnik" +user_error = "Polje korisnika je obavezno" +valid_values_range_from_0_to_1.0._see = "Valjane vrijednosti su u rasponu od 0,0 do 1,0. Pogledajte" +video_post = "Video post" +video_post_comment = "Stvaranje blog posta s istaknutim videom" +view = "Pogled" +view_post = "Pogledaj" +views = "Pregledi" +widget = "Widget" +widget_settings = "Postavke widgeta" +would_you_like_to_try_our = "Biste li željeli isprobati naš" +yes_im_in = "Da, uključen sam" +yes_not_recommended = "Da (nije preporučeno)" +you_dont_have_permission_to_access_this_page = "Nemate dopuštenje pristupiti ovoj stranici" +your_new_config_key = "Vaš novi konfiguracijski ključ" +your_new_value = "Vaša nova vrijednost" +your_backups = "Vaše sigurnosne kopije" +your_latest_blog_posts = "Vaši najnoviji blog postovi" +your_recent_posts = "Vaši nedavni postovi" +by = "od" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "savjet: Koristite Ctrl/CMD + F za pretraživanje vašeg konfiguracijskog ključa ili vrijednosti." +homepage = "početna stranica" +instead = "umjesto" +item_class = "Unesite CSS razred" +item_slug = "Unesite URL linka" +now = "sada" +of = "od" +optional = "opcionalno" +post_your_post_slug = "/post/naslov-posta" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro savjeti: Možete stvoriti prilagođene konfiguracijske ključeve i ispisati vrijednost vašeg konfiguracijskog ključa bilo gdje u vašem predlošku." +read_more = "pročitaj više" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/godina/mjesec/naslov-posta" +your_key = "vaš.ključ" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/hu_HU.ini b/lang/hu_HU.ini new file mode 100644 index 0000000..d6841a3 --- /dev/null +++ b/lang/hu_HU.ini @@ -0,0 +1,326 @@ +about = "About" +add_category = "Kategória hozzáadása" +add_content = "Tartalom hozzáadása" +add_link = "Link hozzáadása" +add_menu = "Menü hozzáadása" +add_new_page = "Új oldal hozzáadása" +add_new_post = "Új bejegyzés hozzáadása" +add_source_link_optional = "Forrás link hozzáadása (nem kötelező)" +add_sub = "Aloldal hozzáadása" +address_url = "Address (URL)" +admin = "Rendszergazda" +admin_panel_style_based_on = "Az adminisztrációs panel stílusa" +all_blog_posts = "Minden blogbejegyzés" +all_cache_has_been_deleted = "Az összes gyorsítótár törölve lett!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Archívum" +are_you_sure_you_want_to_delete_ = "Biztosan törli a következőt: %s?" +at_the_moment_you_are_using_auto_generated_menu = "Jelenleg ön automatikusan generált menüt használ." +audio_post = "Hangbejegyzés" +audio_post_comment = "Blogbejegyzés létrehozása kiemelt hanganyaggal" +author = "Szerző" +author_description = "Just another HTMLy user" +back_to = "Vissza ide" +backup = "Biztonsági másolat" +blog_description = "In one paragraph, tell us more about your blog." +blog_theme = "Blog Theme" +blog_title = "Blog title" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "Blog posts displayed as" +breadcrumb_home_text = "Breadcrumb home text" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Ennek az importnak a használatával elfogadja, ha a hírcsatorna a tiéd, vagy legalábbis jogosult vagy közzétenni." +css_class_optional = "CSS osztály (nem kötelező)" +cache_expiration = "Cache expiration (in hours)" +cache_off = "Cache off" +cache_timestamp = "Cache timestamp" +cancel = "Mégse" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "Kategóriák" +category = "Kategória" +check_update = "Frissítés ellenőrzése" +clear_cache = "Gyorsítótár törlése" +comma_separated_values = "Vesszővel elválasztott értékek" +comment_system = "Comment system" +comments = "Comments" +config = "Beállítás" +congrats_you_have_the_latest_version_of_htmly = "Gratulálunk! Ön a HTMLy legújabb verzióját használja." +content = "Tartalom" +contents = "Tartalom" +copyright_line = "Copyright line" +copyright_line_placeholder = "(c) Your name." +create_backup = "Biztonsági másolat létrehozása" +created = "Létrehozva" +custom = "Egyedi" +custom_settings = "Egyéni beállítások" +dashboard = "Irányítópult" +date = "Dátum" +date_format = "Date Format" +delete = "Törlés" +description = "Leírás" +disable = "Disable" +disabled = "Disabled" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Piszkozat" +edit = "Szerkesztés" +edit_category = "Kategória szerkesztése" +edit_post = "Edit" +edit_profile = "Profil szerkesztése" +enable = "Enable" +enable_blog_url = "Enable blog URL" +enter_image_url = "Írja be a kép URL-jét" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook page" +featured_audio = "Kiemelt hang" +featured_image = "Kiemelt kép" +featured_link = "Kiemelt hivatkozás" +featured_quote = "Kiemelt idézet" +featured_video = "Kiemelt videó" +feed_url = "Hírcsatorna URL" +filename = "Fájlnév" +follow = "Követés" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Front page displays" +full_post = "Full post" +general = "Általános" +general_settings = "Általános beállítások" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Főoldal" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Ha üresen hagyja, akkor kivonjuk az alábbi tartalomból" +if_the_url_is_left_empty_we_will_use_the_page_title = "Ha az URL üres marad, akkor az oldal címét fogjuk használni" +if_the_url_is_left_empty_we_will_use_the_post_title = "Ha az URL üres marad, akkor a bejegyzés címét fogjuk használni" +image_post = "Képes bejegyzés" +image_post_comment = "Blogbejegyzés létrehozása kiemelt képpel" +import = "Import" +import_feed = "Hírcsatorna iport elindítása" +import_rss = "RSS importálása" +import_rss_feed_2.0 = "RSS-hírcsatorna 2.0 importálása" +insert_image = "Kép beszúrása" +invalid_error = "ERROR: Invalid username or password" +language = "System Language" +link_name = "Link neve" +link_post = "Link bejegyzés" +link_post_comment = "Blogbejegyzés létrehozása kiemelt linkkel" +login = "Bejelentkezés" +login_page = "Bejelentkezés oldal" +logout = "Kijelentkezés" +menu = "Menu" +menus = "Menüszerkesztő" +meta_description = "Meta leírás" +meta_description_character = "Meta description character" +metatags = "Metacímkék" +metatags_settings = "Metacímkék beállításai" +mine = "Az enyém" +more = "Több" +my_draft = "Saját piszkozat" +my_posts = "Saját bejegyzések" +name = "Név" +newer = "Újabb" +next = "Következő" +next_post = "Következő bejegyzés" +no_available_backup = "Jelenleg nincs elérhető biztonsági másolat." +no_draft_found = "Nincs vázlat" +no_posts_found = "Nincs bejegyzés" +no_related_post_found = "Nem található kapcsolódó bejegyzés" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Nope" +not = "No" +older = "Régebbi" +only = "Csak" +operations = "Műveletek" +page = "Page" +page_generation_time = "Page generation time" +pages = "Pages" +pass_error = "Password field is required" +password = "Jelszó" +performance = "Teljesítmény" +performance_settings = "Teljesítménybeállítás" +permalink = "Permalink" +popular = "Popular" +popular_posts = "Népszerű bejegyzések" +popular_posts_widget = "Popular posts widget" +popular_posts_widget_at_most = "Popular posts widget at most" +popular_tags = "Népszerű címkék" +post_by_author = "Posts by this author" +posted_in = "Bejegyzés helye" +posted_on = "Bejegyzés ideje" +posts = "Bejegyzések" +posts_by = "Posts by" +posts_draft = "Bejegyzések vázlata" +posts_in_archive_page_at_most = "Posts in archive page at most" +posts_in_category_page_at_most = "Posts in category page at most" +posts_in_front_page_show_at_most = "Posts in front page show at most" +posts_in_profile_page_at_most = "Posts in profile page at most" +posts_in_search_result_at_most = "Posts in search result at most" +posts_in_tag_page_at_most = "Posts in tag page at most" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Posts index settings" +posts_list = "Bejegyzések listája" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "Elöző" +prev_post = "Elöző bejegyzés" +preview = "Előnézet" +profile_for = "Profile for" +proudly_powered_by = "Büszkén működteti" +publish = "Közzététel" +publish_draft = "Piszkozat közzététele" +published = "Közzétett" +quote_post = "Bejegyzés idézettel" +quote_post_comment = "Blogbejegyzés létrehozása kiemelt idézettel" +rss_character = "RSS character" +rss_feeds_show_the_most_recent = "RSS feeds show the most recent" +rss_settings = "RSS settings" +read_more_text = "Read more text" +read_more_text_placeholder = "Read more" +reading = "Olvasás" +reading_settings = "Olvasási beállítások" +recaptcha = "reCAPTCHA" +recent_posts = "Legutóbbi bejegyzések" +recent_posts_widget_at_most = "Recent posts widget at most" +regular_post = "Rendszeres bejegyzés" +regular_post_comment = "Rendszeres bejegyzés létrehozása" +related_posts = "Kapcsolódó bejegyzések" +related_widget_posts_at_most = "Related widget posts at most" +revert_to_draft = "Vissza a piszkozathoz" +save = "Mentés" +save_config = "Save config" +save_edit = "Szerkesztés mentése" +save_menu = "Mentés menü" +save_as_draft = "Mentés piszkozatként" +save_category = "Kategória mentése" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Keresés" +search_for = "Keresés" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Secret Key" +settings = "Beállítások" +sign_in_to_start_your_session = "Jelentkezzen be a munkamenet megkezdéséhez" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "TLD utáni elérési útvonal" +social_media = "Social Media" +static_page = "Statikus oldal" +static_page_comment = "Statikus oldal létrehozása" +static_pages = "Statikus oldalak" +summary = "Summary" +summary_character = "Summary character" +tag = "Címke" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Tagline" +tagline_placeholder = "Databaseless PHP Blogging Platform" +tagline_description = "In a few words, explain what this blog is about." +tags = "Címkék" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "Ez az oldal nem létezik!" +time = "Idő" +timezone = "Timezone" +title = "Cím" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "To using Disqus or Facebook comment you need to provide Disqus shortname or Facebook App ID." +token_error = "CSRF Token not correct" +tools = "Eszközök" +twitter_account = "Twitter account" +type_to_search = "Írja be a kereséshez" +uncategorized = "Nincs kategorizálva" +uncategorized_comment = "Olyan témák, amelyekhez nincs szükség kategóriára, vagy amelyek nem illenek más létező kategóriába" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Frissítés" +update_available = "Elérhető frissítés" +update_draft = "Piszkozat frissítése" +update_post = "Bejegyzés frissítése" +update_to = "Frissítés" +upload = "Feltöltés" +user = "Felhasználó" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Valid values range from 0.0 to 1.0. See" +video_post = "Videó bejegyzés" +video_post_comment = "Blogbejegyzés létrehozása kiemelt videóval" +view = "Nézet" +view_post = "View" +views = "Nézetek" +widget = "Widget" +widget_settings = "Widget beállítások" +would_you_like_to_try_our = "Szeretné kipróbálni a mi " +yes_im_in = "Yes I'm in" +yes_not_recommended = "Yes (not recommended)" +you_dont_have_permission_to_access_this_page = "Nincs engedélyed az oldal elérésére" +your_new_config_key = "Your New Config Key" +your_new_value = "Your New Value" +your_backups = "A biztonsági másolatok" +your_latest_blog_posts = "Your latest blog posts" +your_recent_posts = "Legutóbbi bejegyzéseid" +by = "által" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Use Ctrl/CMD + F to search for your config key or value." +homepage = "kezdőlap" +instead = "helyett" +item_class = "CSS osztály beszúrása" +item_slug = "Link URL beszúrása" +now = "most" +of = "of" +optional = "választható" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro tips: You can creating custom config key and print out your config key value anywhere in your template." +read_more = "tovább" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/id_ID.ini b/lang/id_ID.ini new file mode 100644 index 0000000..dd58a68 --- /dev/null +++ b/lang/id_ID.ini @@ -0,0 +1,326 @@ +about = "Tentang" +add_category = "Tambah kategori" +add_content = "Tambah konten" +add_link = "Tambahkan link" +add_menu = "Tambah menu" +add_new_page = "Tambahkan halaman baru" +add_new_post = "Tambahkan artikel baru" +add_source_link_optional = "Tambahkan link sumber (opsional)" +add_sub = "Tambah sub halaman" +address_url = "Alamat (URL)" +admin = "Admin" +admin_panel_style_based_on = "Gaya panel admin berdasarkan" +all_blog_posts = "Semua artikel" +all_cache_has_been_deleted = "Cache telah dihapus!" +all_posts_tagged = "Semua postingan dengan tag" +archive_for = "Arsip untuk" +archive_page_for = "Halaman arsip untuk" +archives = "Arsip" +are_you_sure_you_want_to_delete_ = "Anda yakin ingin menghapus %s?" +at_the_moment_you_are_using_auto_generated_menu = "Saat ini Anda menggunakan menu yang dibuat secara otomatis." +audio_post = "Artikel dengan Audio" +audio_post_comment = "Membuat artikel dengan audio unggulan" +author = "Penulis" +author_description = "Hanya pengguna HTMLy lainnya" +back_to = "Kembali ke" +backup = "Cadangkan" +blog_description = "Dalam satu paragraf, ceritakan lebih banyak tentang blog Anda." +blog_theme = "Tema" +blog_title = "Judul blog" +blog_title_placeholder = "Blog HTMLy saya" +blog_posts_displayed_as = "Artikel blog ditampilkan sebagai" +breadcrumb_home_text = "Teks beranda pada breadcrumb" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Dengan menggunakan importir ini Anda setuju jika feed adalah milik Anda atau setidaknya Anda memiliki kewenangan untuk mempublikasikannya." +css_class_optional = "CSS Class (opsional)" +cache_expiration = "Masa berlaku cache (dalam jam)" +cache_off = "Cache nonaktif" +cache_timestamp = "Stempel waktu cache" +cancel = "Batal" +cannot_read_feed_content = "Tidak bisa membaca konten feed" +captcha_error = "reCaptcha tidak benar" +categories = "Kategori" +category = "Kategori" +check_update = "Cek pembaruan" +clear_cache = "Bersihkan cache" +comma_separated_values = "Pisahkan dengan koma" +comment_system = "Sistem komentar" +comments = "Komentar" +config = "Konfigurasi" +congrats_you_have_the_latest_version_of_htmly = "Selamat! Anda memiliki HTMLy versi terbaru." +content = "Konten" +contents = "Isi" +copyright_line = "Hak cipta" +copyright_line_placeholder = "(c) Nama Anda." +create_backup = "Membuat cadangan" +created = "Dibuat" +custom = "Kustom" +custom_settings = "Pengaturan Kustom" +dashboard = "Dasbor" +date = "Tanggal" +date_format = "Format tanggal" +delete = "Hapus" +description = "Keterangan" +disable = "Matikan" +disabled = "Dimatikan" +disqus_shortname = "Nama Panggilan Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Konsep" +edit = "Sunting" +edit_category = "Ubah kategori" +edit_post = "Ubah" +edit_profile = "Sunting profil" +enable = "Aktifkan" +enable_blog_url = "Aktifkan URL blog" +enter_image_url = "Masukkan URL gambar" +facebook_app_id = "ID Aplikasi Facebook" +facebook_page = "Halaman Facebook" +featured_audio = "Audio Unggulan" +featured_image = "Gambar Unggulan" +featured_link = "Tautan Unggulan" +featured_quote = "Kutipan Unggulan" +featured_video = "Video Unggulan" +feed_url = "URL RSS" +filename = "Nama berkas" +follow = "Ikuti" +for_google_site_verification_meta = "Untuk meta verifikasi situs-google" +front_page_displays = "Tampilan halaman depan" +full_post = "Artikel lengkap" +general = "Umum" +general_settings = "Pengaturan Umum" +get_one_here = "Dapatkan satu di sini" +github_pre_release = "Pra-rilis Github" +google_analytics = "Penganalisa Google" +google_analytics_legacy = "Penganalisa Google (lama)" +google_search_console = "Google Search Console" +home = "Beranda" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Jika dibiarkan kosong kami akan mengutipnya dari konten di bawah ini" +if_the_url_is_left_empty_we_will_use_the_page_title = "Jika url dibiarkan kosong kita akan menggunakan judul halaman" +if_the_url_is_left_empty_we_will_use_the_post_title = "Jika URL dibiarkan kosong kita akan menggunakan judul artikel" +image_post = "Artikel bergambar" +image_post_comment = "Membuat artikel dengan gambar unggulan" +import = "Import" +import_feed = "Mulai Impor RSS" +import_rss = "Impor RSS" +import_rss_feed_2.0 = "Impor RSS Feed 2.0" +insert_image = "Sisipkan gambar" +invalid_error = "Kesalahan: nama pengguna atau kata sandi tidak sah" +language = "Bahasa Sistem" +link_name = "Nama tautan" +link_post = "Artikel tautan" +link_post_comment = "Membuat artikel dengan tautan unggulan" +login = "Masuk" +login_page = "Halaman login" +logout = "Keluar" +menu = "Menu" +menus = "Menu Editor" +meta_description = "Meta deskripsi" +meta_description_character = "Karakter meta deskripsi" +metatags = "Metatags" +metatags_settings = "Pengaturan Metatags" +mine = "Punya saya" +more = "Selengkapnya" +my_draft = "Konsep saya" +my_posts = "Artikel saya" +name = "Nama" +newer = "Baru" +next = "Selanjutnya" +next_post = "Artikel selanjutnya" +no_available_backup = "Tidak ada cadangan yang tersedia saat ini." +no_draft_found = "Konsep tidak ditemukan" +no_posts_found = "Artikel tidak ditemukan" +no_related_post_found = "Artikel terkait tidak ditemukan" +no_scheduled_posts_found = "Postingan terjadwal tidak ditemukan!" +no_search_results = "Tidak ada hasil pencarian" +nope = "Tidak" +not = "Tidak" +older = "Lama" +only = "Hanya" +operations = "Operasi" +page = "Halaman" +page_generation_time = "Waktu pembuatan halaman" +pages = "Halaman" +pass_error = "Kolom kata sandi diperlukan" +password = "Sandi" +performance = "Performa" +performance_settings = "Pengaturan Performa" +permalink = "Tautan permanen" +popular = "Populer" +popular_posts = "Artikel populer" +popular_posts_widget = "Widget artikel populer" +popular_posts_widget_at_most = "Widget artikel populer paling banyak" +popular_tags = "Tag populer" +post_by_author = "Artikel oleh Penulis ini" +posted_in = "Terbit di" +posted_on = "Terbit pada" +posts = "Artikel" +posts_by = "Postingan oleh" +posts_draft = "Daftar konsep" +posts_in_archive_page_at_most = "Artikel di halaman arsip paling banyak" +posts_in_category_page_at_most = "Artikel dalam halaman kategori paling banyak" +posts_in_front_page_show_at_most = "Artikel paling banyak ditampilkan" +posts_in_profile_page_at_most = "Artikel di halaman profil paling banyak" +posts_in_search_result_at_most = "Artikel dalam hasil pencarian paling banyak" +posts_in_tag_page_at_most = "Artikel paling banyak di halaman tag" +posts_in_type_page_at_most = "Artikel dalam halaman tipe paling banyak" +posts_index_settings = "Pengaturan indeks artikel" +posts_list = "Daftar artikel" +posts_tagged = "Postingan dengan tag" +posts_with_type = "Postingan dengan tipe" +pre_release = "Pra-rilis" +prev = "Sebelumnya" +prev_post = "Artikel sebelumnya" +preview = "Pratayang" +profile_for = "Profil untuk" +proudly_powered_by = "Dengan bangga ditenagai" +publish = "Terbitkan" +publish_draft = "Terbitkan konsep" +published = "Telah terbit" +quote_post = "Artikel dengan kutipan" +quote_post_comment = "Membuat Artikel dengan kutipan unggulan" +rss_character = "Karakter RSS" +rss_feeds_show_the_most_recent = "Umpan RSS menampilkan berapa artikel" +rss_settings = "Pengaturan RSS" +read_more_text = "Baca lebih banyak teks" +read_more_text_placeholder = "Baca lebih banyak" +reading = "Bacaan" +reading_settings = "Pengaturan Membaca" +recaptcha = "reCAPTCHA" +recent_posts = "Artikel terbaru" +recent_posts_widget_at_most = "Widget artikel terbaru paling banyak" +regular_post = "Artikel reguler" +regular_post_comment = "Membuat Artikel reguler" +related_posts = "Artikel terkait" +related_widget_posts_at_most = "Artikel widget terkait paling banyak" +revert_to_draft = "Ubah ke konsep" +save = "Simpan" +save_config = "Simpan konfigurasi" +save_edit = "Simpan Edit" +save_menu = "Simpan menu" +save_as_draft = "Simpan sebagai konsep" +save_category = "Simpan kategori" +scheduled = "Terjadwal" +scheduled_posts = "Postingan terjadwal" +scheduled_tips = "Publikasikan dengan waktu yang akan datang untuk membuat postingan terjadwal" +search = "Cari" +search_for = "Mencari" +search_results_for = "Hasil pencarian untuk" +search_results_not_found = "Hasil pencarian tidak ada!" +secret_key = "Kunci rahasia" +settings = "Pengaturan" +sign_in_to_start_your_session = "Masuk untuk memulai sesi Anda" +site_key = "Kunci Situs" +sitemap = "Peta Situs" +slug = "Tautan" +social_media = "Sosial Media" +static_page = "Halaman statis" +static_page_comment = "Membuat halaman statis" +static_pages = "Halaman statis" +summary = "Ringkasan" +summary_character = "Karakter ringkasan" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud terbanyak" +tagline = "Slogan" +tagline_placeholder = "Platform Blogging PHP Tanpa Database" +tagline_description = "Secara singkat, jelaskan blog ini tentang apa" +tags = "Tags" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Ini adalah kode lama. Biasanya analitik baru dibuat menggunakan gtag.js" +this_page_doesnt_exist = "Halaman ini tidak ada!" +time = "Jam" +timezone = "Zona waktu" +title = "Judul" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Untuk menggunakan Disqus atau komentar Facebook, Anda perlu memberikan username Disqus atau App ID Facebook." +token_error = "Token CSRF tidak benar" +tools = "Alat" +twitter_account = "Akun Twitter" +type_to_search = "Ketik untuk mencari" +uncategorized = "Tanpa kategori" +uncategorized_comment = "Topik yang tidak perlu kategori, atau tidak cocok dengan kategori yang ada" +universal_analytics = "Penganalisa Universal (gtag.js)" +unknown_feed_format = "Format feed tidak diketahui" +update = "Perbarui" +update_available = "Pembaruan tersedia" +update_draft = "Perbarui konsep" +update_post = "Perbarui artikel" +update_to = "Perbarui ke" +upload = "Unggah" +user = "Pengguna" +user_error = "Kolom pengguna dibutuhkan" +valid_values_range_from_0_to_1.0._see = "Nilai yang valid berkisar dari 0,0 hingga 1,0. Lihat" +video_post = "Artikel dengan video" +video_post_comment = "Membuat artikel dengan video unggulan" +view = "Lihat" +view_post = "Lihat" +views = "Tampilan" +widget = "Widget" +widget_settings = "Pengaturan Widget" +would_you_like_to_try_our = "Apakah Anda ingin mencoba " +yes_im_in = "Ya, saya ikut" +yes_not_recommended = "Ya (tidak disarankan)" +you_dont_have_permission_to_access_this_page = "Anda tidak memiliki izin untuk mengakses halaman ini" +your_new_config_key = "Kunci Konfigurasi Baru Anda" +your_new_value = "Nilai Baru Anda" +your_backups = "Cadangan Anda" +your_latest_blog_posts = "Artikel blog terbaru Anda" +your_recent_posts = "Artikel terbaru Anda" +by = "oleh" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = " petunjuk: Gunakan Ctrl / CMD + F untuk menelusuri kunci konfigurasi atau nilai Anda." +homepage = "Beranda" +instead = "Sebagai gantinya" +item_class = "Sisipkan CSS class" +item_slug = "Sisipkan URL Tautan" +now = "sekarang" +of = "dari" +optional = "Opsional" +post_your_post_slug = "/post/slug-artikel-anda" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = " tips pro: Anda dapat membuat kunci konfigurasi khusus dan mencetak nilai kunci konfigurasi Anda di mana saja di template Anda." +read_more = "Baca selengkapnya" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/tahun/bulan/slug-artikel-anda" +your_key = "kunci.anda" +summary_behavior = "Perilaku ringkasan" +default = "Default" +check_shortcode = "Cek shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "Di mode ringkasan, apakah harus mengecek shortcode terlebih dahulu sebelum memangkas konten ke karakter x" +manage_users = "Kelola pengguna" +add_user = "Tambah pengguna" +username = "Username" +role = "Role" +change_password = "Ganti password" +config_mfa = "Mengonfigurasi MFA" +mfacode = "Kode MFA" +verify_code = "Verifikasi kode MFA" +verify_password = "Verifikasi kata sandi saat ini" +manualsetupkey = "Anda juga dapat menambahkan kunci pengaturan secara manual" +mfa_error = "Kode MFA tidak benar" +disablemfa = "Nonaktifkan MFA" +enable_auto_save = "Aktifkan Simpan Otomatis" +explain_autosave = "Jika diaktifkan, konten atau draf baru akan disimpan secara otomatis setiap 60 detik." +login_protect_system = "Sistem perlindungan login" +cloudflare_info = "Tinjau dokumentasi Pintu Putar Cloudflare:" +mfa_config = "Autentikasi Multi Faktor (MFA)" +set_mfa_globally = "Atur status MFA" +explain_mfa = "Saat diaktifkan, MFA bersifat opsional untuk semua pengguna. Saat dinonaktifkan, tidak ada pengguna yang dapat menggunakannya dan menyembunyikan bidang di halaman login." +set_version_publicly = "Visibilitas Versi" +explain_version = "Secara default versi HTMLy terlihat secara publik di kode sumber, beberapa admin mungkin lebih suka menyembunyikannya." +focus_mode = "Beralih Fokus" +writing = "Penulisan" +writing_settings = "Pengaturan Penulisan" +security = "Keamanan" +security_settings = "Pengaturan Keamanan" +msg_error_field_req_username = "Bidang nama pengguna wajib diisi" +msg_error_field_req_password = "Bidang kata sandi wajib diisi" +msg_error_field_req_title = "Bidang judul wajib diisi" +msg_error_field_req_content = "Bidang konten wajib diisi" +msg_error_field_req_tag = "Bidang tag wajib diisi" +msg_error_field_req_image = "Bidang gambar wajib diisi" +msg_error_field_req_video = "Bidang vidio wajib diisi" +msg_error_field_req_link = "Bidang tautan wajin diisi" +msg_error_field_req_quote = "Bidang kutipan wajib diisi." +msg_error_field_req_audio = "Bidang audio wajib diisi." +msg_error_field_req_feedurl = "Anda perlu menentukan url feed." +rss_feeds_description_select = "Deskripsi RSS" +rss_description_body = "Isi postingan" +rss_description_meta = "Deskripsi Meta Postingan" +admin_theme = "Tema admin" +admin_theme_light = "Terang" +admin_theme_dark = "Gelap" diff --git a/lang/it_IT.ini b/lang/it_IT.ini new file mode 100644 index 0000000..cc73cda --- /dev/null +++ b/lang/it_IT.ini @@ -0,0 +1,326 @@ +about = "Informazioni" +add_category = "Aggiungi categoria" +add_content = "Aggiungi contenuto" +add_link = "Aggiungi link" +add_menu = "Aggiungi menu" +add_new_page = "Aggiungi una nuova pagina" +add_new_post = "Aggiungi un nuovo articolo" +add_source_link_optional = "Aggiungi link sorgente (facoltativo)" +add_sub = "Aggiungi sub" +address_url = "Indirizzo (URL)" +admin = "Pannello Amministratore" +admin_panel_style_based_on = "Stile del pannello amminstratore basato su" +all_blog_posts = "Tutti gli articoli del blog" +all_cache_has_been_deleted = "Tutta la cache è stata svuotata !" +all_posts_tagged = "Tutti gli articoli etichettati" +archive_for = "Archivio per" +archive_page_for = "Pagina di archivio per" +archives = "Archivi" +are_you_sure_you_want_to_delete_ = "Sei sicuro di voler eliminare %s?" +at_the_moment_you_are_using_auto_generated_menu = "Al momento stai usando un menu generato automaticamente." +audio_post = "Articolo con audio" +audio_post_comment = "Crea un articolo del blog con un audio in evidenza" +author = "Autore" +author_description = "Solo un altro utente di HTMLy" +back_to = "Torna indietro" +backup = "Backup" +blog_description = "In un paragrafo, parlaci un po' di più del tuo blog." +blog_theme = "Tema del Blog" +blog_title = "Titolo del Blog" +blog_title_placeholder = "Il mio blog con HTMLy" +blog_posts_displayed_as = "Articoli del blog visualizzati come" +breadcrumb_home_text = "Testo della home Breadcrumb" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Usando questo importatore sei d'accordo che il feed sia tuo o almeno tu ne abbia l'autorità per pubblicarlo." +css_class_optional = "Classe CSS (facoltativa)" +cache_expiration = "Scadenza della cache (in ore)" +cache_off = "Disattiva cache" +cache_timestamp = "Fuso orario della cache" +cancel = "Annulla" +cannot_read_feed_content = "Impossibile leggere il contenuto del feed" +captcha_error = "reCaptcha non corretto" +categories = "Categorie" +category = "Categoria" +check_update = "Controllo aggiornamenti" +clear_cache = "Svuota la cache" +comma_separated_values = "Valori separati da virgole" +comment_system = "Sistema dei commenti" +comments = "Commenti" +config = "Configurazione" +congrats_you_have_the_latest_version_of_htmly = "Congratulazioni! Hai l'ultima versione di HTMLy." +content = "Contenuto" +contents = "Contenuti" +copyright_line = "Riga del Copyright" +copyright_line_placeholder = "(c) Il tuo nome." +create_backup = "Crea backup" +created = "Creato" +custom = "Personalizzato" +custom_settings = "Impostazioni personalizzate" +dashboard = "Pannello utente" +date = "Data" +date_format = "Formato della data" +delete = "Elimina" +description = "Descrizione" +disable = "Disabilita" +disabled = "Disabilitato" +disqus_shortname = "Nomignolo Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Bozza" +edit = "Modifica" +edit_category = "Modifica categoria" +edit_post = "Modifica" +edit_profile = "Modifica profilo" +enable = "Abilita" +enable_blog_url = "Abilita URL del blog" +enter_image_url = "Inserisci l'URL dell'immagine" +facebook_app_id = "ID di Facebook" +facebook_page = "Pagina Facebook" +featured_audio = "Audio in primo piano" +featured_image = "Immagine in primo piano" +featured_link = "Link in primo piano" +featured_quote = "Citazione in primo piano" +featured_video = "Video in primo piano" +feed_url = "URL del Feed" +filename = "Nome del file" +follow = "Segui" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Visualizza pagina principale" +full_post = "Articoli completi" +general = "Generali" +general_settings = "Impostazioni generali" +get_one_here = "Prendine una qui" +github_pre_release = "Pre-release di Github" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Home" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Se assente verrà estratto dai contenuti qui sotto" +if_the_url_is_left_empty_we_will_use_the_page_title = "Se l'url rimane in bianco verrà usato il titolo della pagina" +if_the_url_is_left_empty_we_will_use_the_post_title = "Se l'url rimane in bianco verrà usato il titolo dell'articolo" +image_post = "Articolo con immagine" +image_post_comment = "Crea un articolo del blog con un'immagine in evidenza" +import = "Importa" +import_feed = "Avvia importazione del Feed" +import_rss = "Importa RSS" +import_rss_feed_2.0 = "Importa Feed RSS 2.0" +insert_image = "Inserisci immagine" +invalid_error = "ERRORE: Nome utente o password non valido/a" +language = "Lingua di sistema" +link_name = "Nome del collegamento" +link_post = "Articolo con collegamento" +link_post_comment = "Crea un articolo del blog con un collegamento in evidenza" +login = "Connessione" +login_page = "Pagina di login" +logout = "Disconnessione" +menu = "Menu" +menus = "Editor del Menu" +meta_description = "Meta descrizione" +meta_description_character = "Carattere della Metadescrizione" +metatags = "Metatags" +metatags_settings = "Impostazioni dei Metatag" +mine = "I miei contenuti" +more = "Leggi di più" +my_draft = "Le mie bozze" +my_posts = "I miei articoli" +name = "Nome" +newer = "Più recenti" +next = "Successivo" +next_post = "Articolo successivo" +no_available_backup = "Nessun backup disponibile a quest'ora." +no_draft_found = "Nessuna bozza trovata" +no_posts_found = "Nessun articolo trovato" +no_related_post_found = "Nessun articolo correlato" +no_scheduled_posts_found = "Non è stato trovato alcun articolo pianificato!" +no_search_results = "Nessun risultato della ricerca" +nope = "Nessuno" +not = "No" +older = "Più vecchi" +only = "Solo" +operations = "Operazioni" +page = "Pagina" +page_generation_time = "Tempo di generazione della pagina" +pages = "Pagine" +pass_error = "È richiesto il campo Password" +password = "Password" +performance = "Prestazioni" +performance_settings = "Impostazioni delle Prestazioni" +permalink = "Permalink" +popular = "Popolare" +popular_posts = "Articoli popolari" +popular_posts_widget = "Widget articoli popolari" +popular_posts_widget_at_most = "Widget articoli popolari al massimo" +popular_tags = "Etichette popolari" +post_by_author = "Articoli di questo utente" +posted_in = "Pubblicato in" +posted_on = "Pubblicato il" +posts = "Articoli" +posts_by = "Articoli di" +posts_draft = "Elenco delle bozze" +posts_in_archive_page_at_most = "Gli articoli nella pagina archivio al massimo" +posts_in_category_page_at_most = "Gli articoli nella pagina delle categoria al massimo" +posts_in_front_page_show_at_most = "Articoli in prima pagina da visualizzare di più" +posts_in_profile_page_at_most = "Gli articoli nella pagina del profilo al massimo" +posts_in_search_result_at_most = "Gli articoli nei risultati della ricerca al massimo" +posts_in_tag_page_at_most = "Gli articoli nella pagina delle etichette al massimo" +posts_in_type_page_at_most = "Gli articoli della pagina dei tipi al massimo" +posts_index_settings = "Impostazioni indice degli articoli" +posts_list = "Elenco articoli" +posts_tagged = "Articoli etichettati" +posts_with_type = "Articoli con un tipo" +pre_release = "Pre-release" +prev = "Precedenti" +prev_post = "Articolo precedente" +preview = "Anteprima" +profile_for = "Profilo per" +proudly_powered_by = "Questo blog è basato su" +publish = "Pubblica" +publish_draft = "Pubblica la bozza" +published = "Pubblicato" +quote_post = "Articolo con una citazione" +quote_post_comment = "Crea un articolo del blog con una citazione in evidenza" +rss_character = "Carattere RSS" +rss_feeds_show_the_most_recent = "I feed RSS visualizzano i più recenti" +rss_settings = "Impostazioni RSS" +read_more_text = "Leggi più testo" +read_more_text_placeholder = "Leggi di più" +reading = "Lettura" +reading_settings = "Impostazioni di lettura" +recaptcha = "Protezione login" +recent_posts = "Articoli recenti" +recent_posts_widget_at_most = "Widget articoli recenti al massimo" +regular_post = "Articolo semplice" +regular_post_comment = "Crea un articolo semplice per il blog" +related_posts = "Articoli correlati" +related_widget_posts_at_most = "Widget articoli correlati al massimo" +revert_to_draft = "Trasforma in bozza" +save = "Salva" +save_config = "Salva configurazione" +save_edit = "Salva Modifica" +save_menu = "Salva menu" +save_as_draft = "Salva come bozza" +save_category = "Salva categoria" +scheduled = "Pianificazione" +scheduled_posts = "Articoli pianificati" +scheduled_tips = "Pubblicando un articolo con una data o un'ora futura, questo verrà inserito negli articoli pianificati" +search = "Cerca" +search_for = "Cerca per" +search_results_for = "Risultati della ricerca per" +search_results_not_found = "Non è stato trovato nessun risultato della ricerca!" +secret_key = "Chiave segreta" +settings = "Impostazioni" +sign_in_to_start_your_session = "Connettiti per avviare la sessione" +site_key = "Chiave del sito" +sitemap = "Mappa del sito" +slug = "Slug" +social_media = "Social Media" +static_page = "Pagina statica" +static_page_comment = "Creazione di una pagina statica" +static_pages = "Pagine statiche" +summary = "Riassunto" +summary_character = "Caratteri del riassunto" +tag = "Etichetta" +tagcloud_widget_at_most = "TagCloud al massimo" +tagline = "Slogan" +tagline_placeholder = "Piattaforma per blog in PHP senza database" +tagline_description = "In poche parole, spiega di cosa parla questo blog." +tags = "Etichette" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Questo è codice legacy. Di solito le nuove statistiche usano il file gtag.js" +this_page_doesnt_exist = "Questa pagina non esiste !" +time = "Ora" +timezone = "Fuso orario" +title = "Titolo" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Per usare Disqus o i commenti di Facebook hai bisogno di fornire il nomignolo di Disqus o l'ID di Facebook." +token_error = "Il token CSRF non è corretto" +tools = "Strumenti" +twitter_account = "Profilo Twitter" +type_to_search = "Digita per cercare" +uncategorized = "Senza categoria" +uncategorized_comment = "Argomenti che non necessitano di una categoria, o che non si adattano a nessuna categoria esistente" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Formato del feed sconosciuto" +update = "Aggiorna" +update_available = "Aggiornamento disponibile" +update_draft = "Aggiorna bozza" +update_post = "Aggiorna articolo" +update_to = "Aggiorna a" +upload = "Carica" +user = "Utente" +user_error = "È richiesto il campo nome utente" +valid_values_range_from_0_to_1.0._see = "Il campo dei valori validi va da 0.0 a 1.0. Vedi" +video_post = "Articolo video" +video_post_comment = "Crea un articolo del blog con un video in evidenza" +view = "Visualizza" +view_post = "Visualizza" +views = "Visualizzazioni" +widget = "Widget" +widget_settings = "Impostazioni dei Widget" +would_you_like_to_try_our = "Volete provare la nostra " +yes_im_in = "Si, ci sono" +yes_not_recommended = "Si (non consigliato)" +you_dont_have_permission_to_access_this_page = "Non hai il permesso di accedere a questa pagina" +your_new_config_key = "La tua nuova chiave di configurazione" +your_new_value = "Il tuo nuovo valore" +your_backups = "I tuoi backup" +your_latest_blog_posts = "I tuoi ultimi articoli sul blog" +your_recent_posts = "I tuoi articoli più recenti" +by = "di" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "consiglio: Usa Ctrl/CMD + F per cercare la chiave o il valore di configurazione." +homepage = "homepage" +instead = "invece" +item_class = "Inserisci Classe CSS" +item_slug = "Inserisci URL del Link" +now = "ora" +of = "di" +optional = "facoltativo" +post_your_post_slug = "/articolo/il-tuo-slug-degli-articoli" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "consiglio pratico: Puoi creare la tua chiave di configurazione e usare il valore della chiave di configurazione dovunque nel tuo template." +read_more = "leggi di più" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/anno/mese/il-tuo-slug-degli-articoli" +your_key = "la.tua.chiave" +summary_behavior = "Modalità riassunto" +default = "Predefinito" +check_shortcode = "Controlla codice breve" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In modalità riassunto, si può controllare il codice breve o no prima di ridurre il contenuto a x caratteri" +manage_users = "Gestione utenti" +add_user = "Aggiungi utente" +username = "Nome utente" +role = "Ruolo" +change_password = "Modifica password" +config_mfa = "Configura AMF" +mfacode = "Codice AMF" +verify_code = "Verifica il codice AMF" +verify_password = "Verifica la password in uso" +manualsetupkey = "Si può anche aggiungere manualmente la chiave di setup" +mfa_error = "Il codice MFA non è corretto" +disablemfa = "Disabilita AMF" +enable_auto_save = "Abilita il salvataggio automatico nelle Bozze" +explain_autosave = "Una volta abilitato, i nuovi articoli o le nuove pagine verranno atuomaticamente salvate come bozze ogni 60 secondi dopo aver iniziato a scrivere." +login_protect_system = "Sistema di protezione della connessione" +cloudflare_info = "Rivedi la documentazione di Cloudflare Turnstile: " +mfa_config = "Autenticazione Multi Fattore (AMF)" +set_mfa_globally = "Imposta lo stato della AMF" +explain_mfa = "Una volta abilitata, la AMF è facoltativa per tutti gli utenti. Se disattivata, nessun utente può usarla ed il relativo campo nella pagina di connessione viene nascosto." +set_version_publicly = "Visibilità della versione" +explain_version = "Per impostazione predefinita la versione di HTMLy è visibile a tutti nel codice sorgente, alcuni amministratori preferirebbero nasconderla." +focus_mode = "Cambia visuale" +writing = "Scrittura" +writing_settings = "Impostazioni della scrittura" +security = "Sicurezza" +security_settings = "Impostazioni della sicurezza" +msg_error_field_req_username = "È richiesto il campo nome utente." +msg_error_field_req_password = "È richiesto il campo Password." +msg_error_field_req_title = "È richiesto il campo Titolo." +msg_error_field_req_content = "È richiesto il campo Contenuto." +msg_error_field_req_tag = "È richiesto il campo Etichetta." +msg_error_field_req_image = "È richiesto il campo Immagine." +msg_error_field_req_video = "È richiesto il campo Video." +msg_error_field_req_link = "È richiesto il campo Collegamento." +msg_error_field_req_quote = "È richiesto il campo Citazione." +msg_error_field_req_audio = "È richiesto il campo Audio." +msg_error_field_req_feedurl = "Devi specificare l'url del feed." +rss_feeds_description_select = "Descrizione del feed RSS" +rss_description_body = "Corpo dell'articolo" +rss_description_meta = "Meta descrizione dell'articolo" +admin_theme = "Tema Pannello Amministratore" +admin_theme_light = "Chiaro" +admin_theme_dark = "Scuro" diff --git a/lang/ko_KO.ini b/lang/ko_KO.ini new file mode 100644 index 0000000..ad020e0 --- /dev/null +++ b/lang/ko_KO.ini @@ -0,0 +1,326 @@ +about = "이 블로그는..." +add_category = "새 카테고리 만들기" +add_content = "새 글 쓰기" +add_link = "링크 추가" +add_menu = "메뉴 추가" +add_new_page = "새 페이지 만들기" +add_new_post = "새 글 쓰기" +add_source_link_optional = "소스 링크 추가 (선택 사항)" +add_sub = "서브 페이지 추가" +address_url = "주소 (URL)" +admin = "관리자" +admin_panel_style_based_on = "관리자 패널 스타일 기반: " +all_blog_posts = "모든 블로그 글" +all_cache_has_been_deleted = "모든 캐시를 삭제했어요!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "아카이브" +are_you_sure_you_want_to_delete_ = "정말 삭제할거예요? '%s'" +at_the_moment_you_are_using_auto_generated_menu = "지금은 자동으로 만든 메뉴를 쓰고 있어요." +audio_post = "오디오 첨부" +audio_post_comment = "오디오를 넣은 글을 쓸 수 있어요" +author = "글쓴이" +author_description = "또 다른 HTMLy 사용자" +back_to = "돌아가기" +backup = "백업" +blog_description = "한 단락으로 이 블로그에 대해 더 알려주세요." +blog_theme = "블로그 테마" +blog_title = "블로그 제목" +blog_title_placeholder = "내 HTMLy 블로그" +blog_posts_displayed_as = "글 보기 모드" +breadcrumb_home_text = "사이트 이동 홈 (Breadcrumb)" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "가져오기를 사용하면 피드가 사용자의 것이거나 적어도 게시할 권한이 있다고 동의하는거예요." +css_class_optional = "CSS 클래스 (선택 사항)" +cache_expiration = "캐시 만료 (시간 단위) " +cache_off = "캐시 끄기" +cache_timestamp = "캐시 타임 스탬프" +cancel = "취소" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha가 틀렸어요" +categories = "카테고리" +category = "카테고리" +check_update = "업데이트 확인" +clear_cache = "캐시 지우기" +comma_separated_values = "쉼표로 분리된 값" +comment_system = "댓글 시스템" +comments = "댓글" +config = "설정" +congrats_you_have_the_latest_version_of_htmly = "축하해요! HTMLy 최신 버전을 쓰고 있어요." +content = "콘텐츠" +contents = "콘텐츠" +copyright_line = "저작권 표시" +copyright_line_placeholder = "(C) 당신의 이름." +create_backup = "백업 만들기" +created = "만듦" +custom = "사용자 지정" +custom_settings = "사용자 지정 설정" +dashboard = "대시보드" +date = "날짜" +date_format = "날짜 형식" +delete = "지우기" +description = "설명" +disable = "사용 안함" +disabled = "사용 안함" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "초안" +edit = "편집" +edit_category = "카테고리 편집" +edit_post = "편집" +edit_profile = "프로필 편집" +enable = "사용" +enable_blog_url = "'blog' URL 켜기" +enter_image_url = "이미지 URL을 입력하세요" +facebook_app_id = "페이스북 AppID" +facebook_page = "페이스북 페이지" +featured_audio = "오디오 기능" +featured_image = "이미지 기능" +featured_link = "링크 기능" +featured_quote = "인용 기능" +featured_video = "비디오 기능" +feed_url = "URL 피드" +filename = "파일 이름" +follow = "팔로우" +for_google_site_verification_meta = "google-site-verification 메타" +front_page_displays = "첫 페이지 표시" +full_post = "전체 글 보기" +general = "일반" +general_settings = "일반 설정" +get_one_here = "이 곳에서 얻을 수 있어요: " +github_pre_release = "Github 시험판" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "구글 검색 콘솔" +home = "홈" +if_left_empty_we_will_excerpt_it_from_the_content_below = "비워둘 경우 아래 내용에서 발췌해요" +if_the_url_is_left_empty_we_will_use_the_page_title = "URL이 비어 있으면 페이지 제목을 사용해요" +if_the_url_is_left_empty_we_will_use_the_post_title = "URL이 비어 있으면 글 제목을 사용해요" +image_post = "이미지 첨부" +image_post_comment = "이미지를 넣은 글을 쓸 수 있어요" +import = "가져오기" +import_feed = "피드 가져오기 시작" +import_rss = "RSS 가져오기" +import_rss_feed_2.0 = "RSS 2.0 피드 가져오기" +insert_image = "이미지 넣기" +invalid_error = "오류: 사용자나 비밀번호가 틀렸어요" +language = "시스템 언어" +link_name = "링크 이름" +link_post = "링크 첨부" +link_post_comment = "링크가 들어간 글을 쓸 수 있어요" +login = "로그인" +login_page = "로그인 페이지" +logout = "로그아웃" +menu = "메뉴" +menus = "메뉴 편집" +meta_description = "메타 설명" +meta_description_character = "메타 설명 문자" +metatags = "메타 태그" +metatags_settings = "메타 태그 설정" +mine = "내꺼" +more = "더" +my_draft = "내 초안" +my_posts = "내 글" +name = "이름" +newer = "최신" +next = "다음" +next_post = "다음 글" +no_available_backup = "백업이 없어요." +no_draft_found = "초안이 없어요" +no_posts_found = "글이 없어요" +no_related_post_found = "관련된 글이 없어요" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "찾기 결과가 없어요" +nope = "아니오" +not = "아니오" +older = "오래전" +only = "오직(Only)" +operations = "작업" +page = "페이지" +page_generation_time = "페이지 생성 시간" +pages = "페이지" +pass_error = "비밀번호 필드는 필수예요" +password = "비밀번호" +performance = "성능" +performance_settings = "성능 설정" +permalink = "고정링크" +popular = "인기있는" +popular_posts = "인기 게시물" +popular_posts_widget = "인기 글 위젯" +popular_posts_widget_at_most = "최대 인기 글" +popular_tags = "인기 태그" +post_by_author = "이 글쓴이가 썼어요" +posted_in = "카테고리: " +posted_on = "글을 올렸어요: " +posts = "글" +posts_by = "글쓴이: " +posts_draft = "초안 목록" +posts_in_archive_page_at_most = "최대 아카이브 페이지" +posts_in_category_page_at_most = "최대 카테고리 페이지" +posts_in_front_page_show_at_most = "최대 프론트 페이지" +posts_in_profile_page_at_most = "최대 프로필 페이지" +posts_in_search_result_at_most = "최대 검색 결과" +posts_in_tag_page_at_most = "최대 태그 페이지" +posts_in_type_page_at_most = "최대 타입 페이지" +posts_index_settings = "인덱스 설정" +posts_list = "글 목록" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "시험판 써보기" +prev = "이전" +prev_post = "이전 글" +preview = "미리보기" +profile_for = "Profile for" +proudly_powered_by = "Proudly Powered by" +publish = "올리기" +publish_draft = "올리기" +published = "글쓴이" +quote_post = "인용 글" +quote_post_comment = "인용 글을 쓸 수 있어요" +rss_character = "RSS 글자" +rss_feeds_show_the_most_recent = "최대 최근 RSS 피드" +rss_settings = "RSS 설정" +read_more_text = "더 읽기 표시" +read_more_text_placeholder = "더 읽기" +reading = "읽기" +reading_settings = "읽기 설정" +recaptcha = "reCAPTCHA" +recent_posts = "최근 글" +recent_posts_widget_at_most = "최대 최근 글" +regular_post = "글 쓰기" +regular_post_comment = "평범하게 글을 쓸 수 있어요" +related_posts = "관련 글" +related_widget_posts_at_most = "최대 관련 위젯" +revert_to_draft = "초안으로 되돌리기" +save = "저장" +save_config = "설정 저장" +save_edit = "편집 저장" +save_menu = "메뉴 저장" +save_as_draft = "초안 저장하기" +save_category = "카테고리 저장" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "찾기" +search_for = "찾기" +search_results_for = "Search results for" +search_results_not_found = "찾기 결과가 없어요!" +secret_key = "비밀 키" +settings = "설정" +sign_in_to_start_your_session = "시작하려면 로그인 하세요" +site_key = "사이트 키" +sitemap = "사이트맵" +slug = "줄임표시" +social_media = "소셜 미디어" +static_page = "고정 페이지" +static_page_comment = "고정 페이지 만들기" +static_pages = "고정 페이지" +summary = "요약 보기" +summary_character = "요약 글자수" +tag = "태그" +tagcloud_widget_at_most = "최대 TagCloud" +tagline = "태그 라인" +tagline_placeholder = "데이터베이스를 쓰지 않는 PHP 블로그 플랫폼" +tagline_description = "몇 단어로 이 블로그에 대해 설명해주세요." +tags = "태그" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "이것은 레거시 코드입니다. 보통 gtag.js를 써서 새 분석을 만들어요." +this_page_doesnt_exist = "페이지가 존재하지 않아요!" +time = "시간" +timezone = "시간대" +title = "제목" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Disqus나 페이스북 댓글을 사용하려면 Disqus의 shortname 또는, 페이스북 AppID가 필요해요." +token_error = "CSRF 토큰이 바르지 않아요" +tools = "도구" +twitter_account = "트위터 계정" +type_to_search = "찾을 내용 입력" +uncategorized = "카테고리 없음" +uncategorized_comment = "카테고리가 필요하지 않거나 다른 카테고리에 넣을 수 없는 주제" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "업데이트" +update_available = "업데이트가 있어요" +update_draft = "초안 업데이트" +update_post = "글 업데이트" +update_to = "업데이트: " +upload = "업로드" +user = "사용자" +user_error = "사용자 필드는 필수예요" +valid_values_range_from_0_to_1.0._see = "유효한 범위는 0.0에서 1.0까지예요. 참조: " +video_post = "비디오 첨부" +video_post_comment = "비디오를 넣은 글을 쓸 수 있어요" +view = "보기" +view_post = "보기" +views = "보기" +widget = "위젯" +widget_settings = "위젯 설정" +would_you_like_to_try_our = "우리 제품을 시험해 보시겠어요? " +yes_im_in = "예, 써볼께요" +yes_not_recommended = "예 (권장하지 않음)" +you_dont_have_permission_to_access_this_page = "이 페이지에 접근할 권한이 없어요" +your_new_config_key = "새 설정 키" +your_new_value = "새 값" +your_backups = "백업" +your_latest_blog_posts = "최신 블로그 글" +your_recent_posts = "최근 글" +by = ": " +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "힌트: CTRL/CMD + F 를 눌러 키나 값을 찾을 수 있어요." +homepage = "홈페이지" +instead = "대신(instead)" +item_class = "CSS 클래스 추가" +item_slug = "링크 URL 추가" +now = "지금" +of = "of" +optional = "선택 사항" +post_your_post_slug = "/post/문서-줄임표시" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "추가 힌트: 사용자 지정 설정 키를 만들고 템플릿 어디에서나 키 값을 인쇄할 수 있어요." +read_more = "더 읽기" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/년/월/문서-줄임표시" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/ms_MY.ini b/lang/ms_MY.ini new file mode 100644 index 0000000..384d92c --- /dev/null +++ b/lang/ms_MY.ini @@ -0,0 +1,326 @@ +about = "Perihal" +add_category = "Kategori Add" +add_content = "Kandungan Add" +add_link = "Pautan Tambah" +add_menu = "Menu Add" +add_new_page = "Tambah halaman baru" +add_new_post = "Tambah jawatan baru" +add_source_link_optional = "Tambah pautan sumber (pilihan)" +add_sub = "Halaman sub Add" +address_url = "Alamat (URL)" +admin = "Admin" +admin_panel_style_based_on = "Gaya panel Admin berdasarkan" +all_blog_posts = "Jawatan blog Semua" +all_cache_has_been_deleted = "Semua cache telah dipadam!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Arkib" +are_you_sure_you_want_to_delete_ = "Adakah anda pasti anda mahu memadam % s ?" +at_the_moment_you_are_using_auto_generated_menu = "Pada masa ini anda menggunakan auto menu dihasilkan." +audio_post = "Post Audio" +audio_post_comment = "Mewujudkan post blog dengan audio yang diketengahkan" +author = "Pengarang" +author_description = "Just another HTMLy user" +back_to = "Kembali kepada" +backup = "Backup" +blog_description = "Dalam satu ayat, memberitahu kita lebih lanjut mengenai blog anda." +blog_theme = "Blog Tema" +blog_title = "Tajuk blog" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "Jawatan Blog dipaparkan sebagai" +breadcrumb_home_text = "Text rumah Breadcrumb" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Dengan menggunakan pengimport ini anda bersetuju jika suapan itu milik anda atau sekurang-kurangnya anda mempunyai kuasa untuk menerbitkan ia." +css_class_optional = "CSS Kelas (pilihan)" +cache_expiration = "Cache tamat tempoh (dalam jam)" +cache_off = "Cache off" +cache_timestamp = "Cache cap masa" +cancel = "Batal" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "Kategori" +category = "Kategori" +check_update = "Daftar update" +clear_cache = "Kosongkan cache" +comma_separated_values = "Comma Separated Values" +comment_system = "Sistem Comment" +comments = "Comments" +config = "Config" +congrats_you_have_the_latest_version_of_htmly = "Tahniah! Anda mempunyai versi terbaru HTMLy." +content = "Kandungan" +contents = "Kandungan" +copyright_line = "Garis Copyright" +copyright_line_placeholder = "(c) Nama anda." +create_backup = "Buat sandaran" +created = "Dicipta" +custom = "Custom" +custom_settings = "Tetapan Custom" +dashboard = "Dashboard" +date = "Tarikh" +date_format = "Format tarikh" +delete = "Padam" +description = "Penerangan" +disable = "Disable" +disabled = "Orang Kurang Upaya" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "Htmly" +draft = "Draf" +edit = "Edit" +edit_category = "Edit kategori" +edit_post = "Edit" +edit_profile = "Sunting profil" +enable = "Enable" +enable_blog_url = "Membolehkan blog URL" +enter_image_url = "Masukkan URL imej" +facebook_app_id = "Facebook App ID" +facebook_page = "Laman Facebook" +featured_audio = "Terutama Audio" +featured_image = "Imej Pilihan" +featured_link = "Kemudahan Link" +featured_quote = "Quote Pilihan" +featured_video = "Terutama Video" +feed_url = "URL Feed" +filename = "Nama fail" +follow = "Ikut" +for_google_site_verification_meta = "Bagi google-site-pengesahan meta" +front_page_displays = "Memaparkan halaman depan" +full_post = "Post Penuh" +general = "Umum" +general_settings = "Tetapan umum" +get_one_here = "Dapatkan satu di sini" +github_pre_release = "Github pra keluaran" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (warisan)" +google_search_console = "Google Search Console" +home = "Home" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Jika cuti mengosongkan kami akan petikan dari kandungan di bawah" +if_the_url_is_left_empty_we_will_use_the_page_title = "Jika cuti url kosongkan kami akan menggunakan tajuk halaman" +if_the_url_is_left_empty_we_will_use_the_post_title = "Jika cuti url kosongkan kami akan menggunakan tajuk post" +image_post = "Post Image" +image_post_comment = "Mewujudkan post blog dengan imej yang ditampilkan" +import = "Import" +import_feed = "Mula Import Feed" +import_rss = "Import RSS" +import_rss_feed_2.0 = "Import RSS Feed 2.0" +insert_image = "Insert Image" +invalid_error = "ERROR: Invalid username or password" +language = "Sistem Bahasa" +link_name = "Nama Link" +link_post = "Link post" +link_post_comment = "Mewujudkan post blog dengan link yang diketengahkan" +login = "Log masuk" +login_page = "Halaman Login" +logout = "Log keluar" +menu = "Menu" +menus = "Menu Editor" +meta_description = "Description Meta" +meta_description_character = "Meta description watak" +metatags = "Metatags" +metatags_settings = "Metatags Tetapan" +mine = "Mine" +more = "Lagi" +my_draft = "Draf Saya" +my_posts = "Jawatan saya" +name = "Nama" +newer = "Terbaru" +next = "Next" +next_post = "Post Next" +no_available_backup = "Tiada sandaran yang ada pada masa ini." +no_draft_found = "Tidak draf dijumpai" +no_posts_found = "Tiada ulasan dijumpai" +no_related_post_found = "Tiada suapan berita berkaitan dijumpai" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Nope" +not = "Tidak" +older = "Lama" +only = "Sahaja" +operations = "Operasi" +page = "Page" +page_generation_time = "Page masa generasi" +pages = "Pages" +pass_error = "Password field is required" +password = "Kata Laluan" +performance = "Prestasi" +performance_settings = "Tetapan Prestasi" +permalink = "Permalink" +popular = "Popular" +popular_posts = "Jawatan Popular" +popular_posts_widget = "Jawatan Popular widget" +popular_posts_widget_at_most = "Jawatan Popular widget paling banyak" +popular_tags = "Tag Popular" +post_by_author = "Posts by this author" +posted_in = "Posted in" +posted_on = "Posted on" +posts = "Siaran" +posts_by = "Posts by" +posts_draft = "Siaran menggubal" +posts_in_archive_page_at_most = "Siaran di halaman arkib paling banyak" +posts_in_category_page_at_most = "Siaran dalam halaman kategori paling banyak" +posts_in_front_page_show_at_most = "Siaran dalam persembahan muka depan paling banyak" +posts_in_profile_page_at_most = "Siaran di halaman profil paling banyak" +posts_in_search_result_at_most = "Siaran dalam hasil carian paling banyak" +posts_in_tag_page_at_most = "Siaran di halaman tag paling banyak" +posts_in_type_page_at_most = "Siaran di halaman jenis paling banyak" +posts_index_settings = "Siaran tetapan index" +posts_list = "Senarai Posts" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pra-release" +prev = "Tua" +prev_post = "Sebelum Post" +preview = "Preview" +profile_for = "Profile for" +proudly_powered_by = "Dengan bangganya dikuasakan oleh" +publish = "Menerbitkan" +publish_draft = "Terbitkan draf" +published = "Diterbitkan" +quote_post = "Post Quote" +quote_post_comment = "Mewujudkan blog post with quote diketengahkan" +rss_character = "Watak RSS" +rss_feeds_show_the_most_recent = "RSS suapan menunjukkan yang paling baru-baru ini" +rss_settings = "Tetapan RSS" +read_more_text = "Baca lebih lanjut text" +read_more_text_placeholder = "Baca lebih" +reading = "Membaca" +reading_settings = "Tetapan Reading" +recaptcha = "ReCAPTCHA" +recent_posts = "Jawatan baru-baru" +recent_posts_widget_at_most = "Jawatan terkini widget paling banyak" +regular_post = "Post biasa" +regular_post_comment = "Mewujudkan blog post biasa" +related_posts = "Related posts" +related_widget_posts_at_most = "Berkaitan widget jawatan paling banyak" +revert_to_draft = "Kembali kepada draf" +save = "Save" +save_config = "Simpan config" +save_edit = "Save Edit" +save_menu = "Simpan menu" +save_as_draft = "Menyimpan sebagai draf" +save_category = "Simpan kategori" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Cari" +search_for = "Carian untuk" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Secret Key" +settings = "Tetapan" +sign_in_to_start_your_session = "Log masuk untuk memulakan sesi anda" +site_key = "Laman Utama" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Media Sosial" +static_page = "Halaman statik" +static_page_comment = "Membuat halaman statik" +static_pages = "Laman statik" +summary = "Ringkasan" +summary_character = "Ringkasan watak" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Tagline" +tagline_placeholder = "Blogging Platform Databaseless PHP" +tagline_description = "Dalam beberapa perkataan, menjelaskan apa yang blog ini adalah kira-kira." +tags = "Tag" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Ini adalah kod warisan. Selalunya analisis baru dicipta menggunakan gtag.js" +this_page_doesnt_exist = "Laman ini tidak wujud!" +time = "Masa" +timezone = "Zon masa" +title = "Tajuk" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Untuk menggunakan Disqus atau Facebook komen anda perlu memberikan Disqus shortname atau Facebook App ID." +token_error = "CSRF Token not correct" +tools = "Tools" +twitter_account = "Akaun Twitter" +type_to_search = "Taip untuk mencari" +uncategorized = "Uncategorized" +uncategorized_comment = "Topik yang tidak perlu kategori, atau tidak patut ke dalam mana-mana kategori yang sedia ada yang lain" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Update" +update_available = "Kemaskini ada" +update_draft = "Update draf" +update_post = "Update post" +update_to = "Kemas kini kepada" +upload = "Muat naik" +user = "Pengguna" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Nilai sah berkisar 0,0-1,0. Lihat" +video_post = "Post Video" +video_post_comment = "Mewujudkan post blog dengan video yang diketengahkan" +view = "View" +view_post = "View" +views = "Paparan" +widget = "Widget" +widget_settings = "Widget Tetapan" +would_you_like_to_try_our = "Adakah anda ingin mencuba kami" +yes_im_in = "Ya saya setuju" +yes_not_recommended = "Ya (tidak digalakkan)" +you_dont_have_permission_to_access_this_page = "Anda tidak mempunyai kebenaran untuk mengakses halaman ini" +your_new_config_key = "Baru Anda Config Key" +your_new_value = "Nilai Baru Anda" +your_backups = "Backup Anda" +your_latest_blog_posts = "Posting blog terkini Anda" +your_recent_posts = "Jawatan baru-baru Anda" +by = "Oleh" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = " tanda-tanda: Gunakan Ctrl / CMD + F untuk mencari kekunci config anda atau nilai." +homepage = "Laman utama" +instead = "Dan bukannya" +item_class = "Insert kelas CSS" +item_slug = "Insert Link URL" +now = "Sekarang" +of = "of" +optional = "Pilihan" +post_your_post_slug = "/ Pos /-post-slug anda" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = " pro tips:. Anda boleh mewujudkan utama config adat dan mencetak nilai mana-mana sahaja kunci config anda dalam template anda" +read_more = "Read more" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/ Tahun / bulan /-post-slug anda" +your_key = "Your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/nl_NL.ini b/lang/nl_NL.ini new file mode 100644 index 0000000..ff808cf --- /dev/null +++ b/lang/nl_NL.ini @@ -0,0 +1,326 @@ +about = "Over" +add_category = "Categorie toevoegen" +add_content = "Inhoud toevoegen" +add_link = "Voeg link toe" +add_menu = "Menu toevoegen" +add_new_page = "Nieuwe pagina toevoegen" +add_new_post = "Nieuw bericht toevoegen" +add_source_link_optional = "Bronlink toevoegen (optioneel)" +add_sub = "Subpagina toevoegen" +address_url = "Webadres (URL)" +admin = "Admin" +admin_panel_style_based_on = "Stijl Adminpaneel gebaseerd op" +all_blog_posts = "Alle blogberichten" +all_cache_has_been_deleted = "Alle cache werd verwijderd!" +all_posts_tagged = "Alle berichten gelabeld" +archive_for = "Archief voor" +archive_page_for = "Archief pagina voor" +archives = "Archieven" +are_you_sure_you_want_to_delete_ = "Ben je zeker dat je wil verwijderen %s?" +at_the_moment_you_are_using_auto_generated_menu = "Op dit ogenblik gebruikt u een automatisch gegenereerd menu." +audio_post = "Audiobericht" +audio_post_comment = "Blogpost maken met aanbevolen audio" +author = "Auteur" +author_description = "Zomaar een HTMLy gebruiker" +back_to = "Terug naar" +backup = "Backup" +blog_description = "Vertel ons in een alinea wat meer over uw blog." +blog_theme = "Blog thema" +blog_title = "Titel blog" +blog_title_placeholder = "Mijn HTMLy Blog" +blog_posts_displayed_as = "Blogberichten weergegeven als" +breadcrumb_home_text = "Broodkruimel start tekst" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Door te importeren geef je aan dat je er toestemming voor hebt." +css_class_optional = "CSS Class (optioneel)" +cache_expiration = "Cache vervaltijd (in uren)" +cache_off = "Cache uit" +cache_timestamp = "Tijdstempel cache" +cancel = "Annuleren" +cannot_read_feed_content = "Kan feed inhoud niet lezen" +captcha_error = "reCaptcha niet correct" +categories = "Categorieën" +category = "Categorie" +check_update = "Controleer updates" +clear_cache = "Cache verwijderen" +comma_separated_values = "Waarden gescheiden door komma's (CSV)" +comment_system = "Commentaarsysteem" +comments = "Reacties" +config = "Configuratie" +congrats_you_have_the_latest_version_of_htmly = "Gefeliciteerd! Je hebt de laatste versie van HTMLy." +content = "Inhoud" +contents = "Inhoud" +copyright_line = "Copyrightregel" +copyright_line_placeholder = "(c) Uw Naam." +create_backup = "Maak een backup" +created = "Gemaakt" +custom = "Aangepast" +custom_settings = "Aangepaste instellingen" +dashboard = "Dashboard" +date = "Datum" +date_format = "Datumnotatie" +delete = "Verwijder" +description = "Omschrijving" +disable = "Uitschakelen" +disabled = "Uitgeschakeld" +disqus_shortname = "Disqus gebruikersnaam" +disqus_shortname_placeholder = "htmly" +draft = "Ontwerp" +edit = "Bewerk" +edit_category = "Bewerk categorie" +edit_post = "Bewerk" +edit_profile = "Bewerk profiel" +enable = "Inschakelen" +enable_blog_url = "Activeer blog URL" +enter_image_url = "Voer de URL van de afbeelding in" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook pagina" +featured_audio = "Uitgelichte Audio" +featured_image = "Uitgelichte Afbeelding" +featured_link = "Uitgelichte Link" +featured_quote = "Uitgelicht Citaat" +featured_video = "Uitgelichte Video" +feed_url = "Feed URL" +filename = "Bestandsnaam" +follow = "Volg" +for_google_site_verification_meta = "Voor google-site-verificatie meta" +front_page_displays = "Voorpagina weergaven" +full_post = "Volledige bericht" +general = "Algemeen" +general_settings = "Algemene Instellingen" +get_one_here = "Krijg er hier een" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Zoek Console" +home = "Start" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Als u het leeg laat, halen we het uit de onderstaande inhoud" +if_the_url_is_left_empty_we_will_use_the_page_title = "Als de url leeg wordt gelaten, wordt de titel van de pagina gebruikt" +if_the_url_is_left_empty_we_will_use_the_post_title = "Als de url leeg wordt gelaten, wordt de titel van het bericht gebruikt" +image_post = "Bericht met afbeelding" +image_post_comment = "Nieuw bericht met uitgelichte afbeelding" +import = "Importeer" +import_feed = "Importeer feed starten" +import_rss = "Importeer RSS" +import_rss_feed_2.0 = "Importeer RSS Feed 2.0" +insert_image = "Afbeelding invoegen" +invalid_error = "FOUT: Ongeldig gebruikersnaam of wachtwoord" +language = "Systeemtaal" +link_name = "Linknaam" +link_post = "Bericht met link" +link_post_comment = "Nieuw bericht met uitgelichte verwijzing" +login = "aanmelden" +login_page = "Aanmeldpagina" +logout = "Afmelden" +menu = "Menu" +menus = "Menu Bewerken" +meta_description = "Meta omschrijving" +meta_description_character = "Metabeschrijving" +metatags = "Metalabels" +metatags_settings = "Instellingen metalabels" +mine = "Mijn" +more = "Meer" +my_draft = "Mijn concept" +my_posts = "Mijn berichten" +name = "Naam" +newer = "Nieuwere" +next = "Volgende" +next_post = "Volgende bericht" +no_available_backup = "Op dit ogenblik is er geen backup beschikbaar." +no_draft_found = "Geen concept gevonden" +no_posts_found = "Geen berichten gevonden" +no_related_post_found = "Geen gerelateerd bericht gevonden" +no_scheduled_posts_found = "Geen geagendeerd bericht gevonden!" +no_search_results = "Geen zoekresultaat gevonden" +nope = "Nee" +not = "Nee" +older = "Oudere" +only = "Enkel" +operations = "Operaties" +page = "Pagina" +page_generation_time = "Generatietijd pagina" +pages = "Pagina's" +pass_error = "Wachtwoord veld is verplicht" +password = "Wachtwoord" +performance = "Prestaties" +performance_settings = "Prestatie Instellingen" +permalink = "Definitieve link" +popular = "Populair" +popular_posts = "Populaire berichten" +popular_posts_widget = "Populaire berichten widget" +popular_posts_widget_at_most = "Maximum populaire berichten widget" +popular_tags = "Populaire labels" +post_by_author = "Bericht van deze auteur" +posted_in = "Geplaatst in" +posted_on = "Geplaatst op" +posts = "Berichten" +posts_by = "Geplaatst door" +posts_draft = "Berichten ontwerpen" +posts_in_archive_page_at_most = "Maximum berichten op archief pagina" +posts_in_category_page_at_most = "Maximum berichten op pagina categorie" +posts_in_front_page_show_at_most = "Maximum berichten op de voorpagina" +posts_in_profile_page_at_most = "Maximum berichten op profielpagina" +posts_in_search_result_at_most = "Maximum berichten in zoekresultaat" +posts_in_tag_page_at_most = "Maximum berichten op tag pagina" +posts_in_type_page_at_most = "Maximum berichten op type pagina" +posts_index_settings = "Index instellingen berichten" +posts_list = "Lijst berichten" +posts_tagged = "Bericht gelabeld" +posts_with_type = "Bericht van type" +pre_release = "Pre-release" +prev = "Vorige" +prev_post = "Vorige bericht" +preview = "Voorbeeld" +profile_for = "Profiel van" +proudly_powered_by = "Wordt mogelijk gemaakt door" +publish = "Publiceer" +publish_draft = "Publiceer ontwerp" +published = "Gepubliceerd" +quote_post = "Bericht met citaat" +quote_post_comment = "Blogbericht maken met citaat" +rss_character = "RSS tekens" +rss_feeds_show_the_most_recent = "RSS feeds toon de meest recente" +rss_settings = "RSS instellingen" +read_more_text = "Lees meer tekst" +read_more_text_placeholder = "Lees meer tekst placeholder" +reading = "Lezen" +reading_settings = "Instellingen lezen" +recaptcha = "reCAPTCHA" +recent_posts = "Recente berichten" +recent_posts_widget_at_most = "Maximum recente berichten widget" +regular_post = "Reguliere post" +regular_post_comment = "Nieuw bericht maken" +related_posts = "Gerelateerde berichten" +related_widget_posts_at_most = "Maximum Gerelateerde berichten widget" +revert_to_draft = "Terug naar concept" +save = "Opslaan" +save_config = "Bewaar configuratie" +save_edit = "Wijzigingen opslaan" +save_menu = "Menu opslaan" +save_as_draft = "Opslaan als concept" +save_category = "Categorie opslaan" +scheduled = "Geagendeerd (later)" +scheduled_posts = "Geagendeerd bericht" +scheduled_tips = "Geagendeerd bericht met datum in toekomst, wordt later zichtbaar" +search = "Zoeken" +search_for = "Zoeken naar" +search_results_for = "Zoekresultaten voor" +search_results_not_found = "Geen zoekresultaten!" +secret_key = "Geheime sleutel" +settings = "Instellingen" +sign_in_to_start_your_session = "Log in om je sessie te starten" +site_key = "Sitesleutel" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Sociale media" +static_page = "Statische pagina" +static_page_comment = "Statische pagina maken" +static_pages = "Statische pagina's" +summary = "Samenvatting" +summary_character = "Samenvattingsteken" +tag = "Label" +tagcloud_widget_at_most = "LabelWolk met meeste woorden" +tagline = "Labellijn" +tagline_placeholder = "Databaseloos PHP Bloggen Platform" +tagline_description = "In een paar woorden, waar gaat dit blog over." +tags = "Labels" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "Deze pagina bestaat niet!" +time = "Tijd" +timezone = "Tijdzone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Om Disqus of Facebook commentaar te gebruiken moet u Disqus shortname of Facebook App ID opgeven." +token_error = "CSRF Token niet correct" +tools = "Gereedschap" +twitter_account = "Twitter (X) account" +type_to_search = "Tik hier uw zoekterm" +uncategorized = "Niet ingedeeld" +uncategorized_comment = "Onderwerpen die geen categorie nodig hebben, of niet passen in een andere bestaande categorie" +universal_analytics = "Universele Analyse (gtag.js)" +unknown_feed_format = "Onbekende berichtenopmaak" +update = "Bijwerken" +update_available = "Update beschikbaar" +update_draft = "Concept bijwerken" +update_post = "Bericht bijwerken " +update_to = "Bijwerken naar" +upload = "Upload" +user = "Gebruiker" +user_error = "Gebruikersveld is verplicht" +valid_values_range_from_0_to_1.0._see = "Geldige waarden wisselen van 0,0 tot 1,0. Zie" +video_post = "Video bericht" +video_post_comment = "Bericht maken met aanbevolen video" +view = "Bekijken" +view_post = "Bekijk bericht" +views = "Aantal keer bekeken" +widget = "Widget" +widget_settings = "Instellingen Widget" +would_you_like_to_try_our = "Probeert u onze" +yes_im_in = "Ja, ik doe mee" +yes_not_recommended = "Ja (niet aanbevolen)" +you_dont_have_permission_to_access_this_page = "U heeft geen toestemming om deze pagina te openen" +your_new_config_key = "Uw nieuwe configuratiesleutel" +your_new_value = "Uw nieuwe waarde" +your_backups = "Uw backups" +your_latest_blog_posts = "Uw laatste blogberichten" +your_recent_posts = "Uw recente berichten" +by = "door" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Gebruik Ctrl/CMD + F om jouw config key of waarde te vinden." +homepage = "start" +instead = "in plaats van" +item_class = "Invoegen CSS class" +item_slug = "Link URL invoegen" +now = "nu" +of = "of" +optional = "optioneel" +post_your_post_slug = "/bericht/uw-bericht-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro tips: Je kan zelf een key maken en printen overal in je template." +read_more = "Lees meer" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/jaar/maand/uw-bericht-slug" +your_key = "jouw sleutel" +summary_behavior = "Samenvatting" +default = "Standaard" +check_shortcode = "Controleercode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "Bij een samenvatting, controleer eerst wat er staat of gebruik x tekens" +manage_users = "Beheer gebruikers" +add_user = "Voeg gebruiker toe" +username = "Gebruiker" +role = "Rol" +change_password = "Wijzig wachtwoord" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/pl_PL.ini b/lang/pl_PL.ini new file mode 100644 index 0000000..b022fbd --- /dev/null +++ b/lang/pl_PL.ini @@ -0,0 +1,327 @@ +about = "Informacje" +add_category = "Dodaj kategorię" +add_content = "Dodaj zawartość" +add_link = "Dodaj odnośnik" +add_menu = "Dodaj menu" +add_new_page = "Dodaj nową stronę" +add_new_post = "Dodaj nowy post" +add_source_link_optional = "Dodaj odnośnik do źródła (opcjonalne)" +add_sub = "Dodaj podstronę" +address_url = "Addres (URL)" +admin = "Admin" +admin_panel_style_based_on = "Styl panelu administracyjnego bazuje na" +all_blog_posts = "Wszystkie posty" +all_cache_has_been_deleted = "Pamięć podręczna została wyczyszczona!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Archiwa" +are_you_sure_you_want_to_delete_ = "Czy chcesz usunąć %s?" +at_the_moment_you_are_using_auto_generated_menu = "W tym momencie menu jest generowane automatycznie." +audio_post = "Post z audio" +audio_post_comment = "Utwórz dźwiękowy post na blogu" +author = "Autor" +author_description = "Po prostu kolejne konto HTMLy" +back_to = "Wróć do" +backup = "Kopia zapasowa" +blog_description = "W jednym akapicie opisz ten blog." +blog_theme = "Motyw bloga" +blog_title = "Tytuł bloga" +blog_title_placeholder = "Skrót bloga" +blog_posts_displayed_as = "Posty blogowe wyświetlane jako" +breadcrumb_home_text = "Tekst nawigacji domowej" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Używając tego importera zgadzasz się, że feed jest Twój lub przynajmniej masz uprawnienia do jego publikacji." +css_class_optional = "Klasy CSS (opcjonalne)" +cache_expiration = "Czas trwania pamięci tymczasowej (w godzinach)" +cache_off = "Pamięć tymczasowa wyłączona" +cache_timestamp = "Odcisk czasu pamięci podręcznej" +cancel = "Anuluj" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha błędna" +categories = "Kategorie" +category = "Kategoria" +check_update = "Sprawdź aktualizacje" +clear_cache = "Wyczyść pamięć podręczną" +comma_separated_values = "Wartości rozdzielane przecinkiem" +comment_system = "System komentarzy" +comments = "Komentarze" +config = "Konfiguracja" +congrats_you_have_the_latest_version_of_htmly = "Gratulacje! Masz aktualną wersję HTMLy." +content = "Zawartość" +contents = "Zawartość" +copyright_line = "Fragment praw autorskich" +copyright_line_placeholder = "(c) Twoje imię." +create_backup = "Stwórz kopie zapasowe" +created = "Utworzono" +custom = "Modyfikacje" +custom_settings = "Ustawienia modyfikacji" +dashboard = "Kokpit" +date = "Data" +date_format = "Format daty" +delete = "Usuń" +description = "Opis" +disable = "Wyłączenie" +disabled = "Nieaktywne" +disqus_shortname = "Disqus skrócona nazwa" +disqus_shortname_placeholder = "htmly" +draft = "Wersja robocza" +edit = "Edytuj" +edit_category = "Edytuj kategorię" +edit_post = "Edycja" +edit_profile = "Edytuj profil" +enable = "Włączenie" +enable_blog_url = "Włączenie URL blog" +enter_image_url = "Wpisz URL obrazka" +facebook_app_id = "Facebook App ID" +facebook_page = "Strona Facebook" +featured_audio = "Prezentowany Dźwięk" +featured_image = "Prezentowany Obraz" +featured_link = "Prezentowany Odnośnik" +featured_quote = "Prezentowany Cytat" +featured_video = "Prezentowane Wideo" +feed_url = "Feed URL" +filename = "Nazwa pliku" +follow = "Śledź" +for_google_site_verification_meta = "Dla google-site-verification meta" +front_page_displays = "Wyświetlenie strony startowej" +full_post = "Pełen post" +general = "Ogólnie" +general_settings = "Ustawienia ogólne" +get_one_here = "Zdobądź jeden teraz" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Strona domowa" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Jeżeli pozostanie puste, zawartość poniżej zostanie użyta jako zajawka" +if_the_url_is_left_empty_we_will_use_the_page_title = "Jeżeli URL pozostanie puste, tytuł strony zostanie użyty" +if_the_url_is_left_empty_we_will_use_the_post_title = "Jeżeli URL pozostanie puste, tytuł posta zostanie użyty" +image_post = "Post obrazkowy" +image_post_comment = "Tworzy post z wyróżnionym zdjęciem" +import = "Import" +import_feed = "Rozpocznij import Feed'a" +import_rss = "Import RSS" +import_rss_feed_2.0 = "Importuj RSS Feed 2.0" +insert_image = "Wstaw Obraz" +invalid_error = "BŁĄD: Błędna nazwa konta lub hasło" +language = "Język systemu" +link_name = "Nazwa odnośnika" +link_post = "Odnośnik" +link_post_comment = "Tworzy post z wyróżnionym linkiem" +login = "Login" +login_page = "Strona logowania" +logout = "Wyloguj się" +menu = "Menu" +menus = "Edytor Menu" +meta_description = "Meta-informacje" +meta_description_character = "Ilość znaków metaopisu" +metatags = "Metatags" +metatags_settings = "Ustawienia metatagów" +mine = "Moje" +more = "Więcej" +my_draft = "Mój szkic" +my_posts = "Moje posty" +name = "Nazwa" +newer = "Nigdy" +next = "Dalej" +next_post = "Następny post" +no_available_backup = "W tym momencie nie ma dostępnych kopii zapasowych." +no_draft_found = "Nie znaleziono szkicu" +no_newer_posts = "Nie znaleziono najnowszych postów" +no_posts_found = "Nie znaleziono postów" +no_related_post_found = "Nie znaleziono powiązanych postów." +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "Nie znaleziono" +nope = "Nie" +not = "Nie" +older = "Starsze" +only = "Tylko" +operations = "Operacje" +page = "Strona" +page_generation_time = "Czas wygenerowania strony" +pages = "Strony" +pass_error = "Wartość z hasłem konta jest wymagana" +password = "Hasło" +performance = "Wydajność" +performance_settings = "Ustawienia wydajności" +permalink = "Stały odnośnik" +popular = "Popularne" +popular_posts = "Popularne posty" +popular_posts_widget = "Sekcja postów popularnych" +popular_posts_widget_at_most = "Maksymalna ilość postów wyświetlana w Sekcji Postów Popularnych" +popular_tags = "Popularne tagi" +post_by_author = "Posty autorstwa" +posted_in = "Napisano w" +posted_on = "Opublikowano " +posts = "Posty" +posts_by = "Posty " +posts_draft = "Szablon posta" +posts_in_archive_page_at_most = "Maksymalna ilość postów w archiwum" +posts_in_category_page_at_most = "Maksymalna ilość postów na stronie kategorii" +posts_in_front_page_show_at_most = "Posty na stronie startowej widzialne od najnowszego" +posts_in_profile_page_at_most = "Maksymalna ilość postów na stronie profilu" +posts_in_search_result_at_most = "Maksymalna ilość postów na stronie wyszukiwania" +posts_in_tag_page_at_most = "Maksymalna ilość postów na stronie tagu" +posts_in_type_page_at_most = "Maksymalna ilość postów na stronie typu" +posts_index_settings = "Ustawienia indeksowania postów" +posts_list = "Lista postów" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "Starszy" +prev_post = "Poprzedni post" +preview = "Podgląd" +profile_for = "Profile for" +proudly_powered_by = "Dumnie tworzone przez" +publish = "Opublikuj" +publish_draft = "Opublikuj wersję roboczą" +published = "Opublikowano" +quote_post = "Cytuj post" +quote_post_comment = "Tworzenie postu z cytatem" +rss_character = "Ilość znaków RSS" +rss_feeds_show_the_most_recent = "Maksymalna ilość wpisów Feed'u RSS" +rss_settings = "Ustawienia RSS" +read_more_text = "Czytaj Więcej tekst" +read_more_text_placeholder = "Czytaj więcej" +reading = "Czytanie" +reading_settings = "Ustawienia czytania" +recaptcha = "reCAPTCHA" +recent_posts = "Ostatnie posty" +recent_posts_widget_at_most = "Maksymalna ilość postów wyświetlana w Sekcji Ostatnich Postów" +regular_post = "Standardowy post" +regular_post_comment = "Tworzenie zwykłego postu" +related_posts = "Powiązane posty" +related_widget_posts_at_most = "Maksymalna ilość postów wyświetlana w Sekcji Postów Powiązanych" +revert_to_draft = "Cofnij do wersji roboczej" +save = "Zapisz" +save_config = "Zapisz konfigurację" +save_edit = "Zapisz edycję" +save_menu = "Zapisz menu" +save_as_draft = "Zapisz jako szkic" +save_category = "Zapisz kategorię" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Szukaj" +search_for = "Szukaj" +search_results_for = "Search results for" +search_results_not_found = "Brak wyników wyszukiwania!" +secret_key = "Klucz sekretny" +settings = "Ustawienia" +sign_in_to_start_your_session = "Zaloguj się by rozpocząć sesję" +site_key = "Klucz strony" +sitemap = "Mapa strony" +slug = "Uproszczenie" +social_media = "Platforma społecznościowa" +static_page = "Statyczna strona" +static_page_comment = "Tworzy statyczną stronę" +static_pages = "Strony statyczne" +summary = "Podsumowanie" +summary_character = "Ilość znaków podsumowania" +tag = "Tag" +tagcloud_widget_at_most = "Maksymalna ilość tagów w Chmurze Tagów" +tagline = "Krótki opis" +tagline_placeholder = "Bezbazodanowa platforma PHP do blogowania" +tagline_description = "W kilku słowach opsiz o czym ten blog jest." +tags = "Tagi" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "To jest przestarzały kod. Zazwyzcaj nowo utworzone analizy używają gtag.js" +this_page_doesnt_exist = "Ta strona nie istnieje!" +time = "Czas" +timezone = "Strefa czasowa" +title = "Tytuł" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Do używania Disqus lub Komentarzy Facebook potrzeba wpisać ich App ID." +token_error = "Token CSRF jest niepoprawny" +tools = "Narzędzia" +twitter_account = "Konto Twitter" +type_to_search = "Wpisz wyszkukiwaną frazę" +uncategorized = "Bez kategorii" +uncategorized_comment = "Wpisy, któe nie potrzebują kategorii, lub niepasujące do żadnej kategorii." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Aktualizacja" +update_available = "Aktualizacje są dostępne" +update_draft = "Aktualizuj szkic" +update_post = "Aktualizuj post" +update_to = "Aktualizuj do" +upload = "Wgraj" +user = "Konto" +user_error = "Wartość pola z nazwą konta jest wymagane" +valid_values_range_from_0_to_1.0._see = "Poprawne wartości są w zakresie 0.0 do 1.0. Zobacz" +video_post = "Film" +video_post_comment = "Tworzy post z wyróżnionym filmem." +view = "Zobacz" +view_post = "Podgląd" +views = "Wyświetleń" +widget = "Widgety" +widget_settings = "Ustawienia widgetów" +would_you_like_to_try_our = "Czy przetestujesz " +yes_im_in = "Tak, wchodzę w to" +yes_not_recommended = "Tak (niezalecane)" +you_dont_have_permission_to_access_this_page = "Nie masz uprawnień do tej strony" +your_new_config_key = "Twój nowy klucz konfiguracji" +your_new_value = "Wartość twojego nowego klucza konfiguracji" +your_backups = "Twoje kopie zapasowe" +your_latest_blog_posts = "Twoje ostatnie wpisy" +your_recent_posts = "Twoje ostatnie posty" +by = "przez" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "wskazówka: Użyj Ctrl/CMD + F by wyszukać wartość klucza konfiguracji." +homepage = "strona_domowa" +instead = "zamiast" +item_class = "Wstaw klasy CSS" +item_slug = "Wstaw URL odnośnika" +now = "teraz" +of = " " +optional = "opcjonalne" +post_your_post_slug = "/post/uproszczona-nazwa-postu" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "super wskazówka: Możesz tworzyć własne klucze konfiguracji i wyświetlać je gdziekolwiek w szablonie." +read_more = "Czytaj więcej" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/rok/miesiąc/uproszczona-nazwa-postu" +your_key = "ten.klucz" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/pt_BR.ini b/lang/pt_BR.ini new file mode 100644 index 0000000..297ad49 --- /dev/null +++ b/lang/pt_BR.ini @@ -0,0 +1,326 @@ +about = "Sobre" +add_category = "Adicionar categoria" +add_content = "Adicionar conteúdo" +add_link = "Adicionar link" +add_menu = "Adicionar menu" +add_new_page = "Adicionar nova página" +add_new_post = "Adicionar nova postagem" +add_source_link_optional = "Adicione o link da fonte (opcional)" +add_sub = "Adicionar sub página" +address_url = "Endereço (URL)" +admin = "Admin" +admin_panel_style_based_on = "Painel de administração baseado no" +all_blog_posts = "Todas as postagens do blog" +all_cache_has_been_deleted = "Todo cache foi excluído !" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Arquivos" +are_you_sure_you_want_to_delete_ = "Tem certeza de que deseja excluir %s?" +at_the_moment_you_are_using_auto_generated_menu = "No momento você está usando a geração automática de menus." +audio_post = "Postagem com áudio" +audio_post_comment = "Criação de postagem com áudio em destaque" +author = "Autor" +author_description = "Just another HTMLy user" +back_to = "Voltar para" +backup = "Backup" +blog_description = "Em um parágrafo, descreva sobre seu site/blog." +blog_theme = "Tema do site/blog" +blog_title = "Título (site/blog)" +blog_title_placeholder = "Meu site / blog" +blog_posts_displayed_as = "Exibir postagens como" +breadcrumb_home_text = "Breadcrumb: texto da página inicial" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Utilizando este importador você está de acordo que o feed é seu ou pelo menos tenha a autorização para publicar." +css_class_optional = "Classe CSS (opcional)" +cache_expiration = "Expiração do cache (em horas)" +cache_off = "Desativar Cache" +cache_timestamp = "Timestamp do cache" +cancel = "Cancelar" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "Categorias" +category = "Categoria" +check_update = "Verificar atualização" +clear_cache = "Limpar cache" +comma_separated_values = "Os valores devem ser separados por virgula" +comment_system = "Sistema de comentário" +comments = "Comentários" +config = "Configurar" +congrats_you_have_the_latest_version_of_htmly = "Parabêns ! Você tem a última versão do HTMLy." +content = "Conteúdo" +contents = "Conteúdo" +copyright_line = "Direitos reservados" +copyright_line_placeholder = "(c) Seu nome." +create_backup = "Gerar backup" +created = "Criado" +custom = "Customizar" +custom_settings = "Configurações customizadas" +dashboard = "Painel de Controle" +date = "Data" +date_format = "Formato de data" +delete = "Excluir" +description = "Descrição" +disable = "Desabilitar" +disabled = "Desabilitado" +disqus_shortname = "Usuário Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Rascunho" +edit = "Editar" +edit_category = "Editar categoria" +edit_post = "Edit" +edit_profile = "Editar perfil" +enable = "Habilitar" +enable_blog_url = "Habilitar a URL blog" +enter_image_url = "Insira a URL da imagem" +facebook_app_id = "Facebook App ID" +facebook_page = "Página do Facebook" +featured_audio = "Audio em destaque" +featured_image = "Imagem em destaque" +featured_link = "Link em destaque" +featured_quote = "Citação em destaque" +featured_video = "Video em destaque" +feed_url = "URL do Feed" +filename = "Nome do arquivo" +follow = "Seguir" +for_google_site_verification_meta = "Para o meta google-site-verification" +front_page_displays = "Mostrar na primeira página" +full_post = "Postagem completa" +general = "Geral" +general_settings = "Configurações Gerais" +get_one_here = "Efetue as configuração no link" +github_pre_release = "Pré-lançamento do Github" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legado)" +google_search_console = "Google Search Console" +home = "Inicial" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Se deixar em branco, iremos extraí-lo do conteúdo abaixo" +if_the_url_is_left_empty_we_will_use_the_page_title = "Se a url estiver vazia, usaremos o título da página" +if_the_url_is_left_empty_we_will_use_the_post_title = "Se a url estiver vazia, usaremos o título da postagem" +image_post = "Postagem com imagem" +image_post_comment = "Criação de postagem com imagem em destaque" +import = "Importar" +import_feed = "Iniciar importação do feed" +import_rss = "Importar RSS" +import_rss_feed_2.0 = "Importar o Feed RSS 2.0" +insert_image = "Inserir Imagem" +invalid_error = "ERROR: Invalid username or password" +language = "Idioma do sistema" +link_name = "Nome do link" +link_post = "Postagem de link" +link_post_comment = "Criação de postagem com link em destaque" +login = "Logar" +login_page = "Página de login" +logout = "Sair" +menu = "Menu" +menus = "Editor de menus" +meta_description = "Meta Descrição" +meta_description_character = "Caracteres da 'Meta description'" +metatags = "Metatags" +metatags_settings = "Configurações de Metatags" +mine = "Meu" +more = "Mais" +my_draft = "Meu rascunho" +my_posts = "Minhas postagens" +name = "Nome" +newer = "Mais recente" +next = "Próximo" +next_post = "Próxima postagem" +no_available_backup = "Não há nenhum backup no momento." +no_draft_found = "Nenhum rascunho encontrado" +no_posts_found = "nenhuma postagem encontrada" +no_related_post_found = "Nenhuma postagem relacionada encontrada" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Não" +not = "Não" +older = "Antigo" +only = "Somente" +operations = "Operações" +page = "Page" +page_generation_time = "Tempo de geração da página" +pages = "Pages" +pass_error = "Password field is required" +password = "Senha" +performance = "Performance" +performance_settings = "Configurações de Performance" +permalink = "Link permanente" +popular = "Popular" +popular_posts = "Postagens populares" +popular_posts_widget = "Posts populares" +popular_posts_widget_at_most = "Limite de post populares" +popular_tags = "Tags populares" +post_by_author = "Posts by this author" +posted_in = "Postado em" +posted_on = "Posted em" +posts = "Postagens" +posts_by = "Posts by" +posts_draft = "Rascunhos" +posts_in_archive_page_at_most = "Limite na página de arquivados" +posts_in_category_page_at_most = "Limite na página de categoria" +posts_in_front_page_show_at_most = "Limitar posts na primeira página" +posts_in_profile_page_at_most = "Limite na página de perfil" +posts_in_search_result_at_most = "Limite em resultados de pesquisa" +posts_in_tag_page_at_most = "Limite na página de tags" +posts_in_type_page_at_most = "Limite na página por tipo (type)" +posts_index_settings = "Configurações de índice das postagens" +posts_list = "Postagens" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pré-lançamento" +prev = "Antigo" +prev_post = "Postagem anterior" +preview = "Pré visualização" +profile_for = "Profile for" +proudly_powered_by = "Orgulhosamente desenvolvido por" +publish = "Publicar" +publish_draft = "Publicar rascunho" +published = "Publicados" +quote_post = "Postagem com citação" +quote_post_comment = "Criação de postagem de blog com citação em destaque" +rss_character = "Limite de caracteres do RSS" +rss_feeds_show_the_most_recent = "Limite de postagens recentes" +rss_settings = "Configurações RSS" +read_more_text = "Texto para continuar a leitura" +read_more_text_placeholder = "Leia mais" +reading = "Leitura" +reading_settings = "Configurações de Leitura" +recaptcha = "reCAPTCHA" +recent_posts = "Postagens recentes" +recent_posts_widget_at_most = "Limite de posts recentes" +regular_post = "Postagem padrão" +regular_post_comment = "Criação de postagem padrão no blog" +related_posts = "Postagens relacionadas" +related_widget_posts_at_most = "Limite de posts relacionados" +revert_to_draft = "Reverter para rascunho" +save = "Salvar" +save_config = "Salvar configurações" +save_edit = "Salvar edição" +save_menu = "Salvar menu" +save_as_draft = "Salvar como rascunho" +save_category = "Salvar categoria" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Buscar" +search_for = "Buscar por" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Chave secreta" +settings = "Configurações" +sign_in_to_start_your_session = "Faça login para iniciar a sessão" +site_key = "Chave do site" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Mídia Social" +static_page = "Página estática" +static_page_comment = "Criação de página estática" +static_pages = "Páginas estáticas" +summary = "Postagem Resumida" +summary_character = "Limite de caracteres do resumo" +tag = "Tag" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Slogan" +tagline_placeholder = "Descreva um slogan" +tagline_description = "Em poucas palavras defina o site/blog de forma objetiva." +tags = "Tags" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Este é um código legado. Normalmente o novo Analytics usa o gtag.js" +this_page_doesnt_exist = "A página requisitada não existe !" +time = "Hora" +timezone = "Fuso horário" +title = "Título" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Para usar o Disqus ou comentário do Facebook, você precisa fornecer o nome abreviado do Disqus ou o ID do aplicativo do Facebook." +token_error = "CSRF Token not correct" +tools = "Ferramentas" +twitter_account = "Conta do Twitter" +type_to_search = "Digite para buscar" +uncategorized = "Sem categoria" +uncategorized_comment = "Tópicos que não precisam de uma categoria ou não se encaixam em nenhuma outra categoria existente" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Atualizar" +update_available = "Atualização disponível" +update_draft = "Atualizar rascunho" +update_post = "Atualizar postagem" +update_to = "Atualizar para" +upload = "Carregar" +user = "Usuário" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Valores válidos são entre 0.0 e 1.0. Veja mais em" +video_post = "Postagem de video" +video_post_comment = "Criação de postagem com vídeo em destaque" +view = "Visualizar" +view_post = "View" +views = "Visualizações" +widget = "Widget" +widget_settings = "Configurações dos Widgets" +would_you_like_to_try_our = "Poderia tentar a nossa " +yes_im_in = "Sim, estou dentro" +yes_not_recommended = "Sim (não recomendado)" +you_dont_have_permission_to_access_this_page = "Você não tem permissão para acessar esta página" +your_new_config_key = "Sua nova chave configurada" +your_new_value = "Seu novo valor" +your_backups = "Seus backups" +your_latest_blog_posts = "Suas postagens de blog" +your_recent_posts = "Suas postagens recentes" +by = "por" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "Dica: Utilize Ctrl/CMD + F para buscar pela chave ou valor." +homepage = "página inicial" +instead = "no lugar" +item_class = "Insira a classe CSS do link" +item_slug = "Insira a URL do link" +now = "agora" +of = "of" +optional = "opcional" +post_your_post_slug = "/post/url-da-postagem" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Dica profissional: Você pode criar chaves customizadas e imprimir seus valores em qualquer local de seu tema." +read_more = "leia mais" +widget_key_placeholder = "Seu código" +year_month_your_post_slug = "/ano/mes/url-da-postagem" +your_key = "sua.chave" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/ru_RU.ini b/lang/ru_RU.ini new file mode 100644 index 0000000..5bd8cc5 --- /dev/null +++ b/lang/ru_RU.ini @@ -0,0 +1,327 @@ +about = "О сайте" +add_category = "Добавить категорию" +add_content = "Добавить статью" +add_link = "Добавить ссылку" +add_menu = "Добавить меню" +add_new_page = "Добавить новую страницу" +add_new_post = "Добавить новую статью" +add_source_link_optional = "Добавить ссылку на источник (не обязательно)" +add_sub = "Добавить подстраницу" +address_url = "Адрес (URL)" +admin = "Админ" +admin_panel_style_based_on = "Стиль админ панели основан на" +all_blog_posts = "Все статьи" +all_cache_has_been_deleted = "Все кеши были очищены!" +all_posts_tagged = "All posts tagged" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Архивы" +are_you_sure_you_want_to_delete_ = "Вы уверены, что хотите удалить %s?" +at_the_moment_you_are_using_auto_generated_menu = "Сейчас вы используете автоматически созданное меню" +audio_post = "Статья с аудио" +audio_post_comment = "Создать статью с аудио" +author = "Автор" +author_description = "Еще один пользователь HTMLy" +back_to = "Вернуться на" +backup = "Бэкап" +blog_description = "Расскажите больше о своем блоге (один абзац)" +blog_theme = "Тема блога" +blog_title = "Заголовок блога" +blog_title_placeholder = "Мой блог на HTMLy" +blog_posts_displayed_as = "Записи в блоге отображаются в виде" +breadcrumb_home_text = "Текст для главной страницы в хлебных крошках" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Используя данный импортер, вы подтверждаете, что лента принадлежит вам, или у вас есть полномочия на ее публикацию" +css_class_optional = "CSS класс (не обязательно)" +cache_expiration = "Срок действия кеша (в часах)" +cache_off = "Кеш выключен" +cache_timestamp = "Отметка времени кеша" +cancel = "Отменить" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha не верна" +categories = "Категории" +category = "Категория" +check_update = "Проверить обновления" +clear_cache = "Очистить кеш" +comma_separated_values = "Разделенные запятыми значения" +comment_system = "Выберите систему" +comments = "Комментарии" +config = "Конфигурация" +congrats_you_have_the_latest_version_of_htmly = "Поздравляем! У вас установлена последняя версия HTMLy" +content = "Содержимое" +contents = "Содержание" +copyright_line = "Авторские права" +copyright_line_placeholder = "(c) Ваше имя" +create_backup = "Создать резервную копию" +created = "Создано" +custom = "Пользовательские" +custom_settings = "Пользовательские настройки" +dashboard = "Панель" +date = "Дата" +date_format = "Формат даты" +delete = "Удалить" +description = "Описание" +disable = "Выключить" +disabled = "Отключено" +disqus_shortname = "Имя Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Черновик" +edit = "Редактировать" +edit_category = "Редактировать категорию" +edit_post = "Редактировать" +edit_profile = "Редактировать профиль" +enable = "Включить" +enable_blog_url = "Включить ссылку blog" +enter_image_url = "Введите URL изображения" +facebook_app_id = "Facebook App ID" +facebook_page = "Страница Facebook" +featured_audio = "Аудио" +featured_image = "Изображение" +featured_link = "Ссылка" +featured_quote = "Цитата" +featured_video = "Видео" +feed_url = "Адрес рассылки" +filename = "Имя файла" +follow = "Следовать" +for_google_site_verification_meta = "Для google-site-verification (мета тег)" +front_page_displays = "Показывать на главной странице" +full_post = "Статья полностью" +general = "Общие" +general_settings = "Общие настройки" +get_one_here = "Получить" +github_pre_release = "Предварительный выпуск на Github" +google_analytics = "Аналитика Google" +google_analytics_legacy = "Аналитика Google (legacy)" +google_search_console = "Поисковая консоль Google" +home = "Главная" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Если оставить пустым, данные будут внесены из основного содержимого" +if_the_url_is_left_empty_we_will_use_the_page_title = "Если адрес оставить пустым, будет использован заголовок страницы" +if_the_url_is_left_empty_we_will_use_the_post_title = "Если адрес оставить пустым, будет использован заголовок статьи" +image_post = "Статья с изображением" +image_post_comment = "Создать статью с изображением" +import = "Импорт" +import_feed = "Запустить импорт ленты" +import_rss = "Импорт RSS" +import_rss_feed_2.0 = "Импорт RSS Feed 2.0" +insert_image = "Вставить изображение" +invalid_error = "ОШИБКА: Неверные имя пользователя или Пароль" +language = "Язык системы" +link_name = "Название ссылки" +link_post = "Статья со ссылкой" +link_post_comment = "Создать статью со ссылкой" +login = "Вход" +login_page = "Страница входа" +logout = "Выйти" +menu = "Меню" +menus = "Редактор меню" +meta_description = "Мета-описание" +meta_description_character = "Количество символов в мета-описании" +metatags = "Мета теги" +metatags_settings = "Настройки мета тегов" +mine = "Моё" +more = "Подробнее" +my_draft = "Мой черновик" +my_posts = "Мои статьи" +name = "Имя" +newer = "Новое" +next = "Вперед" +next_post = "Следующая статья" +no_available_backup = "Резервные копии отсутствуют" +no_draft_found = "Черновики не найдены" +no_newer_posts = "Нет новых статей" +no_posts_found = "Статьи не найдены" +no_related_post_found = "Нет похожих статей." +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "Безрезультатно" +nope = "Нет" +not = "Нет" +older = "Старое" +only = "Только" +operations = "Операции" +page = "Страница" +page_generation_time = "Время создания страницы" +pages = "Страницы" +pass_error = "Введите пароль" +password = "Пароль" +performance = "Производительность" +performance_settings = "Настройки производительности" +permalink = "Постоянная ссылка" +popular = "Популярный" +popular_posts = "Популярные статьи" +popular_posts_widget = "Популярные статьи" +popular_posts_widget_at_most = "Количество популярных статей, не более" +popular_tags = "Популярные теги" +post_by_author = "Авторские статьи" +posted_in = "Опубликовано в" +posted_on = "Опубликовано " +posts = "Статьи" +posts_by = "Статьи автора" +posts_draft = "Черновики" +posts_in_archive_page_at_most = "Количество статей на архивных страницах, не более" +posts_in_category_page_at_most = "Количество статей на странице категорий, не более" +posts_in_front_page_show_at_most = "Количество статей на главной, не более" +posts_in_profile_page_at_most = "Количество статей на страницах профиля пользователя, не более" +posts_in_search_result_at_most = "Количество статей в результатах поиска, не более" +posts_in_tag_page_at_most = "Количество статей на страницах для каждой метки, не более" +posts_in_type_page_at_most = "Количество статей на страницах для каждого типа записей, не более" +posts_index_settings = "Настройки количества статей" +posts_list = "Список статей" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "предварительный выпуск" +prev = "Назад" +prev_post = "Предыдущая статья" +preview = "Просмотр" +profile_for = "Profile for" +proudly_powered_by = "Разработано" +publish = "Опубликовать" +publish_draft = "Опубликовать черновик" +published = "Опубликовано" +quote_post = "Статья с цитатой" +quote_post_comment = "Создать статью с цитатой" +rss_character = "Количество символов в RSS" +rss_feeds_show_the_most_recent = "Количество последних новостей в RSS каналах" +rss_settings = "Настройки RSS" +read_more_text = "Текст Читать далее" +read_more_text_placeholder = "Подробнее" +reading = "Чтение" +reading_settings = "Настройки чтения" +recaptcha = "reCAPTCHA" +recent_posts = "Новые статьи" +recent_posts_widget_at_most = "Количество новых статей, не более" +regular_post = "Стандартная статья" +regular_post_comment = "Создать стандартную статью" +related_posts = "Похожие статьи" +related_widget_posts_at_most = "Количество похожих статей, не более" +revert_to_draft = "Переключить на черновик" +save = "Сохранить" +save_config = "Сохранить настройки" +save_edit = "Сохранить" +save_menu = "Сохранить меню" +save_as_draft = "Сохранить как черновик" +save_category = "Сохранить категорию" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Поиск" +search_for = "Искать" +search_results_for = "Search results for" +search_results_not_found = "По вашему запросу ничего не найдено!" +secret_key = "Секретный ключ" +settings = "Настройки" +sign_in_to_start_your_session = "Авторизация пользователя" +site_key = "Ключ сайта" +sitemap = "Карта сайта" +slug = "ЧПУ" +social_media = "Социальные медиа" +static_page = "Статичная страница" +static_page_comment = "Создать статичную страницу" +static_pages = "Статичные страницы" +summary = "Отрывок" +summary_character = "Количество символов в отрывке" +tag = "Метка" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Подзаголовок" +tagline_placeholder = "Платформа для ведения блогов на PHP без базы данных" +tagline_description = "В нескольких словах расскажите, о чем этот блог" +tags = "Метки" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Это устаревший код. Обычно новая аналитика создается с использованием gtag.js" +this_page_doesnt_exist = "Такая станица не существует!" +time = "Время" +timezone = "Часовой пояс" +title = "Заголовок" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Для использования комментариев Disqus или Facebook вам необходимо указать короткое имя Disqus или Facebook App ID." +token_error = "Неправильный токен" +tools = "Инструменты" +twitter_account = "Аккаунт Twitter" +type_to_search = "Введите для поиска" +uncategorized = "Без категории" +uncategorized_comment = "Статьи, которым не нужна категория или которые не подходят ни к одной существующей категории." +universal_analytics = "Универсальная (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Обновить" +update_available = "Доступно обновление" +update_draft = "Обновить черновик" +update_post = "Обновить статью" +update_to = "Обновить до" +upload = "Загрузить" +user = "Пользователь" +user_error = "Заполните имя пользователя" +valid_values_range_from_0_to_1.0._see = "Допустимые значения от 0.0 до 1.0. Подробнее: " +video_post = "Статья с видео" +video_post_comment = "Создать статью с видео" +view = "Просмотр" +view_post = "Просмотр" +views = "Просмотры" +widget = "Виджет" +widget_settings = "Управление виджетами" +would_you_like_to_try_our = "Хотели бы вы попробовать " +yes_im_in = "Да" +yes_not_recommended = "Да (не рекомендуется)" +you_dont_have_permission_to_access_this_page = "У вас нет разрешений для доступа к этой странице" +your_new_config_key = "Ваш новый ключ конфигурации" +your_new_value = "Значение ключа" +your_backups = "Резервные копии" +your_latest_blog_posts = "Ваши последние статьи" +your_recent_posts = "Ваши недавние статьи" +by = "" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "совет: Для поиска ключа конфигурации и его значения используйте комбинацию клавиш Ctrl/CMD + F" +homepage = "главная" +instead = "вместо" +item_class = "Добавьте класс CSS" +item_slug = "Вставьте ЧП ссылку" +now = "сейчас" +of = "of" +optional = "необязательный" +post_your_post_slug = "/post/постоянная-ссылка-на-статью" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "совет: Вы можете создать собственный ключ конфигурации и выводить значение этого ключа в любом месте вашего шаблона" +read_more = "Читать далее" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/год/месяц/постоянная-ссылка-на-статью" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/sv_SE.ini b/lang/sv_SE.ini new file mode 100644 index 0000000..2395ac4 --- /dev/null +++ b/lang/sv_SE.ini @@ -0,0 +1,338 @@ +about = "Om" +add_category = "Ny kategori" +add_content = "Nytt" +add_link = "Add link" +add_menu = "Add menu" +add_new_page = "Add new page" +add_new_post = "Add new post" +add_source_link_optional = "Add source link (optional)" +add_sub = "Ny undersida" +address_url = "Address (URL)" +admin = "Admin" +admin_panel_style_based_on = "Admin panel style based on" +all_blog_posts = "Alla blogginlägg" +all_cache_has_been_deleted = "All cache has been deleted !" +all_posts_tagged = "All posts tagged" +archive = "Arkiv" +archive_for = "Archive for" +archive_page_for = "Archive page for" +archives = "Arkiv" +are_you_sure_you_want_to_delete_ = "Är du säker på att du vill radera %s?" +at_the_moment_you_are_using_auto_generated_menu = "At the moment you are using auto generated menu." +audio_post = "Audioinlägg" +audio_post_comment = "Skapa inlägg med ljudklipp" +author = "Författare" +author_description = "Just another HTMLy user" +back_to = "Back to" +backup = "Säkerhetskopiera" +blog_description = "In one paragraph, tell us more about your blog." +blog_theme = "Blog Theme" +blog_title = "Blog title" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "Blog posts displayed as" +breadcrumb_home_text = "Breadcrumb home text" +by = "av" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "By using this importer you are agree if the feed is yours or at least you have the authority to publish it." +css_class_optional = "CSS Class (optional)" +cache_expiration = "Cache expiration (in hours)" +cache_off = "Cache off" +cache_timestamp = "Cache timestamp" +cancel = "Avbryt" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha not correct" +categories = "Kategorier" +category = "Kategori" +check_update = "Check update" +clear_cache = "Rensa cache" +comma_separated_values = "Comma separated values" +comment_system = "Comment system" +comments = "kommentarer" +config = "Konfiguration" +congrats_you_have_the_latest_version_of_htmly = "Congrats! You have the latest version of HTMLy." +content = "Content" +contents = "Innehåll" +continue_reading = "Läs vidare" +copyright_line = "Copyright line" +copyright_line_placeholder = "(c) Your name." +create_backup = "Create backup" +created = "Skapad" +custom = "Custom" +custom_settings = "Custom Settings" +dashboard = "Dashboard" +date = "Date" +date_format = "Date Format" +delete = "Radera" +description = "Beskrivning" +design_by = "Designad av" +disable = "Disable" +disabled = "Disabled" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "Utkast" +edit = "Redigera" +edit_category = "Edit category" +edit_post = "Edit" +edit_profile = "Redigera profil" +enable = "Enable" +enable_blog_url = "Enable blog URL" +enter_image_url = "Enter image URL" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook page" +featured_audio = "Featured Audio" +featured_image = "Featured Image" +featured_link = "Featured Link" +featured_quote = "Featured Quote" +featured_video = "Featured Video" +feed_url = "Feed URL" +filename = "Filnamn" +follow = "Följ" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "Front page displays" +full_post = "Full post" +general = "General" +general_settings = "General Settings" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "Home" +if_left_empty_we_will_excerpt_it_from_the_content_below = "If leave empty we will excerpt it from the content below" +if_the_url_is_left_empty_we_will_use_the_page_title = "If the url leave empty we will use the page title" +if_the_url_is_left_empty_we_will_use_the_post_title = "If the url leave empty we will use the post title" +image_post = "Bildinlägg" +image_post_comment = "Skapa inlägg med bild" +import = "Importera" +import_feed = "Start Import Feed" +import_rss = "Import RSS" +import_rss_feed_2.0 = "Import RSS Feed 2.0" +insert_image = "Insert Image" +invalid_error = "ERROR: Invalid username or password" +language = "System Language" +link_name = "Link name" +link_post = "Länkinlägg" +link_post_comment = "Skapa inlägg med länk" +login = "Login" +login_page = "Inloggningssida" +logout = "Logga ut" +menu = "Menu" +menus = "Menu Editor" +meta_description = "Meta-beskrivning" +meta_description_character = "Meta description character" +metatags = "Metatags" +metatags_settings = "Metatags Settings" +mine = "Mina" +more = "Mer" +my_draft = "Mina utkast" +my_posts = "Mina inlägg" +name = "Name" +newer = "Nyare" +newer_posts = "Nyare inlägg" +next = "Nästa" +next_post = "Nästa inlägg" +no_available_backup = "No available backup at this time." +no_draft_found = "Inga utkast funna" +no_newer_posts = "Inga nyare inlägg" +no_older_posts = "Inga äldre inlägg" +no_posts_found = "Inga inlägg funna" +no_related_post_found = "Inga relaterade inlägg funna" +no_scheduled_posts_found = "No scheduled posts found!" +no_search_results = "No search results" +nope = "Nope" +not = "No" +older = "Äldre" +older_posts = "Äldre inlägg" +only = "Only" +operations = "Åtgärder" +page = "Page" +page_generation_time = "Page generation time" +pages = "Pages" +pass_error = "Password field is required" +password = "Password" +performance = "Performance" +performance_settings = "Performance Settings" +permalink = "Permalink" +popular = "Popular" +popular_posts = "Populära inlägg" +popular_posts_widget = "Popular posts widget" +popular_posts_widget_at_most = "Popular posts widget at most" +popular_tags = "Populära etiketter" +post_by_author = "Posts by this author" +posted_in = "Upplagd i" +posted_on = "Upplagd på" +posts = "Inlägg" +posts_by = "Posts by" +posts_draft = "Posts draft" +posts_in_archive_page_at_most = "Posts in archive page at most" +posts_in_category_page_at_most = "Posts in category page at most" +posts_in_front_page_show_at_most = "Posts in front page show at most" +posts_in_profile_page_at_most = "Posts in profile page at most" +posts_in_search_result_at_most = "Posts in search result at most" +posts_in_tag_page_at_most = "Posts in tag page at most" +posts_in_type_page_at_most = "Posts in type page at most" +posts_index_settings = "Posts index settings" +posts_list = "Posts list" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "Föregående" +prev_post = "Föregående inlägg" +preview = "Preview" +previous = "Föregående" +profile_for = "Profile for" +proudly_powered_by = "Proudly powered by" +publish = "Publicera" +publish_draft = "Publicera utkast" +published = "Publicerad" +published_by = "Publicerad av" +quote_post = "Citatinlägg" +quote_post_comment = "Skapa inlägg med citat" +rss_character = "RSS character" +rss_feeds_show_the_most_recent = "RSS feeds show the most recent" +rss_settings = "RSS settings" +read_more = "läs mer" +read_more_text = "Read more text" +read_more_text_placeholder = "Read more" +reading = "Reading" +reading_settings = "Reading Settings" +recaptcha = "reCAPTCHA" +recent_comments = "Senaste kommentarer" +recent_posts = "Senaste inlägg" +recent_posts_widget_at_most = "Recent posts widget at most" +regular_post = "Vanligt inlägg" +regular_post_comment = "Skapa vanligt inlägg" +related_posts = "Relaterade inlägg" +related_widget_posts_at_most = "Related widget posts at most" +return_to_home = "Tillbaka till startsidan" +revert_to_draft = "Återgå till utkast" +save = "Spara" +save_config = "Save config" +save_edit = "Save Edit" +save_menu = "Save menu" +save_as_draft = "Spara som utkast" +save_category = "Save category" +scheduled = "Scheduled" +scheduled_posts = "Scheduled posts" +scheduled_tips = "Publishing a post with future date or time, it will go into scheduled posts" +search = "Sök" +search_for = "Sök efter" +search_results_for = "Search results for" +search_results_not_found = "Search results not found!" +secret_key = "Secret Key" +settings = "Settings" +share_this_post = "Dela inlägg" +sign_in_to_start_your_session = "Sign in to start your session" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "Statisk sida" +static_page_comment = "Skapa statisk sida" +static_pages = "Statiska sidor" +summary = "Summary" +summary_character = "Summary character" +tag = "Etikett" +tagcloud_widget_at_most = "TagCloud at most" +tagline = "Tagline" +tagline_placeholder = "Databaseless PHP Blogging Platform" +tagline_description = "In a few words, explain what this blog is about." +tags = "Etiketter" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "This page doesn't exist !" +time = "Time" +timezone = "Timezone" +title = "Titel" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "To using Disqus or Facebook comment you need to provide Disqus shortname or Facebook App ID." +token_error = "CSRF Token not correct" +tools = "Tools" +twitter_account = "Twitter account" +type_to_search = "Type to search" +uncategorized = "Ingen kategori" +uncategorized_comment = "Inlägg som inte behöver någon kategori eller inte passar i någon av övriga kategorier." +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "Uppdatera" +update_available = "Update Available" +update_draft = "Uppdatera utkast" +update_post = "Uppdatera inlägg" +update_to = "Update to" +upload = "Upload" +user = "User" +user_error = "User field is required" +valid_values_range_from_0_to_1.0._see = "Valid values range from 0.0 to 1.0. See" +video_post = "Videoinlägg" +video_post_comment = "Skapa inlägg med video" +view = "Visa" +view_post = "View" +views = "Visningar" +widget = "Widget" +widget_settings = "Widget Settings" +would_you_like_to_try_our = "Would you like to try our " +yes_im_in = "Yes I'm in" +yes_not_recommended = "Yes (not recommended)" +you_dont_have_permission_to_access_this_page = "You don't have permission to access this page" +your_new_config_key = "Your New Config Key" +your_new_value = "Your New Value" +your_backups = "Your backups" +your_latest_blog_posts = "Your latest blog posts" +your_recent_posts = "Dina senaste inlägg" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "hint: Use Ctrl/CMD + F to search for your config key or value." +homepage = "homepage" +instead = "instead" +item_class = "Insert CSS class" +item_slug = "Insert Link URL" +now = "now" +of = "of" +optional = "optional" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "pro tips: You can creating custom config key and print out your config key value anywhere in your template." +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/tr_TR.ini b/lang/tr_TR.ini new file mode 100644 index 0000000..e937e3f --- /dev/null +++ b/lang/tr_TR.ini @@ -0,0 +1,326 @@ +about = "Hakkında" +add_category = "Kategori ekle" +add_content = "İçerik ekle" +add_link = "Bağlantı ekle" +add_menu = "Menü ekle" +add_new_page = "Yeni sayfa ekle" +add_new_post = "Yeni gönderi ekle" +add_source_link_optional = "Kaynak bağlantısı ekle (isteğe bağlı)" +add_sub = "Alt ekle" +address_url = "Adres (URL)" +admin = "Yönetici" +admin_panel_style_based_on = "Yönetici paneli stili temel alıyor" +all_blog_posts = "Tüm blog yazıları" +all_cache_has_been_deleted = "Tüm önbellek silindi!" +all_posts_tagged = "Tüm etiketlenmiş gönderiler" +archive_for = "Arşiv" +archive_page_for = "Arşiv sayfası" +archives = "Arşivler" +are_you_sure_you_want_to_delete_ = "%s silmek istediğinize emin misiniz?" +at_the_moment_you_are_using_auto_generated_menu = "Şu anda otomatik oluşturulmuş menü kullanıyorsunuz." +audio_post = "Sesli gönderi" +audio_post_comment = "Ses içeren bir blog gönderisi oluşturuluyor" +author = "Yazar" +author_description = "Bir başka HTMLy kullanıcısı" +back_to = "Geri dön" +backup = "Yedekleme" +blog_description = "Blogunuzu daha iyi anlatan bir paragraf." +blog_theme = "Blog Teması" +blog_title = "Blog Başlığı" +blog_title_placeholder = "HTMLy Blogum" +blog_posts_displayed_as = "Blog gönderileri şu şekilde görüntülenir" +breadcrumb_home_text = "Anasayfa kırıntı metni" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "Bu içe aktarımı kullanarak beslemenin size ait olduğunu veya en azından yayınlama yetkinizin olduğunu onaylıyorsunuz." +css_class_optional = "CSS Sınıfı (isteğe bağlı)" +cache_expiration = "Önbellek süresi (saat cinsinden)" +cache_off = "Önbellek kapalı" +cache_timestamp = "Önbellek zaman damgası" +cancel = "İptal" +cannot_read_feed_content = "Besleme içeriği okunamıyor" +captcha_error = "reCAPTCHA doğru değil" +categories = "Kategoriler" +category = "Kategori" +check_update = "Güncellemeyi kontrol et" +clear_cache = "Önbelleği temizle" +comma_separated_values = "Virgülle ayrılmış değerler" +comment_system = "Yorum sistemi" +comments = "Yorumlar" +config = "Ayarlar" +congrats_you_have_the_latest_version_of_htmly = "Tebrikler! HTMLy'nin en son sürümüne sahipsiniz." +content = "İçerik" +contents = "İçerikler" +copyright_line = "Telif Hakkı Satırı" +copyright_line_placeholder = "(c) Adınız." +create_backup = "Yedek oluştur" +created = "Oluşturuldu" +custom = "Özel" +custom_settings = "Özel Ayarlar" +dashboard = "Panel" +date = "Tarih" +date_format = "Tarih Formatı" +delete = "Sil" +description = "Açıklama" +disable = "Devre dışı bırak" +disabled = "Devre dışı" +disqus_shortname = "Disqus kısa adı" +disqus_shortname_placeholder = "htmly" +draft = "Taslak" +edit = "Düzenle" +edit_category = "Kategoriyi düzenle" +edit_post = "Düzenle" +edit_profile = "Profili düzenle" +enable = "Etkinleştir" +enable_blog_url = "Blog URL'sini etkinleştir" +enter_image_url = "Görsel URL'sini girin" +facebook_app_id = "Facebook Uygulama ID'si" +facebook_page = "Facebook sayfası" +featured_audio = "Öne çıkan ses" +featured_image = "Öne çıkan görsel" +featured_link = "Öne çıkan bağlantı" +featured_quote = "Öne çıkan alıntı" +featured_video = "Öne çıkan video" +feed_url = "Besleme URL'si" +filename = "Dosya Adı" +follow = "Takip et" +for_google_site_verification_meta = "Google site doğrulaması için meta" +front_page_displays = "Anasayfa gösterimi" +full_post = "Tam gönderi" +general = "Genel" +general_settings = "Genel Ayarlar" +get_one_here = "Buradan bir tane alın" +github_pre_release = "Github ön sürüm" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (eski)" +google_search_console = "Google Search Console" +home = "Anasayfa" +if_left_empty_we_will_excerpt_it_from_the_content_below = "Boş bırakılırsa, aşağıdaki içerikten özet çıkarılacaktır." +if_the_url_is_left_empty_we_will_use_the_page_title = "URL boş bırakılırsa sayfa başlığı kullanılacaktır." +if_the_url_is_left_empty_we_will_use_the_post_title = "URL boş bırakılırsa gönderi başlığı kullanılacaktır." +image_post = "Görsel gönderi" +image_post_comment = "Öne çıkan görsel içeren bir blog gönderisi oluşturuluyor" +import = "İçe aktar" +import_feed = "Besleme içe aktarmayı başlat" +import_rss = "RSS'yi içe aktar" +import_rss_feed_2.0 = "RSS Feed 2.0 içe aktar" +insert_image = "Görsel ekle" +invalid_error = "HATA: Geçersiz kullanıcı adı veya şifre" +language = "Sistem Dili" +link_name = "Bağlantı adı" +link_post = "Bağlantı gönderisi" +link_post_comment = "Link içerikli bir blog gönderisi oluşturuluyor." +login = "Giriş yap" +login_page = "Giriş sayfası" +logout = "Çıkış yap" +menu = "Menü" +menus = "Menü Editörü" +meta_description = "Meta Açıklaması" +meta_description_character = "Meta açıklama karakteri" +metatags = "Meta etiketler" +metatags_settings = "Meta etiket ayarları" +mine = "Benim" +more = "Daha fazla" +my_draft = "Taslaklarım" +my_posts = "Gönderilerim" +name = "Ad" +newer = "Daha Yeni" +next = "Sonraki" +next_post = "Sonraki gönderi" +no_available_backup = "Bu anda kullanılabilir yedek yok." +no_draft_found = "Taslak bulunamadı" +no_posts_found = "Gönderi bulunamadı" +no_related_post_found = "Benzer gönderi bulunamadı" +no_scheduled_posts_found = "Planlanmış gönderi bulunamadı!" +no_search_results = "Arama sonuçları yok" +nope = "Hayır" +not = "Değil" +older = "Daha Eski" +only = "Sadece" +operations = "Operasyonlar" +page = "Sayfa" +page_generation_time = "Sayfa oluşturma süresi" +pages = "Sayfalar" +pass_error = "Şifre alanı zorunludur" +password = "Şifre" +performance = "Performans" +performance_settings = "Performans Ayarları" +permalink = "Kalıcı Bağlantı" +popular = "Popüler" +popular_posts = "Popüler gönderiler" +popular_posts_widget = "Popüler gönderiler widget'ı" +popular_posts_widget_at_most = "Popüler gönderiler widget'ı en fazla" +popular_tags = "Popüler etiketler" +post_by_author = "Bu yazarın gönderileri" +posted_in = "Gönderildi" +posted_on = "Gönderildi" +posts = "Gönderiler" +posts_by = "Yazarı" +posts_draft = "Taslak gönderiler" +posts_in_archive_page_at_most = "Arşiv sayfasındaki en fazla gönderi" +posts_in_category_page_at_most = "Kategori sayfasındaki en fazla gönderi" +posts_in_front_page_show_at_most = "Anasayfada en fazla gösterilecek gönderi" +posts_in_profile_page_at_most = "Profil sayfasındaki en fazla gönderi" +posts_in_search_result_at_most = "Arama sonuçlarındaki en fazla gönderi" +posts_in_tag_page_at_most = "Etiket sayfasındaki en fazla gönderi" +posts_in_type_page_at_most = "Tür sayfasındaki en fazla gönderi" +posts_index_settings = "Gönderi dizini ayarları" +posts_list = "Gönderi listesi" +posts_tagged = "Etiketlenmiş gönderiler" +posts_with_type = "Türü olan gönderiler" +pre_release = "Ön sürüm" +prev = "Önceki" +prev_post = "Önceki gönderi" +preview = "Önizleme" +profile_for = "Profil" +proudly_powered_by = "Gururla desteklenir" +publish = "Yayınla" +publish_draft = "Taslağı yayınla" +published = "Yayınlandı" +quote_post = "Alıntı gönderi" +quote_post_comment = "Alıntı içeren blog gönderisi oluşturuluyor" +rss_character = "RSS karakteri" +rss_feeds_show_the_most_recent = "RSS beslemeleri en yeni gönderileri gösterir" +rss_settings = "RSS ayarları" +read_more_text = "Devamını oku metni" +read_more_text_placeholder = "Devamını oku" +reading = "Okuma" +reading_settings = "Okuma Ayarları" +recaptcha = "reCAPTCHA" +recent_posts = "Son gönderiler" +recent_posts_widget_at_most = "Son gönderiler widget'ı en fazla" +regular_post = "Düzenli gönderi" +regular_post_comment = "Düzenli gönderi oluşturuluyor" +related_posts = "İlgili gönderiler" +related_widget_posts_at_most = "İlgili gönderiler widget'ı en fazla" +revert_to_draft = "Taslağa dönüştür" +save = "Kaydet" +save_config = "Yapılandırmayı kaydet" +save_edit = "Düzenlemeyi kaydet" +save_menu = "Menüyü kaydet" +save_as_draft = "Taslak olarak kaydet" +save_category = "Kategoriyi kaydet" +scheduled = "Planlandı" +scheduled_posts = "Planlanan gönderiler" +scheduled_tips = "Gelecek tarih veya saatte bir gönderi yayınlandığında, planlanan gönderiler kısmına gider" +search = "Ara" +search_for = "Arama:" +search_results_for = "Arama sonuçları:" +search_results_not_found = "Arama sonuçları bulunamadı!" +secret_key = "Gizli Anahtar" +settings = "Ayarlar" +sign_in_to_start_your_session = "Oturumunuzu başlatmak için giriş yapın" +site_key = "Site Anahtarı" +sitemap = "Site haritası" +slug = "URL" +social_media = "Sosyal Medya" +static_page = "Statik sayfa" +static_page_comment = "Statik sayfa oluşturuluyor" +static_pages = "Statik sayfalar" +summary = "Özet" +summary_character = "Özet karakteri" +tag = "Etiket" +tagcloud_widget_at_most = "Etiket Bulutu en fazla" +tagline = "Slogan" +tagline_placeholder = "Veritabanı olmayan PHP Blog Platformu" +tagline_description = "Bu blogun ne hakkında olduğunu birkaç kelime ile açıklayın." +tags = "Etiketler" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Bu eski bir koddur. Genellikle yeni oluşturulan analizler gtag.js kullanır." +this_page_doesnt_exist = "Bu sayfa mevcut değil!" +time = "Zaman" +timezone = "Zaman dilimi" +title = "Başlık" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Disqus veya Facebook yorumlarını kullanmak için Disqus kısa adı veya Facebook Uygulama ID'si sağlamanız gerekir." +token_error = "CSRF Tokeni doğru değil" +tools = "Araçlar" +twitter_account = "Twitter hesabı" +type_to_search = "Aramak için yazın" +uncategorized = "Kategorilenmemiş" +uncategorized_comment = "Bir kategoriye ihtiyaç duymayan veya mevcut herhangi bir kategoriye uymayan konular" +universal_analytics = "Evrensel Analiz (gtag.js)" +unknown_feed_format = "Bilinmeyen besleme formatı" +update = "Güncelle" +update_available = "Güncelleme mevcut" +update_draft = "Taslağı güncelle" +update_post = "Gönderiyi güncelle" +update_to = "Güncelle" +upload = "Yükle" +user = "Kullanıcı" +user_error = "Kullanıcı alanı zorunludur" +valid_values_range_from_0_to_1.0._see = "Geçerli değerler 0.0 ile 1.0 arasında olmalıdır. Bakınız" +video_post = "Video gönderisi" +video_post_comment = "Video içeren blog gönderisi oluşturuluyor" +view = "Görüntüleme" +view_post = "Gönderiyi görüntüle" +views = "Görüntülemeler" +widget = "Widget" +widget_settings = "Widget Ayarları" +would_you_like_to_try_our = "Bizimle denemek ister misiniz" +yes_im_in = "Evet, varım" +yes_not_recommended = "Evet (önerilmez)" +you_dont_have_permission_to_access_this_page = "Bu sayfaya erişim izniniz yok" +your_new_config_key = "Yeni Yapılandırma Anahtarınız" +your_new_value = "Yeni Değeriniz" +your_backups = "Yedekleriniz" +your_latest_blog_posts = "Son blog gönderileriniz" +your_recent_posts = "Son gönderileriniz" +by = "tarafından" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "İpucu: Yapılandırma anahtarınızı veya değerini aramak için Ctrl/CMD + F kullanın." +homepage = "ana sayfa" +instead = "yerine" +item_class = "CSS sınıfı ekle" +item_slug = "Bağlantı URL'sini ekle" +now = "şimdi" +of = "nin" +optional = "isteğe bağlı" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "Pro ipucu: Özel yapılandırma anahtarı oluşturabilir ve şablonunuzun herhangi bir yerinde bu anahtarın değerini yazdırabilirsiniz." +read_more = "daha fazla oku" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "sizin.anahtarınız" +summary_behavior = "Özet davranışı" +default = "Varsayılan" +check_shortcode = "Kısa kodu kontrol et" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "Özet modunda, içeriği x karaktere kadar kırpmadan önce kısa kodu kontrol edip etmeyeceğini belirleyin." +manage_users = "Kullanıcıları yönet" +add_user = "Kullanıcı ekle" +username = "Kullanıcı adı" +role = "Rol" +change_password = "Şifre değiştir" +config_mfa = "MFA'yı yapılandır" +mfacode = "MFA Kodu" +verify_code = "MFA kodunu doğrula" +verify_password = "Mevcut şifreyi doğrula" +manualsetupkey = "Kurulum anahtarını manuel olarak da ekleyebilirsiniz" +mfa_error = "MFA kodu doğru değil" +disablemfa = "MFA'yı devre dışı bırak" +enable_auto_save = "Otomatik Kaydet'i Etkinleştir" +explain_autosave = "Etkinleştirildiğinde, yeni içerik veya taslak her 60 saniyede bir otomatik olarak kaydedilir." +login_protect_system = "Giriş koruma sistemi" +cloudflare_info = "Cloudflare'nin Turnstile belgelerini inceleyin:" +mfa_config = "Çok Faktörlü Kimlik Doğrulama (MFA)" +set_mfa_globally = "MFA durumunu genel olarak ayarla" +explain_mfa = "Etkinleştirildiğinde, MFA tüm kullanıcılar için isteğe bağlıdır. Devre dışı bırakıldığında, hiçbir kullanıcı kullanamaz ve giriş sayfasındaki alan gizlenir." +set_version_publicly = "Sürüm Görünürlüğü" +explain_version = "Varsayılan olarak, HTMLy'nin sürümü kaynak kodunda açıkça görülür. Bazı yöneticiler bu bilgiyi gizlemeyi tercih edebilir." +focus_mode = "Odak Modu Değiştir" +writing = "Yazma" +writing_settings = "Yazma Ayarları" +security = "Güvenlik" +security_settings = "Güvenlik Ayarları" +msg_error_field_req_username = "Kullanıcı adı alanı zorunludur." +msg_error_field_req_password = "Şifre alanı zorunludur." +msg_error_field_req_title = "Başlık alanı zorunludur." +msg_error_field_req_content = "İçerik alanı zorunludur." +msg_error_field_req_tag = "Etiket alanı zorunludur." +msg_error_field_req_image = "Görsel alanı zorunludur." +msg_error_field_req_video = "Video alanı zorunludur." +msg_error_field_req_link = "Bağlantı alanı zorunludur." +msg_error_field_req_quote = "Alıntı alanı zorunludur." +msg_error_field_req_audio = "Ses alanı zorunludur." +msg_error_field_req_feedurl = "Besleme URL'sini belirtmeniz gerekiyor." +rss_feeds_description_select = "RSS Açıklaması" +rss_description_body = "Gönderi Metni" +rss_description_meta = "Gönderi Meta Açıklaması" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/uk_UA.ini b/lang/uk_UA.ini new file mode 100644 index 0000000..62ec836 --- /dev/null +++ b/lang/uk_UA.ini @@ -0,0 +1,326 @@ +about = "Про нас" +add_category = "Додати категорію" +add_content = "Додати контент" +add_link = "Додати посилання" +add_menu = "Додати меню" +add_new_page = "Додати нову сторінку" +add_new_post = "Додати новий запис" +add_source_link_optional = "Додати джерело (необов'язково)" +add_sub = "Додати підсторінку" +address_url = "Адреса (URL)" +admin = "Адмін" +admin_panel_style_based_on = "Стиль адмін-панелі на основі" +all_blog_posts = "Всі записи блогу" +all_cache_has_been_deleted = "Весь кеш було видалено!" +all_posts_tagged = "Всі записи з тегом" +archive_for = "Архів для" +archive_page_for = "Сторінка архіву для" +archives = "Архіви" +are_you_sure_you_want_to_delete_ = "Ви впевнені, що хочете видалити %s?" +at_the_moment_you_are_using_auto_generated_menu = "Зараз ви використовуєте автоматично згенероване меню." +audio_post = "Аудіо запис" +audio_post_comment = "Створення блогу з аудіо" +author = "Автор" +author_description = "Ще один користувач HTMLy" +back_to = "Назад до" +backup = "Резервне копіювання" +blog_description = "В одному абзаці розкажіть більше про ваш блог." +blog_theme = "Тема блогу" +blog_title = "Назва блогу" +blog_title_placeholder = "Мій HTMLy блог" +blog_posts_displayed_as = "Відображення записів блогу як" +breadcrumb_home_text = "Текст головної крихти" +by_using_this_importer_you_are_agree_if_the_feed_is_yours_or_at_least_you_have_the_authority_to_publish_it = "Використовуючи цей імпортер, ви погоджуєтесь, що фід ваш або ви маєте право його публікувати." +css_class_optional = "CSS клас (необов'язково)" +cache_expiration = "Час життя кешу (в годинах)" +cache_off = "Кеш вимкнено" +cache_timestamp = "Часова мітка кешу" +cancel = "Скасувати" +cannot_read_feed_content = "Неможливо прочитати вміст фіду" +captcha_error = "Помилка reCAPTCHA" +categories = "Категорії" +category = "Категорія" +check_update = "Перевірити оновлення" +clear_cache = "Очистити кеш" +comma_separated_values = "Значення через кому" +comment_system = "Система коментування" +comments = "Коментарі" +config = "Конфігурація" +congrats_you_have_the_latest_version_of_htmly = "Вітаємо! У вас остання версія HTMLy." +content = "Контент" +contents = "Контенти" +copyright_line = "Рядок копірайту" +copyright_line_placeholder = "(c) Ваше ім'я." +create_backup = "Створити резервну копію" +created = "Створено" +custom = "Користувацький" +custom_settings = "Користувацькі налаштування" +dashboard = "Панель управління" +date = "Дата" +date_format = "Формат дати" +delete = "Видалити" +description = "Опис" +disable = "Вимкнути" +disabled = "Вимкнено" +disqus_shortname = "Коротка назва Disqus" +disqus_shortname_placeholder = "htmly" +draft = "Чернетка" +edit = "Редагувати" +edit_category = "Редагувати категорію" +edit_post = "Редагувати" +edit_profile = "Редагувати профіль" +enable = "Увімкнути" +enable_blog_url = "Увімкнути /blog URL" +enter_image_url = "Введіть URL зображення" +facebook_app_id = "ID додатка Facebook" +facebook_page = "Сторінка Facebook" +featured_audio = "Рекомендоване аудіо" +featured_image = "Рекомендоване зображення" +featured_link = "Рекомендоване посилання" +featured_quote = "Рекомендована цитата" +featured_video = "Рекомендоване відео" +feed_url = "URL фіду" +filename = "Назва файлу" +follow = "Слідкувати" +for_google_site_verification_meta = "Для google-site-verification мета" +front_page_displays = "Головна сторінка відображає" +full_post = "Повний запис" +general = "Загальні" +general_settings = "Загальні налаштування" +get_one_here = "Отримайте один тут" +github_pre_release = "Попередня версія Github" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (спадщина)" +google_search_console = "Google Search Console" +home = "Головна" +if_leave_empty_we_will_excerpt_it_from_the_content_below = "Якщо залишити порожнім, ми витягнемо це з контенту нижче" +if_the_url_leave_empty_we_will_use_the_page_title = "Якщо URL залишити порожнім, ми використаємо заголовок сторінки" +if_the_url_leave_empty_we_will_use_the_post_title = "Якщо URL залишити порожнім, ми використаємо заголовок запису" +image_post = "Зображення запису" +image_post_comment = "Створення блогу з зображенням" +import = "Імпорт" +import_feed = "Почати імпорт фіду" +import_rss = "Імпорт RSS" +import_rss_feed_2.0 = "Імпорт RSS фіду 2.0" +insert_image = "Вставити зображення" +invalid_error = "ПОМИЛКА: Невірне ім'я користувача або пароль" +language = "Мова системи" +link_name = "Назва посилання" +link_post = "Посилання на запис" +link_post_comment = "Створення блогу з посиланням" +login = "Увійти" +login_page = "Сторінка входу" +logout = "Вийти" +menu = "Меню" +menus = "Редактор меню" +meta_description = "Мета опис" +meta_description_character = "Символи мета опису" +metatags = "Мета-теги" +metatags_settings = "Налаштування мета-тегів" +mine = "Мої" +more = "Більше" +my_draft = "Моя чернетка" +my_posts = "Мої записи" +name = "Ім'я" +newer = "Новіші" +next = "Наступні" +next_post = "Наступний запис" +no_available_backup = "Немає доступної резервної копії на цей час." +no_draft_found = "Чернеток не знайдено" +no_posts_found = "Записів не знайдено" +no_related_post_found = "Пов'язаних записів не знайдено" +no_scheduled_posts_found = "Запланованих записів не знайдено!" +no_search_results = "Результатів пошуку не знайдено" +nope = "Ні" +not = "Ні" +older = "Старіші" +only = "Тільки" +operations = "Операції" +page = "Сторінка" +page_generation_time = "Час генерації сторінки" +pages = "Сторінки" +pass_error = "Поле пароля є обов'язковим" +password = "Пароль" +performance = "Продуктивність" +performance_settings = "Налаштування продуктивності" +permalink = "Постійне посилання" +popular = "Популярні" +popular_posts = "Популярні записи" +popular_posts_widget = "Віджет популярних записів" +popular_posts_widget_at_most = "Віджет популярних записів, не більше ніж" +popular_tags = "Популярні теги" +post_by_author = "Записи цього автора" +posted_in = "Опубліковано в" +posted_on = "Опубліковано" +posts = "Записи" +posts_by = "Запис від" +posts_draft = "Чернетки записів" +posts_in_archive_page_at_most = "Записів на сторінці архіву, не більше ніж" +posts_in_category_page_at_most = "Записів на сторінці категорії, не більше ніж" +posts_in_front_page_show_at_most = "Записів на головній сторінці, не більше ніж" +posts_in_profile_page_at_most = "Записів на сторінці профілю, не більше ніж" +posts_in_search_result_at_most = "Записів у результатах пошуку, не більше ніж" +posts_in_tag_page_at_most = "Записів на сторінці тегу, не більше ніж" +posts_in_type_page_at_most = "Записів на сторінці типу, не більше ніж" +posts_index_settings = "Налаштування індексації записів" +posts_list = "Список записів" +posts_tagged = "Записи з тегом" +posts_with_type = "Записи з типом" +pre_release = "Попередній випуск" +prev = "Попередні" +prev_post = "Попередній запис" +preview = "Попередній перегляд" +profile_for = "Профіль для" +proudly_powered_by = "Працює на" +publish = "Опублікувати" +publish_draft = "Опублікувати чернетку" +published = "Опубліковано" +quote_post = "Цитата запису" +quote_post_comment = "Створення блогу з цитатою" +rss_character = "Символи RSS" +rss_feeds_show_the_most_recent = "RSS фіди показують найновіше" +rss_settings = "Налаштування RSS" +read_more_text = "Текст 'Читати більше'" +read_more_text_placeholder = "Читати більше" +reading = "Читання" +reading_settings = "Налаштування читання" +recaptcha = "reCAPTCHA" +recent_posts = "Останні записи" +recent_posts_widget_at_most = "Віджет останніх записів, не більше ніж" +regular_post = "Звичайний запис" +regular_post_comment = "Створення звичайного запису блогу" +related_posts = "Пов'язані записи" +related_widget_posts_at_most = "Віджет пов'язаних записів, не більше ніж" +revert_to_draft = "Повернути до чернетки" +save = "Зберегти" +save_config = "Зберегти конфігурацію" +save_edit = "Зберегти редагування" +save_menu = "Зберегти меню" +save_as_draft = "Зберегти як чернетку" +save_category = "Зберегти категорію" +scheduled = "Заплановано" +scheduled_posts = "Заплановані записи" +scheduled_tips = "Публікація запису з майбутньою датою або часом, він буде відправлений до запланованих записів" +search = "Пошук" +search_for = "Шукати" +search_results_for = "Результати пошуку для" +search_results_not_found = "Результатів пошуку не знайдено!" +secret_key = "Секретний ключ" +settings = "Налаштування" +sign_in_to_start_your_session = "Увійдіть, щоб розпочати сеанс" +site_key = "Ключ сайту" +sitemap = "Карта сайту" +slug = "Slug" +social_media = "Соціальні мережі" +static_page = "Статична сторінка" +static_page_comment = "Створення статичної сторінки" +static_pages = "Статичні сторінки" +summary = "Резюме" +summary_character = "Символи резюме" +tag = "Тег" +tagcloud_widget_at_most = "Хмара тегів, не більше ніж" +tagline = "Слоган" +tagline_placeholder = "Без бази даних PHP платформа для блогів" +tagline_description = "У кількох словах поясніть, про що цей блог." +tags = "Теги" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "Це спадковий код. Зазвичай нові аналітики створюються за допомогою gtag.js" +this_page_doesnt_exist = "Ця сторінка не існує!" +time = "Час" +timezone = "Часовий пояс" +title = "Заголовок" +to_using_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "Для використання коментарів Disqus або Facebook ви повинні надати коротке ім'я Disqus або ID додатка Facebook." +token_error = "Невірний CSRF токен" +tools = "Інструменти" +twitter_account = "Акаунт у Twitter" +type_to_search = "Введіть для пошуку" +uncategorized = "Без категорії" +uncategorized_comment = "Тематики, які не потребують категорії або не підходять до жодної з існуючих категорій" +universal_analytics = "Універсальна аналітика (gtag.js)" +unknown_feed_format = "Невідомий формат фіду" +update = "Оновити" +update_available = "Доступне оновлення" +update_draft = "Оновити чернетку" +update_post = "Оновити запис" +update_to = "Оновити до" +upload = "Завантажити" +user = "Користувач" +user_error = "Поле користувача є обов'язковим" +valid_values_range_from_0_to_1.0._see = "Дійсні значення в діапазоні від 0.0 до 1.0. Див." +video_post = "Відео запис" +video_post_comment = "Створення блогу з відео" +view = "Перегляд" +view_post = "Перегляд" +views = "Перегляди" +widget = "Віджет" +widget_settings = "Налаштування віджетів" +would_you_like_to_try_our = "Бажаєте спробувати наш " +yes_im_in = "Так, я згоден" +yes_not_recommended = "Так (не рекомендується)" +you_dont_have_permission_to_access_this_page = "У вас немає дозволу на доступ до цієї сторінки" +your_new_config_key = "Ваш новий конфігураційний ключ" +your_new_value = "Ваше нове значення" +your_backups = "Ваші резервні копії" +your_latest_blog_posts = "Ваші останні записи блогу" +your_recent_posts = "Ваші останні записи" +by = "від" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "підказка: Використовуйте Ctrl/CMD + F для пошуку вашого конфігураційного ключа або значення." +homepage = "Головна сторінка" +instead = "замість" +item_class = "Вставити CSS клас" +item_slug = "Вставити URL посилання" +now = "зараз" +of = "з" +optional = "необов'язково" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_creating_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "професійна підказка: Ви можете створити власні конфігураційні ключі та виводити їх значення будь-де у вашому шаблоні." +read_more = "читати далі" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "ваш ключ" +summary_behavior = "Поведінка резюме" +default = "За замовчуванням" +check_shortcode = "Перевірити шорткод" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "У режимі резюме, чи перевіряти спочатку шорткод перед обрізанням контенту до x символів" +manage_users = "Керування користувачами" +add_user = "Додати користувача" +username = "Ім'я користувача" +role = "Роль" +change_password = "Змінити пароль" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/zh_CN.ini b/lang/zh_CN.ini new file mode 100644 index 0000000..9045b97 --- /dev/null +++ b/lang/zh_CN.ini @@ -0,0 +1,326 @@ +about = "关于" +add_category = "添加分类" +add_content = "添加内容" +add_link = "添加链接" +add_menu = "添加菜单" +add_new_page = "添加新页面" +add_new_post = "添加新文章" +add_source_link_optional = "添加源链接(可选)" +add_sub = "添加子页面" +address_url = "地址(URL)" +admin = "管理员" +admin_panel_style_based_on = "管理面板风格基于" +all_blog_posts = "所有博客文章" +all_cache_has_been_deleted = "所有缓存已删除!" +all_posts_tagged = "所有带指定标签的文章:" +archive_for = "归档:" +archive_page_for = "归档:" +archives = "存档" +are_you_sure_you_want_to_delete_ = "你确定要删除%s?" +at_the_moment_you_are_using_auto_generated_menu = "你正在使用自动创建的菜单" +audio_post = "音频文章" +audio_post_comment = "创建有特色音频的文章" +author = "作者" +author_description = "Just another HTMLy user" +back_to = "回到" +backup = "备份" +blog_description = "用一篇文章告诉我们更多关于你博客的信息" +blog_theme = "博客主题" +blog_title = "博客标题" +blog_title_placeholder = "My HTMLy Blog" +blog_posts_displayed_as = "文章显示为" +breadcrumb_home_text = "“主页”链接文本" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "使用这个导入器即代表你同意要导入的Feed是你的,或者至少你有权力发布它" +css_class_optional = "CSS类(可选)" +cache_expiration = "缓存过期时间(小时)" +cache_off = "关闭缓存" +cache_timestamp = "缓存时间戳" +cancel = "取消" +cannot_read_feed_content = "Cannot read feed content" +captcha_error = "reCaptcha不正确" +categories = "分类" +category = "分类" +check_update = "检查更新" +clear_cache = "清除缓存" +comma_separated_values = "用逗号分隔值" +comment_system = "评论系统" +comments = "评论" +config = "配置" +congrats_you_have_the_latest_version_of_htmly = "恭喜!你正在使用最新版HTMLy" +content = "内容" +contents = "内容" +copyright_line = "版权信息" +copyright_line_placeholder = "(c) Your name." +create_backup = "创建备份" +created = "已创建" +custom = "自定义" +custom_settings = "自定义设置" +dashboard = "仪表板" +date = "日期" +date_format = "日期格式" +delete = "删除" +description = "描述" +disable = "禁用" +disabled = "已禁用" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "草稿" +edit = "编辑" +edit_category = "编辑分类" +edit_post = "编辑" +edit_profile = "编辑个人信息" +enable = "启用" +enable_blog_url = "启用 blog URL" +enter_image_url = "输入图片URL" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook页面" +featured_audio = "特色音频" +featured_image = "特色图片" +featured_link = "特色链接" +featured_quote = "特色引用" +featured_video = "特色视频" +feed_url = "Feed URL" +filename = "文件名" +follow = "跟随" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "主页显示" +full_post = "全文" +general = "通用" +general_settings = "通用设置" +get_one_here = "获取自" +github_pre_release = "Github预发布版本" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (传统)" +google_search_console = "Google Search Console" +home = "主页" +if_left_empty_we_will_excerpt_it_from_the_content_below = "如果留空,从下面的文章内容中摘录" +if_the_url_is_left_empty_we_will_use_the_page_title = "如果留空,使用页面标题作为URL" +if_the_url_is_left_empty_we_will_use_the_post_title = "如果留空,使用文章标题作为URL" +image_post = "图片文章" +image_post_comment = "创建有特色图片的文章" +import = "导入" +import_feed = "开始导入Feed" +import_rss = "导入RSS" +import_rss_feed_2.0 = "导入RSS Feed 2.0" +insert_image = "插入图片" +invalid_error = "用户名或密码错误" +language = "系统语言" +link_name = "链接名称" +link_post = "链接文章" +link_post_comment = "创建有特色链接的文章" +login = "登录" +login_page = "登录页面" +logout = "登出" +menu = "菜单" +menus = "菜单编辑器" +meta_description = "元数据描述" +meta_description_character = "元描述字数" +metatags = "Metatags" +metatags_settings = "Metatag设置" +mine = "我的" +more = "更多" +my_draft = "我的草稿" +my_posts = "我的文章" +name = "名称" +newer = "较新" +next = "下一个" +next_post = "下一个文章" +no_available_backup = "现在没有可用备份" +no_draft_found = "没有找到草稿" +no_posts_found = "没有找到文章" +no_related_post_found = "没有找到相关文章" +no_scheduled_posts_found = "没有计划发布的文章!" +no_search_results = "没有搜索结果" +nope = "否" +not = "否" +older = "较旧" +only = "只有" +operations = "操作" +page = "页面" +page_generation_time = "页面创建时间" +pages = "页面" +pass_error = "密码输入框没有内容" +password = "密码" +performance = "性能" +performance_settings = "性能设置" +permalink = "外链位置" +popular = "热门" +popular_posts = "热门文章" +popular_posts_widget = "热门文章组件" +popular_posts_widget_at_most = "“热门”组件最多文章数" +popular_tags = "热门标签" +post_by_author = "这个作者的文章" +posted_in = "发布于" +posted_on = "发布于" +posts = "文章" +posts_by = "文章来自" +posts_draft = "文章草稿" +posts_in_archive_page_at_most = "归档页最多文章数" +posts_in_category_page_at_most = "分类页最多文章数" +posts_in_front_page_show_at_most = "主页最多文章数" +posts_in_profile_page_at_most = "个人资料页最多文章数" +posts_in_search_result_at_most = "搜索结果页最多文章数" +posts_in_tag_page_at_most = "标签页最多文章数" +posts_in_type_page_at_most = "类型页最多文章数" +posts_index_settings = "文章索引设置" +posts_list = "文章列表" +posts_tagged = "带指定标签的文章:" +posts_with_type = "指定类型的文章:" +pre_release = "接收预发布版本" +prev = "旧" +prev_post = "上一个文章" +preview = "预览" +profile_for = "个人资料:" +proudly_powered_by = "Proudly powered by" +publish = "发布" +publish_draft = "发布草稿" +published = "发布" +quote_post = "引用文章" +quote_post_comment = "创建有特色引用的文章" +rss_character = "RSS字数" +rss_feeds_show_the_most_recent = "RSS feed显示最近文章数" +rss_settings = "RSS设置" +read_more_text = "“查看全文”文本" +read_more_text_placeholder = "阅读全文" +reading = "阅读" +reading_settings = "阅读设置" +recaptcha = "reCAPTCHA" +recent_posts = "最近文章" +recent_posts_widget_at_most = "“最近”组件最多文章数" +regular_post = "普通文章" +regular_post_comment = "创建普通文章" +related_posts = "相关文章" +related_widget_posts_at_most = "“相关”组件最多文章数" +revert_to_draft = "转换成草稿" +save = "保存" +save_config = "保存配置" +save_edit = "保存编辑" +save_menu = "保存菜单" +save_as_draft = "作为草稿保存" +save_category = "保存分类" +scheduled = "计划发布" +scheduled_posts = "计划发布的文章" +scheduled_tips = "设定一个未来的时间和日期以启动计划发布" +search = "搜索" +search_for = "搜索" +search_results_for = "搜索结果:" +search_results_not_found = "没有找到搜索结果" +secret_key = "Secret Key" +settings = "设置" +sign_in_to_start_your_session = "登录以开始你的会话" +site_key = "Site Key" +sitemap = "站点地图" +slug = "外链" +social_media = "社交媒体" +static_page = "静态页面" +static_page_comment = "创建静态页面" +static_pages = "静态页面" +summary = "摘要" +summary_character = "摘要字数" +tag = "标签" +tagcloud_widget_at_most = "TagCloud最多标签数" +tagline = "标语" +tagline_placeholder = "Databaseless PHP Blogging Platform" +tagline_description = "用几个字简述这个博客是关于什么的" +tags = "标签" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "通常情况下新创建的统计使用gtag.js" +this_page_doesnt_exist = "这个页面不存在!" +time = "时间" +timezone = "时区" +title = "标题" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "要使用Disqus或Facebook评论,你需要提供你的Disqus shortname或你的Facebook App ID" +token_error = "CSRF Token不正确" +tools = "工具" +twitter_account = "Twitter账号" +type_to_search = "输入搜索内容" +uncategorized = "未分类" +uncategorized_comment = "不需要分类的或者不适合任何分类的文章" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "Unknown feed format" +update = "更新" +update_available = "更新可用" +update_draft = "更新草稿" +update_post = "更新文章" +update_to = "更新到" +upload = "上传" +user = "用户" +user_error = "用户输入框没有内容" +valid_values_range_from_0_to_1.0._see = "有效范围从0.0到1.0。参考" +video_post = "视频文章" +video_post_comment = "创建有特色视频的文章" +view = "查看" +view_post = "查看" +views = "查看" +widget = "组件" +widget_settings = "组件设置" +would_you_like_to_try_our = "你想不想试试我们的" +yes_im_in = "是" +yes_not_recommended = "是(不推荐)" +you_dont_have_permission_to_access_this_page = "你没有访问此页面的权限" +your_new_config_key = "新配置项" +your_new_value = "值" +your_backups = "你的备份" +your_latest_blog_posts = "最新的文章" +your_recent_posts = "你的最近文章" +by = "来自" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "提示:Ctrl/CMD + F搜索配置项或者值" +homepage = "主页" +instead = "instead" +item_class = "CSS类" +item_slug = "链接URL" +now = "现在" +of = "于" +optional = "选填" +post_your_post_slug = "/post/文章外链" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "专业提示:你可以在模板的任何地方创建自定义的配置项并打印出对应的值" +read_more = "阅读全文" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/年/月/文章外链" +your_key = "your.key" +summary_behavior = "Summary behavior" +default = "Default" +check_shortcode = "Check shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "In summary mode, whether check the shortcode first or not before trim the content to x char" +manage_users = "Manage users" +add_user = "Add user" +username = "Username" +role = "Role" +change_password = "Change password" +config_mfa = "Configure MFA" +mfacode = "MFA Code" +verify_code = "Verify the MFA code" +verify_password = "Verify current password" +manualsetupkey = "You can also manually add the setup key" +mfa_error = "MFA code is not correct" +disablemfa = "Disable MFA" +enable_auto_save = "Enable Auto Save" +explain_autosave = "When enabled, new content or draft will be automatically saved every 60 seconds." +login_protect_system = "Login protection system" +cloudflare_info = "Review Cloudflare's Turnstile documentation: " +mfa_config = "Multi Factor Authentication (MFA)" +set_mfa_globally = "Set the status of MFA" +explain_mfa = "When enabled, MFA is optional for all users. When disabled, no users can use it and it hides the field on the login page." +set_version_publicly = "Version Visibility" +explain_version = "By default the version of HTMLy is visible publicly in the source code, some admins may prefer to hide this." +focus_mode = "Toggle Focus" +writing = "Writing" +writing_settings = "Writing Settings" +security = "Security" +security_settings = "Security Settings" +msg_error_field_req_username = "Username field is required." +msg_error_field_req_password = "Password field is required." +msg_error_field_req_title = "Title field is required." +msg_error_field_req_content = "Content field is required." +msg_error_field_req_tag = "Tag field is required." +msg_error_field_req_image = "Image field is required." +msg_error_field_req_video = "Video field is required." +msg_error_field_req_link = "Link field is required." +msg_error_field_req_quote = "Quote field is required." +msg_error_field_req_audio = "Audio field is required." +msg_error_field_req_feedurl = "You need to specify the feed url." +rss_feeds_description_select = "RSS Description" +rss_description_body = "Post Body" +rss_description_meta = "Post Meta Description" +admin_theme = "Admin theme" +admin_theme_light = "Light" +admin_theme_dark = "Dark" diff --git a/lang/zh_TW.ini b/lang/zh_TW.ini new file mode 100644 index 0000000..cae1399 --- /dev/null +++ b/lang/zh_TW.ini @@ -0,0 +1,326 @@ +about = "關於" +add_category = "新增分類" +add_content = "新增內容" +add_link = "新增連結" +add_menu = "新增選單" +add_new_page = "新增一頁新網頁" +add_new_post = "新增一篇新文章" +add_source_link_optional = "加入來源連結 (非必填)" +add_sub = "新增子項" +address_url = "位址 (URL)" +admin = "管理" +admin_panel_style_based_on = "管理面板風格基於" +all_blog_posts = "所有部落格文章" +all_cache_has_been_deleted = "所有暫存頁面資料已經清除 !" +all_posts_tagged = "所有已標記的文章" +archive_for = "文章庫的" +archive_page_for = "文章庫頁面" +archives = "文章庫" +are_you_sure_you_want_to_delete_ = "你確定你想要刪除 %s 嗎?" +at_the_moment_you_are_using_auto_generated_menu = "目前您正在使用自動產生的選單." +audio_post = "音樂文章" +audio_post_comment = "建立以音樂為主的文章" +author = "作者" +author_description = "其他文章作者" +back_to = "返回" +backup = "備份資料" +blog_description = "請用短短幾句話,簡單介紹更多關於您部落格的主題內容" +blog_theme = "部落格樣式" +blog_title = "部落格標題" +blog_title_placeholder = "我的部落格" +blog_posts_displayed_as = "文章用何種方式顯示" +breadcrumb_home_text = "導覽列的首頁顯示文字" +by_using_this_importer_you_confirm_that_the_feed_is_yours_or_that_at_least_you_have_the_authority_to_publish_it = "By using this importer you are agree if the feed is yours or at least you have the authority to publish it." +css_class_optional = "CSS Class (非必填)" +cache_expiration = "快取暫存失效時間 (小時)" +cache_off = "關閉快取暫存" +cache_timestamp = "快取暫存時間戳" +cancel = "取消" +cannot_read_feed_content = "無法讀取提供的內容" +captcha_error = "reCaptcha 不正確" +categories = "文章分類" +category = "文章分類" +check_update = "檢查更新" +clear_cache = "清除快取" +comma_separated_values = "以逗號來分隔不同標籤值" +comment_system = "留言系統" +comments = "留言" +config = "系統設定" +congrats_you_have_the_latest_version_of_htmly = "恭喜! 您擁有最新版本的 HTMLy." +content = "內容" +contents = "內容" +copyright_line = "著作權宣導" +copyright_line_placeholder = "©你的名字." +create_backup = "建立備份" +created = "已建立" +custom = "自訂" +custom_settings = "自訂設定" +dashboard = "儀表板" +date = "日期" +date_format = "日期格式" +delete = "刪除" +description = "簡介" +disable = "停用" +disabled = "已停用" +disqus_shortname = "Disqus shortname" +disqus_shortname_placeholder = "htmly" +draft = "草稿" +edit = "編輯" +edit_category = "修改分類" +edit_post = "修改" +edit_profile = "編輯個人資料" +enable = "啟用" +enable_blog_url = "啟用 blog 的前置網址" +enter_image_url = "輸入圖片URL位址" +facebook_app_id = "Facebook App ID" +facebook_page = "Facebook page" +featured_audio = "Featured Audio" +featured_image = "Featured Image" +featured_link = "Featured Link" +featured_quote = "Featured Quote" +featured_video = "Featured Video" +feed_url = "Feed URL" +filename = "檔名" +follow = "追蹤" +for_google_site_verification_meta = "For google-site-verification meta" +front_page_displays = "前端頁面的顯示" +full_post = "全文" +general = "基本" +general_settings = "基本設定" +get_one_here = "Get one here" +github_pre_release = "Github pre-release" +google_analytics = "Google Analytics" +google_analytics_legacy = "Google Analytics (legacy)" +google_search_console = "Google Search Console" +home = "首頁" +if_left_empty_we_will_excerpt_it_from_the_content_below = "如果留空我們將從下面的內容中摘錄簡介" +if_the_url_is_left_empty_we_will_use_the_page_title = "如果 url 留空,我們將使用頁面標題" +if_the_url_is_left_empty_we_will_use_the_post_title = "如果 url 留空,我們將使用文章標題" +image_post = "影像文章" +image_post_comment = "建立以圖片為主的文章" +import = "匯入" +import_feed = "開始匯入 Feed" +import_rss = "匯入 RSS" +import_rss_feed_2.0 = "匯入 RSS Feed 2.0" +insert_image = "插入圖片" +invalid_error = "錯誤: 不正確的帳號或密碼" +language = "系統語言" +link_name = "連結名稱" +link_post = "連結文章" +link_post_comment = "建立以連結為主的文章" +login = "登入" +login_page = "登入頁面" +logout = "登出" +menu = "選單" +menus = "編輯選單" +meta_description = "Meta 備註" +meta_description_character = "文章簡介字數" +metatags = "標籤" +metatags_settings = "標籤設定" +mine = "Mine" +more = "更多" +my_draft = "我的草稿" +my_posts = "我的文章" +name = "名稱" +newer = "較新的" +next = "下一個" +next_post = "下一篇文章" +no_available_backup = "目前沒有可用的備份." +no_draft_found = "找不到草稿" +no_posts_found = "找不到文章" +no_related_post_found = "找不到相關文章" +no_scheduled_posts_found = "找不到預約排定的文章!" +no_search_results = "沒有搜尋到結果" +nope = "沒有" +not = "否" +older = "較舊的" +only = "只有" +operations = "操作" +page = "頁" +page_generation_time = "頁面產生時間" +pages = "靜態網頁" +pass_error = "密碼欄位為必填" +password = "密碼" +performance = "效能" +performance_settings = "效能設定" +permalink = "文章網址格式" +popular = "熱門" +popular_posts = "熱門文章" +popular_posts_widget = "熱門文章工具" +popular_posts_widget_at_most = "熱門文章工具篇數" +popular_tags = "熱門標籤" +post_by_author = "發表自" +posted_in = "發文在" +posted_on = "發文於" +posts = "文章" +posts_by = "發表自 " +posts_draft = "文章草稿" +posts_in_archive_page_at_most = "更多封存頁中的文章" +posts_in_category_page_at_most = "更多分類頁中的文章" +posts_in_front_page_show_at_most = "更多前端顯示頁中的文章" +posts_in_profile_page_at_most = "更多個人頁中的文章" +posts_in_search_result_at_most = "更多搜尋結果頁中的文章" +posts_in_tag_page_at_most = "更多標籤頁中的文章" +posts_in_type_page_at_most = "更多類別頁中的文章" +posts_index_settings = "文章首頁設定" +posts_list = "文章列表" +posts_tagged = "Posts tagged" +posts_with_type = "Posts with type" +pre_release = "Pre-release" +prev = "舊" +prev_post = "前一篇文章" +preview = "預覽" +profile_for = "Profile for" +proudly_powered_by = "Proudly powered by" +publish = "發布" +publish_draft = "發布草稿" +published = "已發表" +quote_post = "語錄文章" +quote_post_comment = "建立以語錄為主的文章" +rss_character = "RSS character" +rss_feeds_show_the_most_recent = "RSS feeds show the most recent" +rss_settings = "RSS 設定" +read_more_text = "閱讀更多文字" +read_more_text_placeholder = "閱讀更多" +reading = "顯示" +reading_settings = "顯示設定" +recaptcha = "reCAPTCHA" +recent_posts = "最新文章" +recent_posts_widget_at_most = "更多小工具中的文章" +regular_post = "一般文章" +regular_post_comment = "建立一般部落格文章" +related_posts = "相關文章" +related_widget_posts_at_most = "更多相關工具中的文章" +revert_to_draft = "轉換為草稿" +save = "儲存" +save_config = "儲存設定" +save_edit = "儲存編輯" +save_menu = "儲存選單" +save_as_draft = "儲存為草稿" +save_category = "儲存分類" +scheduled = "預約排定" +scheduled_posts = "預約排定的文章" +scheduled_tips = "發表帶有未來日期或時間的文章,將可提前預約排定文章的發表" +search = "搜尋" +search_for = "搜尋" +search_results_for = "搜尋一下" +search_results_not_found = "搜尋不到任何結果" +secret_key = "Secret Key" +settings = "系統設定" +sign_in_to_start_your_session = "Sign in to start your session" +site_key = "Site Key" +sitemap = "Sitemap" +slug = "Slug" +social_media = "Social Media" +static_page = "靜態網頁" +static_page_comment = "建立靜態網頁" +static_pages = "靜態網頁" +summary = "摘要" +summary_character = "摘要字數" +tag = "標籤" +tagcloud_widget_at_most = "標籤雲數量" +tagline = "副標" +tagline_placeholder = "這裡都是我的祕密" +tagline_description = "請用一句話快速表達這個部落格的主題" +tags = "標籤" +this_is_legacy_code_usually_new_created_analytics_using_gtag_js = "This is legacy code. Usually new created analytics using gtag.js" +this_page_doesnt_exist = "該頁面不存在 !" +time = "時間" +timezone = "時區" +title = "標題" +to_use_disqus_or_facebook_comment_you_need_to_provide_disqus_shortname_or_facebook_app_id = "To using Disqus or Facebook comment you need to provide Disqus shortname or Facebook App ID." +token_error = "CSRF Token not correct" +tools = "工具" +twitter_account = "Twitter(X.com)帳號" +type_to_search = "輸入欲搜尋的文字" +uncategorized = "無分類" +uncategorized_comment = "不需要分類或不適合目前所有分類的文章主題" +universal_analytics = "Universal Analytics (gtag.js)" +unknown_feed_format = "未知的格式" +update = "更新" +update_available = "可用的更新" +update_draft = "更新草稿" +update_post = "更新文章" +update_to = "更新到" +upload = "上傳" +user = "使用者" +user_error = "使用者欄位為必填" +valid_values_range_from_0_to_1.0._see = "驗證數值範圍自 0.0 到 1.0" +video_post = "影片文章" +video_post_comment = "建立以影片為主的文章" +view = "檢視" +view_post = "觀看" +views = "看過" +widget = "工具" +widget_settings = "工具設定" +would_you_like_to_try_our = "您想嘗試我們的 " +yes_im_in = "是的 我有" +yes_not_recommended = "是 (不建議)" +you_dont_have_permission_to_access_this_page = "您無權限存取此頁面" +your_new_config_key = "Your New Config Key" +your_new_value = "Your New Value" +your_backups = "你的備份" +your_latest_blog_posts = "您最新的部落格文章" +your_recent_posts = "您最近的文章" +by = "由" +hint_use_ctrlcmdf_to_search_for_your_config_key_or_value = "提示: 使用 Ctrl/CMD + F 可以快速搜尋你設定的按鍵值。" +homepage = "首頁" +instead = "取代" +item_class = "插入CSS class" +item_slug = "插入URL連結" +now = "現在" +of = "of" +optional = "選填" +post_your_post_slug = "/post/your-post-slug" +pro_tips_you_can_create_custom_config_key_and_print_out_your_config_key_value_anywhere_in_your_template = "專業提示: 您可以建立自訂按鍵並在樣版中的任何位置,顯示您設定的按鍵鍵值。" +read_more = "讀取更多" +widget_key_placeholder = "12345abcde" +year_month_your_post_slug = "/year/month/your-post-slug" +your_key = "your.key" +summary_behavior = "摘要特性" +default = "預設" +check_shortcode = "檢查 shortcode" +in_summary_mode_whether_check_the_shortcode_first_or_not_before_trim_the_content_to_x_char = "在摘要模式下,將內容縮減字元數之前,是不要先檢查 shortcode" +manage_users = "管理使用者" +add_user = "新增使用者" +username = "使用者名稱" +role = "規則" +change_password = "更改密碼" +config_mfa = "設定 MFA" +mfacode = "MFA Code" +verify_code = "驗證 MFA code" +verify_password = "驗證目前密碼" +manualsetupkey = "您也可以手動新增設定密鑰" +mfa_error = "MFA code 不正確" +disablemfa = "停用 MFA" +enable_auto_save = "啟用自動儲存" +explain_autosave = "當啟用時,新的內容或刪減將會自動在每60秒進行背景儲存。" +login_protect_system = "登入保護系統" +cloudflare_info = "查看 Cloudflare's Turnstile 文件: " +mfa_config = "多重身份驗證 (MFA)" +set_mfa_globally = "設定 MFA 狀態" +explain_mfa = "當啟用時,MFA 會開放給所有使用者自行選用。當停用後,所有使用者都不能使用此功能,並且會在登入頁面隱藏相關訊息。" +set_version_publicly = "可見版本" +explain_version = "預設情況下,HTMLy 的版本在原始碼中公開可見,但有些管理員可能會希望隱藏起來。" +focus_mode = "切換焦點" +writing = "寫入" +writing_settings = "寫入設定" +security = "安全" +security_settings = "安全設定" +msg_error_field_req_username = "名稱欄位為必填." +msg_error_field_req_password = "密碼欄位為必填." +msg_error_field_req_title = "標題欄位為必填." +msg_error_field_req_content = "內容欄位為必填." +msg_error_field_req_tag = "標籤欄位為必填." +msg_error_field_req_image = "圖片欄位為必填." +msg_error_field_req_video = "影片欄位為必填." +msg_error_field_req_link = "連結欄位為必填." +msg_error_field_req_quote = "語錄欄位為必填." +msg_error_field_req_audio = "音訊欄位為必填." +msg_error_field_req_feedurl = "您需指定 Feed 網址." +rss_feeds_description_select = "RSS 描述" +rss_description_body = "Post 內容" +rss_description_meta = "Post Meta 描述" +admin_theme = "後台界面風格" +admin_theme_light = "明亮" +admin_theme_dark = "暗沉" diff --git a/old/README.md b/old/README.md new file mode 100755 index 0000000..cc8afc8 --- /dev/null +++ b/old/README.md @@ -0,0 +1 @@ +# kyledot.net diff --git a/blog/2024-06-07_MFA-i.html b/old/blog/2024-06-07_MFA-i.html similarity index 100% rename from blog/2024-06-07_MFA-i.html rename to old/blog/2024-06-07_MFA-i.html diff --git a/blog/2024-07-01_Plates.html b/old/blog/2024-07-01_Plates.html similarity index 100% rename from blog/2024-07-01_Plates.html rename to old/blog/2024-07-01_Plates.html diff --git a/blog/2024-07-01_Plates_list.html b/old/blog/2024-07-01_Plates_list.html similarity index 100% rename from blog/2024-07-01_Plates_list.html rename to old/blog/2024-07-01_Plates_list.html diff --git a/blog/2024-08-04_Vexillology-i.html b/old/blog/2024-08-04_Vexillology-i.html similarity index 100% rename from blog/2024-08-04_Vexillology-i.html rename to old/blog/2024-08-04_Vexillology-i.html diff --git a/blog/home.html b/old/blog/home.html similarity index 100% rename from blog/home.html rename to old/blog/home.html diff --git a/blog/media/MFA-i.png b/old/blog/media/MFA-i.png similarity index 100% rename from blog/media/MFA-i.png rename to old/blog/media/MFA-i.png diff --git a/blog/style.css b/old/blog/style.css similarity index 100% rename from blog/style.css rename to old/blog/style.css diff --git a/blog/template.html b/old/blog/template.html similarity index 100% rename from blog/template.html rename to old/blog/template.html diff --git a/index.html b/old/index.html similarity index 100% rename from index.html rename to old/index.html diff --git a/projects.html b/old/projects.html similarity index 100% rename from projects.html rename to old/projects.html diff --git a/resume.html b/old/resume.html similarity index 100% rename from resume.html rename to old/resume.html diff --git a/style.css b/old/style.css similarity index 100% rename from style.css rename to old/style.css diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..f3f9b23 --- /dev/null +++ b/robots.txt @@ -0,0 +1,36 @@ +# +# robots.txt +# +# This file is to prevent the crawling and indexing of certain parts +# of your site by web crawlers and spiders run by sites like Yahoo! +# and Google. By telling these "robots" where not to go on your site, +# you save bandwidth and server resources. +# +# This file will be ignored unless it is at the root of your host: +# Used: http://example.com/robots.txt +# Ignored: http://example.com/site/robots.txt +# +# For more information about the robots.txt standard, see: +# http://www.robotstxt.org/wc/robots.html +# +# For syntax checking, see: +# http://www.sxw.org.uk/computing/robots/check.html + +User-agent: * + +# Allow directories +Allow: /system/resources/ + +# Disallow directories +Disallow: /config/ +Disallow: /system/ +Disallow: /cache/ +Disallow: /lang/ + +# Disallow files +Disallow: /composer.json +Disallow: /composer.lock +Disallow: /composer.phar + +# Disallow paths +Disallow: /admin/ diff --git a/system/admin/admin.php b/system/admin/admin.php new file mode 100644 index 0000000..3452179 --- /dev/null +++ b/system/admin/admin.php @@ -0,0 +1,1833 @@ +
  • ' . i18n('Invalid_Error') . '
'; + } + + $user_enc = user('encryption', $user); + $user_pass = user('password', $user); + $user_role = user('role', $user); + $mfa = user('mfa_secret', $user); + + if(is_null($user_enc) || is_null($user_pass) || is_null($user_role)) { + return $str = '
  • ' . i18n('Invalid_Error') . '
'; + } + + if ($user_enc == "password_hash") { + if (password_verify($pass, $user_pass)) { + if (session_status() == PHP_SESSION_NONE) session_start(); + if (password_needs_rehash($user_pass, PASSWORD_DEFAULT)) { + update_user($user, $pass, $user_role, $mfa); + } + $_SESSION[site_url()]['user'] = $user; + header('location: admin'); + } else { + return $str = '
  • ' . i18n('Invalid_Error') . '
'; + } + } else if (old_password_verify($pass, $user_enc, $user_pass)) { + if (session_status() == PHP_SESSION_NONE) session_start(); + update_user($user, $pass, $user_role, $mfa); + $_SESSION[site_url()]['user'] = $user; + header('location: admin'); + } else { + return $str = '
  • ' . i18n('Invalid_Error') . '
'; + } +} + +function old_password_verify($pass, $user_enc, $user_pass) +{ + $password = (strlen($user_enc) > 0 && $user_enc !== 'clear' && $user_enc !== 'none') ? hash($user_enc, $pass) : $pass; + return ($password === $user_pass); +} + +// Generate csrf token +function generate_csrf_token() +{ + $_SESSION[site_url()]['csrf_token'] = sha1(microtime(true) . mt_rand(10000, 90000)); +} + +// Get csrf token +function get_csrf() +{ + if (!isset($_SESSION[site_url()]['csrf_token']) || empty($_SESSION[site_url()]['csrf_token'])) { + generate_csrf_token(); + } + return $_SESSION[site_url()]['csrf_token']; +} + +// Check the csrf token +function is_csrf_proper($csrf_token) +{ + if ($csrf_token == get_csrf()) { + return true; + } + return false; +} + +// Clean URLs +function remove_accent($str) +{ + return URLify::downcode($str); +} + +// Add content +function add_content($title, $tag, $url, $content, $user, $draft, $category, $type, $description = null, $media = null, $dateTime = null, $autoSave = null, $oldfile = null) +{ + if (!is_null($autoSave)) { + $draft = 'draft'; + } + $tag = explode(',', preg_replace("/\s*,\s*/", ",", rtrim($tag, ','))); + $tag = array_filter(array_unique($tag)); + $tagslang = "content/data/tags.lang"; + if (file_exists($tagslang)) { + $taglang = array_flip(unserialize(file_get_contents($tagslang))); + $tflip = array_intersect_key($taglang, array_flip($tag)); + $post_tag = array(); + $post_tagmd = array(); + foreach ($tag as $t) { + if (array_key_exists($t, $tflip)) { + foreach ($tflip as $tfp => $tf){ + if($t == $tfp) { + $post_tag[] = $tf; + $post_tagmd[] = $tfp; + } + } + } else { + $post_tag[] = $t; + $post_tagmd[] = $t; + } + } + + $post_tag = safe_tag(implode(',', $post_tag)); + $post_tagmd = safe_html(implode(',', $post_tagmd)); + + } else { + $post_tag = safe_tag(implode(',', $tag)); + $post_tagmd = safe_html(implode(',', $tag)); + } + + $post_date = date('Y-m-d-H-i-s', strtotime($dateTime)); + $post_title = safe_html($title); + $post_tag = strtolower(preg_replace(array('/[^a-zA-Z0-9,. \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($post_tag))); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $category = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($category))); + $description = safe_html($description); + + $post_t = explode(',', $post_tag); + $pret_t = explode(',', $post_tagmd); + $tags = tag_cloud(true); + $timestamp = date('YmdHis'); + + $combine = array_combine($pret_t, $post_t); + $inter = array_intersect_key($tags, array_flip($post_t)); + $newtag = array(); + + foreach ($combine as $tag => $v) { + if (array_key_exists($v, $tags)) { + foreach ($inter as $in => $i){ + if($v == $in) { + if (strtolower($tag) == strtolower(tag_i18n($in))) { + $newtag[$v]= $tag; + } else { + $newtag[$v.'-'. $timestamp]= $tag; + } + } + } + } else { + $newtag[$v] = $tag; + } + } + + $post_tag = implode(',', array_keys($newtag)); + + $posts = get_blog_posts(); + foreach ($posts as $index => $v) { + $arr = explode('_', $v['basename']); + if (strtolower($arr[2]) === strtolower($post_url . '.md')) { + $post_url = $post_url .'-'. $timestamp; + } else { + $post_url = $post_url; + } + } + + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + if ($tag !== null) { + $tagmd = "\n"; + } else { + $tagmd = ""; + } + if ($media!== null) { + $post_media = "\n"; + } else { + $post_media = ""; + } + $post_content = "" . $post_description . $tagmd . $post_media . "\n\n" . $content; + + if (!empty($post_title) && !empty($post_tag) && !empty($post_url) && !empty($post_content)) { + + $filename = $post_date . '_' . $post_tag . '_' . $post_url . '.md'; + + if (empty($draft)) { + if (date('Y-m-d-H-i-s') >= $post_date) { + $dir = 'content/' . $user . '/blog/' . $category. '/'.$type. '/'; + } else { + $dir = 'content/' . $user . '/blog/' . $category. '/'.$type. '/scheduled/'; + } + } else { + $dir = 'content/' . $user . '/blog/' . $category. '/draft/'; + } + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + + } + + $oldfile = $oldfile; + $newfile = $dir . $filename; + if ($oldfile !== $newfile && !is_null($autoSave)) { + if (file_exists($oldfile)) { + rename($oldfile, $newfile); + } + } + + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + + if (empty($draft)) { + $draftFile = 'content/' . $user . '/blog/' . $category. '/draft/' . $filename; + if (file_exists($draftFile)) { + unlink($draftFile); + } + } + + save_tag_i18n($post_tag, $post_tagmd); + + rebuilt_cache('all'); + + clear_post_cache($post_date, $post_tag, $post_url, $dir . $filename, $category, $type); + + if (!is_null($autoSave)) { + return json_encode(array('message' => 'Auto Saved', 'file' => $newfile)); + } + + if (empty($draft)) { + if (date('Y-m-d-H-i-s') >= $post_date) { + $redirect = site_url() . 'admin/mine'; + } else { + $redirect = site_url() . 'admin/scheduled'; + } + } else { + $redirect = site_url() . 'admin/draft'; + } + + header("Location: $redirect"); + } +} + +// Edit content +function edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, $type, $destination = null, $description = null, $date = null, $media = null, $autoSave = null) +{ + $tag = explode(',', preg_replace("/\s*,\s*/", ",", rtrim($tag, ','))); + $tag = array_filter(array_unique($tag)); + $tagslang = "content/data/tags.lang"; + $newfile = ''; + $views = array(); + $viewsFile = "content/data/views.json"; + if (file_exists($tagslang)) { + $taglang = array_flip(unserialize(file_get_contents($tagslang))); + $tflip = array_intersect_key($taglang, array_flip($tag)); + $post_tag = array(); + $post_tagmd = array(); + foreach ($tag as $t) { + if (array_key_exists($t, $tflip)) { + foreach ($tflip as $tfp => $tf){ + if($t == $tfp) { + $post_tag[] = $tf; + $post_tagmd[] = $tfp; + } + } + } else { + $post_tag[] = $t; + $post_tagmd[] = $t; + } + } + + $post_tag = safe_tag(implode(',', $post_tag)); + $post_tagmd = safe_html(implode(',', $post_tagmd)); + } else { + $post_tag = safe_tag(implode(',', $tag)); + $post_tagmd = safe_html(implode(',', $tag)); + } + + $dir = explode('/', pathinfo($oldfile, PATHINFO_DIRNAME)); + $olddate = date('Y-m-d-H-i-s', strtotime($date)); + + $post_title = safe_html($title); + $post_tag = strtolower(preg_replace(array('/[^a-zA-Z0-9,. \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($post_tag))); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $category = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($category))); + $description = safe_html($description); + + + $post_t = explode(',', $post_tag); + $pret_t = explode(',', $post_tagmd); + $tags = tag_cloud(true); + $timestamp = date('YmdHis'); + + $combine = array_combine($pret_t, $post_t); + $inter = array_intersect_key($tags, array_flip($post_t)); + $newtag = array(); + + foreach ($combine as $tag => $v) { + if (array_key_exists($v, $tags)) { + foreach ($inter as $in => $i){ + if($v == $in) { + if (strtolower($tag) == strtolower(tag_i18n($in))) { + $newtag[$v]= $tag; + } else { + $newtag[$v.'-'. $timestamp]= $tag; + } + } + } + } else { + $newtag[$v] = $tag; + } + } + + $post_tag = implode(',', array_keys($newtag)); + + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + if ($tag !== null) { + $tagmd = "\n"; + } else { + $tagmd = ""; + } + if ($media !== null) { + $post_media = "\n"; + } else { + $post_media = ""; + } + $post_content = "" . $post_description . $tagmd . $post_media . "\n\n" . $content; + + $dirBlog = $dir[0] . '/' . $dir[1] . '/' . $dir[2] . '/' . $category . '/' . $type . '/'; + $dirDraft = $dir[0] . '/' . $dir[1] . '/' . $dir[2] . '/' . $category . '/draft/'; + $dirScheduled = $dir[0] . '/' . $dir[1] . '/' . $dir[2] . '/' . $category . '/' . $type . '/scheduled/'; + + if (!is_dir($dirBlog)) { + mkdir($dirBlog, 0775, true); + } + + if (!is_dir($dirDraft)) { + mkdir($dirDraft, 0775, true); + } + + if (!is_dir($dirScheduled)) { + mkdir($dirScheduled, 0775, true); + } + + if (!empty($post_title) && !empty($post_tag) && !empty($post_url) && !empty($post_content)) { + + if(!empty($revertPost) || !empty($publishDraft)) { + + if($dir[4] == 'draft') { + if (date('Y-m-d-H-i-s') >= $olddate) { + $newfile = $dirBlog . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } else { + $newfile = $dirScheduled . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } + } else { + $newfile = $dirDraft . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } + + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + unlink($oldfile); + + } else { + + if ($dir[3] === $category) { + + if($dir[4] == 'draft') { + $newfile = $dirDraft . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } else { + if (date('Y-m-d-H-i-s') >= $olddate) { + $newfile = $dirBlog . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } else { + $newfile = $dirScheduled . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } + } + + if ($oldfile === $newfile) { + file_put_contents($oldfile, print_r($post_content, true), LOCK_EX); + } else { + rename($oldfile, $newfile); + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + } + } else { + + if($dir[4] == 'draft') { + $newfile = $dirDraft . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } else { + if (date('Y-m-d-H-i-s') >= $olddate) { + $newfile = $dirBlog . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } else { + $newfile = $dirScheduled . $olddate . '_' . $post_tag . '_' . $post_url . '.md'; + } + } + + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + unlink($oldfile); + + } + + } + + if(!empty($publishDraft)) { + $dt = $olddate; + $t = str_replace('-', '', $dt); + $time = new DateTime($t); + $timestamp = $time->format("Y-m-d"); + } else { + $fn = explode('_', pathinfo($oldfile, PATHINFO_FILENAME)); + $dt = $fn[0]; + $t = str_replace('-', '', $dt); + $time = new DateTime($t); + $timestamp = $time->format("Y-m-d"); + } + + // The post date + $postdate = strtotime($timestamp); + + // The post URL + if (permalink_type() == 'default') { + $posturl = site_url() . date('Y/m', $postdate) . '/' . $post_url; + } else { + $posturl = site_url() . permalink_type() . '/' . $post_url; + } + + save_tag_i18n($post_tag, $post_tagmd); + + rebuilt_cache('all'); + clear_post_cache($dt, $post_tag, $post_url, $oldfile, $category, $type); + + $old_filename = pathinfo($oldfile, PATHINFO_FILENAME); + $old_ex = explode('_', $old_filename); + $old_url = $old_ex[2]; + + if ($old_url != $post_url) { + if (file_exists($viewsFile)) { + $views = json_decode(file_get_data($viewsFile), true); + $oKey = 'post_' . $old_url; + $nKey = 'post_' . $post_url; + if (isset($views[$oKey])) { + $arr = replace_key($views, $oKey, $nKey); + save_json_pretty($viewsFile, $arr); + } + } + } + + if (!is_null($autoSave)) { + return json_encode(array('message' => 'Auto Saved', 'file' => $newfile)); + } + + if ($destination == 'post') { + if(!empty($revertPost)) { + $drafturl = site_url() . 'admin/draft'; + header("Location: $drafturl"); + } else { + if (date('Y-m-d-H-i-s') >= $olddate) { + header("Location: $posturl"); + } else { + $schurl = site_url() . 'admin/scheduled'; + header("Location: $schurl"); + } + } + } else { + if(!empty($publishDraft)) { + if (date('Y-m-d-H-i-s') >= $olddate) { + header("Location: $posturl"); + } else { + $schurl = site_url() . 'admin/scheduled'; + header("Location: $schurl"); + } + } elseif (!empty($revertPost)) { + $drafturl = site_url() . 'admin/draft'; + header("Location: $drafturl"); + } else { + $redirect = site_url() . $destination; + header("Location: $redirect"); + } + } + } +} + +// Add static page +function add_page($title, $url, $content, $draft, $description = null, $autoSave = null, $oldfile = null) +{ + if (!is_null($autoSave)) { + $draft = 'draft'; + } + $post_title = safe_html($title); + $newfile = ''; + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + + $posts = get_static_pages(); + $timestamp = date('YmdHis'); + foreach ($posts as $index => $v) { + $m_url = explode('.', $v['filename']); + if (isset($m_url[1])) { + $b_url = $m_url[1] . '.md'; + } else { + $b_url = $v['basename']; + } + if (strtolower($b_url) === strtolower($post_url . '.md')) { + $post_url = $post_url .'-'. $timestamp; + } else { + $post_url = $post_url; + } + } + + $post_content = '' . $post_description . "\n\n" . $content; + + if (!empty($post_title) && !empty($post_url) && !empty($post_content)) { + + $filename = $post_url . '.md'; + $dir = 'content/static/'; + $dirDraft = 'content/static/draft/'; + + if (empty($draft)) { + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + $draftFile = $dirDraft . $filename; + if (file_exists($draftFile)) { + unlink($draftFile); + } + } else { + if (!is_dir($dirDraft)) { + mkdir($dirDraft, 0775, true); + } + + $oldfile = $oldfile; + $newfile = $dirDraft . $filename; + if ($oldfile !== $newfile && !is_null($autoSave)) { + if (file_exists($oldfile)) { + rename($oldfile, $newfile); + } + } + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + } + + rebuilt_cache('all'); + clear_page_cache($post_url); + + if (!is_null($autoSave)) { + return json_encode(array('message' => 'Auto Saved', 'file' => $newfile)); + } + + if (empty($draft)) { + $redirect = site_url() . 'admin/pages'; + header("Location: $redirect"); + } else { + $redirect = site_url() . 'admin/draft'; + header("Location: $redirect"); + } + } +} + +// Add static sub page +function add_sub_page($title, $url, $content, $static, $draft, $description = null, $autoSave = null, $oldfile = null) +{ + if (!is_null($autoSave)) { + $draft = 'draft'; + } + $post = find_page($static); + $newfile = ''; + $static = pathinfo($post['current']->md, PATHINFO_FILENAME); + $post_title = safe_html($title); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + + $posts = get_static_subpages($post['current']->slug); + $timestamp = date('YmdHis'); + foreach ($posts as $index => $v) { + $m_url = explode('.', $v['filename']); + if (isset($m_url[1])) { + $b_url = $m_url[1] . '.md'; + } else { + $b_url = $v['basename']; + } + if (strtolower($b_url) === strtolower($post_url . '.md')) { + $post_url = $post_url .'-'. $timestamp; + } else { + $post_url = $post_url; + } + } + + $post_content = '' . $post_description . "\n\n" . $content; + + if (!empty($post_title) && !empty($post_url) && !empty($post_content)) { + + $filename = $post_url . '.md'; + $dir = 'content/static/' . $static . '/'; + $dirDraft = 'content/static/' . $static . '/draft/'; + + if (empty($draft)) { + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + $draftFile = $dirDraft . $filename; + if (file_exists($draftFile)) { + unlink($draftFile); + } + } else { + if (!is_dir($dirDraft)) { + mkdir($dirDraft, 0775, true); + } + + $oldfile = $oldfile; + $newfile = $dirDraft . $filename; + if ($oldfile !== $newfile && !is_null($autoSave)) { + if (file_exists($oldfile)) { + rename($oldfile, $newfile); + } + } + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + } + + if (!is_null($autoSave)) { + return json_encode(array('message' => 'Auto Saved', 'file' => $newfile)); + } + + rebuilt_cache('all'); + clear_page_cache($post_url); + $redirect = site_url() . 'admin/pages'; + header("Location: $redirect"); + } +} + +// Edit static page and sub page +function edit_page($title, $url, $content, $oldfile, $revertPage, $publishDraft, $destination = null, $description = null, $static = null, $autoSave = null) +{ + $dir = pathinfo($oldfile, PATHINFO_DIRNAME); + $fn = explode('.', pathinfo($oldfile, PATHINFO_FILENAME)); + if (isset($fn[1])) { + $num = $fn[0] . '.'; + } else { + $num = null; + } + $newfile = ''; + $views = array(); + $viewsFile = "content/data/views.json"; + $post_title = safe_html($title); + $pUrl = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $post_url = $num . $pUrl; + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + + $post_content = '' . $post_description . "\n\n" . $content; + + if (!empty($post_title) && !empty($post_url) && !empty($post_content)) { + + if(!empty($revertPage)) { + $dirDraft = $dir . '/draft'; + if (!is_dir($dirDraft)) { + mkdir($dirDraft, 0775, true); + } + $newfile = $dirDraft . '/' . $post_url . '.md'; + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + if (empty($static)) { + $old = pathinfo($oldfile, PATHINFO_FILENAME); + if(is_dir($dir . '/' . $old)) { + rename($dir . '/' . $old, $dir . '/' . $post_url); + } + } + unlink($oldfile); + } elseif (!empty($publishDraft)) { + $newfile = dirname($dir) . '/' . $post_url . '.md'; + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + if (empty($static)) { + $old = pathinfo($oldfile, PATHINFO_FILENAME); + if(is_dir(dirname($dir) . '/' . $old)) { + rename(dirname($dir) . '/' . $old, dirname($dir) . '/' . $post_url); + } + } + unlink($oldfile); + } else { + $newfile = $dir . '/' . $post_url . '.md'; + if ($oldfile === $newfile) { + file_put_contents($oldfile, print_r($post_content, true), LOCK_EX); + } else { + rename($oldfile, $newfile); + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + if (empty($static)) { + $old = pathinfo($oldfile, PATHINFO_FILENAME); + if(is_dir($dir . '/' . $old)) { + rename($dir . '/' . $old, $dir . '/' . $post_url); + } + } + } + } + + $cl = explode('.', $post_url); + if (isset($cl[1])) { + $pu = $cl[1]; + } else { + $pu = $post_url; + } + + $old_filename = pathinfo($oldfile, PATHINFO_FILENAME); + $old_ex = explode('.', $old_filename); + if (isset($old_ex[1])) { + $old_url = $old_ex[1]; + } else { + $old_url = $old_filename; + } + + rebuilt_cache('all'); + clear_page_cache($post_url); + + if (!empty($static)) { + $posturl = site_url() . $static .'/'. $pu; + + if ($old_url != $pu) { + if (file_exists($viewsFile)) { + $views = json_decode(file_get_data($viewsFile), true); + $oKey = 'subpage_' . $static . '.' . $old_url; + $nKey = 'subpage_' . $static . '.' . $pu; + if (isset($views[$oKey])) { + $arr = replace_key($views, $oKey, $nKey); + save_json_pretty($viewsFile, $arr); + } + } + } + + } else { + $posturl = site_url() . $pu; + + if ($old_url != $pu) { + if (file_exists($viewsFile)) { + $views = json_decode(file_get_data($viewsFile), true); + $oKey = 'page_' . $old_url; + $nKey = 'page_' . $pu; + if (isset($views[$oKey])) { + $arr = replace_key($views, $oKey, $nKey); + save_json_pretty($viewsFile, $arr); + } + } + + $sPage = find_subpage($pu); + if (!empty($sPage)) { + foreach ($sPage as $sp) { + if (file_exists($viewsFile)) { + $views = json_decode(file_get_data($viewsFile), true); + $oKey = 'subpage_' . $old_url . '.' . $sp->slug; + $nKey = 'subpage_' . $pu . '.' . $sp->slug; + if (isset($views[$oKey])) { + $arr = replace_key($views, $oKey, $nKey); + save_json_pretty($viewsFile, $arr); + } + } + } + } + } + + } + + if (!is_null($autoSave)) { + return json_encode(array('message' => 'Auto Saved', 'file' => $newfile)); + } + + if ($destination == 'post') { + if(!empty($revertPage)) { + $drafturl = site_url() . 'admin/draft'; + header("Location: $drafturl"); + } else { + header("Location: $posturl"); + } + } else { + $redirect = site_url() . $destination; + header("Location: $redirect"); + } + } +} + +// Add category +function add_category($title, $url, $content, $description = null) +{ + $post_title = safe_html($title); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + $post_content = '' . $post_description . "\n\n" . $content; + + if (!empty($post_title) && !empty($post_url) && !empty($post_content)) { + + $filename = $post_url . '.md'; + $dir = 'content/data/category/'; + if (is_dir($dir)) { + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + } else { + mkdir($dir, 0775, true); + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + } + + rebuilt_cache('all'); + clear_page_cache($post_url); + $redirect = site_url() . 'admin/categories'; + header("Location: $redirect"); + } +} + +// Edit category +function edit_category($title, $url, $content, $oldfile, $destination = null, $description = null) +{ + $dir = pathinfo($oldfile, PATHINFO_DIRNAME); + + $post_title = safe_html($title); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $post_description = "\n"; + } else { + $post_description = "\n"; + } + } else { + $post_description = ""; + } + $post_content = '' . $post_description . "\n\n" . $content; + if (!empty($post_title) && !empty($post_url) && !empty($post_content)) { + + $newfile = $dir . '/' . $post_url . '.md'; + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + if ($oldfile === $newfile) { + file_put_contents($oldfile, print_r($post_content, true), LOCK_EX); + } else { + if (file_exists($oldfile)) { + rename($oldfile, $newfile); + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + } else { + file_put_contents($newfile, print_r($post_content, true), LOCK_EX); + } + } + + rename_category_folder($post_url, $oldfile); + + rebuilt_cache('all'); + if ($destination == 'post') { + header("Location: $posturl"); + } else { + $redirect = site_url() . $destination; + header("Location: $redirect"); + } + } +} + +// Edit user profile +function edit_profile($title, $content, $user, $description = null, $image = null) +{ + $description = safe_html($description); + if ($description !== null) { + if (!empty($description)) { + $profile_description = "\n"; + } else { + $profile_description = "\n"; + } + } else { + $profile_description = ""; + } + if ($image !== null) { + $avatar = "\n"; + } else { + $avatar = ""; + } + $user_title = safe_html($title); + $user_content = '' . $profile_description . $avatar . "\n\n" . $content; + + if (!empty($user_title) && !empty($user_content)) { + + $dir = 'content/' . $user . '/'; + $filename = 'content/' . $user . '/author.md'; + if (is_dir($dir)) { + file_put_contents($filename, print_r($user_content, true), LOCK_EX); + } else { + mkdir($dir, 0775, true); + file_put_contents($filename, print_r($user_content, true), LOCK_EX); + } + rebuilt_cache('all'); + $redirect = site_url() . 'author/' . $user; + header("Location: $redirect"); + } +} + +// Edit homepage +function edit_frontpage($title, $content) +{ + $front_title = safe_html($title); + $front_content = '' . "\n\n" . $content; + + if (!empty($front_title) && !empty($front_content)) { + + $dir = 'content/data/frontpage'; + $filename = 'content/data/frontpage/frontpage.md'; + if (is_dir($dir)) { + file_put_contents($filename, print_r($front_content, true), LOCK_EX); + } else { + mkdir($dir, 0775, true); + file_put_contents($filename, print_r($front_content, true), LOCK_EX); + } + rebuilt_cache('all'); + $redirect = site_url(); + header("Location: $redirect"); + } +} + +// Delete blog post +function delete_post($file, $destination) +{ + if (!login()) + return null; + $deleted_content = $file; + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $arr = explode('/', $file); + + // realpath resolves all traversal operations like ../ + $realFilePath = realpath($file); + + // realpath returns an empty string if the file does not exist + if ($realFilePath == '') { + return; + } + + // get the current project working directory + $cwd = getcwd(); + + // content directory relative to the current project working directory + $contentDir = $cwd . DIRECTORY_SEPARATOR . 'content'; + + // if the file path does not start with $contentDir, it means its accessing + // files in folders other than content + if (strpos($realFilePath, $contentDir) !== 0) { + return; + } + + // Get cache file + $info = pathinfo($file); + $fn = explode('_', $info['basename']); + $dr = explode('/', $info['dirname']); + clear_post_cache($fn[0], $fn[1], str_replace('.md', '', $fn[2]), $file, $dr[3], $dr[4]); + + if (!empty($deleted_content)) { + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + unlink($deleted_content); + rebuilt_cache('all'); + if ($destination == 'post') { + $redirect = site_url(); + header("Location: $redirect"); + } else { + $redirect = site_url() . $destination; + header("Location: $redirect"); + } + } + } +} + +// Delete static page +function delete_page($file, $destination) +{ + if (!login()) + return null; + $deleted_content = $file; + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + // realpath resolves all traversal operations like ../ + $realFilePath = realpath($file); + + // realpath returns an empty string if the file does not exist + if ($realFilePath == '') { + return; + } + + // get the current project working directory + $cwd = getcwd(); + + // content directory relative to the current project working directory + $contentDir = $cwd . DIRECTORY_SEPARATOR . 'content'; + + // if the file path does not start with $contentDir, it means its accessing + // files in folders other than content + if (strpos($realFilePath, $contentDir) !== 0) { + return; + } + + if (!empty($menu)) { + foreach (glob('cache/page/*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + } else { + clear_page_cache(pathinfo($file, PATHINFO_BASENAME)); + } + + if (!empty($deleted_content)) { + if ($role === 'editor' || $role === 'admin') { + unlink($deleted_content); + rebuilt_cache('all'); + if ($destination == 'post') { + $redirect = site_url(); + header("Location: $redirect"); + } else { + $redirect = site_url() . $destination; + header("Location: $redirect"); + } + } + } +} + +// Find draft. +function find_draft($year, $month, $name) +{ + $posts = get_draft_posts(); + + foreach ($posts as $index => $v) { + $arr = explode('_', $v['basename']); + if (strpos($arr[0], "$year-$month") !== false && strtolower($arr[2]) === strtolower($name . '.md') || strtolower($arr[2]) === strtolower($name . '.md')) { + + // Use the get_posts method to return + // a properly parsed object + + $ar = get_posts($posts, $index + 1, 1); + $nx = get_posts($posts, $index, 1); + $pr = get_posts($posts, $index + 2, 1); + + if ($index == 0) { + if (isset($pr[0])) { + return array( + 'current' => $ar[0], + 'prev' => $pr[0] + ); + } else { + return array( + 'current' => $ar[0], + 'prev' => null + ); + } + } elseif (count($posts) == $index + 1) { + return array( + 'current' => $ar[0], + 'next' => $nx[0] + ); + } else { + return array( + 'current' => $ar[0], + 'next' => $nx[0], + 'prev' => $pr[0] + ); + } + } + } +} + +// Return draft list +function get_draft($profile, $page, $perpage) +{ + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $posts = get_draft_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + $str = explode('/', $v['dirname']); + if (strtolower($profile) === strtolower($str[1]) || $role === 'admin') { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return false; + } + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return draft static page. +function find_draft_page($static = null) +{ + $posts = get_draft_pages(); + + $tmp = array(); + + $counter = config('views.counter'); + + if ($counter == 'true') { + $viewsFile = "content/data/views.json"; + if (file_exists($viewsFile)) { + $views = json_decode(file_get_contents($viewsFile), true); + } + } + + if (!empty($posts)) { + + foreach ($posts as $index => $v) { + if (stripos($v['basename'], $static . '.md') !== false) { + + $post = new stdClass; + + // The static page URL + $fn = explode('.', $v['filename']); + + if (isset($fn[1])) { + $url = $fn[1]; + } else { + $url= $v['filename']; + } + + $post->url = site_url() . $url; + + $post->file = $v['dirname'] . '/' . $v['basename']; + $post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file))); + + $post->md = $v['basename']; + $post->slug = $url; + $post->parent = null; + $post->parentSlug = null; + + // Get the contents and convert it to HTML + $content = file_get_contents($post->file); + + // Extract the title and body + $post->title = get_content_tag('t', $content, 'Untitled static page: ' . format_date($post->lastMod, 'l, j F Y, H:i')); + + // Get the contents and convert it to HTML + $post->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + if ($counter == 'true') { + $post->views = get_views('page_' . $post->slug, $post->file, $views); + } else { + $post->views = null; + } + + $post->description = get_content_tag("d", $content, get_description($post->body)); + + $word_count = str_word_count(strip_tags($post->body)); + $post->readTime = ceil($word_count / 200); + + $tmp[] = $post; + } + } + } + + return $tmp; +} + +// Return draft static subpage. +function find_draft_subpage($static = null, $sub_static = null) +{ + $posts = get_draft_subpages($static); + + $tmp = array(); + + $counter = config('views.counter'); + + if ($counter == 'true') { + $viewsFile = "content/data/views.json"; + if (file_exists($viewsFile)) { + $views = json_decode(file_get_contents($viewsFile), true); + } + } + + if (!empty($posts)) { + + foreach ($posts as $index => $v) { + if (stripos($v['basename'], $sub_static . '.md') !== false) { + + $post = new stdClass; + + $fd = str_replace('content/static/', '', dirname($v['dirname'])); + + $pr = explode('.', $fd); + if (isset($pr[1])) { + $ps = $pr[1]; + } else { + $ps = $fd; + } + + // The static page URL + $fn = explode('.', $v['filename']); + + if (isset($fn[1])) { + $url = $fn[1]; + } else { + $url = $v['filename']; + } + + $post->parent = $fd; + $post->parentSlug = $ps; + $post->url = site_url() . $ps . "/" . $url; + + $post->file = $v['dirname'] . '/' . $v['basename']; + $post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file))); + + $post->md = $v['basename']; + $post->slug = $url; + + // Get the contents and convert it to HTML + $content = file_get_contents($post->file); + + // Extract the title and body + $post->title = get_content_tag('t', $content, 'Untitled static subpage: ' . format_date($post->lastMod, 'l, j F Y, H:i')); + + // Get the contents and convert it to HTML + $post->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + if ($counter == 'true') { + $post->views = get_views('subpage_' . $post->parentSlug .'.'. $post->slug, $post->file, $views); + } else { + $post->views = null; + } + + $post->description = get_content_tag("d", $content, get_description($post->body)); + + $word_count = str_word_count(strip_tags($post->body)); + $post->readTime = ceil($word_count / 200); + + $tmp[] = $post; + } + } + } + + return $tmp; +} + +// Find scheduled post. +function find_scheduled($year, $month, $name) +{ + $posts = get_scheduled_posts(); + + foreach ($posts as $index => $v) { + $arr = explode('_', $v['basename']); + if (strpos($arr[0], "$year-$month") !== false && strtolower($arr[2]) === strtolower($name . '.md') || strtolower($arr[2]) === strtolower($name . '.md')) { + + // Use the get_posts method to return + // a properly parsed object + + $ar = get_posts($posts, $index + 1, 1); + $nx = get_posts($posts, $index, 1); + $pr = get_posts($posts, $index + 2, 1); + + if ($index == 0) { + if (isset($pr[0])) { + return array( + 'current' => $ar[0], + 'prev' => $pr[0] + ); + } else { + return array( + 'current' => $ar[0], + 'prev' => null + ); + } + } elseif (count($posts) == $index + 1) { + return array( + 'current' => $ar[0], + 'next' => $nx[0] + ); + } else { + return array( + 'current' => $ar[0], + 'next' => $nx[0], + 'prev' => $pr[0] + ); + } + } + } +} + +// Return scheduled list +function get_scheduled($profile, $page, $perpage) +{ + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $posts = get_scheduled_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + $str = explode('/', $v['dirname']); + if (strtolower($profile) === strtolower($str[1]) || $role === 'admin') { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return false; + } + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Import RSS feed +function migrate($title, $time, $tags, $content, $url, $user, $source) +{ + $post_date = date('Y-m-d-H-i-s', $time); + $post_title = safe_html($title); + $pt = safe_tag($tags); + $post_tag = strtolower(preg_replace(array('/[^a-zA-Z0-9,. \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($pt))); + $post_tagmd = preg_replace(array('/[^a-zA-Z0-9,. \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', ' ', ''), $pt); + $post_tag = rtrim($post_tag, ','); + $post_tagmd = rtrim($post_tagmd, ','); + $post_url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($url))); + if (!empty($source)) { + $post_content = '' . "\n" . '' . "\n\n" . $content . "\n\n" . 'Source: ' . $title . ''; + } else { + $post_content = '' . "\n" . '' . "\n\n" . $content; + } + if (!empty($post_title) && !empty($post_tag) && !empty($post_url) && !empty($post_content)) { + + $filename = $post_date . '_' . $post_tag . '_' . $post_url . '.md'; + $dir = 'content/' . $user . '/blog/uncategorized/post/'; + if (is_dir($dir)) { + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + } else { + mkdir($dir, 0775, true); + file_put_contents($dir . $filename, print_r($post_content, true), LOCK_EX); + } + save_tag_i18n($post_tag, $post_tagmd); + $redirect = site_url() . 'admin/clear-cache'; + header("Location: $redirect"); + } +} + +// Fetch RSS feed +function get_feed($feed_url, $credit) +{ + $source = file_get_contents($feed_url); + $feed = new SimpleXmlElement($source); + if (!empty($feed->channel->item)) { + foreach ($feed->channel->item as $entry) { + $descriptionA = $entry->children('content', true); + $descriptionB = $entry->description; + if (!empty($descriptionA)) { + $content = $descriptionA; + } elseif (!empty($descriptionB)) { + $content = preg_replace('##i', "\n", $descriptionB); + } else { + return $str = '
  • ' . i18n('Cannot_read_feed_content') . '
  • '; + } + $time = new DateTime($entry->pubDate); + $timestamp = $time->format("Y-m-d H:i:s"); + $time = strtotime($timestamp); + $tags = $entry->category; + $title = rtrim($entry->title, ' \,\.\-'); + $title = ltrim($title, ' \,\.\-'); + $user = $_SESSION[site_url()]['user']; + $url = strtolower(preg_replace(array('/[^a-zA-Z0-9 \-\p{L}]/u', '/[ -]+/', '/^-|-$/'), array('', '-', ''), remove_accent($title))); + if ($credit == 'yes') { + $source = $entry->link; + } else { + $source = null; + } + migrate($title, $time, $tags, $content, $url, $user, $source); + } + } else { + return $str = '
  • ' . i18n('Unknown_feed_format') . '
  • '; + } +} + +// return tag safe string +function safe_tag($string) +{ + $tags = array(); + $string = preg_replace('/[\s-]+/', ' ', $string); + $string = explode(',', $string); + $string = array_map('trim', $string); + foreach ($string as $str) { + $tags[] = $str; + } + $string = implode(',', $tags); + $string = preg_replace('/[\s_]/', '-', $string); + return $string; + +} + +// Create Zip files +function Zip($source, $destination, $include_dir = false) +{ + if (!extension_loaded('zip') || !file_exists($source)) { + return false; + } + + if (file_exists($destination)) { + unlink($destination); + } + + $zip = new ZipArchive(); + + if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { + return false; + } + + if (is_dir($source) === true) { + + $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); + + foreach ($files as $file) { + $file = str_replace('\\', '/', $file); + + // Ignore "." and ".." folders + if (in_array(substr($file, strrpos($file, '/') + 1), array('.', '..'))) + continue; + + if (is_dir($file) === true) { + $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); + } elseif (is_file($file) === true) { + $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); + } + } + } elseif (is_file($source) === true) { + $zip->addFromString(basename($source), file_get_contents($source)); + } + + return $zip->close(); +} + +// Return toolbar +function toolbar() +{ + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $base = site_url(); + $toolbar = ''; + + $toolbar .= << +EOF; + $toolbar .= '
    '; + echo $toolbar; +} + +// save the i18n tag +function save_tag_i18n($tag,$tagDisplay) +{ + + $dir = 'content/data/'; + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + $filename = "content/data/tags.lang"; + $tags = array(); + $tmp = array(); + $views = array(); + + $tt = explode(',', rtrim($tag, ',')); + $tl = explode(',', rtrim($tagDisplay, ',')); + $tags = array_combine($tt,$tl); + + if (file_exists($filename)) { + $views = unserialize(file_get_contents($filename)); + foreach ($tags as $key => $val) { + if (isset($views[$key])) { + $views[$key] = $val; + } else { + $views[$key] = $val; + } + } + } else { + $views = $tags; + } + + $tmp = serialize($views); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + +} + +function clear_post_cache($post_date, $post_tag, $post_url, $filename, $category, $type) +{ + $b = str_replace('/', '#', site_path() . '/'); + $c = explode(',', $post_tag); + $t = explode('-', $post_date); + + // Delete post default permalink + $p = 'cache/page/' . $b . $t[0] . '#' . $t[1] . '#' . $post_url . '.cache'; + if (file_exists($p)) { + unlink($p); + } + + // Delete post permalink + $pp = 'cache/page/' . $b . 'post#' . $post_url . '.cache'; + if (file_exists($pp)) { + unlink($pp); + } + + // Delete homepage + $yd = 'cache/page/' . $b . '.cache'; + if (file_exists($yd)) { + unlink($yd); + } + foreach (glob('cache/page/' . $b . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete year + $yd = 'cache/page/' . $b . 'archive#' . $t[0] . '.cache'; + if (file_exists($yd)) { + unlink($yd); + } + foreach (glob('cache/page/' . $b . 'archive#' . $t[0] . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete year-month + $yd = 'cache/page/' . $b . 'archive#' . $t[0] . '-' . $t[1] . '.cache'; + if (file_exists($yd)) { + unlink($yd); + } + foreach (glob('cache/page/' . $b . 'archive#' . $t[0] . '-' . $t[1] . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete year-month-day + $yd = 'cache/page/' . $b . 'archive#' . $t[0] . '-' . $t[1] . '-' . $t[2] . '.cache'; + if (file_exists($yd)) { + unlink($yd); + } + foreach (glob('cache/page/' . $b . 'archive#' . $t[0] . '-' . $t[1] . '-' . $t[2] . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete tag + foreach ($c as $tag) { + $yd = 'cache/page/' . $b . 'tag#' . $tag . '.cache'; + if (file_exists($yd)) { + unlink($yd); + } + foreach (glob('cache/page/' . $b . 'tag#' . $tag . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + } + + // Delete search + foreach (glob('cache/page/' . $b . 'search#*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete category + $cc = 'cache/page/' . $b . 'category#' . $category . '.cache'; + if (file_exists($cc)) { + unlink($cc); + } + foreach (glob('cache/page/' . $b . 'category#' . $category . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Delete type + $tp = 'cache/page/' . $b . 'type#' . $type . '.cache'; + if (file_exists($tp)) { + unlink($tp); + } + foreach (glob('cache/page/' . $b . 'type#' . $type . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + + // Get cache post author + $arr = pathinfo($filename, PATHINFO_DIRNAME); + $x = explode('/', $arr); + // Delete author post list cache + $a = 'cache/page/' . $b . 'author#' . $x[1] . '.cache'; + if (file_exists($a)) { + unlink($a); + } + foreach (glob('cache/page/' . $b . 'author#' . $x[1] . '~*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } +} + +function clear_page_cache($url) +{ + $b = str_replace('/', '#', site_path() . '/'); + $p = 'cache/page/' . $b . $url . '.cache'; + if (file_exists($p)) { + unlink($p); + } +} + +function clear_cache() +{ + foreach (glob('cache/page/*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } +} + +function valueMaker($value) +{ + if (is_string($value)) + return htmlspecialchars($value); + + if ($value === true) + return "true"; + if ($value === false) + return "false"; + + if ($value == false) + return "0"; + return (string)$value; +} + +function replace_key($arr, $oldkey, $newkey) +{ + if(array_key_exists($oldkey, $arr)) { + $keys = array_keys($arr); + $keys[array_search($oldkey, $keys)] = $newkey; + return array_combine($keys, $arr); + } + return $arr; +} + +// rename category folder +function rename_category_folder($new_name, $old_file) +{ + $old_name = str_replace('.md', '', basename($old_file)); + $dir = get_category_folder(); + foreach ($dir as $index => $v) { + if (stripos($v, '/' . $old_name . '/') !== false) { + $str = explode('/', $v); + $old_folder = $str[0] . '/' . $str[1] . '/' . $str[2] . '/' . $old_name . '/'; + $new_folder = $str[0] . '/' . $str[1] . '/' . $str[2] . '/' . $new_name . '/'; + rename($old_folder, $new_folder); + } + } +} + +// reorder the static page +function reorder_pages($pages = null) +{ + $i = 1; + $arr = array(); + $dir = 'content/static/'; + foreach ($pages as $p) { + $fn = pathinfo($p, PATHINFO_FILENAME); + $num = str_pad($i, 2, 0, STR_PAD_LEFT); + $arr = explode('.' , $fn); + if (isset($arr[1])) { + rename ($dir . $p, $dir . $num . '.' . $arr[1] . '.md'); + if (is_dir($dir . $fn)) { + rename($dir . $fn, $dir . $num . '.' . $arr[1]); + } + } else { + rename($dir . $p, $dir . $num . '.' . $fn . '.md'); + if (is_dir($dir . $fn)) { + rename($dir . $fn, $dir . $num . '.' . $fn); + } + } + $i++; + } + + rebuilt_cache(); +} + +// reorder the subpage +function reorder_subpages($subpages = null) +{ + $i = 1; + $arr = array(); + $dir = 'content/static/'; + foreach ($subpages as $sp) { + $dn = $dir . pathinfo($sp, PATHINFO_DIRNAME) . '/'; + $fn = pathinfo($sp, PATHINFO_FILENAME); + $num = str_pad($i, 2, 0, STR_PAD_LEFT); + $arr = explode('.' , $fn); + if (isset($arr[1])) { + rename ($dir . $sp, $dn . $num . '.' . $arr[1] . '.md'); + } else { + rename($dir . $sp, $dn . $num . '.' . $fn . '.md'); + } + + $i++; + + } + + rebuilt_cache(); +} + +// Return image gallery in pager. +function image_gallery($images, $page = 1, $perpage = 0) +{ + if (empty($images)) { + $images = scan_images(); + } + $tmp = ''; + $pagination = has_pagination(count($images), $perpage, $page); + $images = array_slice($images, ($page - 1) * $perpage, $perpage); + $tmp .= '
    '; + foreach ($images as $index => $v) { + $tmp .= '
    '; + } + $tmp .= '

    '; + if (!empty($pagination['prev'])) { + $prev = $page - 1; + $tmp .= '← '. i18n('Prev') .''; + } + if (!empty($pagination['next'])) { + $next = $page + 1; + $tmp .= ''. i18n('Next') .' →'; + } + $tmp .= '
    '; + return $tmp; +} + +function authorized ($data = null) +{ + if (login()) { + if (is_null($data)) { + return false; + } + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (isset($data->author)) { + if ($user === $data->author || $role === 'editor' || $role === 'admin') { + return true; + } else { + return false; + } + } else { + if ($role === 'editor' || $role === 'admin') { + return true; + } else { + return false; + } + } + } +} diff --git a/system/admin/editor/LICENSE.txt b/system/admin/editor/LICENSE.txt new file mode 100644 index 0000000..d4c1099 --- /dev/null +++ b/system/admin/editor/LICENSE.txt @@ -0,0 +1,32 @@ +A javascript port of Markdown, as used on Stack Overflow +and the rest of Stack Exchange network. + +Largely based on showdown.js by John Fraser (Attacklab). + +Original Markdown Copyright (c) 2004-2005 John Gruber + + + +Original Showdown code copyright (c) 2007 John Fraser + +Modifications and bugfixes (c) 2009 Dana Robinson +Modifications and bugfixes (c) 2009-2013 Stack Exchange Inc. + +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 +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. + diff --git a/system/admin/editor/css/editor.css b/system/admin/editor/css/editor.css new file mode 100644 index 0000000..580172f --- /dev/null +++ b/system/admin/editor/css/editor.css @@ -0,0 +1,184 @@ +body { + font-family: Georgia, sans-serif; +} + +blockquote { + border-left: 2px dotted #888; + padding-left: 5px; + background: #F6F7F9; +} + +.wmd-panel { + float: left; +} + +.wmd-button-bar { + background-color: #F6F7F9; + padding: 5px 0; + margin-bottom: 10px; + width: 100%; + border: 1px solid #CFDAE5; + border-radius:5px; + display: block; + float: left; +} +.dark-mode .wmd-button-bar { + background-color: #292d32; + border-color: #292d32 !important; +} +.wmd-button-bar:hover { + border: 1px solid #CCCCCC; +} + +.wmd-input { + min-height: 300px; +} + +.wmd-preview { + background-color: #E4EBF1; + float: left; + padding: 2%; +} + +.wmd-preview table { + margin: 20px 0; +} + +.wmd-preview td, .wmd-preview th { + border-right: 1px solid #ccc; + padding: 8px 12px; +} + +.wmd-preview td:last-child, .wmd-preview th:last-child { + border-right: none; +} + +.wmd-preview td { + border-top: 1px solid #ccc; +} + +.wmd-button-row { + position: relative; + margin: 0px; + padding: 0px; +} + +.wmd-spacer { + width: 1px; + height: 20px; + background-color: Silver; + list-style: none; + float: left; + margin: 5px; +} + +.wmd-button { + list-style: none; + cursor: pointer; + float: left; +} + +.wmd-button > span { + background-repeat: no-repeat; + background-position: 0px 0px; + display: inline-block; +} + +.dark-mode .wmd-button > span.btn-light { + color: #fff; + background-color: #292d32; + border-color: #292d32; + box-shadow: none; +} +.dark-mode .wmd-button > span.btn-light:not(.disabled):hover { + background-color: #171a1d; + border-color: #343a40; +} +.wmd-spacer1 { + left: 50px; +} + +.wmd-spacer2 { + left: 175px; +} + +.wmd-spacer3 { + left: 300px; +} + +.wmd-prompt-background { + background-color: Black; +} + +.wmd-prompt-dialog { + border: 1px solid #999999; + background-color: #F5F5F5; +} + +.wmd-prompt-dialog > div { + font-size: 0.8em; + font-family: arial, helvetica, sans-serif; +} + +.wmd-prompt-dialog > form > input[type="text"] { + border: 1px solid #999999; + color: black; +} + +.wmd-prompt-dialog > form > input[type="button"] { + border: 1px solid #888888; + font-family: trebuchet MS, helvetica, sans-serif; + font-size: 0.8em; + font-weight: bold; +} + +pre { + margin: 1em 0; + overflow: auto; + background: #F1F1FF; +} + +pre code { + color: #333333; + display: block; + font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif; + font-size: 14px; + padding: 5px 10px; +} + +@media all and (max-width: 980px) { + + .nav { + width: 100%; + padding: 2%; + } + + .wmd-panel, .wmd-preview { + width: 96%; + float: left; + padding: 2%; + } + + pre { + white-space: pre-wrap; + word-wrap: break-word; + } + +} + +.notice { + position: fixed; + bottom: 20px; + right: 20px; + padding: 10px 20px; + background-color: #f0f9ff; + border: 1px solid #e0e0e0; + border-radius: 5px; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1); + font-size: 14px; + color: #333; + z-index: 999; + display: flex; + align-items: center; + display: none; +} \ No newline at end of file diff --git a/system/admin/editor/js/Markdown.Converter.js b/system/admin/editor/js/Markdown.Converter.js new file mode 100644 index 0000000..60e0bb5 --- /dev/null +++ b/system/admin/editor/js/Markdown.Converter.js @@ -0,0 +1,1428 @@ +var Markdown; + +if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module + Markdown = exports; +else + Markdown = {}; + +// The following text is included for historical reasons, but should +// be taken with a pinch of salt; it's not all true anymore. + +// +// Wherever possible, Showdown is a straight, line-by-line port +// of the Perl version of Markdown. +// +// This is not a normal parser design; it's basically just a +// series of string substitutions. It's hard to read and +// maintain this way, but keeping Showdown close to the original +// design makes it easier to port new features. +// +// More importantly, Showdown behaves like markdown.pl in most +// edge cases. So web applications can do client-side preview +// in Javascript, and then build identical HTML on the server. +// +// This port needs the new RegExp functionality of ECMA 262, +// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers +// should do fine. Even with the new regular expression features, +// We do a lot of work to emulate Perl's regex functionality. +// The tricky changes in this file mostly have the "attacklab:" +// label. Major or self-explanatory changes don't. +// +// Smart diff tools like Araxis Merge will be able to match up +// this file with markdown.pl in a useful way. A little tweaking +// helps: in a copy of markdown.pl, replace "#" with "//" and +// replace "$text" with "text". Be sure to ignore whitespace +// and line endings. +// + + +// +// Usage: +// +// var text = "Markdown *rocks*."; +// +// var converter = new Markdown.Converter(); +// var html = converter.makeHtml(text); +// +// alert(html); +// +// Note: move the sample code to the bottom of this +// file before uncommenting it. +// + +(function () { + + function identity(x) { + return x; + } + + function returnFalse(x) { + return false; + } + + function HookCollection() { + } + + HookCollection.prototype = { + + chain: function (hookname, func) { + var original = this[hookname]; + if (!original) + throw new Error("unknown hook " + hookname); + + if (original === identity) + this[hookname] = func; + else + this[hookname] = function (text) { + var args = Array.prototype.slice.call(arguments, 0); + args[0] = original.apply(null, args); + return func.apply(null, args); + }; + }, + set: function (hookname, func) { + if (!this[hookname]) + throw new Error("unknown hook " + hookname); + this[hookname] = func; + }, + addNoop: function (hookname) { + this[hookname] = identity; + }, + addFalse: function (hookname) { + this[hookname] = returnFalse; + } + }; + + Markdown.HookCollection = HookCollection; + + // g_urls and g_titles allow arbitrary user-entered strings as keys. This + // caused an exception (and hence stopped the rendering) when the user entered + // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this + // (since no builtin property starts with "s_"). See + // http://meta.stackoverflow.com/questions/64655/strange-wmd-bug + // (granted, switching from Array() to Object() alone would have left only __proto__ + // to be a problem) + function SaveHash() { + } + + SaveHash.prototype = { + set: function (key, value) { + this["s_" + key] = value; + }, + get: function (key) { + return this["s_" + key]; + } + }; + + Markdown.Converter = function () { + var pluginHooks = this.hooks = new HookCollection(); + + // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link + pluginHooks.addNoop("plainLinkText"); + + // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked + pluginHooks.addNoop("preConversion"); + + // called with the text once all normalizations have been completed (tabs to spaces, line endings, etc.), but before any conversions have + pluginHooks.addNoop("postNormalization"); + + // Called with the text before / after creating block elements like code blocks and lists. Note that this is called recursively + // with inner content, e.g. it's called with the full text, and then only with the content of a blockquote. The inner + // call will receive outdented text. + pluginHooks.addNoop("preBlockGamut"); + pluginHooks.addNoop("postBlockGamut"); + + // called with the text of a single block element before / after the span-level conversions (bold, code spans, etc.) have been made + pluginHooks.addNoop("preSpanGamut"); + pluginHooks.addNoop("postSpanGamut"); + + // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml + pluginHooks.addNoop("postConversion"); + + // + // Private state of the converter instance: + // + + // Global hashes, used by various utility routines + var g_urls; + var g_titles; + var g_html_blocks; + + // Used to track when we're inside an ordered or unordered list + // (see _ProcessListItems() for details): + var g_list_level; + + this.makeHtml = function (text) { + + // + // Main function. The order in which other subs are called here is + // essential. Link and image substitutions need to happen before + // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the + // and tags get encoded. + // + + // This will only happen if makeHtml on the same converter instance is called from a plugin hook. + // Don't do that. + if (g_urls) + throw new Error("Recursive call to converter.makeHtml"); + + // Create the private state objects. + g_urls = new SaveHash(); + g_titles = new SaveHash(); + g_html_blocks = []; + g_list_level = 0; + + text = pluginHooks.preConversion(text); + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g, "~T"); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, "~D"); + + // Standardize line endings + text = text.replace(/\r\n/g, "\n"); // DOS to Unix + text = text.replace(/\r/g, "\n"); // Mac to Unix + + // Make sure text begins and ends with a couple of newlines: + text = "\n\n" + text + "\n\n"; + + // Convert all tabs to spaces. + text = _Detab(text); + + // Strip any lines consisting only of spaces and tabs. + // This makes subsequent regexen easier to write, because we can + // match consecutive blank lines with /\n+/ instead of something + // contorted like /[ \t]*\n+/ . + text = text.replace(/^[ \t]+$/mg, ""); + + text = pluginHooks.postNormalization(text); + + // Turn block-level HTML blocks into hash entries + text = _HashHTMLBlocks(text); + + // Strip link definitions, store in hashes. + text = _StripLinkDefinitions(text); + + text = _RunBlockGamut(text); + + text = _UnescapeSpecialChars(text); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g, "$$"); + + // attacklab: Restore tildes + text = text.replace(/~T/g, "~"); + + text = pluginHooks.postConversion(text); + + g_html_blocks = g_titles = g_urls = null; + + return text; + }; + + function _StripLinkDefinitions(text) { + // + // Strips link definitions from text, stores the URLs and titles in + // hash references. + // + + // Link defs are in the form: ^[id]: url "optional title" + + /* + text = text.replace(/ + ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 + [ \t]* + \n? // maybe *one* newline + [ \t]* + ? // url = $2 + (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below + [ \t]* + \n? // maybe one newline + [ \t]* + ( // (potential) title = $3 + (\n*) // any lines skipped = $4 attacklab: lookbehind removed + [ \t]+ + ["(] + (.+?) // title = $5 + [")] + [ \t]* + )? // title is optional + (?:\n+|$) + /gm, function(){...}); + */ + + text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, + function (wholeMatch, m1, m2, m3, m4, m5) { + m1 = m1.toLowerCase(); + g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive + if (m4) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return m3; + } else if (m5) { + g_titles.set(m1, m5.replace(/"/g, """)); + } + + // Completely remove the definition from the text + return ""; + } + ); + + return text; + } + + function _HashHTMLBlocks(text) { + + // Hashify HTML blocks: + // We only want to do this for block-level HTML tags, such as headers, + // lists, and tables. That's because we still want to wrap

    s around + // "paragraphs" that are wrapped in non-block-level tags, such as anchors, + // phrase emphasis, and spans. The list of tags we're looking for is + // hard-coded: + var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" + var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" + + // First, look for nested blocks, e.g.: + //

    + //
    + // tags for inner block must be indented. + //
    + //
    + // + // The outermost tags must start at the left margin for this to match, and + // the inner nested divs must be indented. + // We need to do this before the next, more liberal match, because the next + // match will start at the first `
    ` and stop at the first `
    `. + + // attacklab: This regex can be expensive when it fails. + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_a) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*?\n // any number of lines, minimally matching + // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement); + + // + // Now match more liberally, simply from `\n` to `\n` + // + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_b) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*? // any number of lines, minimally matching + .* // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement); + + // Special case just for
    . It was easier to make a special case than + // to make the other regex more complicated. + + /* + text = text.replace(/ + \n // Starting after a blank line + [ ]{0,3} + ( // save in $1 + (<(hr) // start tag = $2 + \b // word break + ([^<>])*? + \/?>) // the matching end tag + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement); + + // Special case for standalone HTML comments: + + /* + text = text.replace(/ + \n\n // Starting after a blank line + [ ]{0,3} // attacklab: g_tab_width - 1 + ( // save in $1 + -]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackoverflow.com/q/95256 + > + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/\n\n[ ]{0,3}(-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashElement); + + // PHP and ASP-style processor instructions ( and <%...%>) + + /* + text = text.replace(/ + (?: + \n\n // Starting after a blank line + ) + ( // save in $1 + [ ]{0,3} // attacklab: g_tab_width - 1 + (?: + <([?%]) // $2 + [^\r]*? + \2> + ) + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement); + + return text; + } + + function hashElement(wholeMatch, m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/^\n+/, ""); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g, ""); + + // Replace the element text with a marker ("~KxK" where x is its key) + blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n"; + + return blockText; + } + + var blockGamutHookCallback = function (t) { + return _RunBlockGamut(t); + } + + function _RunBlockGamut(text, doNotUnhash) { + // + // These are all the transformations that form block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preBlockGamut(text, blockGamutHookCallback); + + text = _DoHeaders(text); + + // Do Horizontal Rules: + var replacement = "
    \n"; + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement); + + text = _DoLists(text); + text = _DoCodeBlocks(text); + text = _DoBlockQuotes(text); + + text = pluginHooks.postBlockGamut(text, blockGamutHookCallback); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

    tags around block-level tags. + text = _HashHTMLBlocks(text); + text = _FormParagraphs(text, doNotUnhash); + + return text; + } + + function _RunSpanGamut(text) { + // + // These are all the transformations that occur *within* block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preSpanGamut(text); + + text = _DoCodeSpans(text); + text = _EscapeSpecialCharsWithinTagAttributes(text); + text = _EncodeBackslashEscapes(text); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = _DoImages(text); + text = _DoAnchors(text); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = _DoAutoLinks(text); + + text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now + + text = _EncodeAmpsAndAngles(text); + text = _DoItalicsAndBold(text); + + // Do hard breaks: + text = text.replace(/ +\n/g, "
    \n"); + + text = pluginHooks.postSpanGamut(text); + + return text; + } + + function _EscapeSpecialCharsWithinTagAttributes(text) { + // + // Within tags -- meaning between < and > -- encode [\ ` * _] so they + // don't conflict with their use in Markdown for code, italics and strong. + // + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + + // SE: changed the comment part of the regex + + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi; + + text = text.replace(regex, function (wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`"); + tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackoverflow.com/questions/95987 + return tag; + }); + + return text; + } + + function _DoAnchors(text) { + // + // Turn Markdown link shortcuts into XHTML
    tags. + // + // + // First, handle reference-style links: [link text] [id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad remaining backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + )* + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g, writeAnchorTag); + */ + + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + ) + ()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); + + return text; + } + + function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) { + if (m7 == undefined) m7 = ""; + var whole_match = m1; + var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = link_text.toLowerCase().replace(/ ?\n/g, " "); + } + url = "#" + link_id; + + if (g_urls.get(link_id) != undefined) { + url = g_urls.get(link_id); + if (g_titles.get(link_id) != undefined) { + title = g_titles.get(link_id); + } + } + else { + if (whole_match.search(/\(\s*\)$/m) > -1) { + // Special case for explicit empty url + url = ""; + } else { + return whole_match; + } + } + } + url = encodeProblemUrlChars(url); + url = escapeCharacters(url, "*_"); + var result = ""; + + return result; + } + + function _DoImages(text) { + // + // Turn Markdown image shortcuts into tags. + // + + // + // First, handle reference-style labeled images: ![alt text][id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad rest of backreferences + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag); + + // + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + \s? // One optional whitespace character + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // src url = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // title = $7 + \6 // matching quote + [ \t]* + )? // title is optional + \) + ) + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag); + + return text; + } + + function attributeEncode(text) { + // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title) + // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it) + return text.replace(/>/g, ">").replace(/" + _RunSpanGamut(m1) + "\n\n"; + } + ); + + text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, + function (matchFound, m1) { + return "

    " + _RunSpanGamut(m1) + "

    \n\n"; + } + ); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + + /* + text = text.replace(/ + ^(\#{1,6}) // $1 = string of #'s + [ \t]* + (.+?) // $2 = Header text + [ \t]* + \#* // optional closing #'s (not counted) + \n+ + /gm, function() {...}); + */ + + text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, + function (wholeMatch, m1, m2) { + var h_level = m1.length; + return "" + _RunSpanGamut(m2) + "\n\n"; + } + ); + + return text; + } + + function _DoLists(text, isInsideParagraphlessListItem) { + // + // Form HTML ordered (numbered) and unordered (bulleted) lists. + // + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += "~0"; + + // Re-usable pattern to match any entirel ul or ol list: + + /* + var whole_list = / + ( // $1 = whole list + ( // $2 + [ ]{0,3} // attacklab: g_tab_width - 1 + ([*+-]|\d+[.]) // $3 = first list item marker + [ \t]+ + ) + [^\r]+? + ( // $4 + ~0 // sentinel for workaround; should be $ + | + \n{2,} + (?=\S) + (?! // Negative lookahead for another list item marker + [ \t]* + (?:[*+-]|\d+[.])[ \t]+ + ) + ) + ) + /g + */ + var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + if (g_list_level) { + text = text.replace(whole_list, function (wholeMatch, m1, m2) { + var list = m1; + var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol"; + + var result = _ProcessListItems(list, list_type, isInsideParagraphlessListItem); + + // Trim any trailing whitespace, to put the closing `` + // up on the preceding line, to get it past the current stupid + // HTML block parser. This is a hack to work around the terrible + // hack that is the HTML block parser. + result = result.replace(/\s+$/, ""); + result = "<" + list_type + ">" + result + "\n"; + return result; + }); + } else { + whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; + text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) { + var runup = m1; + var list = m2; + + var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol"; + var result = _ProcessListItems(list, list_type); + result = runup + "<" + list_type + ">\n" + result + "\n"; + return result; + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + var _listItemMarkers = {ol: "\\d+[.]", ul: "[*+-]"}; + + function _ProcessListItems(list_str, list_type, isInsideParagraphlessListItem) { + // + // Process the contents of a single ordered or unordered list, splitting it + // into individual list items. + // + // list_type is either "ul" or "ol". + + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + + g_list_level++; + + // trim trailing blank lines: + list_str = list_str.replace(/\n{2,}$/, "\n"); + + // attacklab: add sentinel to emulate \z + list_str += "~0"; + + // In the original attacklab showdown, list_type was not given to this function, and anything + // that matched /[*+-]|\d+[.]/ would just create the next
  • , causing this mismatch: + // + // Markdown rendered by WMD rendered by MarkdownSharp + // ------------------------------------------------------------------ + // 1. first 1. first 1. first + // 2. second 2. second 2. second + // - third 3. third * third + // + // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx, + // with {MARKER} being one of \d+[.] or [*+-], depending on list_type: + + /* + list_str = list_str.replace(/ + (^[ \t]*) // leading whitespace = $1 + ({MARKER}) [ \t]+ // list marker = $2 + ([^\r]+? // list item text = $3 + (\n+) + ) + (?= + (~0 | \2 ({MARKER}) [ \t]+) + ) + /gm, function(){...}); + */ + + var marker = _listItemMarkers[list_type]; + var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm"); + var last_item_had_a_double_newline = false; + list_str = list_str.replace(re, + function (wholeMatch, m1, m2, m3) { + var item = m3; + var leading_space = m1; + var ends_with_double_newline = /\n\n$/.test(item); + var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1; + + if (contains_double_newline || last_item_had_a_double_newline) { + item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true); + } + else { + // Recursion for sub-lists: + item = _DoLists(_Outdent(item), /* isInsideParagraphlessListItem= */ true); + item = item.replace(/\n$/, ""); // chomp(item) + if (!isInsideParagraphlessListItem) // only the outer-most item should run this, otherwise it's run multiple times for the inner ones + item = _RunSpanGamut(item); + } + last_item_had_a_double_newline = ends_with_double_newline; + return "
  • " + item + "
  • \n"; + } + ); + + // attacklab: strip sentinel + list_str = list_str.replace(/~0/g, ""); + + g_list_level--; + return list_str; + } + + function _DoCodeBlocks(text) { + // + // Process Markdown `
    ` blocks.
    +            //  
    +
    +            /*
    +             text = text.replace(/
    +             (?:\n\n|^)
    +             (                               // $1 = the code block -- one or more lines, starting with a space/tab
    +             (?:
    +             (?:[ ]{4}|\t)           // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
    +             .*\n+
    +             )+
    +             )
    +             (\n*[ ]{0,3}[^ \t\n]|(?=~0))    // attacklab: g_tab_width
    +             /g ,function(){...});
    +             */
    +
    +            // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
    +            text += "~0";
    +
    +            text = text.replace(/(?:\n\n|^\n?)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
    +                function (wholeMatch, m1, m2) {
    +                    var codeblock = m1;
    +                    var nextChar = m2;
    +
    +                    codeblock = _EncodeCode(_Outdent(codeblock));
    +                    codeblock = _Detab(codeblock);
    +                    codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
    +                    codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
    +
    +                    codeblock = "
    " + codeblock + "\n
    "; + + return "\n\n" + codeblock + "\n\n" + nextChar; + } + ); + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + function hashBlock(text) { + text = text.replace(/(^\n+|\n+$)/g, ""); + return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n"; + } + + function _DoCodeSpans(text) { + // + // * Backtick quotes are used for spans. + // + // * You can use multiple backticks as the delimiters if you want to + // include literal backticks in the code span. So, this input: + // + // Just type ``foo `bar` baz`` at the prompt. + // + // Will translate to: + // + //

    Just type foo `bar` baz at the prompt.

    + // + // There's no arbitrary limit to the number of backticks you + // can use as delimters. If you need three consecutive backticks + // in your code, use four for delimiters, etc. + // + // * You can use spaces to get literal backticks at the edges: + // + // ... type `` `bar` `` ... + // + // Turns to: + // + // ... type `bar` ... + // + + /* + text = text.replace(/ + (^|[^\\]) // Character before opening ` can't be a backslash + (`+) // $2 = Opening run of ` + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3, m4) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ""); // leading whitespace + c = c.replace(/[ \t]*$/g, ""); // trailing whitespace + c = _EncodeCode(c); + c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs. + return m1 + "" + c + ""; + } + ); + + return text; + } + + function _EncodeCode(text) { + // + // Encode/escape certain characters inside Markdown code runs. + // The point is that in code, these characters are literals, + // and lose their special Markdown meanings. + // + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g, "&"); + + // Do the angle bracket song and dance: + text = text.replace(//g, ">"); + + // Now, escape characters that are magic in Markdown: + text = escapeCharacters(text, "\*_{}[]\\", false); + + // jj the line above breaks this: + //--- + + //* Item + + // 1. Subitem + + // special char: * + //--- + + return text; + } + + function _DoItalicsAndBold(text) { + + // must go first: + text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g, + "$1$3$4"); + + text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g, + "$1$3$4"); + + return text; + } + + function _DoBlockQuotes(text) { + + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, + function (wholeMatch, m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g, ""); + + bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines + bq = _RunBlockGamut(bq); // recurse + + bq = bq.replace(/(^|\n)/g, "$1 "); + // These leading spaces screw with
     content, so we need to fix that:
    +                    bq = bq.replace(
    +                        /(\s*
    [^\r]+?<\/pre>)/gm,
    +                        function (wholeMatch, m1) {
    +                            var pre = m1;
    +                            // attacklab: hack around Konqueror 3.5.4 bug:
    +                            pre = pre.replace(/^  /mg, "~0");
    +                            pre = pre.replace(/~0/g, "");
    +                            return pre;
    +                        });
    +
    +                    return hashBlock("
    \n" + bq + "\n
    "); + } + ); + return text; + } + + function _FormParagraphs(text, doNotUnhash) { + // + // Params: + // $text - string to process with html

    tags + // + + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ""); + text = text.replace(/\n+$/g, ""); + + var grafs = text.split(/\n{2,}/g); + var grafsOut = []; + + var markerRe = /~K(\d+)K/; + + // + // Wrap

    tags. + // + var end = grafs.length; + for (var i = 0; i < end; i++) { + var str = grafs[i]; + + // if this is an HTML marker, copy it + if (markerRe.test(str)) { + grafsOut.push(str); + } + else if (/\S/.test(str)) { + str = _RunSpanGamut(str); + str = str.replace(/^([ \t]*)/g, "

    "); + str += "

    " + grafsOut.push(str); + } + + } + // + // Unhashify HTML blocks + // + if (!doNotUnhash) { + end = grafsOut.length; + for (var i = 0; i < end; i++) { + var foundAny = true; + while (foundAny) { // we may need several runs, since the data may be nested + foundAny = false; + grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) { + foundAny = true; + return g_html_blocks[id]; + }); + } + } + } + return grafsOut.join("\n\n"); + } + + function _EncodeAmpsAndAngles(text) { + // Smart processing for ampersands and angle brackets that need to be encoded. + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?!]|~D)/gi, "<"); + + return text; + } + + function _EncodeBackslashEscapes(text) { + // + // Parameter: String. + // Returns: The string, with after processing the following backslash + // escape sequences. + // + + // attacklab: The polite way to do this is with the new + // escapeCharacters() function: + // + // text = escapeCharacters(text,"\\",true); + // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + // + // ...but we're sidestepping its use of the (slow) RegExp constructor + // as an optimization for Firefox. This function gets called a LOT. + + text = text.replace(/\\(\\)/g, escapeCharacters_callback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback); + return text; + } + + var charInsideUrl = "[-A-Z0-9+&@#/%?=~_|[\\]()!:,.;]", + charEndingUrl = "[-A-Z0-9+&@#/%=~_|[\\])]", + autoLinkRegex = new RegExp("(=\"|<)?\\b(https?|ftp)(://" + charInsideUrl + "*" + charEndingUrl + ")(?=$|\\W)", "gi"), + endCharRegex = new RegExp(charEndingUrl, "i"); + + function handleTrailingParens(wholeMatch, lookbehind, protocol, link) { + if (lookbehind) + return wholeMatch; + if (link.charAt(link.length - 1) !== ")") + return "<" + protocol + link + ">"; + var parens = link.match(/[()]/g); + var level = 0; + for (var i = 0; i < parens.length; i++) { + if (parens[i] === "(") { + if (level <= 0) + level = 1; + else + level++; + } + else { + level--; + } + } + var tail = ""; + if (level < 0) { + var re = new RegExp("\\){1," + (-level) + "}$"); + link = link.replace(re, function (trailingParens) { + tail = trailingParens; + return ""; + }); + } + if (tail) { + var lastChar = link.charAt(link.length - 1); + if (!endCharRegex.test(lastChar)) { + tail = lastChar + tail; + link = link.substr(0, link.length - 1); + } + } + return "<" + protocol + link + ">" + tail; + } + + function _DoAutoLinks(text) { + + // note that at this point, all other URL in the text are already hyperlinked as
    + // *except* for the case + + // automatically add < and > around unadorned raw hyperlinks + // must be preceded by a non-word character (and not by =" or <) and followed by non-word/EOF character + // simulating the lookbehind in a consuming way is okay here, since a URL can neither and with a " nor + // with a <, so there is no risk of overlapping matches. + text = text.replace(autoLinkRegex, handleTrailingParens); + + // autolink anything like + + var replacer = function (wholematch, m1) { + return "" + pluginHooks.plainLinkText(m1) + ""; + } + text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer); + + // Email addresses: + /* + text = text.replace(/ + < + (?:mailto:)? + ( + [-.\w]+ + \@ + [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ + ) + > + /gi, _DoAutoLinks_callback()); + */ + + /* disabling email autolinking, since we don't do that on the server, either + text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + function(wholeMatch,m1) { + return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); + } + ); + */ + return text; + } + + function _UnescapeSpecialChars(text) { + // + // Swap back in all the special characters we've hidden. + // + text = text.replace(/~E(\d+)E/g, + function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + } + ); + return text; + } + + function _Outdent(text) { + // + // Remove one level of line-leading tabs or spaces + // + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g, "") + + return text; + } + + function _Detab(text) { + if (!/\t/.test(text)) + return text; + + var spaces = [" ", " ", " ", " "], + skew = 0, + v; + + return text.replace(/[\n\t]/g, function (match, offset) { + if (match === "\n") { + skew = offset + 1; + return match; + } + v = (offset - skew) % 4; + skew = offset + 1; + return spaces[v]; + }); + } + + // + // attacklab: Utility functions + // + + var _problemUrlChars = /(?:["'*()[\]:]|~D)/g; + + // hex-encodes some unusual "problem" chars in URLs to avoid URL detection problems + function encodeProblemUrlChars(url) { + if (!url) + return ""; + + var len = url.length; + + return url.replace(_problemUrlChars, function (match, offset) { + if (match == "~D") // escape for dollar + return "%24"; + if (match == ":") { + if (offset == len - 1 || /[0-9\/]/.test(url.charAt(offset + 1))) + return ":" + } + return "%" + match.charCodeAt(0).toString(16); + }); + } + + + function escapeCharacters(text, charsToEscape, afterBackslash) { + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])"; + + if (afterBackslash) { + regexString = "\\\\" + regexString; + } + + var regex = new RegExp(regexString, "g"); + text = text.replace(regex, escapeCharacters_callback); + + return text; + } + + + function escapeCharacters_callback(wholeMatch, m1) { + var charCodeToEscape = m1.charCodeAt(0); + return "~E" + charCodeToEscape + "E"; + } + + }; // end of the Markdown.Converter constructor + +})(); diff --git a/system/admin/editor/js/Markdown.Editor.js b/system/admin/editor/js/Markdown.Editor.js new file mode 100644 index 0000000..bec160b --- /dev/null +++ b/system/admin/editor/js/Markdown.Editor.js @@ -0,0 +1,2489 @@ +// needs Markdown.Converter.js at the moment + +(function () { + + var util = {}, + position = {}, + ui = {}, + doc = window.document, + re = window.RegExp, + nav = window.navigator, + SETTINGS = {lineLength: 72}, + + // Used to work around some browser bugs where we can't use feature testing. + uaSniffed = { + isIE: /msie/.test(nav.userAgent.toLowerCase()), + isIE_5or6: /msie 6/.test(nav.userAgent.toLowerCase()) || /msie 5/.test(nav.userAgent.toLowerCase()), + isOpera: /opera/.test(nav.userAgent.toLowerCase()) + }; + + var defaultsStrings = { + bold: "Strong Ctrl+B", + boldexample: "strong text", + + italic: "Emphasis Ctrl+I", + italicexample: "emphasized text", + + strikethrough: "Strikethrough Ctrl+X", + strikethroughexample: "strikethrough text", + + link: "Hyperlink Ctrl+L", + linkdescription: "enter link description here", + linkdialog: "

    Insert Hyperlink

    https://example.com/ \"optional title\"

    ", + + quote: "Blockquote
    Ctrl+Q", + quoteexample: "Blockquote", + + code: "Code
     Ctrl+K",
    +        codeexample: "enter code here",
    +
    +        image: "Image  Ctrl+G",
    +        imagedescription: "enter image description here",
    +        imagedialog: "

    Insert Image

    https://example.com/images/diagram.jpg \"optional title\"

    Need
    free image hosting?

    ", + + olist: "Numbered List
      Ctrl+O", + ulist: "Bulleted List
        Ctrl+U", + litem: "List item", + + heading: "Heading Ctrl+H", + headingexample: "Heading", + + hr: "Horizontal Rule
        Ctrl+R", + + readmore: "Read More Ctrl+M", + + toc: "TOC ", + + table: "Table - Ctrl+J", + + undo: "Undo - Ctrl+Z", + redo: "Redo - Ctrl+Y", + redomac: "Redo - Ctrl+Shift+Z", + + help: "Markdown Editing Help" + }; + + + // ------------------------------------------------------------------- + // YOUR CHANGES GO HERE + // + // I've tried to localize the things you are likely to change to + // this area. + // ------------------------------------------------------------------- + + // The default text that appears in the dialog input box when entering + // links. + var imageDefaultText = "https://"; + var linkDefaultText = "https://"; + + //Polyfill for node.remove() from MDN + // from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md + (function (arr) { + arr.forEach(function (item) { + if (item.hasOwnProperty('remove')) { + return; + } + Object.defineProperty(item, 'remove', { + configurable: true, + enumerable: true, + writable: true, + value: function remove() { + this.parentNode.removeChild(this); + } + }); + }); + })([Element.prototype, CharacterData.prototype, DocumentType.prototype]); + // ------------------------------------------------------------------- + // END OF YOUR CHANGES + // ------------------------------------------------------------------- + + // options, if given, can have the following properties: + // options.helpButton = { handler: yourEventHandler } + // options.strings = { italicexample: "slanted text" } + // `yourEventHandler` is the click handler for the help button. + // If `options.helpButton` isn't given, not help button is created. + // `options.strings` can have any or all of the same properties as + // `defaultStrings` above, so you can just override some string displayed + // to the user on a case-by-case basis, or translate all strings to + // a different language. + // + // For backwards compatibility reasons, the `options` argument can also + // be just the `helpButton` object, and `strings.help` can also be set via + // `helpButton.title`. This should be considered legacy. + // + // The constructed editor object has the methods: + // - getConverter() returns the markdown converter object that was passed to the constructor + // - run() actually starts the editor; should be called after all necessary plugins are registered. Calling this more than once is a no-op. + // - refreshPreview() forces the preview to be updated. This method is only available after run() was called. + Markdown.Editor = function (markdownConverter, idPostfix, options) { + + options = options || {}; + + if (typeof options.handler === "function") { //backwards compatible behavior + options = {helpButton: options}; + } + options.strings = options.strings || {}; + if (options.helpButton) { + options.strings.help = options.strings.help || options.helpButton.title; + } + var getString = function (identifier) { + return options.strings[identifier] || defaultsStrings[identifier]; + } + + idPostfix = idPostfix || ""; + + var hooks = this.hooks = new Markdown.HookCollection(); + hooks.addNoop("onPreviewRefresh"); // called with no arguments after the preview has been refreshed + hooks.addNoop("postBlockquoteCreation"); // called with the user's selection *after* the blockquote was created; should return the actual to-be-inserted text + hooks.addFalse("insertImageDialog"); + /* called with one parameter: a callback to be called with the URL of the image. If the application creates + * its own image insertion dialog, this hook should return true, and the callback should be called with the chosen + * image url (or null if the user cancelled). If this hook returns false, the default dialog will be used. + */ + + this.getConverter = function () { + return markdownConverter; + } + + var that = this, + panels; + + this.run = function () { + if (panels) + return; // already initialized + + panels = new PanelCollection(idPostfix); + var commandManager = new CommandManager(hooks, getString); + var previewManager = new PreviewManager(markdownConverter, panels, function () { + hooks.onPreviewRefresh(); + }); + var undoManager, uiManager; + + if (!/\?noundo/.test(doc.location.href)) { + undoManager = new UndoManager(function () { + previewManager.refresh(); + if (uiManager) // not available on the first call + uiManager.setUndoRedoButtonStates(); + }, panels); + this.textOperation = function (f) { + undoManager.setCommandMode(); + f(); + that.refreshPreview(); + } + } + + uiManager = new UIManager(idPostfix, panels, undoManager, previewManager, commandManager, options.helpButton, getString); + uiManager.setUndoRedoButtonStates(); + + var forceRefresh = that.refreshPreview = function () { + previewManager.refresh(true); + }; + + forceRefresh(); + }; + + } + + // before: contains all the text in the input box BEFORE the selection. + // after: contains all the text in the input box AFTER the selection. + function Chunks() { + } + + // startRegex: a regular expression to find the start tag + // endRegex: a regular expresssion to find the end tag + Chunks.prototype.findTags = function (startRegex, endRegex) { + + var chunkObj = this; + var regex; + + if (startRegex) { + + regex = util.extendRegExp(startRegex, "", "$"); + + this.before = this.before.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + + regex = util.extendRegExp(startRegex, "^", ""); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + } + + if (endRegex) { + + regex = util.extendRegExp(endRegex, "", "$"); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + + regex = util.extendRegExp(endRegex, "^", ""); + + this.after = this.after.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + } + }; + + // If remove is false, the whitespace is transferred + // to the before/after regions. + // + // If remove is true, the whitespace disappears. + Chunks.prototype.trimWhitespace = function (remove) { + var beforeReplacer, afterReplacer, that = this; + if (remove) { + beforeReplacer = afterReplacer = ""; + } else { + beforeReplacer = function (s) { + that.before += s; + return ""; + } + afterReplacer = function (s) { + that.after = s + that.after; + return ""; + } + } + + this.selection = this.selection.replace(/^(\s*)/, beforeReplacer).replace(/(\s*)$/, afterReplacer); + }; + + + Chunks.prototype.skipLines = function (nLinesBefore, nLinesAfter, findExtraNewlines) { + + if (nLinesBefore === undefined) { + nLinesBefore = 1; + } + + if (nLinesAfter === undefined) { + nLinesAfter = 1; + } + + nLinesBefore++; + nLinesAfter++; + + var regexText; + var replacementText; + + // chrome bug ... documented at: http://meta.stackoverflow.com/questions/63307/blockquote-glitch-in-editor-in-chrome-6-and-7/65985#65985 + if (navigator.userAgent.match(/Chrome/)) { + "X".match(/()./); + } + + this.selection = this.selection.replace(/(^\n*)/, ""); + + this.startTag = this.startTag + re.$1; + + this.selection = this.selection.replace(/(\n*$)/, ""); + this.endTag = this.endTag + re.$1; + this.startTag = this.startTag.replace(/(^\n*)/, ""); + this.before = this.before + re.$1; + this.endTag = this.endTag.replace(/(\n*$)/, ""); + this.after = this.after + re.$1; + + if (this.before) { + + regexText = replacementText = ""; + + while (nLinesBefore--) { + regexText += "\\n?"; + replacementText += "\n"; + } + + if (findExtraNewlines) { + regexText = "\\n*"; + } + this.before = this.before.replace(new re(regexText + "$", ""), replacementText); + } + + if (this.after) { + + regexText = replacementText = ""; + + while (nLinesAfter--) { + regexText += "\\n?"; + replacementText += "\n"; + } + if (findExtraNewlines) { + regexText = "\\n*"; + } + + this.after = this.after.replace(new re(regexText, ""), replacementText); + } + }; + + // end of Chunks + + // A collection of the important regions on the page. + // Cached so we don't have to keep traversing the DOM. + // Also holds ieCachedRange and ieCachedScrollTop, where necessary; working around + // this issue: + // Internet explorer has problems with CSS sprite buttons that use HTML + // lists. When you click on the background image "button", IE will + // select the non-existent link text and discard the selection in the + // textarea. The solution to this is to cache the textarea selection + // on the button's mousedown event and set a flag. In the part of the + // code where we need to grab the selection, we check for the flag + // and, if it's set, use the cached area instead of querying the + // textarea. + // + // This ONLY affects Internet Explorer (tested on versions 6, 7 + // and 8) and ONLY on button clicks. Keyboard shortcuts work + // normally since the focus never leaves the textarea. + function PanelCollection(postfix) { + this.buttonBar = doc.getElementById("wmd-button-bar" + postfix); + this.preview = doc.getElementById("wmd-preview" + postfix); + this.input = doc.getElementById("wmd-input" + postfix); + }; + + // Returns true if the DOM element is visible, false if it's hidden. + // Checks if display is anything other than none. + util.isVisible = function (elem) { + + if (window.getComputedStyle) { + // Most browsers + return window.getComputedStyle(elem, null).getPropertyValue("display") !== "none"; + } + else if (elem.currentStyle) { + // IE + return elem.currentStyle["display"] !== "none"; + } + }; + + + // Adds a listener callback to a DOM element which is fired on a specified + // event. + util.addEvent = function (elem, event, listener) { + if (elem.attachEvent) { + // IE only. The "on" is mandatory. + elem.attachEvent("on" + event, listener); + } + else { + // Other browsers. + elem.addEventListener(event, listener, false); + } + }; + + + // Removes a listener callback from a DOM element which is fired on a specified + // event. + util.removeEvent = function (elem, event, listener) { + if (elem.detachEvent) { + // IE only. The "on" is mandatory. + elem.detachEvent("on" + event, listener); + } + else { + // Other browsers. + elem.removeEventListener(event, listener, false); + } + }; + + // Converts \r\n and \r to \n. + util.fixEolChars = function (text) { + text = text.replace(/\r\n/g, "\n"); + text = text.replace(/\r/g, "\n"); + return text; + }; + + // Extends a regular expression. Returns a new RegExp + // using pre + regex + post as the expression. + // Used in a few functions where we have a base + // expression and we want to pre- or append some + // conditions to it (e.g. adding "$" to the end). + // The flags are unchanged. + // + // regex is a RegExp, pre and post are strings. + util.extendRegExp = function (regex, pre, post) { + + if (pre === null || pre === undefined) { + pre = ""; + } + if (post === null || post === undefined) { + post = ""; + } + + var pattern = regex.toString(); + var flags; + + // Replace the flags with empty space and store them. + pattern = pattern.replace(/\/([gim]*)$/, function (wholeMatch, flagsPart) { + flags = flagsPart; + return ""; + }); + + // Remove the slash delimiters on the regular expression. + pattern = pattern.replace(/(^\/|\/$)/g, ""); + pattern = pre + pattern + post; + + return new re(pattern, flags); + } + + // UNFINISHED + // The assignment in the while loop makes jslint cranky. + // I'll change it to a better loop later. + position.getTop = function (elem, isInner) { + var result = elem.offsetTop; + if (!isInner) { + while (elem = elem.offsetParent) { + result += elem.offsetTop; + } + } + return result; + }; + + position.getHeight = function (elem) { + return elem.offsetHeight || elem.scrollHeight; + }; + + position.getWidth = function (elem) { + return elem.offsetWidth || elem.scrollWidth; + }; + + position.getPageSize = function () { + + var scrollWidth, scrollHeight; + var innerWidth, innerHeight; + + // It's not very clear which blocks work with which browsers. + if (self.innerHeight && self.scrollMaxY) { + scrollWidth = doc.body.scrollWidth; + scrollHeight = self.innerHeight + self.scrollMaxY; + } + else if (doc.body.scrollHeight > doc.body.offsetHeight) { + scrollWidth = doc.body.scrollWidth; + scrollHeight = doc.body.scrollHeight; + } + else { + scrollWidth = doc.body.offsetWidth; + scrollHeight = doc.body.offsetHeight; + } + + if (self.innerHeight) { + // Non-IE browser + innerWidth = self.innerWidth; + innerHeight = self.innerHeight; + } + else if (doc.documentElement && doc.documentElement.clientHeight) { + // Some versions of IE (IE 6 w/ a DOCTYPE declaration) + innerWidth = doc.documentElement.clientWidth; + innerHeight = doc.documentElement.clientHeight; + } + else if (doc.body) { + // Other versions of IE + innerWidth = doc.body.clientWidth; + innerHeight = doc.body.clientHeight; + } + + var maxWidth = Math.max(scrollWidth, innerWidth); + var maxHeight = Math.max(scrollHeight, innerHeight); + return [maxWidth, maxHeight, innerWidth, innerHeight]; + }; + + // Handles pushing and popping TextareaStates for undo/redo commands. + // I should rename the stack variables to list. + function UndoManager(callback, panels) { + + var undoObj = this; + var undoStack = []; // A stack of undo states + var stackPtr = 0; // The index of the current state + var mode = "none"; + var lastState; // The last state + var timer; // The setTimeout handle for cancelling the timer + var inputStateObj; + + // Set the mode for later logic steps. + var setMode = function (newMode, noSave) { + if (mode != newMode) { + mode = newMode; + if (!noSave) { + saveState(); + } + } + + if (!uaSniffed.isIE || mode != "moving") { + timer = setTimeout(refreshState, 1); + } + else { + inputStateObj = null; + } + }; + + var refreshState = function (isInitialState) { + inputStateObj = new TextareaState(panels, isInitialState); + timer = undefined; + }; + + this.setCommandMode = function () { + mode = "command"; + saveState(); + timer = setTimeout(refreshState, 0); + }; + + this.canUndo = function () { + return stackPtr > 1; + }; + + this.canRedo = function () { + if (undoStack[stackPtr + 1]) { + return true; + } + return false; + }; + + // Removes the last state and restores it. + this.undo = function () { + + if (undoObj.canUndo()) { + if (lastState) { + // What about setting state -1 to null or checking for undefined? + lastState.restore(); + lastState = null; + } + else { + undoStack[stackPtr] = new TextareaState(panels); + undoStack[--stackPtr].restore(); + + if (callback) { + callback(); + } + } + } + + mode = "none"; + panels.input.focus(); + refreshState(); + }; + + // Redo an action. + this.redo = function () { + + if (undoObj.canRedo()) { + + undoStack[++stackPtr].restore(); + + if (callback) { + callback(); + } + } + + mode = "none"; + panels.input.focus(); + refreshState(); + }; + + // Push the input area state to the stack. + var saveState = function () { + var currState = inputStateObj || new TextareaState(panels); + + if (!currState) { + return false; + } + if (mode == "moving") { + if (!lastState) { + lastState = currState; + } + return; + } + if (lastState) { + if (undoStack[stackPtr - 1].text != lastState.text) { + undoStack[stackPtr++] = lastState; + } + lastState = null; + } + undoStack[stackPtr++] = currState; + undoStack[stackPtr + 1] = null; + if (callback) { + callback(); + } + }; + + var handleCtrlYZ = function (event) { + + var handled = false; + + if ((event.ctrlKey || event.metaKey) && !event.altKey) { + + // IE and Opera do not support charCode. + var keyCode = event.charCode || event.keyCode; + var keyCodeChar = String.fromCharCode(keyCode); + + switch (keyCodeChar.toLowerCase()) { + + case "y": + undoObj.redo(); + handled = true; + break; + + case "z": + if (!event.shiftKey) { + undoObj.undo(); + } + else { + undoObj.redo(); + } + handled = true; + break; + } + } + + if (handled) { + if (event.preventDefault) { + event.preventDefault(); + } + if (window.event) { + window.event.returnValue = false; + } + return; + } + }; + + // Set the mode depending on what is going on in the input area. + var handleModeChange = function (event) { + + if (!event.ctrlKey && !event.metaKey) { + + var keyCode = event.keyCode; + + if ((keyCode >= 33 && keyCode <= 40) || (keyCode >= 63232 && keyCode <= 63235)) { + // 33 - 40: page up/dn and arrow keys + // 63232 - 63235: page up/dn and arrow keys on safari + setMode("moving"); + } + else if (keyCode == 8 || keyCode == 46 || keyCode == 127) { + // 8: backspace + // 46: delete + // 127: delete + setMode("deleting"); + } + else if (keyCode == 13) { + // 13: Enter + setMode("newlines"); + } + else if (keyCode == 27) { + // 27: escape + setMode("escape"); + } + else if ((keyCode < 16 || keyCode > 20) && keyCode != 91) { + // 16-20 are shift, etc. + // 91: left window key + // I think this might be a little messed up since there are + // a lot of nonprinting keys above 20. + setMode("typing"); + } + } + }; + + var setEventHandlers = function () { + util.addEvent(panels.input, "keypress", function (event) { + // keyCode 89: y + // keyCode 90: z + if ((event.ctrlKey || event.metaKey) && !event.altKey && (event.keyCode == 89 || event.keyCode == 90)) { + event.preventDefault(); + } + }); + + var handlePaste = function () { + if (uaSniffed.isIE || (inputStateObj && inputStateObj.text != panels.input.value)) { + if (timer == undefined) { + mode = "paste"; + saveState(); + refreshState(); + } + } + }; + + util.addEvent(panels.input, "keydown", handleCtrlYZ); + util.addEvent(panels.input, "keydown", handleModeChange); + util.addEvent(panels.input, "mousedown", function () { + setMode("moving"); + }); + + panels.input.onpaste = handlePaste; + panels.input.ondrop = handlePaste; + }; + + var init = function () { + setEventHandlers(); + refreshState(true); + saveState(); + }; + + init(); + } + + // end of UndoManager + + // The input textarea state/contents. + // This is used to implement undo/redo by the undo manager. + function TextareaState(panels, isInitialState) { + + // Aliases + var stateObj = this; + var inputArea = panels.input; + this.init = function () { + if (!util.isVisible(inputArea)) { + return; + } + if (!isInitialState && doc.activeElement && doc.activeElement !== inputArea) { // this happens when tabbing out of the input box + return; + } + + this.setInputAreaSelectionStartEnd(); + this.scrollTop = inputArea.scrollTop; + if (!this.text && inputArea.selectionStart || inputArea.selectionStart === 0) { + this.text = inputArea.value; + } + + } + + // Sets the selected text in the input box after we've performed an + // operation. + this.setInputAreaSelection = function () { + + if (!util.isVisible(inputArea)) { + return; + } + + if (inputArea.selectionStart !== undefined && !uaSniffed.isOpera) { + + inputArea.focus(); + inputArea.selectionStart = stateObj.start; + inputArea.selectionEnd = stateObj.end; + inputArea.scrollTop = stateObj.scrollTop; + } + else if (doc.selection) { + + if (doc.activeElement && doc.activeElement !== inputArea) { + return; + } + + inputArea.focus(); + var range = inputArea.createTextRange(); + range.moveStart("character", -inputArea.value.length); + range.moveEnd("character", -inputArea.value.length); + range.moveEnd("character", stateObj.end); + range.moveStart("character", stateObj.start); + range.select(); + } + }; + + this.setInputAreaSelectionStartEnd = function () { + + if (!panels.ieCachedRange && (inputArea.selectionStart || inputArea.selectionStart === 0)) { + + stateObj.start = inputArea.selectionStart; + stateObj.end = inputArea.selectionEnd; + } + else if (doc.selection) { + + stateObj.text = util.fixEolChars(inputArea.value); + + // IE loses the selection in the textarea when buttons are + // clicked. On IE we cache the selection. Here, if something is cached, + // we take it. + var range = panels.ieCachedRange || doc.selection.createRange(); + + var fixedRange = util.fixEolChars(range.text); + var marker = "\x07"; + var markedRange = marker + fixedRange + marker; + range.text = markedRange; + var inputText = util.fixEolChars(inputArea.value); + + range.moveStart("character", -markedRange.length); + range.text = fixedRange; + + stateObj.start = inputText.indexOf(marker); + stateObj.end = inputText.lastIndexOf(marker) - marker.length; + + var len = stateObj.text.length - util.fixEolChars(inputArea.value).length; + + if (len) { + range.moveStart("character", -fixedRange.length); + while (len--) { + fixedRange += "\n"; + stateObj.end += 1; + } + range.text = fixedRange; + } + + if (panels.ieCachedRange) + stateObj.scrollTop = panels.ieCachedScrollTop; // this is set alongside with ieCachedRange + + panels.ieCachedRange = null; + + this.setInputAreaSelection(); + } + }; + + // Restore this state into the input area. + this.restore = function () { + + if (stateObj.text != undefined && stateObj.text != inputArea.value) { + inputArea.value = stateObj.text; + } + this.setInputAreaSelection(); + inputArea.scrollTop = stateObj.scrollTop; + }; + + // Gets a collection of HTML chunks from the inptut textarea. + this.getChunks = function () { + + var chunk = new Chunks(); + chunk.before = util.fixEolChars(stateObj.text.substring(0, stateObj.start)); + chunk.startTag = ""; + chunk.selection = util.fixEolChars(stateObj.text.substring(stateObj.start, stateObj.end)); + chunk.endTag = ""; + chunk.after = util.fixEolChars(stateObj.text.substring(stateObj.end)); + chunk.scrollTop = stateObj.scrollTop; + + return chunk; + }; + + // Sets the TextareaState properties given a chunk of markdown. + this.setChunks = function (chunk) { + + chunk.before = chunk.before + chunk.startTag; + chunk.after = chunk.endTag + chunk.after; + + this.start = chunk.before.length; + this.end = chunk.before.length + chunk.selection.length; + this.text = chunk.before + chunk.selection + chunk.after; + this.scrollTop = chunk.scrollTop; + }; + this.init(); + }; + + function PreviewManager(converter, panels, previewRefreshCallback) { + + var managerObj = this; + var timeout; + var elapsedTime; + var oldInputText; + var maxDelay = 3000; + var startType = "delayed"; // The other legal value is "manual" + + // Adds event listeners to elements + var setupEvents = function (inputElem, listener) { + + util.addEvent(inputElem, "input", listener); + inputElem.onpaste = listener; + inputElem.ondrop = listener; + + util.addEvent(inputElem, "keypress", listener); + util.addEvent(inputElem, "keydown", listener); + }; + + var getDocScrollTop = function () { + + var result = 0; + + if (window.innerHeight) { + result = window.pageYOffset; + } + else if (doc.documentElement && doc.documentElement.scrollTop) { + result = doc.documentElement.scrollTop; + } + else if (doc.body) { + result = doc.body.scrollTop; + } + + return result; + }; + + var makePreviewHtml = function () { + + // If there is no registered preview panel + // there is nothing to do. + if (!panels.preview) + return; + + + var text = panels.input.value; + if (text && text == oldInputText) { + return; // Input text hasn't changed. + } + else { + oldInputText = text; + } + + var prevTime = new Date().getTime(); + + text = converter.makeHtml(text); + + // Calculate the processing time of the HTML creation. + // It's used as the delay time in the event listener. + var currTime = new Date().getTime(); + elapsedTime = currTime - prevTime; + + pushPreviewHtml(text); + }; + + // setTimeout is already used. Used as an event listener. + var applyTimeout = function () { + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + if (startType !== "manual") { + + var delay = 0; + + if (startType === "delayed") { + delay = elapsedTime; + } + + if (delay > maxDelay) { + delay = maxDelay; + } + timeout = setTimeout(makePreviewHtml, delay); + } + }; + + var getScaleFactor = function (panel) { + if (panel.scrollHeight <= panel.clientHeight) { + return 1; + } + return panel.scrollTop / (panel.scrollHeight - panel.clientHeight); + }; + + var setPanelScrollTops = function () { + if (panels.preview) { + panels.preview.scrollTop = (panels.preview.scrollHeight - panels.preview.clientHeight) * getScaleFactor(panels.preview); + } + }; + + this.refresh = function (requiresRefresh) { + + if (requiresRefresh) { + oldInputText = ""; + makePreviewHtml(); + } + else { + applyTimeout(); + } + }; + + this.processingTime = function () { + return elapsedTime; + }; + + var isFirstTimeFilled = true; + + // IE doesn't let you use innerHTML if the element is contained somewhere in a table + // (which is the case for inline editing) -- in that case, detach the element, set the + // value, and reattach. Yes, that *is* ridiculous. + var ieSafePreviewSet = function (text) { + var preview = panels.preview; + var parent = preview.parentNode; + var sibling = preview.nextSibling; + parent.removeChild(preview); + preview.innerHTML = text; + if (!sibling) + parent.appendChild(preview); + else + parent.insertBefore(preview, sibling); + } + + var nonSuckyBrowserPreviewSet = function (text) { + panels.preview.innerHTML = text; + } + + var previewSetter; + + var previewSet = function (text) { + if (previewSetter) + return previewSetter(text); + + try { + nonSuckyBrowserPreviewSet(text); + previewSetter = nonSuckyBrowserPreviewSet; + } catch (e) { + previewSetter = ieSafePreviewSet; + previewSetter(text); + } + }; + + var pushPreviewHtml = function (text) { + + var emptyTop = position.getTop(panels.input) - getDocScrollTop(); + + if (panels.preview) { + previewSet(text); + previewRefreshCallback(); + } + + setPanelScrollTops(); + + if (isFirstTimeFilled) { + isFirstTimeFilled = false; + return; + } + + var fullTop = position.getTop(panels.input) - getDocScrollTop(); + + if (uaSniffed.isIE) { + setTimeout(function () { + window.scrollBy(0, fullTop - emptyTop); + }, 0); + } + else { + window.scrollBy(0, fullTop - emptyTop); + } + }; + + var init = function () { + + setupEvents(panels.input, applyTimeout); + makePreviewHtml(); + + if (panels.preview) { + panels.preview.scrollTop = 0; + } + }; + + init(); + }; + + // Creates the background behind the hyperlink text entry box. + // And download dialog + // Most of this has been moved to CSS but the div creation and + // browser-specific hacks remain here. + ui.createBackground = function () { + + var background = doc.createElement("div"), + style = background.style; + + background.className = "wmd-prompt-background"; + + style.position = "absolute"; + style.top = "0"; + + style.zIndex = "1000"; + + if (uaSniffed.isIE) { + style.filter = "alpha(opacity=50)"; + } + else { + style.opacity = "0.5"; + } + + var pageSize = position.getPageSize(); + style.height = pageSize[1] + "px"; + + if (uaSniffed.isIE) { + style.left = doc.documentElement.scrollLeft; + style.width = doc.documentElement.clientWidth; + } + else { + style.left = "0"; + style.width = "100%"; + } + + doc.body.appendChild(background); + return background; + }; + + // This simulates a modal dialog box and asks for the URL when you + // click the hyperlink or image buttons. + // + // text: The html for the input box. + // defaultInputText: The default value that appears in the input box. + // callback: The function which is executed when the prompt is dismissed, either via OK or Cancel. + // It receives a single argument; either the entered text (if OK was chosen) or null (if Cancel + // was chosen). + ui.prompt = function (text, defaultInputText, callback) { + + // These variables need to be declared at this level since they are used + // in multiple functions. + var dialog; // The dialog box. + var input; // The text box where you enter the hyperlink. + + + if (defaultInputText === undefined) { + defaultInputText = ""; + } + + // Used as a keydown event handler. Esc dismisses the prompt. + // Key code 27 is ESC. + var checkEscape = function (key) { + var code = (key.charCode || key.keyCode); + if (code === 27) { + close(true); + } + }; + + // Dismisses the hyperlink input box. + // isCancel is true if we don't care about the input text. + // isCancel is false if we are going to keep the text. + var close = function (isCancel) { + util.removeEvent(doc.body, "keydown", checkEscape); + var text = input.value; + + if (isCancel) { + text = null; + } + else { + // Fixes common pasting errors. + text = text.replace(/^http:\/\/(https?|ftp):\/\//, '$1://'); + if (!/^(?:https?|ftp):\/\//.test(text)) + text = 'https://' + text; + } + + dialog.parentNode.removeChild(dialog); + + callback(text); + return false; + }; + + + // Create the text input box form/window. + var createDialog = function () { + + // The main dialog box. + dialog = doc.createElement("div"); + dialog.className = "wmd-prompt-dialog"; + dialog.style.padding = "10px;"; + dialog.style.position = "fixed"; + dialog.style.width = "400px"; + dialog.style.zIndex = "1001"; + + // The dialog text. + var question = doc.createElement("div"); + question.innerHTML = text; + question.style.padding = "5px"; + dialog.appendChild(question); + + // The web form container for the text box and buttons. + var form = doc.createElement("form"), + style = form.style; + form.onsubmit = function () { + return close(false); + }; + style.padding = "0"; + style.margin = "0"; + style.cssFloat = "left"; + style.width = "100%"; + style.textAlign = "center"; + style.position = "relative"; + dialog.appendChild(form); + + // The input text box + input = doc.createElement("input"); + input.type = "text"; + input.value = defaultInputText; + style = input.style; + style.display = "block"; + style.width = "80%"; + style.marginLeft = style.marginRight = "auto"; + form.appendChild(input); + + // The ok button + var okButton = doc.createElement("input"); + okButton.type = "button"; + okButton.onclick = function () { + return close(false); + }; + okButton.value = "OK"; + style = okButton.style; + style.margin = "10px"; + style.display = "inline"; + style.width = "7em"; + + + // The cancel button + var cancelButton = doc.createElement("input"); + cancelButton.type = "button"; + cancelButton.onclick = function () { + return close(true); + }; + cancelButton.value = "Cancel"; + style = cancelButton.style; + style.margin = "10px"; + style.display = "inline"; + style.width = "7em"; + + form.appendChild(okButton); + form.appendChild(cancelButton); + + util.addEvent(doc.body, "keydown", checkEscape); + dialog.style.top = "50%"; + dialog.style.left = "50%"; + dialog.style.display = "block"; + if (uaSniffed.isIE_5or6) { + dialog.style.position = "absolute"; + dialog.style.top = doc.documentElement.scrollTop + 200 + "px"; + dialog.style.left = "50%"; + } + doc.body.appendChild(dialog); + + // This has to be done AFTER adding the dialog to the form if you + // want it to be centered. + dialog.style.marginTop = -(position.getHeight(dialog) / 2) + "px"; + dialog.style.marginLeft = -(position.getWidth(dialog) / 2) + "px"; + + }; + + // Why is this in a zero-length timeout? + // Is it working around a browser bug? + setTimeout(function () { + + createDialog(); + + var defTextLen = defaultInputText.length; + if (input.selectionStart !== undefined) { + input.selectionStart = 0; + input.selectionEnd = defTextLen; + } + else if (input.createTextRange) { + var range = input.createTextRange(); + range.collapse(false); + range.moveStart("character", -defTextLen); + range.moveEnd("character", defTextLen); + range.select(); + } + + input.focus(); + }, 0); + }; + + function UIManager(postfix, panels, undoManager, previewManager, commandManager, helpOptions, getString) { + + var inputBox = panels.input, + buttons = {}; // buttons.undo, buttons.link, etc. The actual DOM elements. + + makeSpritedButtonRow(); + + var keyEvent = "keydown"; + if (uaSniffed.isOpera) { + keyEvent = "keypress"; + } + + util.addEvent(inputBox, keyEvent, function (key) { + + // Check to see if we have a button key and, if so execute the callback. + if ((key.ctrlKey || key.metaKey) && !key.altKey && !key.shiftKey) { + + var keyCode = key.charCode || key.keyCode; + var keyCodeStr = String.fromCharCode(keyCode).toLowerCase(); + + switch (keyCodeStr) { + case "b": + doClick(buttons.bold); + break; + case "i": + doClick(buttons.italic); + break; + case "l": + doClick(buttons.link); + break; + case "q": + doClick(buttons.quote); + break; + case "k": + doClick(buttons.code); + break; + case "g": + doClick(buttons.image); + break; + case "o": + doClick(buttons.olist); + break; + case "u": + doClick(buttons.ulist); + break; + case "h": + doClick(buttons.heading); + break; + case "r": + doClick(buttons.hr); + break; + case "m": + doClick(buttons.readmore); + break; + // case "x": + // doClick(buttons.strikethrough); + // break; + case "j": + doClick(buttons.table); + break; + // case "y": + // doClick(buttons.redo); + // break; + // case "z": + // if (key.shiftKey) { + // doClick(buttons.redo); + // } + // else { + // doClick(buttons.undo); + // } + // break; + default: + return; + } + + + if (key.preventDefault) { + key.preventDefault(); + } + + if (window.event) { + window.event.returnValue = false; + } + } + }); + + // Auto-indent on shift-enter + util.addEvent(inputBox, "keyup", function (key) { + if (key.shiftKey && !key.ctrlKey && !key.metaKey) { + var keyCode = key.charCode || key.keyCode; + // Character 13 is Enter + if (keyCode === 13) { + var fakeButton = {}; + fakeButton.textOp = bindCommand("doAutoindent"); + doClick(fakeButton); + } + } + }); + + // special handler because IE clears the context of the textbox on ESC + if (uaSniffed.isIE) { + util.addEvent(inputBox, "keydown", function (key) { + var code = key.keyCode; + if (code === 27) { + return false; + } + }); + } + + + // Perform the button's action. + function doClick(button) { + + inputBox.focus(); + + if (button.textOp) { + + if (undoManager) { + undoManager.setCommandMode(); + } + + var state = new TextareaState(panels); + + if (!state) { + return; + } + + var chunks = state.getChunks(); + + // Some commands launch a "modal" prompt dialog. Javascript + // can't really make a modal dialog box and the WMD code + // will continue to execute while the dialog is displayed. + // This prevents the dialog pattern I'm used to and means + // I can't do something like this: + // + // var link = CreateLinkDialog(); + // makeMarkdownLink(link); + // + // Instead of this straightforward method of handling a + // dialog I have to pass any code which would execute + // after the dialog is dismissed (e.g. link creation) + // in a function parameter. + // + // Yes this is awkward and I think it sucks, but there's + // no real workaround. Only the image and link code + // create dialogs and require the function pointers. + var fixupInputArea = function () { + + inputBox.focus(); + + if (chunks) { + state.setChunks(chunks); + } + + state.restore(); + previewManager.refresh(); + }; + + var noCleanup = button.textOp(chunks, fixupInputArea); + + if (!noCleanup) { + fixupInputArea(); + } + + } + + if (button.execute) { + button.execute(undoManager); + } + }; + + function setupButton(button, isEnabled) { + + var normalYShift = "note-btn btn btn-light btn-sm"; + var disabledYShift = "note-btn btn btn-light btn-sm disabled"; + var highlightYShift = ""; + var image = button.getElementsByTagName("span")[0]; + if (isEnabled) { + image.className = normalYShift; + if (!button.isHelp) { + button.onclick = function () { + if (this.onmouseout) { + this.onmouseout(); + } + doClick(this); + return false; + } + } + } + else { + image.className = disabledYShift; + button.onmouseover = button.onmouseout = button.onclick = function () { + }; + } + } + + function bindCommand(method) { + if (typeof method === "string") + method = commandManager[method]; + return function () { + method.apply(commandManager, arguments); + } + } + + function makeSpritedButtonRow() { + + var buttonBar = panels.buttonBar; + + var normalYShift = "note-btn btn btn-light btn-sm"; + var disabledYShift = "note-btn btn btn-light btn-sm disabled"; + var highlightYShift = ""; + + var buttonRow = document.createElement("ul"); + buttonRow.style.padding = "0px 10px"; + buttonRow.id = "wmd-button-row" + postfix; + buttonRow.className = 'wmd-button-row'; + buttonRow = buttonBar.appendChild(buttonRow); + var xPosition = 0; + var makeButton = function (id, title, XClass, textOp) { + var button = document.createElement("li"); + button.className = "wmd-button"; + var buttonImage = document.createElement("span"); + var buttonIcon = document.createElement("i"); + buttonImage.className = "note-btn btn btn-light btn-sm"; + buttonIcon.className = XClass; + buttonImage.appendChild(buttonIcon); + button.id = id + postfix; + button.appendChild(buttonImage); + button.title = title; + if (textOp) + button.textOp = textOp; + setupButton(button, true); + buttonRow.appendChild(button); + return button; + }; + var makeSpacer = function (num) { + var spacer = document.createElement("li"); + spacer.className = "wmd-spacer wmd-spacer" + num; + spacer.id = "wmd-spacer" + num + postfix; + buttonRow.appendChild(spacer); + } + + buttons.bold = makeButton("wmd-bold-button", getString("bold"), "fa fa-bold", bindCommand("doBold")); + buttons.italic = makeButton("wmd-italic-button", getString("italic"), "fa fa-italic", bindCommand("doItalic")); + buttons.heading = makeButton("wmd-heading-button", getString("heading"), "fa fa-header", bindCommand("doHeading")); + buttons.strikethrough = makeButton("wmd-strikethrough-button", getString("strikethrough"), "fa fa-strikethrough", bindCommand("doStrikethrough")); + //makeSpacer(1); + buttons.olist = makeButton("wmd-olist-button", getString("olist"), "fa fa-list-ol", bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, true); + })); + buttons.ulist = makeButton("wmd-ulist-button", getString("ulist"), "fa fa-list-ul", bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, false); + })); + buttons.quote = makeButton("wmd-quote-button", getString("quote"), "fa fa-quote-right", bindCommand("doBlockquote")); + buttons.code = makeButton("wmd-code-button", getString("code"), "fa fa-code", bindCommand("doCode")); + buttons.table = makeButton("wmd-table-button", getString("table"), "fa fa-table", bindCommand("doTable")); + //makeSpacer(2); + buttons.link = makeButton("wmd-link-button", getString("link"), "fa fa-link", bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, false); + })); + buttons.image = makeButton("wmd-image-button", getString("image"), "fa fa-image", bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, true); + })); + buttons.hr = makeButton("wmd-hr-button", getString("hr"), "fa fa-ellipsis-h", bindCommand("doHorizontalRule")); + buttons.readmore = makeButton("wmd-readmore-button", getString("readmore"), "fa fa-arrow-right", bindCommand("doReadMore")); + buttons.toc = makeButton("wmd-toc-button", getString("toc"), "fa fa-list-alt", bindCommand("doTOC")); + //makeSpacer(3); + buttons.undo = makeButton("wmd-undo-button", getString("undo"), "fa-solid fa-rotate-left", null); + buttons.undo.execute = function (manager) { + if (manager) manager.undo(); + }; + + var redoTitle = /win/.test(nav.platform.toLowerCase()) ? + getString("redo") : + getString("redomac"); // mac and other non-Windows platforms + + buttons.redo = makeButton("wmd-redo-button", redoTitle, "fa-solid fa-rotate-right", null); + buttons.redo.execute = function (manager) { + if (manager) manager.redo(); + }; + + if (helpOptions) { + var helpButton = document.createElement("li"); + var helpButtonImage = document.createElement("span"); + helpButton.appendChild(helpButtonImage); + helpButton.className = "wmd-button wmd-help-button"; + helpButton.id = "wmd-help-button" + postfix; + helpButton.XClass = "note-btn btn btn-light btn-sm"; + helpButton.isHelp = true; + helpButton.style.right = "0px"; + helpButton.title = getString("help"); + helpButton.onclick = helpOptions.handler; + + setupButton(helpButton, true); + buttonRow.appendChild(helpButton); + buttons.help = helpButton; + } + + setUndoRedoButtonStates(); + } + + function setUndoRedoButtonStates() { + if (undoManager) { + setupButton(buttons.undo, undoManager.canUndo()); + setupButton(buttons.redo, undoManager.canRedo()); + } + }; + + this.setUndoRedoButtonStates = setUndoRedoButtonStates; + + } + + function CommandManager(pluginHooks, getString) { + this.hooks = pluginHooks; + this.getString = getString; + } + + var commandProto = CommandManager.prototype; + + // The markdown symbols - 4 spaces = code, > = blockquote, etc. + commandProto.prefixes = "(?:\\s{4,}|\\s*>|\\s*-\\s+|\\s*\\d+\\.|=|\\+|-|_|\\*|#|\\s*\\[[^\n]]+\\]:)"; + + // Remove markdown symbols from the chunk selection. + commandProto.unwrap = function (chunk) { + var txt = new re("([^\\n])\\n(?!(\\n|" + this.prefixes + "))", "g"); + chunk.selection = chunk.selection.replace(txt, "$1 $2"); + }; + + commandProto.wrap = function (chunk, len) { + this.unwrap(chunk); + var regex = new re("(.{1," + len + "})( +|$\\n?)", "gm"), + that = this; + + chunk.selection = chunk.selection.replace(regex, function (line, marked) { + if (new re("^" + that.prefixes, "").test(line)) { + return line; + } + return marked + "\n"; + }); + + chunk.selection = chunk.selection.replace(/\s+$/, ""); + }; + + commandProto.doBold = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 2, this.getString("boldexample")); + }; + + commandProto.doItalic = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 1, this.getString("italicexample")); + }; + + // chunk: The selected region that will be enclosed with */** + // nStars: 1 for italics, 2 for bold + // insertText: If you just click the button without highlighting text, this gets inserted + commandProto.doBorI = function (chunk, postProcessing, nStars, insertText) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(\**$)/.exec(chunk.before)[0]; + var starsAfter = /(^\**)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[*]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[*]{" + nStars + "}", ""), ""); + } + else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^([*_]*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } + else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = insertText; + } + + // Add the true markup. + var markup = nStars <= 1 ? "*" : "**"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; + }; + + commandProto.stripLinkDefs = function (text, defsToAdd) { + + text = text.replace(/^[ ]{0,3}\[(\d+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|$)/gm, + function (totalMatch, id, link, newlines, title) { + defsToAdd[id] = totalMatch.replace(/\s*$/, ""); + if (newlines) { + // Strip the title and return that separately. + defsToAdd[id] = totalMatch.replace(/["(](.+?)[")]$/, ""); + return newlines + title; + } + return ""; + }); + + return text; + }; + + commandProto.addLinkDef = function (chunk, linkDef) { + + var refNumber = 0; // The current reference number + var defsToAdd = {}; // + // Start with a clean slate by removing all previous link definitions. + chunk.before = this.stripLinkDefs(chunk.before, defsToAdd); + chunk.selection = this.stripLinkDefs(chunk.selection, defsToAdd); + chunk.after = this.stripLinkDefs(chunk.after, defsToAdd); + + var defs = ""; + var regex = /(\[)((?:\[[^\]]*\]|[^\[\]])*)(\][ ]?(?:\n[ ]*)?\[)(\d+)(\])/g; + + var addDefNumber = function (def) { + refNumber++; + def = def.replace(/^[ ]{0,3}\[(\d+)\]:/, " [" + refNumber + "]:"); + defs += "\n" + def; + }; + + // note that + // a) the recursive call to getLink cannot go infinite, because by definition + // of regex, inner is always a proper substring of wholeMatch, and + // b) more than one level of nesting is neither supported by the regex + // nor making a lot of sense (the only use case for nesting is a linked image) + var getLink = function (wholeMatch, before, inner, afterInner, id, end) { + inner = inner.replace(regex, getLink); + if (defsToAdd[id]) { + addDefNumber(defsToAdd[id]); + return before + inner + afterInner + refNumber + end; + } + return wholeMatch; + }; + + chunk.before = chunk.before.replace(regex, getLink); + + if (linkDef) { + addDefNumber(linkDef); + } + else { + chunk.selection = chunk.selection.replace(regex, getLink); + } + + var refOut = refNumber; + + chunk.after = chunk.after.replace(regex, getLink); + + if (chunk.after) { + chunk.after = chunk.after.replace(/\n*$/, ""); + } + if (!chunk.after) { + chunk.selection = chunk.selection.replace(/\n*$/, ""); + } + + chunk.after += "\n\n" + defs; + + return refOut; + }; + + // takes the line as entered into the add link/as image dialog and makes + // sure the URL and the optinal title are "nice". + function properlyEncoded(linkdef) { + return linkdef.replace(/^\s*(.*?)(?:\s+"(.+)")?\s*$/, function (wholematch, link, title) { + link = link.replace(/\?.*$/, function (querypart) { + return querypart.replace(/\+/g, " "); // in the query string, a plus and a space are identical + }); + link = decodeURIComponent(link); // unencode first, to prevent double encoding + link = encodeURI(link).replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29'); + link = link.replace(/\?.*$/, function (querypart) { + return querypart.replace(/\+/g, "%2b"); // since we replaced plus with spaces in the query part, all pluses that now appear where originally encoded + }); + if (title) { + title = title.trim ? title.trim() : title.replace(/^\s*/, "").replace(/\s*$/, ""); + title = title.replace(/"/g, "quot;").replace(/\(/g, "(").replace(/\)/g, ")").replace(//g, ">"); + } + return title ? link + ' "' + title + '"' : link; + }); + } + + commandProto.doLinkOrImage = function (chunk, postProcessing, isImage) { + + chunk.trimWhitespace(); + chunk.findTags(/\s*!?\[/, /\][ ]?(?:\n[ ]*)?(\[.*?\])?/); + var background; + + if (chunk.endTag.length > 1 && chunk.startTag.length > 0) { + + chunk.startTag = chunk.startTag.replace(/!?\[/, ""); + chunk.endTag = ""; + this.addLinkDef(chunk, null); + + } + else { + + // We're moving start and end tag back into the selection, since (as we're in the else block) we're not + // *removing* a link, but *adding* one, so whatever findTags() found is now back to being part of the + // link text. linkEnteredCallback takes care of escaping any brackets. + chunk.selection = chunk.startTag + chunk.selection + chunk.endTag; + chunk.startTag = chunk.endTag = ""; + + if (/\n\n/.test(chunk.selection)) { + this.addLinkDef(chunk, null); + return; + } + var that = this; + // The function to be executed when you enter a link and press OK or Cancel. + // Marks up the link and adds the ref. + var linkEnteredCallback = function (link) { + + background.remove(); + + if (link !== null) { + // ( $1 + // [^\\] anything that's not a backslash + // (?:\\\\)* an even number (this includes zero) of backslashes + // ) + // (?= followed by + // [[\]] an opening or closing bracket + // ) + // + // In other words, a non-escaped bracket. These have to be escaped now to make sure they + // don't count as the end of the link or similar. + // Note that the actual bracket has to be a lookahead, because (in case of to subsequent brackets), + // the bracket in one match may be the "not a backslash" character in the next match, so it + // should not be consumed by the first match. + // The "prepend a space and finally remove it" steps makes sure there is a "not a backslash" at the + // start of the string, so this also works if the selection begins with a bracket. We cannot solve + // this by anchoring with ^, because in the case that the selection starts with two brackets, this + // would mean a zero-width match at the start. Since zero-width matches advance the string position, + // the first bracket could then not act as the "not a backslash" for the second. + chunk.selection = (" " + chunk.selection).replace(/([^\\](?:\\\\)*)(?=[[\]])/g, "$1\\").substr(1); + + // var linkDef = " [999]: " + properlyEncoded(link); + + // var num = that.addLinkDef(chunk, linkDef); + chunk.startTag = isImage ? "![" : "["; + // chunk.endTag = "][" + num + "]"; + chunk.endTag = "](" + properlyEncoded(link) + ")"; + + if (!chunk.selection) { + if (isImage) { + chunk.selection = that.getString("imagedescription"); + } + else { + chunk.selection = that.getString("linkdescription"); + } + } + } + postProcessing(); + }; + + background = ui.createBackground(); + + if (isImage) { + if (!this.hooks.insertImageDialog(linkEnteredCallback)) + ui.prompt(this.getString("imagedialog"), imageDefaultText, linkEnteredCallback); + } + else { + ui.prompt(this.getString("linkdialog"), linkDefaultText, linkEnteredCallback); + } + return true; + } + }; + + // When making a list, hitting shift-enter will put your cursor on the next line + // at the current indent level. + commandProto.doAutoindent = function (chunk, postProcessing) { + + var commandMgr = this, + fakeSelection = false; + + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}>[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ \t]+\n$/, "\n\n"); + + // There's no selection, end the cursor wasn't at the end of the line: + // The user wants to split the current list item / code line / blockquote line + // (for the latter it doesn't really matter) in two. Temporarily select the + // (rest of the) line to achieve this. + if (!chunk.selection && !/^[ \t]*(?:\n|$)/.test(chunk.after)) { + chunk.after = chunk.after.replace(/^[^\n]*/, function (wholeMatch) { + chunk.selection = wholeMatch; + return ""; + }); + fakeSelection = true; + } + + if (/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doList) { + commandMgr.doList(chunk); + } + } + if (/(\n|^)[ ]{0,3}>[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doBlockquote) { + commandMgr.doBlockquote(chunk); + } + } + if (/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)) { + if (commandMgr.doCode) { + commandMgr.doCode(chunk); + } + } + + if (fakeSelection) { + chunk.after = chunk.selection + chunk.after; + chunk.selection = ""; + } + }; + + commandProto.doBlockquote = function (chunk, postProcessing) { + + chunk.selection = chunk.selection.replace(/^(\n*)([^\r]+?)(\n*)$/, + function (totalMatch, newlinesBefore, text, newlinesAfter) { + chunk.before += newlinesBefore; + chunk.after = newlinesAfter + chunk.after; + return text; + }); + + chunk.before = chunk.before.replace(/(>[ \t]*)$/, + function (totalMatch, blankLine) { + chunk.selection = blankLine + chunk.selection; + return ""; + }); + + chunk.selection = chunk.selection.replace(/^(\s|>)+$/, ""); + chunk.selection = chunk.selection || this.getString("quoteexample"); + + // The original code uses a regular expression to find out how much of the + // text *directly before* the selection already was a blockquote: + + /* + if (chunk.before) { + chunk.before = chunk.before.replace(/\n?$/, "\n"); + } + chunk.before = chunk.before.replace(/(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*$)/, + function (totalMatch) { + chunk.startTag = totalMatch; + return ""; + }); + */ + + // This comes down to: + // Go backwards as many lines a possible, such that each line + // a) starts with ">", or + // b) is almost empty, except for whitespace, or + // c) is preceeded by an unbroken chain of non-empty lines + // leading up to a line that starts with ">" and at least one more character + // and in addition + // d) at least one line fulfills a) + // + // Since this is essentially a backwards-moving regex, it's susceptible to + // catstrophic backtracking and can cause the browser to hang; + // see e.g. http://meta.stackoverflow.com/questions/9807. + // + // Hence we replaced this by a simple state machine that just goes through the + // lines and checks for a), b), and c). + + var match = "", + leftOver = "", + line; + if (chunk.before) { + var lines = chunk.before.replace(/\n$/, "").split("\n"); + var inChain = false; + for (var i = 0; i < lines.length; i++) { + var good = false; + line = lines[i]; + inChain = inChain && line.length > 0; // c) any non-empty line continues the chain + if (/^>/.test(line)) { // a) + good = true; + if (!inChain && line.length > 1) // c) any line that starts with ">" and has at least one more character starts the chain + inChain = true; + } else if (/^[ \t]*$/.test(line)) { // b) + good = true; + } else { + good = inChain; // c) the line is not empty and does not start with ">", so it matches if and only if we're in the chain + } + if (good) { + match += line + "\n"; + } else { + leftOver += match + line; + match = "\n"; + } + } + if (!/(^|\n)>/.test(match)) { // d) + leftOver += match; + match = ""; + } + } + + chunk.startTag = match; + chunk.before = leftOver; + + // end of change + + if (chunk.after) { + chunk.after = chunk.after.replace(/^\n?/, "\n"); + } + + chunk.after = chunk.after.replace(/^(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*)/, + function (totalMatch) { + chunk.endTag = totalMatch; + return ""; + } + ); + + var replaceBlanksInTags = function (useBracket) { + + var replacement = useBracket ? "> " : ""; + + if (chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n((>|\s)*)\n$/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + if (chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n((>|\s)*)\n/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + }; + + if (/^(?![ ]{0,3}>)/m.test(chunk.selection)) { + this.wrap(chunk, SETTINGS.lineLength - 2); + chunk.selection = chunk.selection.replace(/^/gm, "> "); + replaceBlanksInTags(true); + chunk.skipLines(); + } else { + chunk.selection = chunk.selection.replace(/^[ ]{0,3}> ?/gm, ""); + this.unwrap(chunk); + replaceBlanksInTags(false); + + if (!/^(\n|^)[ ]{0,3}>/.test(chunk.selection) && chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n{0,2}$/, "\n\n"); + } + + if (!/(\n|^)[ ]{0,3}>.*$/.test(chunk.selection) && chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n{0,2}/, "\n\n"); + } + } + + chunk.selection = this.hooks.postBlockquoteCreation(chunk.selection); + + if (!/\n/.test(chunk.selection)) { + chunk.selection = chunk.selection.replace(/^(> *)/, + function (wholeMatch, blanks) { + chunk.startTag += blanks; + return ""; + }); + } + }; + + commandProto.doCode = function (chunk, postProcessing) { + + var hasTextBefore = /\S[ ]*$/.test(chunk.before); + var hasTextAfter = /^[ ]*\S/.test(chunk.after); + + // Use 'four space' markdown if the selection is on its own + // line or is multiline. + if ((!hasTextAfter && !hasTextBefore) || /\n/.test(chunk.selection)) { + + chunk.before = chunk.before.replace(/[ ]{4}$/, + function (totalMatch) { + chunk.selection = totalMatch + chunk.selection; + return ""; + }); + + var nLinesBack = 1; + var nLinesForward = 1; + + if (/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)) { + nLinesBack = 0; + } + if (/^\n(\t|[ ]{4,})/.test(chunk.after)) { + nLinesForward = 0; + } + + chunk.skipLines(nLinesBack, nLinesForward); + + if (!chunk.selection) { + chunk.startTag = " "; + chunk.selection = this.getString("codeexample"); + } + else { + if (/^[ ]{0,3}\S/m.test(chunk.selection)) { + if (/\n/.test(chunk.selection)) + chunk.selection = chunk.selection.replace(/^/gm, " "); + else // if it's not multiline, do not select the four added spaces; this is more consistent with the doList behavior + chunk.before += " "; + } + else { + chunk.selection = chunk.selection.replace(/^(?:[ ]{4}|[ ]{0,3}\t)/gm, ""); + } + } + } + else { + // Use backticks (`) to delimit the code block. + + chunk.trimWhitespace(); + chunk.findTags(/`/, /`/); + + if (!chunk.startTag && !chunk.endTag) { + chunk.startTag = chunk.endTag = "`"; + if (!chunk.selection) { + chunk.selection = this.getString("codeexample"); + } + } + else if (chunk.endTag && !chunk.startTag) { + chunk.before += chunk.endTag; + chunk.endTag = ""; + } + else { + chunk.startTag = chunk.endTag = ""; + } + } + }; + + commandProto.doList = function (chunk, postProcessing, isNumberedList) { + + // These are identical except at the very beginning and end. + // Should probably use the regex extension function to make this clearer. + var previousItemsRegex = /(\n|^)(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*$/; + var nextItemsRegex = /^\n*(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*/; + + // The default bullet is a dash but others are possible. + // This has nothing to do with the particular HTML bullet, + // it's just a markdown bullet. + var bullet = "-"; + + // The number in a numbered list. + var num = 1; + + // Get the item prefix - e.g. " 1. " for a numbered list, " - " for a bulleted list. + var getItemPrefix = function () { + var prefix; + if (isNumberedList) { + prefix = " " + num + ". "; + num++; + } + else { + prefix = " " + bullet + " "; + } + return prefix; + }; + + // Fixes the prefixes of the other list items. + var getPrefixedItem = function (itemText) { + + // The numbering flag is unset when called by autoindent. + if (isNumberedList === undefined) { + isNumberedList = /^\s*\d/.test(itemText); + } + + // Renumber/bullet the list element. + itemText = itemText.replace(/^[ ]{0,3}([*+-]|\d+[.])\s/gm, + function (_) { + return getItemPrefix(); + }); + + return itemText; + }; + + chunk.findTags(/(\n|^)*[ ]{0,3}([*+-]|\d+[.])\s+/, null); + + if (chunk.before && !/\n$/.test(chunk.before) && !/^\n/.test(chunk.startTag)) { + chunk.before += chunk.startTag; + chunk.startTag = ""; + } + + if (chunk.startTag) { + + var hasDigits = /\d+[.]/.test(chunk.startTag); + chunk.startTag = ""; + chunk.selection = chunk.selection.replace(/\n[ ]{4}/g, "\n"); + this.unwrap(chunk); + chunk.skipLines(); + + if (hasDigits) { + // Have to renumber the bullet points if this is a numbered list. + chunk.after = chunk.after.replace(nextItemsRegex, getPrefixedItem); + } + if (isNumberedList == hasDigits) { + return; + } + } + + var nLinesUp = 1; + + chunk.before = chunk.before.replace(previousItemsRegex, + function (itemText) { + if (/^\s*([*+-])/.test(itemText)) { + bullet = re.$1; + } + nLinesUp = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + if (!chunk.selection) { + chunk.selection = this.getString("litem"); + } + + var prefix = getItemPrefix(); + + var nLinesDown = 1; + + chunk.after = chunk.after.replace(nextItemsRegex, + function (itemText) { + nLinesDown = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + chunk.trimWhitespace(true); + chunk.skipLines(nLinesUp, nLinesDown, true); + chunk.startTag = prefix; + var spaces = prefix.replace(/./g, " "); + this.wrap(chunk, SETTINGS.lineLength - spaces.length); + chunk.selection = chunk.selection.replace(/\n/g, "\n" + spaces); + + }; + + commandProto.doHeading = function (chunk, postProcessing) { + + // Remove leading/trailing whitespace and reduce internal spaces to single spaces. + chunk.selection = chunk.selection.replace(/\s+/g, " "); + chunk.selection = chunk.selection.replace(/(^\s+|\s+$)/g, ""); + + // If we clicked the button with no selected text, we just + // make a level 2 hash header around some default text. + if (!chunk.selection) { + chunk.startTag = "## "; + chunk.selection = this.getString("headingexample"); + chunk.endTag = " \n"; + return; + } + + var headerLevel = 0; // The existing header level of the selected text. + + // Remove any existing hash heading markdown and save the header level. + chunk.findTags(/#+[ ]*/, /[ ]*#+/); + if (/#+/.test(chunk.startTag)) { + headerLevel = re.lastMatch.length; + } + chunk.startTag = chunk.endTag = ""; + + // Try to get the current header level by looking for - and = in the line + // below the selection. + chunk.findTags(null, /\s?(-+|=+)/); + if (/=+/.test(chunk.endTag)) { + headerLevel = 1; + } + if (/-+/.test(chunk.endTag)) { + headerLevel = 2; + } + + // Skip to the next line so we can create the header markdown. + chunk.startTag = chunk.endTag = ""; + chunk.skipLines(1, 1); + + // We make a level 4 header if there is no current header. + // If there is a header level, we substract one from the header level. + // If it's already a level 1 header, it's removed. + var headerLevelToCreate = headerLevel == 0 ? 4 : headerLevel - 1; + + /* + if (headerLevelToCreate > 0) { + + // The button only creates level 1 and 2 underline headers. + // Why not have it iterate over hash header levels? Wouldn't that be easier and cleaner? + var headerChar = headerLevelToCreate >= 2 ? "-" : "="; + var len = chunk.selection.length; + if (len > SETTINGS.lineLength) { + len = SETTINGS.lineLength; + } + chunk.endTag = "\n"; + while (len--) { + chunk.endTag += headerChar; + } + } + */ + + if (headerLevelToCreate > 0) { + var hashesToCreate = headerLevelToCreate; + while (hashesToCreate--) { + chunk.startTag += "#"; + } + chunk.startTag += " "; //So we have #### Header instead of ####Header (optional) + } + + }; + + commandProto.doHorizontalRule = function (chunk, postProcessing) { + chunk.startTag = "----------\n"; + chunk.selection = ""; + chunk.skipLines(1, 1, true); + } + + commandProto.doReadMore = function (chunk, postProcessing) { + chunk.startTag = ""; + chunk.selection = ""; + chunk.skipLines(1, 1, true); + } + + commandProto.doTOC = function (chunk, postProcessing) { + chunk.startTag = ""; + chunk.selection = ""; + chunk.skipLines(1, 1, true); + } + + commandProto.doStrikethrough = function (chunk, postProcessing) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(~*$)/.exec(chunk.before)[0]; + var starsAfter = /(^~*)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + var nStars = 2; + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[~]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[~]{" + nStars + "}", ""), ""); + } else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^(~*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = this.getString("strikethroughexample"); + } + + // Add the true markup. + var markup = "~~"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; + }; + + commandProto.doTable = function (chunk) { + // Credit: https://github.com/fcrespo82/atom-markdown-table-formatter + + var keepFirstAndLastPipes = true, + /* + ( # header capture + (?: + (?:[^\n]*?\|[^\n]*) # line w/ at least one pipe + \ * # maybe trailing whitespace + )? # maybe header + (?:\n|^) # newline + ) + ( # format capture + (?: + \|\ *:?-+:?\ * # format starting w/pipe + |\|?(?:\ *:?-+:?\ *\|)+ # or separated by pipe + ) + (?:\ *:?-+:?\ *)? # maybe w/o trailing pipe + \ * # maybe trailing whitespace + \n # newline + ) + ( # body capture + (?: + (?:[^\n]*?\|[^\n]*) # line w/ at least one pipe + \ * # maybe trailing whitespace + (?:\n|$) # newline + )+ # at least one + ) + */ + regex = /((?:(?:[^\n]*?\|[^\n]*) *)?(?:\r?\n|^))((?:\| *:?-+:? *|\|?(?: *:?-+:? *\|)+)(?: *:?-+:? *)? *\r?\n)((?:(?:[^\n]*?\|[^\n]*) *(?:\r?\n|$))+)/; + + + function padding(len, str) { + var result = ''; + str = str || ' '; + len = Math.floor(len); + for (var i = 0; i < len; i++) { + result += str; + } + return result; + } + + function stripTailPipes(str) { + return str.trim().replace(/(^\||\|$)/g, ""); + } + + function splitCells(str) { + return str.split('|'); + } + + function addTailPipes(str) { + if (keepFirstAndLastPipes) { + return "|" + str + "|"; + } else { + return str; + } + } + + function joinCells(arr) { + return arr.join('|'); + } + + function formatTable(text, appendNewline) { + var i, j, len1, ref1, ref2, ref3, k, len2, results, formatline, headerline, just, formatrow, data, line, lines, justify, cell, cells, first, last, ends, columns, content, widths, formatted, front, back; + formatline = text[2].trim(); + headerline = text[1].trim(); + ref1 = headerline.length === 0 ? [0, text[3]] : [1, text[1] + text[3]], formatrow = ref1[0], data = ref1[1]; + lines = data.trim().split('\n'); + justify = []; + ref2 = splitCells(stripTailPipes(formatline)); + for (j = 0, len1 = ref2.length; j < len1; j++) { + cell = ref2[j]; + ref3 = cell.trim(), first = ref3[0], last = ref3[ref3.length - 1]; + switch ((ends = (first ? first : ':') + (last ? last : ''))) { + case '::': + case '-:': + case ':-': + justify.push(ends); + break; + default: + justify.push('--'); + } + } + columns = justify.length; + content = []; + for (j = 0, len1 = lines.length; j < len1; j++) { + line = lines[j]; + cells = splitCells(stripTailPipes(line)); + cells[columns - 1] = joinCells(cells.slice(columns - 1)); + results = []; + for (k = 0, len2 = cells.length; k < len2; k++) { + cell = cells[k]; + results.push(padding(' ') + ((ref2 = cell ? typeof cell.trim === "function" ? cell.trim() : void 0 : void 0) ? ref2 : '') + padding(' ')); + } + content.push(results); + } + widths = []; + for (i = j = 0, ref2 = columns - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) { + results = []; + for (k = 0, len1 = content.length; k < len1; k++) { + cells = content[k]; + results.push(cells[i].length); + } + widths.push(Math.max.apply(Math, [2].concat(results))); + } + just = function (string, col) { + var back, front, length; + length = widths[col] - string.length; + switch (justify[col]) { + case '::': + front = padding[0], back = padding[1]; + return padding(length / 2) + string + padding((length + 1) / 2); + case '-:': + return padding(length) + string; + default: + return string + padding(length); + } + }; + formatted = []; + for (j = 0, len1 = content.length; j < len1; j++) { + cells = content[j]; + results = []; + for (i = k = 0, ref2 = columns - 1; 0 <= ref2 ? k <= ref2 : k >= ref2; i = 0 <= ref2 ? ++k : --k) { + results.push(just(cells[i], i)); + } + formatted.push(addTailPipes(joinCells(results))); + } + formatline = addTailPipes(joinCells((function () { + var j, ref2, ref3, results; + results = []; + for (i = j = 0, ref2 = columns - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) { + ref3 = justify[i], front = ref3[0], back = ref3[1]; + results.push(front + padding(widths[i] - 2, '-') + back); + } + return results; + })())); + formatted.splice(formatrow, 0, formatline); + var result = (headerline.length === 0 && text[1] !== '' ? '\n' : '') + formatted.join('\n'); + if (appendNewline !== false) { + result += '\n' + } + return result; + } + + if (chunk.before.slice(-1) !== '\n') { + chunk.before += '\n'; + } + var match = chunk.selection.match(regex); + if (match) { + chunk.selection = formatTable(match, chunk.selection.slice(-1) === '\n'); + } else { + var table = chunk.selection + '|\n-|-\n|'; + match = table.match(regex); + if (!match || match[0].slice(0, table.length) !== table) { + return; + } + table = formatTable(match); + var selectionOffset = keepFirstAndLastPipes ? 1 : 0; + var pipePos = table.indexOf('|', selectionOffset); + chunk.before += table.slice(0, selectionOffset); + chunk.selection = table.slice(selectionOffset, pipePos); + chunk.after = table.slice(pipePos) + chunk.after; + } + }; + + +})(); \ No newline at end of file diff --git a/system/admin/editor/js/Markdown.Extra.js b/system/admin/editor/js/Markdown.Extra.js new file mode 100644 index 0000000..d3b859a --- /dev/null +++ b/system/admin/editor/js/Markdown.Extra.js @@ -0,0 +1,874 @@ +(function () { + // A quick way to make sure we're only keeping span-level tags when we need to. + // This isn't supposed to be foolproof. It's just a quick way to make sure we + // keep all span-level tags returned by a pagedown converter. It should allow + // all span-level tags through, with or without attributes. + var inlineTags = new RegExp(['^(<\\/?(a|abbr|acronym|applet|area|b|basefont|', + 'bdo|big|button|cite|code|del|dfn|em|figcaption|', + 'font|i|iframe|img|input|ins|kbd|label|map|', + 'mark|meter|object|param|progress|q|ruby|rp|rt|s|', + 'samp|script|select|small|span|strike|strong|', + 'sub|sup|textarea|time|tt|u|var|wbr)[^>]*>|', + '<(br)\\s?\\/?>)$'].join(''), 'i'); + + /****************************************************************** + * Utility Functions * + *****************************************************************/ + + // patch for ie7 + if (!Array.indexOf) { + Array.prototype.indexOf = function(obj) { + for (var i = 0; i < this.length; i++) { + if (this[i] == obj) { + return i; + } + } + return -1; + }; + } + + function trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + + function rtrim(str) { + return str.replace(/\s+$/g, ''); + } + + // Remove one level of indentation from text. Indent is 4 spaces. + function outdent(text) { + return text.replace(new RegExp('^(\\t|[ ]{1,4})', 'gm'), ''); + } + + function contains(str, substr) { + return str.indexOf(substr) != -1; + } + + // Sanitize html, removing tags that aren't in the whitelist + function sanitizeHtml(html, whitelist) { + return html.replace(/<[^>]*>?/gi, function(tag) { + return tag.match(whitelist) ? tag : ''; + }); + } + + // Merge two arrays, keeping only unique elements. + function union(x, y) { + var obj = {}; + for (var i = 0; i < x.length; i++) + obj[x[i]] = x[i]; + for (i = 0; i < y.length; i++) + obj[y[i]] = y[i]; + var res = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) + res.push(obj[k]); + } + return res; + } + + // JS regexes don't support \A or \Z, so we add sentinels, as Pagedown + // does. In this case, we add the ascii codes for start of text (STX) and + // end of text (ETX), an idea borrowed from: + // https://github.com/tanakahisateru/js-markdown-extra + function addAnchors(text) { + if(text.charAt(0) != '\x02') + text = '\x02' + text; + if(text.charAt(text.length - 1) != '\x03') + text = text + '\x03'; + return text; + } + + // Remove STX and ETX sentinels. + function removeAnchors(text) { + if(text.charAt(0) == '\x02') + text = text.substr(1); + if(text.charAt(text.length - 1) == '\x03') + text = text.substr(0, text.length - 1); + return text; + } + + // Convert markdown within an element, retaining only span-level tags + function convertSpans(text, extra) { + return sanitizeHtml(convertAll(text, extra), inlineTags); + } + + // Convert internal markdown using the stock pagedown converter + function convertAll(text, extra) { + var result = extra.blockGamutHookCallback(text); + // We need to perform these operations since we skip the steps in the converter + result = unescapeSpecialChars(result); + result = result.replace(/~D/g, "$$").replace(/~T/g, "~"); + result = extra.previousPostConversion(result); + return result; + } + + // Convert escaped special characters + function processEscapesStep1(text) { + // Markdown extra adds two escapable characters, `:` and `|` + return text.replace(/\\\|/g, '~I').replace(/\\:/g, '~i'); + } + function processEscapesStep2(text) { + return text.replace(/~I/g, '|').replace(/~i/g, ':'); + } + + // Duplicated from PageDown converter + function unescapeSpecialChars(text) { + // Swap back in all the special characters we've hidden. + text = text.replace(/~E(\d+)E/g, function(wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + return text; + } + + function slugify(text) { + return text.toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + } + + /***************************************************************************** + * Markdown.Extra * + ****************************************************************************/ + + Markdown.Extra = function() { + // For converting internal markdown (in tables for instance). + // This is necessary since these methods are meant to be called as + // preConversion hooks, and the Markdown converter passed to init() + // won't convert any markdown contained in the html tags we return. + this.converter = null; + + // Stores html blocks we generate in hooks so that + // they're not destroyed if the user is using a sanitizing converter + this.hashBlocks = []; + + // Stores footnotes + this.footnotes = {}; + this.usedFootnotes = []; + + // Special attribute blocks for fenced code blocks and headers enabled. + this.attributeBlocks = false; + + // Fenced code block options + this.googleCodePrettify = false; + this.highlightJs = false; + + // Table options + this.tableClass = ''; + + this.tabWidth = 4; + }; + + Markdown.Extra.init = function(converter, options) { + // Each call to init creates a new instance of Markdown.Extra so it's + // safe to have multiple converters, with different options, on a single page + var extra = new Markdown.Extra(); + var postNormalizationTransformations = []; + var preBlockGamutTransformations = []; + var postSpanGamutTransformations = []; + var postConversionTransformations = ["unHashExtraBlocks"]; + + options = options || {}; + options.extensions = options.extensions || ["all"]; + if (contains(options.extensions, "all")) { + options.extensions = ["tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants", "strikethrough", "newlines"]; + } + preBlockGamutTransformations.push("wrapHeaders"); + if (contains(options.extensions, "attr_list")) { + postNormalizationTransformations.push("hashFcbAttributeBlocks"); + preBlockGamutTransformations.push("hashHeaderAttributeBlocks"); + postConversionTransformations.push("applyAttributeBlocks"); + extra.attributeBlocks = true; + } + if (contains(options.extensions, "fenced_code_gfm")) { + // This step will convert fcb inside list items and blockquotes + preBlockGamutTransformations.push("fencedCodeBlocks"); + // This extra step is to prevent html blocks hashing and link definition/footnotes stripping inside fcb + postNormalizationTransformations.push("fencedCodeBlocks"); + } + if (contains(options.extensions, "tables")) { + preBlockGamutTransformations.push("tables"); + } + if (contains(options.extensions, "def_list")) { + preBlockGamutTransformations.push("definitionLists"); + } + if (contains(options.extensions, "footnotes")) { + postNormalizationTransformations.push("stripFootnoteDefinitions"); + preBlockGamutTransformations.push("doFootnotes"); + postConversionTransformations.push("printFootnotes"); + } + if (contains(options.extensions, "smartypants")) { + postConversionTransformations.push("runSmartyPants"); + } + if (contains(options.extensions, "strikethrough")) { + postSpanGamutTransformations.push("strikethrough"); + } + if (contains(options.extensions, "newlines")) { + postSpanGamutTransformations.push("newlines"); + } + + converter.hooks.chain("postNormalization", function(text) { + return extra.doTransform(postNormalizationTransformations, text) + '\n'; + }); + + converter.hooks.chain("preBlockGamut", function(text, blockGamutHookCallback) { + // Keep a reference to the block gamut callback to run recursively + extra.blockGamutHookCallback = blockGamutHookCallback; + text = processEscapesStep1(text); + text = extra.doTransform(preBlockGamutTransformations, text) + '\n'; + text = processEscapesStep2(text); + return text; + }); + + converter.hooks.chain("postSpanGamut", function(text) { + return extra.doTransform(postSpanGamutTransformations, text); + }); + + // Keep a reference to the hook chain running before doPostConversion to apply on hashed extra blocks + extra.previousPostConversion = converter.hooks.postConversion; + converter.hooks.chain("postConversion", function(text) { + text = extra.doTransform(postConversionTransformations, text); + // Clear state vars that may use unnecessary memory + extra.hashBlocks = []; + extra.footnotes = {}; + extra.usedFootnotes = []; + return text; + }); + + if ("highlighter" in options) { + extra.googleCodePrettify = options.highlighter === 'prettify'; + extra.highlightJs = options.highlighter === 'highlight'; + } + + if ("table_class" in options) { + extra.tableClass = options.table_class; + } + + extra.converter = converter; + + // Caller usually won't need this, but it's handy for testing. + return extra; + }; + + // Do transformations + Markdown.Extra.prototype.doTransform = function(transformations, text) { + for(var i = 0; i < transformations.length; i++) + text = this[transformations[i]](text); + return text; + }; + + // Return a placeholder containing a key, which is the block's index in the + // hashBlocks array. We wrap our output in a

        tag here so Pagedown won't. + Markdown.Extra.prototype.hashExtraBlock = function(block) { + return '\n

        ~X' + (this.hashBlocks.push(block) - 1) + 'X

        \n'; + }; + Markdown.Extra.prototype.hashExtraInline = function(block) { + return '~X' + (this.hashBlocks.push(block) - 1) + 'X'; + }; + + // Replace placeholder blocks in `text` with their corresponding + // html blocks in the hashBlocks array. + Markdown.Extra.prototype.unHashExtraBlocks = function(text) { + var self = this; + function recursiveUnHash() { + var hasHash = false; + text = text.replace(/(?:

        )?~X(\d+)X(?:<\/p>)?/g, function(wholeMatch, m1) { + hasHash = true; + var key = parseInt(m1, 10); + return self.hashBlocks[key]; + }); + if(hasHash === true) { + recursiveUnHash(); + } + } + recursiveUnHash(); + return text; + }; + + // Wrap headers to make sure they won't be in def lists + Markdown.Extra.prototype.wrapHeaders = function(text) { + function wrap(text) { + return '\n' + text + '\n'; + } + text = text.replace(/^.+[ \t]*\n=+[ \t]*\n+/gm, wrap); + text = text.replace(/^.+[ \t]*\n-+[ \t]*\n+/gm, wrap); + text = text.replace(/^\#{1,6}[ \t]*.+?[ \t]*\#*\n+/gm, wrap); + return text; + }; + + + /****************************************************************** + * Attribute Blocks * + *****************************************************************/ + + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + var attrBlock = "\\{[ \\t]*((?:[#.][-_:a-zA-Z0-9]+[ \\t]*)+)\\}"; + var hdrAttributesA = new RegExp("^(#{1,6}.*#{0,6})[ \\t]+" + attrBlock + "[ \\t]*(?:\\n|0x03)", "gm"); + var hdrAttributesB = new RegExp("^(.*)[ \\t]+" + attrBlock + "[ \\t]*\\n" + + "(?=[\\-|=]+\\s*(?:\\n|0x03))", "gm"); // underline lookahead + var fcbAttributes = new RegExp("^(```[^`\\n]*)[ \\t]+" + attrBlock + "[ \\t]*\\n" + + "(?=([\\s\\S]*?)\\n```[ \\t]*(\\n|0x03))", "gm"); + + // Extract headers attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(text) { + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

        ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

        \n' + pre + "\n"; + } + + text = text.replace(hdrAttributesA, attributeCallback); // ## headers + text = text.replace(hdrAttributesB, attributeCallback); // underline headers + return text; + }; + + // Extract FCB attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashFcbAttributeBlocks = function(text) { + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

        ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

        \n' + pre + "\n"; + } + + return text.replace(fcbAttributes, attributeCallback); + }; + + Markdown.Extra.prototype.applyAttributeBlocks = function(text) { + var self = this; + var blockRe = new RegExp('

        ~XX(\\d+)XX

        [\\s]*' + + '(?:<(h[1-6]|pre)(?: +class="(\\S+)")?(>[\\s\\S]*?))', "gm"); + text = text.replace(blockRe, function(wholeMatch, k, tag, cls, rest) { + if (!tag) // no following header or fenced code block. + return ''; + + // get attributes list from hash + var key = parseInt(k, 10); + var attributes = self.hashBlocks[key]; + + // get id + var id = attributes.match(/#[^\s#.]+/g) || []; + var idStr = id[0] ? ' id="' + id[0].substr(1, id[0].length - 1) + '"' : ''; + + // get classes and merge with existing classes + var classes = attributes.match(/\.[^\s#.]+/g) || []; + for (var i = 0; i < classes.length; i++) // Remove leading dot + classes[i] = classes[i].substr(1, classes[i].length - 1); + + var classStr = ''; + if (cls) + classes = union(classes, [cls]); + + if (classes.length > 0) + classStr = ' class="' + classes.join(' ') + '"'; + + return "<" + tag + idStr + classStr + rest; + }); + + return text; + }; + + /****************************************************************** + * Tables * + *****************************************************************/ + + // Find and convert Markdown Extra tables into html. + Markdown.Extra.prototype.tables = function(text) { + var self = this; + + var leadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '[|]' , // Initial pipe + '(.+)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '[|]([ ]*[-:]+[-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:[ ]*[|].*\\n?)*' , // Table rows + ')', + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + var noLeadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '(\\S.*[|].*)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '([-:]+[ ]*[|][-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:.*[|].*\\n?)*' , // Table rows + ')' , + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + text = text.replace(leadingPipe, doTable); + text = text.replace(noLeadingPipe, doTable); + + // $1 = header, $2 = separator, $3 = body + function doTable(match, header, separator, body, offset, string) { + // remove any leading pipes and whitespace + header = header.replace(/^ *[|]/m, ''); + separator = separator.replace(/^ *[|]/m, ''); + body = body.replace(/^ *[|]/gm, ''); + + // remove trailing pipes and whitespace + header = header.replace(/[|] *$/m, ''); + separator = separator.replace(/[|] *$/m, ''); + body = body.replace(/[|] *$/gm, ''); + + // determine column alignments + var alignspecs = separator.split(/ *[|] */); + var align = []; + for (var i = 0; i < alignspecs.length; i++) { + var spec = alignspecs[i]; + if (spec.match(/^ *-+: *$/m)) + align[i] = ' align="right"'; + else if (spec.match(/^ *:-+: *$/m)) + align[i] = ' align="center"'; + else if (spec.match(/^ *:-+ *$/m)) + align[i] = ' align="left"'; + else align[i] = ''; + } + + // TODO: parse spans in header and rows before splitting, so that pipes + // inside of tags are not interpreted as separators + var headers = header.split(/ *[|] */); + var colCount = headers.length; + + // build html + var cls = self.tableClass ? ' class="' + self.tableClass + '"' : ''; + var html = ['\n', '\n', '\n'].join(''); + + // build column headers. + for (i = 0; i < colCount; i++) { + var headerHtml = convertSpans(trim(headers[i]), self); + html += [" ", headerHtml, "\n"].join(''); + } + html += "\n\n"; + + // build rows + var rows = body.split('\n'); + for (i = 0; i < rows.length; i++) { + if (rows[i].match(/^\s*$/)) // can apply to final row + continue; + + // ensure number of rowCells matches colCount + var rowCells = rows[i].split(/ *[|] */); + var lenDiff = colCount - rowCells.length; + for (var j = 0; j < lenDiff; j++) + rowCells.push(''); + + html += "\n"; + for (j = 0; j < colCount; j++) { + var colHtml = convertSpans(trim(rowCells[j]), self); + html += [" ", colHtml, "\n"].join(''); + } + html += "\n"; + } + + html += "\n"; + + // replace html with placeholder until postConversion step + return self.hashExtraBlock(html); + } + + return text; + }; + + + /****************************************************************** + * Footnotes * + *****************************************************************/ + + // Strip footnote, store in hashes. + Markdown.Extra.prototype.stripFootnoteDefinitions = function(text) { + var self = this; + + text = text.replace( + /\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, + function(wholeMatch, m1, m2) { + m1 = slugify(m1); + m2 += "\n"; + m2 = m2.replace(/^[ ]{0,3}/g, ""); + self.footnotes[m1] = m2; + return "\n"; + }); + + return text; + }; + + + // Find and convert footnotes references. + Markdown.Extra.prototype.doFootnotes = function(text) { + var self = this; + if(self.isConvertingFootnote === true) { + return text; + } + + var footnoteCounter = 0; + text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) { + var id = slugify(m1); + var footnote = self.footnotes[id]; + if (footnote === undefined) { + return wholeMatch; + } + footnoteCounter++; + self.usedFootnotes.push(id); + var html = '' + footnoteCounter + + ''; + return self.hashExtraInline(html); + }); + + return text; + }; + + // Print footnotes at the end of the document + Markdown.Extra.prototype.printFootnotes = function(text) { + var self = this; + + if (self.usedFootnotes.length === 0) { + return text; + } + + text += '\n\n
        \n
        \n
          \n\n'; + for(var i=0; i' + + formattedfootnote + + ' \n\n'; + } + text += '
        \n
        '; + return text; + }; + + + /****************************************************************** + * Fenced Code Blocks (gfm) * + ******************************************************************/ + + // Find and convert gfm-inspired fenced code blocks into html. + Markdown.Extra.prototype.fencedCodeBlocks = function(text) { + function encodeCode(code) { + code = code.replace(/&/g, "&"); + code = code.replace(//g, ">"); + // These were escaped by PageDown before postNormalization + code = code.replace(/~D/g, "$$"); + code = code.replace(/~T/g, "~"); + return code; + } + + var self = this; + text = text.replace(/(?:^|\n)```([^`\n]*)\n([\s\S]*?)\n```[ \t]*(?=\n)/g, function(match, m1, m2) { + var language = trim(m1), codeblock = m2; + + // adhere to specified options + var preclass = self.googleCodePrettify ? ' class="prettyprint"' : ''; + var codeclass = ''; + if (language) { + if (self.googleCodePrettify || self.highlightJs) { + // use html5 language- class names. supported by both prettify and highlight.js + codeclass = ' class="language-' + language + '"'; + } else { + codeclass = ' class="' + language + '"'; + } + } + + var html = ['', + encodeCode(codeblock), '
    '].join(''); + + // replace codeblock with placeholder until postConversion step + return self.hashExtraBlock(html); + }); + + return text; + }; + + + /****************************************************************** + * SmartyPants * + ******************************************************************/ + + Markdown.Extra.prototype.educatePants = function(text) { + var self = this; + var result = ''; + var blockOffset = 0; + // Here we parse HTML in a very bad manner + text.replace(/(?:)|(<)([a-zA-Z1-6]+)([^\n]*?>)([\s\S]*?)(<\/\2>)/g, function(wholeMatch, m1, m2, m3, m4, m5, offset) { + var token = text.substring(blockOffset, offset); + result += self.applyPants(token); + self.smartyPantsLastChar = result.substring(result.length - 1); + blockOffset = offset + wholeMatch.length; + if(!m1) { + // Skip commentary + result += wholeMatch; + return; + } + // Skip special tags + if(!/code|kbd|pre|script|noscript|iframe|math|ins|del|pre/i.test(m2)) { + m4 = self.educatePants(m4); + } + else { + self.smartyPantsLastChar = m4.substring(m4.length - 1); + } + result += m1 + m2 + m3 + m4 + m5; + }); + var lastToken = text.substring(blockOffset); + result += self.applyPants(lastToken); + self.smartyPantsLastChar = result.substring(result.length - 1); + return result; + }; + + function revertPants(wholeMatch, m1) { + var blockText = m1; + blockText = blockText.replace(/&\#8220;/g, "\""); + blockText = blockText.replace(/&\#8221;/g, "\""); + blockText = blockText.replace(/&\#8216;/g, "'"); + blockText = blockText.replace(/&\#8217;/g, "'"); + blockText = blockText.replace(/&\#8212;/g, "---"); + blockText = blockText.replace(/&\#8211;/g, "--"); + blockText = blockText.replace(/&\#8230;/g, "..."); + return blockText; + } + + Markdown.Extra.prototype.applyPants = function(text) { + // Dashes + text = text.replace(/---/g, "—").replace(/--/g, "–"); + // Ellipses + text = text.replace(/\.\.\./g, "…").replace(/\.\s\.\s\./g, "…"); + // Backticks + text = text.replace(/``/g, "“").replace (/''/g, "”"); + + if(/^'$/.test(text)) { + // Special case: single-character ' token + if(/\S/.test(this.smartyPantsLastChar)) { + return "’"; + } + return "‘"; + } + if(/^"$/.test(text)) { + // Special case: single-character " token + if(/\S/.test(this.smartyPantsLastChar)) { + return "”"; + } + return "“"; + } + + // Special case if the very first character is a quote + // followed by punctuation at a non-word-break. Close the quotes by brute force: + text = text.replace (/^'(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/, "’"); + text = text.replace (/^"(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/, "”"); + + // Special case for double sets of quotes, e.g.: + //

    He said, "'Quoted' words in a larger quote."

    + text = text.replace(/"'(?=\w)/g, "“‘"); + text = text.replace(/'"(?=\w)/g, "‘“"); + + // Special case for decade abbreviations (the '80s): + text = text.replace(/'(?=\d{2}s)/g, "’"); + + // Get most opening single quotes: + text = text.replace(/(\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)'(?=\w)/g, "$1‘"); + + // Single closing quotes: + text = text.replace(/([^\s\[\{\(\-])'/g, "$1’"); + text = text.replace(/'(?=\s|s\b)/g, "’"); + + // Any remaining single quotes should be opening ones: + text = text.replace(/'/g, "‘"); + + // Get most opening double quotes: + text = text.replace(/(\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)"(?=\w)/g, "$1“"); + + // Double closing quotes: + text = text.replace(/([^\s\[\{\(\-])"/g, "$1”"); + text = text.replace(/"(?=\s)/g, "”"); + + // Any remaining quotes should be opening ones. + text = text.replace(/"/ig, "“"); + return text; + }; + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.runSmartyPants = function(text) { + this.smartyPantsLastChar = ''; + text = this.educatePants(text); + // Clean everything inside html tags (some of them may have been converted due to our rough html parsing) + text = text.replace(/(<([a-zA-Z1-6]+)\b([^\n>]*?)(\/)?>)/g, revertPants); + return text; + }; + + /****************************************************************** + * Definition Lists * + ******************************************************************/ + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.definitionLists = function(text) { + var wholeList = new RegExp( + ['(\\x02\\n?|\\n\\n)' , + '(?:' , + '(' , // $1 = whole list + '(' , // $2 + '[ ]{0,3}' , + '((?:[ \\t]*\\S.*\\n)+)', // $3 = defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '([\\s\\S]+?)' , + '(' , // $4 + '(?=\\0x03)' , // \z + '|' , + '(?=' , + '\\n{2,}' , + '(?=\\S)' , + '(?!' , // Negative lookahead for another term + '[ ]{0,3}' , + '(?:\\S.*\\n)+?' , // defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '(?!' , // Negative lookahead for another definition + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + ')' , + ')' , + ')' , + ')' + ].join(''), + 'gm' + ); + + var self = this; + text = addAnchors(text); + + text = text.replace(wholeList, function(match, pre, list) { + var result = trim(self.processDefListItems(list)); + result = "
    \n" + result + "\n
    "; + return pre + self.hashExtraBlock(result) + "\n\n"; + }); + + return removeAnchors(text); + }; + + // Process the contents of a single definition list, splitting it + // into individual term and definition list items. + Markdown.Extra.prototype.processDefListItems = function(listStr) { + var self = this; + + var dt = new RegExp( + ['(\\x02\\n?|\\n\\n+)' , // leading line + '(' , // definition terms = $1 + '[ ]{0,3}' , // leading whitespace + '(?![:][ ]|[ ])' , // negative lookahead for a definition + // mark (colon) or more whitespace + '(?:\\S.*\\n)+?' , // actual term (not whitespace) + ')' , + '(?=\\n?[ ]{0,3}:[ ])' // lookahead for following line feed + ].join(''), // with a definition mark + 'gm' + ); + + var dd = new RegExp( + ['\\n(\\n+)?' , // leading line = $1 + '(' , // marker space = $2 + '[ ]{0,3}' , // whitespace before colon + '[:][ ]+' , // definition mark (colon) + ')' , + '([\\s\\S]+?)' , // definition text = $3 + '(?=\\n*' , // stop at next definition mark, + '(?:' , // next term or end of text + '\\n[ ]{0,3}[:][ ]|' , + '
    |\\x03' , // \z + ')' , + ')' + ].join(''), + 'gm' + ); + + listStr = addAnchors(listStr); + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}(?=\\x03)/, "\n"); + + // Process definition terms. + listStr = listStr.replace(dt, function(match, pre, termsStr) { + var terms = trim(termsStr).split("\n"); + var text = ''; + for (var i = 0; i < terms.length; i++) { + var term = terms[i]; + // process spans inside dt + term = convertSpans(trim(term), self); + text += "\n
    " + term + "
    "; + } + return text + "\n"; + }); + + // Process actual definitions. + listStr = listStr.replace(dd, function(match, leadingLine, markerSpace, def) { + if (leadingLine || def.match(/\n{2,}/)) { + // replace marker with the appropriate whitespace indentation + def = Array(markerSpace.length + 1).join(' ') + def; + // process markdown inside definition + // TODO?: currently doesn't apply extensions + def = outdent(def) + "\n\n"; + def = "\n" + convertAll(def, self) + "\n"; + } else { + // convert span-level markdown inside definition + def = rtrim(def); + def = convertSpans(outdent(def), self); + } + + return "\n
    " + def + "
    \n"; + }); + + return removeAnchors(listStr); + }; + + + /*********************************************************** + * Strikethrough * + ************************************************************/ + + Markdown.Extra.prototype.strikethrough = function(text) { + // Pretty much duplicated from _DoItalicsAndBold + return text.replace(/([\W_]|^)~T~T(?=\S)([^\r]*?\S[\*_]*)~T~T([\W_]|$)/g, + "$1$2$3"); + }; + + + /*********************************************************** + * New lines * + ************************************************************/ + + Markdown.Extra.prototype.newlines = function(text) { + // We have to ignore already converted newlines and line breaks in sub-list items + return text.replace(/(<(?:br|\/li)>)?\n/g, function(wholeMatch, previousTag) { + return previousTag ? wholeMatch : "
    \n"; + }); + }; + +})(); + diff --git a/system/admin/editor/js/Markdown.Sanitizer.js b/system/admin/editor/js/Markdown.Sanitizer.js new file mode 100644 index 0000000..bfced16 --- /dev/null +++ b/system/admin/editor/js/Markdown.Sanitizer.js @@ -0,0 +1,108 @@ +(function () { + var output, Converter; + if (typeof exports === "object" && typeof require === "function") { // we're in a CommonJS (e.g. Node.js) module + output = exports; + Converter = require("./Markdown.Converter").Converter; + } else { + output = window.Markdown; + Converter = output.Converter; + } + + output.getSanitizingConverter = function () { + var converter = new Converter(); + converter.hooks.chain("postConversion", sanitizeHtml); + converter.hooks.chain("postConversion", balanceTags); + return converter; + } + + function sanitizeHtml(html) { + return html.replace(/<[^>]*>?/gi, sanitizeTag); + } + + // (tags that can be opened/closed) | (tags that stand alone) + var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i; + // | + var a_white = /^(]+")?\s?>|<\/a>)$/i; + + // ]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i; + + function sanitizeTag(tag) { + if (tag.match(basic_tag_whitelist) || tag.match(a_white) || tag.match(img_white)) + return tag; + else + return ""; + } + + /// + /// attempt to balance HTML tags in the html string + /// by removing any unmatched opening or closing tags + /// IMPORTANT: we *assume* HTML has *already* been + /// sanitized and is safe/sane before balancing! + /// + /// adapted from CODESNIPPET: A8591DBA-D1D3-11DE-947C-BA5556D89593 + /// + function balanceTags(html) { + + if (html == "") + return ""; + + var re = /<\/?\w+[^>]*(\s|$|>)/g; + // convert everything to lower case; this makes + // our case insensitive comparisons easier + var tags = html.toLowerCase().match(re); + + // no HTML tags present? nothing to do; exit now + var tagcount = (tags || []).length; + if (tagcount == 0) + return html; + + var tagname, tag; + var ignoredtags = "



  • "; + var match; + var tagpaired = []; + var tagremove = []; + var needsRemoval = false; + + // loop through matched tags in forward order + for (var ctag = 0; ctag < tagcount; ctag++) { + tagname = tags[ctag].replace(/<\/?(\w+).*/, "$1"); + // skip any already paired tags + // and skip tags in our ignore list; assume they're self-closed + if (tagpaired[ctag] || ignoredtags.search("<" + tagname + ">") > -1) + continue; + + tag = tags[ctag]; + match = -1; + + if (!/^<\//.test(tag)) { + // this is an opening tag + // search forwards (next tags), look for closing tags + for (var ntag = ctag + 1; ntag < tagcount; ntag++) { + if (!tagpaired[ntag] && tags[ntag] == "") { + match = ntag; + break; + } + } + } + + if (match == -1) + needsRemoval = tagremove[ctag] = true; // mark for removal + else + tagpaired[match] = true; // mark paired + } + + if (!needsRemoval) + return html; + + // delete all orphaned tags from the string + + var ctag = 0; + html = html.replace(re, function (match) { + var res = tagremove[ctag] ? "" : match; + ctag++; + return res; + }); + return html; + } +})(); diff --git a/system/admin/editor/js/editor.js b/system/admin/editor/js/editor.js new file mode 100644 index 0000000..fdc4cac --- /dev/null +++ b/system/admin/editor/js/editor.js @@ -0,0 +1,73 @@ +(function () { + var converter = new Markdown.Converter(); + Markdown.Extra.init(converter); + var editor = new Markdown.Editor(converter); + + //======Image Uploader===== + var callbackFunc; + var dialogClose = function() { + $('#insertImageDialog').modal('hide'); + $('#insertImageDialogURL').val(''); + $('#insertImageDialogFile').val(''); + $('#insertMediaDialogURL').val(''); + $('#insertMediaDialogFile').val(''); + $('#gallery-1').html(initial_image); + $('#gallery-2').html(initial_image); + }; + $('#insertImageDialogInsert').click( function() { + callbackFunc( $('#insertImageDialogURL').val().length > 0 ? $('#insertImageDialogURL').val() : null ); + dialogClose(); + }); + $('#insertImageDialogClose').click( function() { + callbackFunc(null); + dialogClose(); + }); + $('#insertImageDialogCancel').click( function() { + callbackFunc(null); + dialogClose(); + }); + $('#insertImageDialogFile').on('input', function(){ + var file = $("#insertImageDialogFile").prop("files"); + var formData = new FormData(); + formData.append('file', file[0], file[0].name); + // Set up the request. + $.ajax({ + type: "POST", + url: base_path + 'upload.php', + data: formData, + processData: false, + contentType: false, + success: function (response) { + if (response.error == '0') + { + callbackFunc(base_path + response.path); + dialogClose(); + } + else + { + if (response.error !== '') alert(response.error); + else alert("An unknown error has occurred"); + console.error("Bad Response"); + console.error(response); + $('#insertImageDialogFile').val(''); + } + }, + failure: function (response) { + if (response.error !== '') alert(response.error); + else alert("An unknown error has occurred"); + console.error("Unable to Upload"); + console.error(response); + $('#insertImageDialogFile').val(''); + } + });//ajax + });//oninput + editor.hooks.set('insertImageDialog', function(callback) { + $('#insertImageDialog').modal('show'); + callbackFunc = callback; + + return true; // tell the editor that we'll take care of getting the image url + }); + //=====end image uploader===== + editor.run(); + +})(); \ No newline at end of file diff --git a/system/admin/editor/js/local/Markdown.local.fr.js b/system/admin/editor/js/local/Markdown.local.fr.js new file mode 100644 index 0000000..febd080 --- /dev/null +++ b/system/admin/editor/js/local/Markdown.local.fr.js @@ -0,0 +1,43 @@ +// Usage: +// +// var myConverter = new Markdown.Editor(myConverter, null, { strings: Markdown.local.fr }); + +(function () { + Markdown.local = Markdown.local || {}; + Markdown.local.fr = { + bold: "Gras Ctrl+B", + boldexample: "texte en gras", + + italic: "Italique Ctrl+I", + italicexample: "texte en italique", + + link: "Hyperlien Ctrl+L", + linkdescription: "description de l'hyperlien", + linkdialog: "

    Insérer un hyperlien

    http://example.com/ \"titre optionnel\"

    ", + + quote: "Citation
    Ctrl+Q", + quoteexample: "Citation", + + code: "Extrait de code
     Ctrl+K",
    +        codeexample: "votre extrait de code",
    +
    +        image: "Image  Ctrl+G",
    +        imagedescription: "description de l'image",
    +        imagedialog: "

    Insérer une image

    http://example.com/images/diagram.jpg \"titre optionnel\"

    Vous chercher un hébergement d'image grauit ?

    ", + + olist: "Liste numérotée
      Ctrl+O", + ulist: "Liste à point
        Ctrl+U", + litem: "Elément de liste", + + heading: "Titre

        /

        Ctrl+H", + headingexample: "Titre", + + hr: "Trait horizontal
        Ctrl+R", + + undo: "Annuler - Ctrl+Z", + redo: "Refaire - Ctrl+Y", + redomac: "Refaire - Ctrl+Shift+Z", + + help: "Aide sur Markdown" + }; +})(); \ No newline at end of file diff --git a/system/admin/editor/js/node-pagedown-extra.js b/system/admin/editor/js/node-pagedown-extra.js new file mode 100644 index 0000000..a19f1d9 --- /dev/null +++ b/system/admin/editor/js/node-pagedown-extra.js @@ -0,0 +1,3 @@ +GLOBAL.Markdown = {}; +require('./Markdown.Extra.js'); +exports.Extra = Markdown.Extra; diff --git a/system/admin/editor/js/node-pagedown.js b/system/admin/editor/js/node-pagedown.js new file mode 100644 index 0000000..e214548 --- /dev/null +++ b/system/admin/editor/js/node-pagedown.js @@ -0,0 +1,2 @@ +exports.Converter = require("./Markdown.Converter").Converter; +exports.getSanitizingConverter = require("./Markdown.Sanitizer").getSanitizingConverter; diff --git a/system/admin/editor/package.json b/system/admin/editor/package.json new file mode 100644 index 0000000..57b0689 --- /dev/null +++ b/system/admin/editor/package.json @@ -0,0 +1,19 @@ +{ + "name": "pagedown", + "version": "1.1.0", + "description": "markdown converter, based on showdown", + "repository": { + "type": "hg", + "url": "https://code.google.com/p/pagedown/" + }, + "keywords": ["markdown"], + "license": "MIT", + "files": [ + "Markdown.Converter.js", + "Markdown.Sanitizer.js", + "node-pagedown.js" + ], + "main": "node-pagedown.js", + "bugs": "http://code.google.com/p/pagedown/issues/list", + "homepage": "http://code.google.com/p/pagedown/wiki/PageDown" +} diff --git a/system/admin/views/.htaccess b/system/admin/views/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/system/admin/views/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/system/admin/views/404.html.php b/system/admin/views/404.html.php new file mode 100644 index 0000000..cb052c2 --- /dev/null +++ b/system/admin/views/404.html.php @@ -0,0 +1,21 @@ + + + + + + + + + 404 Not Found - <?php echo blog_title() ?> + + + + + +
        +

        + +

        ?

        +
        + + \ No newline at end of file diff --git a/system/admin/views/add-content.html.php b/system/admin/views/add-content.html.php new file mode 100644 index 0000000..7db1104 --- /dev/null +++ b/system/admin/views/add-content.html.php @@ -0,0 +1,381 @@ + + + + + + + + + + + + + +
        + +
        +
        +
        +
        +
        +
        +
        + + +
        + + +
        + + +
        + + +
        +
        + +
        +
        +
        + + +
        +
        + + +
        + +
        +
        + + +
        + + + + + +
        + + + + + + +
        + + + + + +
        + +
        +
        ';} ?>
        +
        + + +
        + + + + + + +
        + + + + + + +
        + + + + + + + +
        +
        +
        +
        + +
        +
        +
        +
        +
        + + +
        +
        + +

        +
        +
        +
        + +
        +
        " style="width:100%;overflow:auto;">
        +
        +
        +
        +
        + + + + + + + + +
        + + + + + + + + + + + + diff --git a/system/admin/views/add-page.html.php b/system/admin/views/add-page.html.php new file mode 100644 index 0000000..9817646 --- /dev/null +++ b/system/admin/views/add-page.html.php @@ -0,0 +1,201 @@ + + + + + + + + + + + + +
        + +
        +
        +
        +
        +
        +
        +
        + + +
        + + +
        +
        +
        + + + +
        + +
        +
        +
        +
        + +
        +
        +
        +
        + +
        + +
        + + + + + + + + + +
        +
        + +
        +
        " style="width:100%;overflow:auto;">
        +
        +
        +
        +
        + + + + +
        + + + + + + + + + + + \ No newline at end of file diff --git a/system/admin/views/add-user.html.php b/system/admin/views/add-user.html.php new file mode 100644 index 0000000..c809377 --- /dev/null +++ b/system/admin/views/add-user.html.php @@ -0,0 +1,48 @@ + +

        +
        + +
        + +
        + +
        + +
        + +
        +
        +
        + +
        +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        +
        +
        +
        + +
        + +
        +
        + + +
        \ No newline at end of file diff --git a/system/admin/views/backup-start.html.php b/system/admin/views/backup-start.html.php new file mode 100644 index 0000000..aaaa353 --- /dev/null +++ b/system/admin/views/backup-start.html.php @@ -0,0 +1,24 @@ + + \ No newline at end of file diff --git a/system/admin/views/backup.html.php b/system/admin/views/backup.html.php new file mode 100644 index 0000000..6b4f2b1 --- /dev/null +++ b/system/admin/views/backup.html.php @@ -0,0 +1,51 @@ + + + +
        +
        Note:
        +Please install the ZIP extension to use the backup feature. +
        + +

        +
        + +

        +'; + echo '' . i18n('Filename') . ''.i18n('Date').'' . i18n('Operations') . ''; + foreach ($files as $file) { + + $arr = explode('_', pathinfo($file, PATHINFO_FILENAME)); + $t = str_replace('-', '', $arr[1]); + $dt = new DateTime($t); + $timestamp = $dt->format("D, d F Y, H:i:s"); + $url = site_url() . $file; + echo ''; + echo '' . pathinfo($file, PATHINFO_BASENAME) . ''; + echo '' . $timestamp . ''; + echo 'Download
        '; + echo ''; + } + echo ''; + } else { + echo i18n('No_available_backup'); + } +} + + ?> \ No newline at end of file diff --git a/system/admin/views/categories.html.php b/system/admin/views/categories.html.php new file mode 100644 index 0000000..cfe1700 --- /dev/null +++ b/system/admin/views/categories.html.php @@ -0,0 +1,30 @@ + + +

        +
        + +

        + + + + + + + + + + + + + + + + slug !== 'uncategorized'):?> + + + + + +
        title;?>body;?>slug) + $d->count + get_scheduledcount($d->slug); echo $total?> count == 0 && get_draftcount($d->slug) == 0 && get_scheduledcount($d->slug) == 0){echo '' . i18n('Delete') . '';}?>
        diff --git a/system/admin/views/category-list.html.php b/system/admin/views/category-list.html.php new file mode 100644 index 0000000..c7d1d23 --- /dev/null +++ b/system/admin/views/category-list.html.php @@ -0,0 +1,53 @@ + +

        title ?>

        +
        body;?>
        +
        +url !== site_url() . 'category/uncategorized'):?> +

        + + + + + + + + + + + + + + + url !== site_url() . 'category/uncategorized') {?> + + + + + + + + +
        title ?>date) ?>
        + +
        +
        +
          + +
        • + +
        • + +
        • + +
        • + +
        • + +
        +
        + + \ No newline at end of file diff --git a/system/admin/views/clear-cache.html.php b/system/admin/views/clear-cache.html.php new file mode 100644 index 0000000..db722fa --- /dev/null +++ b/system/admin/views/clear-cache.html.php @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/system/admin/views/config-custom.html.php b/system/admin/views/config-custom.html.php new file mode 100644 index 0000000..50d195d --- /dev/null +++ b/system/admin/views/config-custom.html.php @@ -0,0 +1,45 @@ + +

        +
        + +

        +

        +

        +

        <?php echo config(''); ?>

        +
        + + + + + + + $value) { + if (!in_array($key, $configList)) { + echo ''; + echo ''; + echo ''; + echo ''; + } + } + ?> +
        + +
        diff --git a/system/admin/views/config-metatags.html.php b/system/admin/views/config-metatags.html.php new file mode 100644 index 0000000..d3977c5 --- /dev/null +++ b/system/admin/views/config-metatags.html.php @@ -0,0 +1,254 @@ + + +

        +
        + +
        +
        Note:
        +Please install and enable the GD extension to use the thumbnail feature. +
        + + +

        +
        + +

        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +

        default

        +

        post

        +
        +
        +
        +

        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        Title formats

        +
        + +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %post_title% %post_description% %post_category% %post_tag% %post_author% %post_type%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %page_title% %page_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %category_title% %category_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %tag_title% %tag_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %archive_title% %archive_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %search_title% %search_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %type_title% %type_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %author_name% %author_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description%

        +
        +
        +
        + +
        + +

        Available shortcode: %blog_title% %blog_tagline% %blog_description% %page_title%

        +
        +
        +
        +

        +
        +

        https://www.sitemaps.org/protocol.html

        + $value) {?> + + +
        + +
        + +
        +
        + + + +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config-performance.html.php b/system/admin/views/config-performance.html.php new file mode 100644 index 0000000..b6a0ded --- /dev/null +++ b/system/admin/views/config-performance.html.php @@ -0,0 +1,131 @@ + +

        +
        + +

        +
        + +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        +

        Multisite

        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        +

        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config-reading.html.php b/system/admin/views/config-reading.html.php new file mode 100644 index 0000000..64d7097 --- /dev/null +++ b/system/admin/views/config-reading.html.php @@ -0,0 +1,173 @@ + +

        +
        + +

        +
        + +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config-security.html.php b/system/admin/views/config-security.html.php new file mode 100644 index 0000000..55dfe00 --- /dev/null +++ b/system/admin/views/config-security.html.php @@ -0,0 +1,88 @@ + +

        +
        + +

        +
        + +

        +
        +

        https://www.google.com/recaptcha/admin +

        https://developers.cloudflare.com/turnstile/ +

        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + +
        +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config-widget.html.php b/system/admin/views/config-widget.html.php new file mode 100644 index 0000000..d81f5b0 --- /dev/null +++ b/system/admin/views/config-widget.html.php @@ -0,0 +1,261 @@ + +

        +
        + +

        +
        + +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        TOC (Table of Contents)

        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + It will check the shortcode first before add the TOC to post or page/subpage +
        +
        +
        + +
        + +
        +
        +
        +

        +
        +

        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +

        +
        +
        + +
        + +
        +
        +
        + +
        + + +
        +
        +
        + +
        + + +
        +
        +
        +

        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config-writing.html.php b/system/admin/views/config-writing.html.php new file mode 100644 index 0000000..dd9dcf1 --- /dev/null +++ b/system/admin/views/config-writing.html.php @@ -0,0 +1,44 @@ + +

        +
        + +

        +
        + +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + +
        +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/config.html.php b/system/admin/views/config.html.php new file mode 100644 index 0000000..d8998e6 --- /dev/null +++ b/system/admin/views/config.html.php @@ -0,0 +1,199 @@ + +

        +
        + + +
        +
        Note:
        +Please install and enable the INTL extension to format the date format to your local language. +
        + + +

        +
        + +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + + +
        +
        +
        + +
        + + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + format("Y-m-d H:i:s");?> + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + +
        +
        + +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        + + +
        +
        +
        + +
        +
        +
        diff --git a/system/admin/views/content-type.html.php b/system/admin/views/content-type.html.php new file mode 100644 index 0000000..4e99532 --- /dev/null +++ b/system/admin/views/content-type.html.php @@ -0,0 +1,21 @@ + +

        + +
        +
        +


        .

        +


        .

        +


        .

        +


        .

        +
        +
        +


        .

        +


        .

        + +


        .

        + +
        +
        \ No newline at end of file diff --git a/system/admin/views/delete-category.html.php b/system/admin/views/delete-category.html.php new file mode 100644 index 0000000..6aa9dc5 --- /dev/null +++ b/system/admin/views/delete-category.html.php @@ -0,0 +1,25 @@ + +file; +$post = $p->url; +if (isset($destination)) { + if ($destination == 'post') { + $back = $post; + } else { + $back = site_url() . $destination; + } +} else { + $back = site_url(); +} +$info = $p->title . ' (' . $p->file . ')'; +?> +

        +
        +
        + + + ' . i18n('Cancel');?> +
        \ No newline at end of file diff --git a/system/admin/views/delete-page.html.php b/system/admin/views/delete-page.html.php new file mode 100644 index 0000000..6aa9dc5 --- /dev/null +++ b/system/admin/views/delete-page.html.php @@ -0,0 +1,25 @@ + +file; +$post = $p->url; +if (isset($destination)) { + if ($destination == 'post') { + $back = $post; + } else { + $back = site_url() . $destination; + } +} else { + $back = site_url(); +} +$info = $p->title . ' (' . $p->file . ')'; +?> +

        +
        +
        + + + ' . i18n('Cancel');?> +
        \ No newline at end of file diff --git a/system/admin/views/delete-post.html.php b/system/admin/views/delete-post.html.php new file mode 100644 index 0000000..6aa9dc5 --- /dev/null +++ b/system/admin/views/delete-post.html.php @@ -0,0 +1,25 @@ + +file; +$post = $p->url; +if (isset($destination)) { + if ($destination == 'post') { + $back = $post; + } else { + $back = site_url() . $destination; + } +} else { + $back = site_url(); +} +$info = $p->title . ' (' . $p->file . ')'; +?> +

        +
        +
        + + + ' . i18n('Cancel');?> +
        \ No newline at end of file diff --git a/system/admin/views/delete-user.html.php b/system/admin/views/delete-user.html.php new file mode 100644 index 0000000..9610fd0 --- /dev/null +++ b/system/admin/views/delete-user.html.php @@ -0,0 +1,13 @@ + + +

        +

        Note: This only delete the user and not the contents. +

        +
        +
        + + + +
        \ No newline at end of file diff --git a/system/admin/views/denied.html.php b/system/admin/views/denied.html.php new file mode 100644 index 0000000..da08b83 --- /dev/null +++ b/system/admin/views/denied.html.php @@ -0,0 +1,2 @@ + +

        \ No newline at end of file diff --git a/system/admin/views/edit-content.html.php b/system/admin/views/edit-content.html.php new file mode 100644 index 0000000..8e77bb5 --- /dev/null +++ b/system/admin/views/edit-content.html.php @@ -0,0 +1,431 @@ + +file)) { + $file_path = pathinfo($p->file); +} else { + $file_path = pathinfo($oldfile); +} + +$filename = $file_path['dirname'] . '/' . $file_path['basename']; + +$desc = get_category_info(null); + +$content = file_get_contents($filename); +$oldtitle = get_content_tag('t', $content, 'Untitled'); +$olddescription = get_content_tag('d', $content); +$oldtag = get_content_tag('tag', $content); +$oldcontent = remove_html_comments($content); + +$oldimage = get_content_tag('image', $content); +$oldaudio = get_content_tag('audio', $content); +$oldvideo = get_content_tag('video', $content); +$oldlink = get_content_tag('link', $content); +$oldquote = get_content_tag('quote', $content); + +$dir = $file_path['dirname']; +$isdraft = explode('/', $dir); +$oldurl = explode('_', $file_path['basename']); + +if (empty($oldtag)) { + $oldtag = $oldurl[1]; +} + +$oldmd = str_replace('.md', '', $oldurl[2]); + +if (isset($_GET['destination'])) { + $destination = _h($_GET['destination']); +} else { + $destination = 'admin'; +} + +$cat = explode('/', $dir); +$category = $cat[3]; + +$dt = $oldurl[0]; +$t = str_replace('-', '', $dt); +$time = new DateTime($t); +$timestamp = $time->format("Y-m-d H:i:s"); +// The post date +$postdate = strtotime($timestamp); +// The post URL +if (permalink_type() == 'default') { + $delete = site_url() . date('Y/m', $postdate) . '/' . $oldmd . '/delete?destination=' . $destination; +} else { + // The post URL + $delete = site_url() . permalink_type() . '/' . $oldmd . '/delete?destination=' . $destination; +} + +$tags = tag_cloud(true); +$tagslang = "content/data/tags.lang"; +if (file_exists($tagslang)) { + $ptags = unserialize(file_get_contents($tagslang)); + $tkey = array_keys($tags); + if (!empty($ptags)) { + $newlang = array_intersect_key($ptags, array_flip($tkey)); + } else { + $newlang = array_combine($tkey, $tkey); + } + $tmp = serialize($newlang); + file_put_contents($tagslang, print_r($tmp, true), LOCK_EX); +} + +$images = image_gallery(null, 1, 40); + +?> + + + + + + + + + + + +
        + +
        +
        +
        +
        +
        +
        +
        + + +
        + + +
        + + +
        + + + +
        +
        + +
        +
        +
        + + +
        +
        + + +
        + +
        +
        + + +
        + + + + + +
        + + + + + + +
        + + + + + +
        + +
        +
        +
        + + +
        + + + + + + +
        + + + + + + +
        + + + + + + + +
        +
        +
        +
        + +
        +
        +
        +
        +
        + + +
        +
        + + + + + +

        +
        +
        +
        + +
        +
        " style="width:100%;overflow:auto;">
        +
        +
        +
        +
        + + + + + + + + +
        + + + + + + + + + + + + diff --git a/system/admin/views/edit-mfa.html.php b/system/admin/views/edit-mfa.html.php new file mode 100644 index 0000000..33a6227 --- /dev/null +++ b/system/admin/views/edit-mfa.html.php @@ -0,0 +1,76 @@ + +generateSecretKey(); + + if (version_compare(PHP_VERSION, '8.1', '>=')) { + + $g2faUrl = $google2fa->getQRCodeUrl( + $user, + $domain, + $mfasecret + ); + + $renderer = new GDLibRenderer(400); + $writer = new Writer($renderer); + + $qrcode_image = base64_encode($writer->writeString($g2faUrl)); + } +} +?> +

        +
        + +
        + +
        + + + + =')) {?> +
        + + + Setup Key +

        +

        + +
        + +
        + +
        +
        +
        + +
        + +
        +
        + + + + +
        + +
        + +
        +
        + + +
        diff --git a/system/admin/views/edit-page.html.php b/system/admin/views/edit-page.html.php new file mode 100644 index 0000000..2a01396 --- /dev/null +++ b/system/admin/views/edit-page.html.php @@ -0,0 +1,358 @@ + +body; + $oldtitle = $p->title; + $olddescription = $p->description; + $oldcontent = $p->body; + $oldmd = $p->slug; + $url = 'content/data/category/'. $p->slug . '.md'; +} else { + + if (isset($p->file)) { + $url = $p->file; + } else { + $url = $oldfile; + } + $content = file_get_contents($url); + $oldtitle = get_content_tag('t', $content, 'Untitled'); + $olddescription = get_content_tag('d', $content); + $oldcontent = remove_html_comments($content); + + if (isset($_GET['destination'])) { + $destination = _h($_GET['destination']); + } else { + $destination = 'admin'; + } + $dir = pathinfo($url, PATHINFO_DIRNAME); + $oldurl = pathinfo($url, PATHINFO_BASENAME); + + $fn = explode('.', pathinfo($url, PATHINFO_FILENAME)); + if (isset($fn[1])) { + $oldmd = $fn[1]; + } else { + $oldmd = pathinfo($url, PATHINFO_FILENAME); + } + + if (isset($p->url)) { + $delete = $p->url . '/delete?destination=' . $destination; + } + else { + if(empty($sub)) { + $delete = site_url() . $oldmd . '/delete?destination=' . $destination; + } + else { + $delete = site_url() . $static .'/'. $sub . '/delete?destination=' . $destination; + } + } +} + +$images = image_gallery(null, 1, 40); + +?> + + + + + + + + + + +
        + +
        +
        +
        +
        +
        +
        +
        + + +
        + + +
        + +

        + +
        +
        + + +
        + +
        + + + + + +
        + +
        +
        +
        + + +
        + + +
        +
        +
        +
        + +
        +
        +
        +
        + +
        + +
        + + + + + + + + + + + + + + + + + + +
        +
        + +
        +
        " style="width:100%;overflow:auto;">
        +
        +
        +
        +
        + + + + + + + + +
        + + + + + + + + + + + + + + + + diff --git a/system/admin/views/edit-password.html.php b/system/admin/views/edit-password.html.php new file mode 100644 index 0000000..8e0497d --- /dev/null +++ b/system/admin/views/edit-password.html.php @@ -0,0 +1,25 @@ + + +

        +
        +
        + +
        + +
        + +
        +
        +
        + +
        + +
        +
        + + +
        \ No newline at end of file diff --git a/system/admin/views/edit-user.html.php b/system/admin/views/edit-user.html.php new file mode 100644 index 0000000..efa3e1c --- /dev/null +++ b/system/admin/views/edit-user.html.php @@ -0,0 +1,49 @@ + +

        +
        + +
        + +
        + +
        + +
        +
        +
        + +
        +
        +
        + checked> + +
        +
        + checked> + +
        +
        + checked> + +
        +
        +
        +
        +
        + +
        + +
        +
        + + +
        \ No newline at end of file diff --git a/system/admin/views/import.html.php b/system/admin/views/import.html.php new file mode 100644 index 0000000..872c0fb --- /dev/null +++ b/system/admin/views/import.html.php @@ -0,0 +1,16 @@ + + +
        + +

        +

        +
        +
        +

        + + +
        diff --git a/system/admin/views/layout.html.php b/system/admin/views/layout.html.php new file mode 100644 index 0000000..fb68517 --- /dev/null +++ b/system/admin/views/layout.html.php @@ -0,0 +1,394 @@ + + + + + + <?php echo $title;?> + + + + + + + + + + +"> +
        +
        + + + + + + + + + +
        + +
        +
        +
        +
        + + + + +
        +
        +
        +
        + + + +
        +
        +
        +
        +
        +
        + +
        +
        +
        + +
        + +
        +
        + +
        + + + + + + + + +
        + + +"> + + + + + + + + + + + + + diff --git a/system/admin/views/login-mfa.html.php b/system/admin/views/login-mfa.html.php new file mode 100644 index 0000000..ee4531c --- /dev/null +++ b/system/admin/views/login-mfa.html.php @@ -0,0 +1,17 @@ + + + + +
        + +

        +
        + + + +
        + +
        diff --git a/system/admin/views/login.html.php b/system/admin/views/login.html.php new file mode 100644 index 0000000..7bd42e0 --- /dev/null +++ b/system/admin/views/login.html.php @@ -0,0 +1,38 @@ + + + +
        + + +

        +
        + + +
        + + +
        + + + +
        ">
        +
        + + + +
        ">
        +
        + + +
        + diff --git a/system/admin/views/logout.html.php b/system/admin/views/logout.html.php new file mode 100644 index 0000000..19ab5c8 --- /dev/null +++ b/system/admin/views/logout.html.php @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/system/admin/views/main.html.php b/system/admin/views/main.html.php new file mode 100644 index 0000000..01eab03 --- /dev/null +++ b/system/admin/views/main.html.php @@ -0,0 +1,31 @@ + +' . i18n('Your_recent_posts') . '';?> +
        + +

        +'; + echo '' . i18n('Title') . '' . i18n('Published') . ''; + if (config("views.counter") == "true") + echo ''.i18n('Views').''; + echo '' . i18n('Category') . '' . i18n('Tags') . '' . i18n('Operations') . ''; + foreach ($posts as $p) { + echo ''; + echo '' . $p->title . ''; + echo '' . format_date($p->date) . ''; + if (config("views.counter") == "true") + echo '' . $p->views . ''; + echo ''. $p->categoryTitle .''; + echo '' . str_replace("rel=\"tag\"", "rel=\"tag\" class=\"badge badge-light text-primary font-weight-normal\"", $p->tag) . ''; + echo '' . i18n('Edit') . ' ' . i18n('Delete') . ''; + echo ''; + } + echo ''; + } +} + +?> diff --git a/system/admin/views/menu.html.php b/system/admin/views/menu.html.php new file mode 100644 index 0000000..966094c --- /dev/null +++ b/system/admin/views/menu.html.php @@ -0,0 +1,416 @@ + +'; + foreach ($menus as $menu) { + $ol .= parseMenu($menu); + } + $ol .= '
    '; + return $ol; +} + +function parseMenu($menu) { + $li = '
  • '; + $li .= '
    '.$menu->name.'
    '; + $li .= ''.i18n('Delete').''; + $li .= ''.i18n('Edit').''; + if (isset($menu->children)) { + $li .= parseMenus($menu->children); + } + $li .= '
  • '; + return $li; +} + +?> + +
    +
    +
    Drag & Drop
    '. $menu;} else {echo ''.i18n('At_the_moment_you_are_using_auto_generated_menu').'
      ';}?>
      +
      + +
      + + +
      +
      + +
      +
      +
      + + +
      +
      +
      + + + + \ No newline at end of file diff --git a/system/admin/views/no-posts.html.php b/system/admin/views/no-posts.html.php new file mode 100644 index 0000000..641ec95 --- /dev/null +++ b/system/admin/views/no-posts.html.php @@ -0,0 +1,2 @@ + +

      !

      diff --git a/system/admin/views/popular-posts.html.php b/system/admin/views/popular-posts.html.php new file mode 100644 index 0000000..94946df --- /dev/null +++ b/system/admin/views/popular-posts.html.php @@ -0,0 +1,37 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      title ?>date) ?>slug); ?>author ?>categoryTitle;?>tag); ?>
      + diff --git a/system/admin/views/posts-list.html.php b/system/admin/views/posts-list.html.php new file mode 100644 index 0000000..f30bdb3 --- /dev/null +++ b/system/admin/views/posts-list.html.php @@ -0,0 +1,55 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      title ?>date) ?>views ?>author ?>categoryTitle;?>tag); ?>
      + +
      +
      +
        + +
      • + +
      • + +
      • + +
      • + +
      • + +
      +
      + + diff --git a/system/admin/views/scheduled.html.php b/system/admin/views/scheduled.html.php new file mode 100644 index 0000000..349b573 --- /dev/null +++ b/system/admin/views/scheduled.html.php @@ -0,0 +1,49 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + +
      title ?>date, 'd F Y, H:i:s') ?>categoryTitle;?>tag); ?>
      + +
      +
      +
        + +
      • + +
      • + +
      • + +
      • + +
      • + +
      +
      + + diff --git a/system/admin/views/static-pages.html.php b/system/admin/views/static-pages.html.php new file mode 100644 index 0000000..9470ffa --- /dev/null +++ b/system/admin/views/static-pages.html.php @@ -0,0 +1,72 @@ + +' . i18n('Static_pages') . '';?> +
      + +

      + + + + + + + + + + + + + + + + + slug); ?> + slug);?> + + + + + + + + +
      title;?>views;?> + +
      +
      + title;?> +
      +
      views;?>
      +
      + +
      +
      + +
      +
      + + + \ No newline at end of file diff --git a/system/admin/views/static-subpages.html.php b/system/admin/views/static-subpages.html.php new file mode 100644 index 0000000..0b43a20 --- /dev/null +++ b/system/admin/views/static-subpages.html.php @@ -0,0 +1,71 @@ + + +
      +
      +

      title ?>

      +
      description;?>
      +
      +
      + +

      + +slug);?> + + + + + + + + + + + + + + + + + + + + + + + +
      title ?>description;?>views;?>
      +
      + + \ No newline at end of file diff --git a/system/admin/views/update.html.php b/system/admin/views/update.html.php new file mode 100644 index 0000000..1fe412f --- /dev/null +++ b/system/admin/views/update.html.php @@ -0,0 +1,63 @@ + + 'danpros/htmly', + 'prerelease' => config("prerelease"), +)); + +$dir = 'cache/'; +if (!is_dir($dir)) { + mkdir($dir, 0775, true); +} +if (defined("JSON_PRETTY_PRINT")) { + file_put_contents( + 'cache/installedVersion.json', + json_encode(array( + "tag_name" => constant('HTMLY_VERSION') + ), JSON_PRETTY_PRINT), LOCK_EX); +} else { + file_put_contents( + 'cache/installedVersion.json', + json_encode(array( + "tag_name" => constant('HTMLY_VERSION') + )), LOCK_EX + ); +} + +if (empty($updater->getNewestInfo())) { + echo '

      '.i18n('Update').'


      '; + echo "Can't check Github server for latest version. You are probably offline."; +} else { + if ($updater->able()) { + $info = $updater->getNewestInfo(); + echo '

      '.i18n('Update_Available').'


      '; + echo '

      '. $info['name'] .'

      '; + echo '

      Version: '. $info['tag_name'] .'

      '; + echo '
      Release Notes
      '; + echo '
      '; + echo \Michelf\MarkdownExtra::defaultTransform($info['body']); + echo '
      '; + echo '

      Important: Please always backup your files before upgrading to newer version.

      '; + echo '

      '.i18n('Update_to').' '. $info['tag_name'] . ' '.i18n('now').'

      '; + } else { + echo '

      '.i18n('Congrats_You_have_the_latest_version_of_HTMLy').'


      '; + $info = $updater->getCurrentInfo(); + echo '

      '. $info['name'] .'

      '; + echo '

      Installed Version: '. $info['tag_name'] .'

      '; + echo '
      Release Notes:
      '; + echo '
      '; + echo \Michelf\MarkdownExtra::defaultTransform($info['body']); + echo '
      '; + echo '

      Read on Github

      '; + if (config('show.version') == 'false') { + if(file_exists('cache/installedVersion.json')) { + unlink('cache/installedVersion.json'); + } + } + } +} diff --git a/system/admin/views/updated-to.html.php b/system/admin/views/updated-to.html.php new file mode 100644 index 0000000..d5cc320 --- /dev/null +++ b/system/admin/views/updated-to.html.php @@ -0,0 +1,13 @@ +

      Updated to

      +

      []

      +

      + diff --git a/system/admin/views/user-draft.html.php b/system/admin/views/user-draft.html.php new file mode 100644 index 0000000..3285913 --- /dev/null +++ b/system/admin/views/user-draft.html.php @@ -0,0 +1,93 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + +
      title ?>date) ?>categoryTitle;?>tag); ?>
      + +
      +
      +
        + +
      • + +
      • + +
      • + +
      • + +
      • + +
      +
      + + + + +

      +
      +

      :

      + + + + + + + + slug)); ?> + + + + + + +
      title ?>lastMod) ?>
      + + + +

      +
      +

      : Sub

      + + + + + + + + + parentSlug);?> + + + + + + + +
      title ?>lastMod) ?> title;?>
      + diff --git a/system/admin/views/user-posts.html.php b/system/admin/views/user-posts.html.php new file mode 100644 index 0000000..12cd947 --- /dev/null +++ b/system/admin/views/user-posts.html.php @@ -0,0 +1,55 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      title ?>date) ?>views ?>categoryTitle;?>tag); ?>
      + +
      +
      +
        + +
      • + +
      • + +
      • + +
      • + +
      • + +
      +
      + + diff --git a/system/admin/views/users.html.php b/system/admin/views/users.html.php new file mode 100644 index 0000000..4dfd837 --- /dev/null +++ b/system/admin/views/users.html.php @@ -0,0 +1,29 @@ + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + +
      \ No newline at end of file diff --git a/system/configList.json b/system/configList.json new file mode 100644 index 0000000..66eae48 --- /dev/null +++ b/system/configList.json @@ -0,0 +1,99 @@ +[ + "site.url", + "timezone", + "date.format", + "language", + "blog.title", + "blog.tagline", + "blog.description", + "blog.copyright", + "permalink.type", + "static.frontpage", + "blog.enable", + "blog.path", + "blog.string", + "social.bluesky", + "social.twitter", + "social.facebook", + "social.instagram", + "social.linkedin", + "social.github", + "social.youtube", + "social.mastodon", + "social.tiktok", + "breadcrumb.home", + "comment.system", + "fb.appid", + "fb.num", + "fb.color", + "disqus.shortname", + "google.wmt.id", + "google.analytics.id", + "google.gtag.id", + "login.protect.system", + "login.protect.public", + "login.protect.private", + "posts.perpage", + "category.perpage", + "tag.perpage", + "archive.perpage", + "search.perpage", + "profile.perpage", + "type.perpage", + "json.count", + "category.info", + "related.count", + "recent.count", + "popular.count", + "tagcloud.count", + "read.more", + "teaser.type", + "teaser.behave", + "teaser.char", + "description.char", + "rss.count", + "rss.char", + "views.counter", + "sitemap.priority.base", + "sitemap.priority.post", + "sitemap.priority.static", + "sitemap.priority.category", + "sitemap.priority.tag", + "sitemap.priority.archiveDay", + "sitemap.priority.archiveMonth", + "sitemap.priority.archiveYear", + "sitemap.priority.author", + "sitemap.priority.type", + "prerelease", + "cache.expiration", + "cache.off", + "generation.time", + "cache.timestamp", + "multi.site", + "toc.label", + "toc.state", + "toc.style", + "toc.automatic", + "toc.position", + "home.title.format", + "post.title.format", + "page.title.format", + "category.title.format", + "tag.title.format", + "archive.title.format", + "search.title.format", + "type.title.format", + "profile.title.format", + "blog.title.format", + "default.title.format", + "default.image", + "favicon.image", + "views.root", + "views.layout", + "autosave.enable", + "mfa.state", + "show.version", + "thumbnail.width", + "rss.description", + "admin.theme" +] \ No newline at end of file diff --git a/system/htmly.php b/system/htmly.php new file mode 100644 index 0000000..d22af8b --- /dev/null +++ b/system/htmly.php @@ -0,0 +1,5118 @@ + generate_title('is_front', null), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'in-front', + 'breadcrumb' => '', + 'p' => $front, + 'static' => $front, + 'type' => 'is_frontpage', + 'is_front' => true + ), $layout); + + + } else { + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('posts.perpage'); + + $posts = get_posts(null, $page, $perpage); + + $total = ''; + + $pv = $vroot . '/main--front.html.php'; + if (file_exists($pv)) { + $pview = 'main--front'; + } else { + $pview = 'main'; + } + + $tblog = new stdClass; + $tblog->title = blog_tagline(); + $tblog->url = site_url(); + $tblog->count = count(get_blog_posts()); + $tblog->description = blog_description(); + $tblog->body = $tblog->description; + $tblog->rss = site_url() . 'feed/rss'; + $tblog->slug = site_path(); + + if (empty($posts) || $page < 1) { + + // a non-existing page + render('no-posts', array( + 'title' => generate_title('is_front', null), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'breadcrumb' => '', + 'bodyclass' => 'no-posts', + 'type' => 'is_frontpage', + 'is_front' => true + ), $layout); + + die; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_front', null), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url() . $CanonicalPageNum, + 'metatags' => generate_meta(null, null), + 'page' => $page, + 'posts' => $posts, + 'taxonomy' => $tblog, + 'bodyclass' => 'in-front', + 'breadcrumb' => '', + 'pagination' => has_pagination($total, $perpage, $page), + 'type' => 'is_frontpage', + 'is_front' => true, + 'is_taxonomy' => true + ), $layout); + + } +}); + +// Get submitted login data +post('/login', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $captcha = config('login.protect.system'); + if (is_null($captcha) || $captcha === 'disabled') { + $captcha = true; + } elseif ($captcha === 'cloudflare') { + $captcha = isTurnstile(from($_REQUEST, 'cf-turnstile-response')); + } elseif ($captcha === 'google') { + $captcha = isCaptcha(from($_REQUEST, 'g-recaptcha-response')); + } + + $user = from($_REQUEST, 'user'); + $pass = from($_REQUEST, 'password'); + $mfa_secret = user('mfa_secret', $user); + if ($proper && $captcha && !empty($user) && !empty($pass)) { + if (!is_null($mfa_secret) && $mfa_secret !== "disabled" && config('mfa.state') === 'true') { + config('views.root', 'system/admin/views'); + + render('login-mfa', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => i18n('Login') . ' ' . blog_title(), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'username' => $user, + 'password' => $pass, + 'type' => 'is_login', + 'is_login' => true, + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + } else { + session($user, $pass); + $log = session($user, $pass); + + if (!empty($log)) { + + config('views.root', 'system/admin/views'); + + render('login', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => i18n('Login') . ' ' . blog_title(), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $log . '
      ', + 'type' => 'is_login', + 'is_login' => true, + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + } + } + } else { + $message['error'] = ''; + if (empty($user)) { + $message['error'] .= '
    1. ' . i18n('User_Error') . '
    2. '; + } + if (empty($pass)) { + $message['error'] .= '
    3. ' . i18n('Pass_Error') . '
    4. '; + } + if (!$proper) { + $message['error'] .= '
    5. ' . i18n('Token_Error') . '
    6. '; + } + if (!$captcha) { + $message['error'] .= '
    7. ' . i18n('Captcha_Error') . '
    8. '; + } + + config('views.root', 'system/admin/views'); + + render('login', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => i18n('Login') . ' ' . blog_title(), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'username' => $user, + 'password' => $pass, + 'type' => 'is_login', + 'is_login' => true, + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + } +}); + +// Verify MFA +post('/login-mfa', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $user = $_SESSION["mfa_uid"]; + $pass = $_SESSION["mfa_pwd"]; + $mfacode = from($_REQUEST, 'mfacode'); + $mfa_secret = user('mfa_secret', $user); + $google2fa = new Google2FA(); + if ($proper && $google2fa->verifyKey($mfa_secret, $mfacode, '1')) { + session($user, $pass); + $log = session($user, $pass); + + if (!empty($log)) { + + config('views.root', 'system/admin/views'); + + render('login', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => i18n('Login') . ' ' . blog_title(), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $log . '
      ', + 'type' => 'is_login', + 'is_login' => true, + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + } + } else { + $message['error'] = ''; + if (!$proper) { + $message['error'] .= '
    9. ' . i18n('Token_Error') . '
    10. '; + } else { + $message['error'] .= '
    11. ' . i18n('MFA_Error') . '
    12. '; + } + config('views.root', 'system/admin/views'); + + render('login-mfa', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => i18n('Login') . ' ' . blog_title(), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'username' => $user, + 'password' => $pass, + 'type' => 'is_login', + 'is_login' => true, + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + } +}); + +// Show the author page +get('/author/:name', function ($name) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('profile.perpage'); + + $posts = get_profile_posts($name, $page, $perpage); + + $total = get_count('/'.$name.'/', 'dirname'); + + if ($total === 0) { + not_found(); + } + + $author = get_author($name); + + if (isset($author[0])) { + $author = $author[0]; + } else { + $author = default_profile($name); + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--profile--' . strtolower($name) . '.html.php'; + $ls = $vroot . '/layout--profile.html.php'; + if (file_exists($lt)) { + $layout = 'layout--profile--' . strtolower($name); + } else if (file_exists($ls)) { + $layout = 'layout--profile'; + } else { + $layout = ''; + } + + $pv = $vroot . '/profile--'. strtolower($name) .'.html.php'; + if (file_exists($pv)) { + $pview = 'profile--'. strtolower($name); + } else { + $pview = 'profile'; + } + + if (empty($posts) || $page < 1) { + render($pview, array( + 'title' => generate_title('is_profile', $author), + 'description' => $author->description, + 'canonical' => $author->url, + 'metatags' => generate_meta('is_profile', $author), + 'page' => $page, + 'posts' => null, + 'about' => $author->about, + 'name' => $author->name, + 'author' => $author, + 'type' => 'is_profile', + 'bodyclass' => 'in-profile author-' . $name, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Profile_for') . ' ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_profile' => true + ), $layout); + die; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_profile', $author), + 'description' => $author->description, + 'canonical' => $author->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_profile', $author), + 'page' => $page, + 'posts' => $posts, + 'about' => $author->about, + 'name' => $author->name, + 'author' => $author, + 'type' => 'is_profile', + 'bodyclass' => 'in-profile author-' . $name, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Profile_for') . ' ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_profile' => true + ), $layout); +}); + +// Show the RSS feed +get('/author/:name/feed', function ($name) { + + header('Content-Type: application/rss+xml'); + + $posts = get_profile_posts($name, 1, config('rss.count')); + + $author = get_author($name); + + if (isset($author[0])) { + $author = $author[0]; + } else { + $author = default_profile($name); + } + + // Show an RSS feed + echo generate_rss($posts, $author); +}); + +// Edit the profile +get('/edit/profile', function () { + if (login()) { + config('views.root', 'system/admin/views'); + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit_profile')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-profile', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » '. i18n('Edit_profile'), + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get submitted data from edit profile page +post('/edit/profile', function () { + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $user = $_SESSION[site_url()]['user']; + $title = from($_REQUEST, 'title'); + $description = from($_REQUEST, 'description'); + $image = from($_REQUEST, 'image'); + $content = from($_REQUEST, 'content'); + if ($proper && !empty($title) && !empty($content)) { + edit_profile($title, $content, $user, $description, $image); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    13. ' . i18n('msg_error_field_req_title') . '
    14. '; + } + if (empty($content)) { + $message['error'] .= '
    15. ' . i18n('msg_error_field_req_content') . '
    16. '; + } + if (!$proper) { + $message['error'] .= '
    17. ' . i18n('Token_Error') . '
    18. '; + } + config('views.root', 'system/admin/views'); + + render('edit-page', array( + 'title' => generate_title('is_default', 'Edit profile'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postContent' => $content, + 'postImage' => $image, + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-profile', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » Edit profile' + )); + } +}); + +get('/edit/password', function () { + if (login()) { + config('views.root', 'system/admin/views'); + render('edit-password', array( + 'title' => generate_title('is_default', i18n('change_password')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-password', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » '. i18n('change_password'), + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/edit/password', function() { + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $username = from($_REQUEST, 'username'); + $new_password = from($_REQUEST, 'password'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $mfa = user('mfa_secret', $user); + $old_password = user('password', $username); + if ($user === $username) { + $file = 'config/users/' . $user . '.ini'; + if (file_exists($file)) { + if (!empty($new_password)) { + update_user($user, $new_password, $role, $mfa); + } + } + $redir = site_url() . 'admin'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +get('/edit/mfa', function () { + if (login()) { + config('views.root', 'system/admin/views'); + render('edit-mfa', array( + 'title' => generate_title('is_default', i18n('config_mfa')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-mfa', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » '. i18n('config_mfa'), + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/edit/mfa', function() { + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $username = from($_REQUEST, 'username'); + $mfa_secret = from($_REQUEST, 'mfa_secret'); + $mfacode = from($_REQUEST, 'mfacode'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $old_password = user('password', $user); + $password = from($_REQUEST, 'password'); + $message['error'] = ''; + if ($user === $username) { + if (!is_null($mfa_secret) && $mfa_secret !== "disabled") { + $google2fa = new Google2FA(); + if ($google2fa->verifyKey($mfa_secret, $mfacode)) { + if (password_verify($password, $old_password)) { + if (!empty($mfa_secret)) { + update_user($user, $password, $role, $mfa_secret); + } + } else { + $message['error'] .= '
    19. ' . i18n('Pass_Error') . '
    20. '; + } + } else { + $message['error'] .= '
    21. ' . i18n('MFA_Error') . '
    22. '; + } + config('views.root', 'system/admin/views'); + render('edit-mfa', array( + 'title' => generate_title('is_default', i18n('config_mfa')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-mfa', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » '. i18n('config_mfa'), + )); + } else { + if (password_verify($password, $old_password)) { + update_user($user, $password, $role, 'disabled'); + } else { + $message['error'] .= '
    23. ' . i18n('Pass_Error') . '
    24. '; + } + config('views.root', 'system/admin/views'); + render('edit-mfa', array( + 'title' => generate_title('is_default', i18n('config_mfa')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'type' => 'is_profile', + 'is_admin' => true, + 'bodyclass' => 'edit-mfa', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » '. i18n('config_mfa'), + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Edit the frontpage +get('/edit/frontpage', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + + config('views.root', 'system/admin/views'); + + if ($role === 'editor' || $role === 'admin') { + render('edit-page', array( + 'title' => generate_title('is_default', 'Edit frontpage'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_frontpage', + 'is_admin' => true, + 'bodyclass' => 'edit-frontpage', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » Edit frontpage', + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_frontpage', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get submitted data from edit frontpage +post('/edit/frontpage', function () { + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $title = from($_REQUEST, 'title'); + $content = from($_REQUEST, 'content'); + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + edit_frontpage($title, $content); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    25. ' . i18n('msg_error_field_req_title') . '
    26. '; + } + if (empty($content)) { + $message['error'] .= '
    27. ' . i18n('msg_error_field_req_content') . '
    28. '; + } + if (!$proper) { + $message['error'] .= '
    29. ' . i18n('Token_Error') . '
    30. '; + } + config('views.root', 'system/admin/views'); + + render('edit-page', array( + 'title' => generate_title('is_default', 'Edit frontpage'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postContent' => $content, + 'type' => 'is_frontpage', + 'is_admin' => true, + 'bodyclass' => 'edit-frontpage', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » Edit frontpage' + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Edit the frontpage +get('/front/edit', function () { + + if (login()) { + $edit = site_url() . 'edit/frontpage'; + header("location: $edit"); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show the "Add content" page +get('/add/content', function () { + + if (isset($_GET['type'])) { + $req = _h($_GET['type']); + } else { + $req = 'post'; + } + + $type = 'is_' . $req; + + if (login()) { + + config('views.root', 'system/admin/views'); + + render('add-content', array( + 'title' => generate_title('is_default', i18n('Add_new_post')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => $type, + 'is_admin' => true, + 'bodyclass' => 'add-content', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_new_post') + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted add post data +post('/add/content', function () { + + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $is_image = from($_REQUEST, 'is_image'); + $is_audio = from($_REQUEST, 'is_audio'); + $is_video = from($_REQUEST, 'is_video'); + $is_quote = from($_REQUEST, 'is_quote'); + $is_link = from($_REQUEST, 'is_link'); + $is_post = from($_REQUEST, 'is_post'); + + if (!empty($is_image)) { + $type = 'is_image'; + } elseif (!empty($is_video)) { + $type = 'is_video'; + } elseif (!empty($is_link)) { + $type = 'is_link'; + } elseif (!empty($is_quote)) { + $type = 'is_quote'; + } elseif (!empty($is_audio)) { + $type = 'is_audio'; + } elseif (!empty($is_post)) { + $type = 'is_post'; + } + + $link = from($_REQUEST, 'link'); + $image = from($_REQUEST, 'image'); + $audio = from($_REQUEST, 'audio'); + $video = from($_REQUEST, 'video'); + $quote = from($_REQUEST, 'quote'); + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + + $title = from($_REQUEST, 'title'); + $tag = from($_REQUEST, 'tag'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $description = from($_REQUEST, 'description'); + $user = $_SESSION[site_url()]['user']; + $draft = from($_REQUEST, 'draft'); + $category = from($_REQUEST, 'category'); + $date = from($_REQUEST, 'date'); + $time = from($_REQUEST, 'time'); + $dateTime = null; + if ($date !== null && $time !== null) { + $dateTime = $date . ' ' . $time; + } + if (empty($url)) { + $url = $title; + } + + if (empty($is_post) && empty($is_image) && empty($is_video) && empty($is_audio) && empty($is_link) && empty($is_quote)) { + $add = site_url() . 'admin/content'; + header("location: $add"); + } + + if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($is_post)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'post', $description, null, $dateTime); + } elseif ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($image)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'image', $description, $image, $dateTime); + } elseif ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($video)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'video', $description, $video, $dateTime); + } elseif ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($audio)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'audio', $description, $audio, $dateTime); + } elseif ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($quote)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'quote', $description, $quote, $dateTime); + } elseif ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($link)) { + add_content($title, $tag, $url, $content, $user, $draft, $category, 'link', $description, $link, $dateTime); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    31. ' . i18n('msg_error_field_req_title') . '
    32. '; + } + if (empty($tag)) { + $message['error'] .= '
    33. ' . i18n('msg_error_field_req_tag') . '
    34. '; + } + if (empty($content)) { + $message['error'] .= '
    35. ' . i18n('msg_error_field_req_content') . '
    36. '; + } + if (!$proper) { + $message['error'] .= '
    37. ' . i18n('Token_Error') . '
    38. '; + } + + if (!empty($is_image)) { + if (empty($image)) { + $message['error'] .= '
    39. ' . i18n('msg_error_field_req_image') . '
    40. '; + } + } elseif (!empty($is_video)) { + if (empty($video)) { + $message['error'] .= '
    41. ' . i18n('msg_error_field_req_video') . '
    42. '; + } + } elseif (!empty($is_link)) { + if (empty($link)) { + $message['error'] .= '
    43. ' . i18n('msg_error_field_req_link') . '
    44. '; + } + } elseif (!empty($is_quote)) { + if (empty($quote)) { + $message['error'] .= '
    45. ' . i18n('msg_error_field_req_quote') . '
    46. '; + } + } elseif (!empty($is_audio)) { + if (empty($audio)) { + $message['error'] .= '
    47. ' . i18n('msg_error_field_req_audio') . '
    48. '; + } + } + + config('views.root', 'system/admin/views'); + render('add-content', array( + 'title' => generate_title('is_default', i18n('Add_content')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postImage' => $image, + 'postVideo' => $video, + 'postLink' => $link, + 'postQuote' => $quote, + 'postAudio' => $audio, + 'postTag' => $tag, + 'postUrl' => $url, + 'postContent' => $content, + 'type' => $type, + 'is_admin' => true, + 'bodyclass' => 'add-content', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_content') + )); + } + +}); + +// Show the static add page +get('/add/page', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_new_page')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_page', + 'is_admin' => true, + 'bodyclass' => 'add-page', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_new_page') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_page', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted static add page data +post('/add/page', function () { + + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $description = from($_REQUEST, 'description'); + $draft = from($_REQUEST, 'draft'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content) && login()) { + add_page($title, $url, $content, $draft, $description); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    49. ' . i18n('msg_error_field_req_title') . '
    50. '; + } + if (empty($content)) { + $message['error'] .= '
    51. ' . i18n('msg_error_field_req_content') . '
    52. '; + } + if (!$proper) { + $message['error'] .= '
    53. ' . i18n('Token_Error') . '
    54. '; + } + config('views.root', 'system/admin/views'); + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_new_page')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'type' => 'is_page', + 'is_admin' => true, + 'bodyclass' => 'add-page', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_new_page') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Autosave +post('/admin/autosave', function () { + + if (login()) { + $title = $_REQUEST['title']; + $url = $_REQUEST['url']; + $content = $_REQUEST['content']; + $description = $_REQUEST['description']; + $draft = 'draft'; + $posttype = $_REQUEST['posttype']; + $autoSave = $_REQUEST['autoSave']; + $oldfile = $_REQUEST['oldfile']; + $addEdit = $_REQUEST['addEdit']; + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (empty($url)) { + $url = $title; + } + + if ($addEdit == 'edit') { + $revertPage = ''; + $revertPost = ''; + $publishDraft = ''; + $destination = null; + } + + if (!empty($title) && !empty($content)) { + if ($posttype == 'is_page') { + if ($role === 'editor' || $role === 'admin') { + if ($addEdit == 'add') { + $response = add_page($title, $url, $content, $draft, $description, $autoSave, $oldfile); + } else { + $response = edit_page($title, $url, $content, $oldfile, $revertPage, $publishDraft, $destination, $description, null, $autoSave); + } + } + } elseif ($posttype == 'is_subpage') { + if ($role === 'editor' || $role === 'admin') { + $static = $_REQUEST['parent_page']; + if ($addEdit == 'add') { + $response = add_sub_page($title, $url, $content, $static, $draft, $description, $autoSave, $oldfile); + } else { + $response = edit_page($title, $url, $content, $oldfile, $revertPage, $publishDraft, $destination, $description, $static, $autoSave); + } + } + } else { + $tag = $_REQUEST['tag']; + $category = $_REQUEST['category']; + $dateTime = $_REQUEST['dateTime']; + if ($posttype == 'is_image') { + $type = 'image'; + $media = $_REQUEST['pimage']; + } elseif ($posttype == 'is_video') { + $type = 'video'; + $media = $_REQUEST['pvideo']; + } elseif ($posttype == 'is_link') { + $type = 'link'; + $media = $_REQUEST['plink']; + } elseif ($posttype == 'is_quote') { + $type = 'quote'; + $media = $_REQUEST['pquote']; + } elseif ($posttype == 'is_audio') { + $type = 'audio'; + $media = $_REQUEST['paudio']; + } elseif ($posttype == 'is_post') { + $type = 'post'; + $media = null; + } + + if ($type == 'post') { + if (!empty($title) && !empty($tag) && !empty($content)) { + if ($addEdit == 'add') { + $response = add_content($title, $tag, $url, $content, $user, $draft, $category, $type, $description, $media, $dateTime, $autoSave, $oldfile); + } else { + $arr = explode('/', $oldfile); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + $response = edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, $type, $destination, $description, $dateTime, $media, $autoSave); + } + } + } else { + $response = json_encode(array('message' => 'Cannot save draft!
      Please fill in all required fields', 'file' => '')); + } + } else { + if (!empty($title) && !empty($tag) && !empty($content) && !empty($media)) { + if ($addEdit == 'add') { + $response = add_content($title, $tag, $url, $content, $user, $draft, $category, $type, $description, $media, $dateTime, $autoSave, $oldfile); + } else { + $arr = explode('/', $oldfile); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + $response = edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, $type, $destination, $description, $dateTime, $media, $autoSave); + } + } + } else { + $response = json_encode(array('message' => 'Cannot save draft!
      Please fill in all required fields', 'file' => '')); + } + } + } + } else { + $response = json_encode(array('message' => 'Cannot save draft!
      Please fill in all required fields', 'file' => '')); + } + header('Content-Type: application/json'); + echo $response; + } +}); + +// Show the add category +get('/add/category', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_category')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'add-category', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_category') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted add category +post('/add/category', function () { + + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $description = from($_REQUEST, 'description'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + add_category($title, $url, $content, $description); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    55. ' . i18n('msg_error_field_req_title') . '
    56. '; + } + if (empty($content)) { + $message['error'] .= '
    57. ' . i18n('msg_error_field_req_content') . '
    58. '; + } + if (!$proper) { + $message['error'] .= '
    59. ' . i18n('Token_Error') . '
    60. '; + } + config('views.root', 'system/admin/views'); + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_category')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'add-category', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_category') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } + +}); + +// Show admin/posts +get('/admin/posts', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + config('views.root', 'system/admin/views'); + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = 20; + + $posts = get_posts(null, $page, $perpage); + + $total = ''; + + if (empty($posts) || $page < 1) { + + // a non-existing page + render('no-posts', array( + 'title' => generate_title('is_default', i18n('All_blog_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'no-posts', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('All_blog_posts') + )); + + die; + } + + render('posts-list', array( + 'title' => generate_title('is_default', i18n('All_blog_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'heading' => i18n('All_blog_posts'), + 'page' => $page, + 'posts' => $posts, + 'bodyclass' => 'all-posts', + 'type' => 'is_admin-posts', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('All_blog_posts'), + 'pagination' => has_pagination($total, $perpage, $page) + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('All_blog_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-posts', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('All_blog_posts') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/popular +get('/admin/popular', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + config('views.root', 'system/admin/views'); + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = 20; + + $posts = popular_posts(true,$perpage); + + $total = ''; + + if (empty($posts) || $page < 1) { + + // a non-existing page + render('no-posts', array( + 'title' => generate_title('is_default', i18n('Popular_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'is_admin' => true, + 'bodyclass' => 'admin-popular', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Popular_posts') + )); + + die; + } + + render('popular-posts', array( + 'title' => generate_title('is_default', i18n('Popular_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'heading' => i18n('Popular_posts'), + 'page' => $page, + 'posts' => $posts, + 'is_admin' => true, + 'bodyclass' => 'admin-popular', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Popular_posts'), + 'pagination' => has_pagination($total, $perpage, $page) + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Popular_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Popular_posts') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/mine +get('/admin/mine', function () { + + if (login()) { + + config('views.root', 'system/admin/views'); + + $name = $_SESSION[site_url()]['user']; + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('profile.perpage'); + + $posts = get_profile_posts($name, $page, $perpage); + + $total = get_count('/'.$name.'/', 'dirname'); + + $author = get_author($name); + + if (isset($author[0])) { + $author = $author[0]; + } else { + $author = default_profile($name); + } + + if (empty($posts) || $page < 1) { + render('user-posts', array( + 'title' => generate_title('is_default', i18n('My_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'page' => $page, + 'heading' => i18n('My_posts'), + 'posts' => null, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-mine', + 'is_admin' => true, + 'bodyclass' => 'admin-mine', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('My_posts') . ': '. $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + die; + } + + render('user-posts', array( + 'title' => generate_title('is_default', i18n('My_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'heading' => i18n('My_posts'), + 'page' => $page, + 'posts' => $posts, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-mine', + 'is_admin' => true, + 'bodyclass' => 'admin-mine', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('My_posts') . ': '. $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/draft +get('/admin/draft', function () { + + if (login()) { + + config('views.root', 'system/admin/views'); + + $name = $_SESSION[site_url()]['user']; + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('profile.perpage'); + + $posts = get_draft($name, $page, $perpage); + + $draftPages = find_draft_page(); + + $draftSubpages = find_draft_subpage(); + + $total = get_draftcount($name); + + $author = get_author($name); + + if (isset($author[0])) { + $author = $author[0]; + } else { + $author = default_profile($name); + } + + if (empty($posts) || $page < 1) { + render('user-draft', array( + 'title' => generate_title('is_default', i18n('My_draft')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'page' => $page, + 'heading' => i18n('My_draft'), + 'posts' => null, + 'draftPages' => $draftPages, + 'draftSubpages' => $draftSubpages, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-draft', + 'is_admin' => true, + 'bodyclass' => 'admin-draft', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('My_draft'). ': ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + die; + } + + render('user-draft', array( + 'title' => generate_title('is_default', i18n('My_draft')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'heading' => i18n('My_draft'), + 'page' => $page, + 'posts' => $posts, + 'draftPages' => $draftPages, + 'draftSubpages' => $draftSubpages, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-draft', + 'is_admin' => true, + 'bodyclass' => 'admin-draft', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('My_draft') . ': ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/scheduled +get('/admin/scheduled', function () { + + if (login()) { + + config('views.root', 'system/admin/views'); + + $name = $_SESSION[site_url()]['user']; + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('profile.perpage'); + + $posts = get_scheduled($name, $page, $perpage); + + $total = get_scheduledcount($name); + + $author = get_author($name); + + if (isset($author[0])) { + $author = $author[0]; + } else { + $author = default_profile($name); + } + + if (empty($posts) || $page < 1) { + render('scheduled', array( + 'title' => generate_title('is_default', i18n('Scheduled_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'page' => $page, + 'heading' => i18n('Scheduled_posts'), + 'posts' => null, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-scheduled', + 'is_admin' => true, + 'bodyclass' => 'admin-scheduled', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Scheduled_posts') . ': ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + die; + } + + render('scheduled', array( + 'title' => generate_title('is_default', i18n('Scheduled_posts')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'heading' => i18n('Scheduled_posts'), + 'page' => $page, + 'posts' => $posts, + 'about' => $author->about, + 'name' => $author->name, + 'type' => 'is_admin-scheduled', + 'is_admin' => true, + 'bodyclass' => 'admin-scheduled', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Scheduled_posts') . ': ' . $author->name, + 'pagination' => has_pagination($total, $perpage, $page) + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/content +get('/admin/content', function () { + if (login()) { + config('views.root', 'system/admin/views'); + render('content-type', array( + 'title' => generate_title('is_default', i18n('Add_content')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-content', + 'is_admin' => true, + 'bodyclass' => 'admin-content', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Add_content') + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show admin/pages +get('/admin/pages', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('static-pages', array( + 'title' => generate_title('is_default', i18n('Static_pages')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-pages', + 'is_admin' => true, + 'bodyclass' => 'admin-pages', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Static_pages') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/admin/pages', function () { + + if (login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $json = $_REQUEST['json']; + reorder_pages($json); + echo json_encode(array( + 'message' => 'Page order saved successfully!', + )); + } + } +}); + +// Show admin/pages +get('/admin/pages/:static', function ($static) +{ + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + + $post = find_page($static); + + if (!$post) { + not_found(); + } + + if (array_key_exists('prev', $post)) { + $prev = $post['prev']; + } else { + $prev = array(); + } + + if (array_key_exists('next', $post)) { + $next = $post['next']; + } else { + $next = array(); + } + + $post = $post['current']; + + render('static-subpages', array( + 'title' => generate_title('is_default', $post->title), + 'description' => $post->description, + 'canonical' => $post->url, + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'in-page ' . strtolower($static), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . '' .i18n('pages').' » ' . $post->title, + 'p' => $post, + 'static' => $post, + 'type' => 'is_subpage', + 'prev' => static_prev($prev), + 'next' => static_next($next), + 'is_page' => true + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', 'Pages'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_subpage', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '', + )); + } + } else { + $login = site_url() . 'login'; + } +}); + +post('/admin/pages/:static', function ($static) { + + if (login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $json = $_REQUEST['json']; + reorder_subpages($json); + echo json_encode(array( + 'message' => 'Page order saved successfully!', + )); + } + } +}); + +// Show import page +get('/admin/import', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('import', array( + 'title' => generate_title('is_default', i18n('Import_Feed')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-import', + 'is_admin' => true, + 'bodyclass' => 'admin-import', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Import_Feed') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-import', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; +}); + +// Submitted import page data +post('/admin/import', function () { + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $url = from($_REQUEST, 'url'); + $credit = from($_REQUEST, 'credit'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + if (!empty($url) && $proper) { + + get_feed($url, $credit); + $log = get_feed($url, $credit); + + if (!empty($log)) { + + config('views.root', 'system/admin/views'); + + render('import', array( + 'title' => generate_title('is_default', i18n('Import_Feed')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $log . '
      ', + 'type' => 'is_admin-import', + 'is_admin' => true, + 'bodyclass' => 'admin-import', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Import_Feed') + )); + } + } else { + $message['error'] = ''; + if (empty($url)) { + $message['error'] .= '
    61. ' . i18n('msg_error_field_req_feedurl') . '
    62. '; + } + if (!$proper) { + $message['error'] .= '
    63. ' . i18n('Token_Error') . '
    64. '; + } + + config('views.root', 'system/admin/views'); + + render('import', array( + 'title' => generate_title('is_default', i18n('Import_Feed')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'url' => $url, + 'type' => 'is_admin-import', + 'is_admin' => true, + 'bodyclass' => 'admin-import', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Import_Feed') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Show Config page +get('/admin/config', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; +}); + +// Submitted Config page data +post('/admin/config', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + $new_config = array(); + $new_Keys = array(); + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + foreach (glob('cache/widget/archive*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + $redir = site_url() . 'admin/config'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/custom', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-custom', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/config/custom', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + $newKey = from($_REQUEST, 'newKey'); + $newValue = from($_REQUEST, 'newValue'); + + $new_config = array(); + $new_Keys = array(); + if (!empty($newKey)) { + $new_Keys[$newKey] = $newValue; + } + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + $new_config[$name] = $value; + } + } + save_config($new_config, $new_Keys); + $redir = site_url() . 'admin/config/custom'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/reading', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-reading', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/config/reading', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + $redir = site_url() . 'admin/config/reading'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/writing', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-writing', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/config/writing', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + $redir = site_url() . 'admin/config/writing'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/widget', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-widget', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/config/widget', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + foreach (glob('cache/widget/tags*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + $redir = site_url() . 'admin/config/widget'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/metatags', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-metatags', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; +}); + +// Submitted Config page data +post('/admin/config/metatags', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + foreach (glob('cache/widget/*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + $redir = site_url() . 'admin/config/metatags'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Config page +get('/admin/config/security', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-security', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/config/security', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + $redir = site_url() . 'admin/config/security'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + + +// Show Config page +get('/admin/config/performance', function () { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('config-performance', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'admin-config', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Config')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Config') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; +}); + +// Submitted Config page data +post('/admin/config/performance', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $new_config = array(); + $new_Keys = array(); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + foreach ($_POST as $name => $value) { + if (substr($name, 0, 8) == "-config-") { + $name = str_replace("_", ".", substr($name, 8)); + if(!is_null(config($name))) { + $new_config[$name] = $value; + } else { + $new_Keys[$name] = $value; + } + } + } + save_config($new_config, $new_Keys); + $redir = site_url() . 'admin/config/performance'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Backup page +get('/admin/backup', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('backup', array( + 'title' => generate_title('is_default', i18n('Backup')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-backup', + 'is_admin' => true, + 'bodyclass' => 'admin-backup', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Backup') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Create backup page +get('/admin/backup-start', function () { + if (login()) { + config('views.root', 'system/admin/views'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + render('backup-start', array( + 'title' => generate_title('is_default', i18n('Create_backup')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-backup-start', + 'is_admin' => true, + 'bodyclass' => 'admin-backup-start', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Create_backup') + )); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show clear cache page +get('/admin/clear-cache', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('clear-cache', array( + 'title' => generate_title('is_default', i18n('Clear_cache')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-clear-cache', + 'is_admin' => true, + 'bodyclass' => 'admin-clear-cache', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Clear_cache') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-clear-cache', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Update page +get('/admin/update', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('update', array( + 'title' => generate_title('is_default', i18n('Check_update')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-update', + 'is_admin' => true, + 'bodyclass' => 'admin-update', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Check_update') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show the update now link +get('/admin/update/now/:csrf', function ($CSRF) { + $proper = is_csrf_proper($CSRF); + $updater = new \Kanti\HubUpdater(array( + 'name' => 'danpros/htmly', + 'prerelease' => !!config("prerelease"), + )); + if (login() && $proper && $updater->able()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'admin') { + $updater->update(); + config('views.root', 'system/admin/views'); + render('updated-to', array( + 'title' => generate_title('is_default', i18n('Update')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'info' => $updater->getCurrentInfo(), + 'type' => 'is_admin-update', + 'is_admin' => true, + 'bodyclass' => 'admin-update', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Update') + )); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show Menu builder +get('/admin/menu', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('menu', array( + 'title' => generate_title('is_default', i18n('Menus')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'admin-menu', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Menus') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/admin/menu', function () { + + if (login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $json = from($_REQUEST, 'json'); + file_put_contents('content/data/menu.json', json_encode($json, JSON_UNESCAPED_UNICODE)); + echo json_encode(array( + 'message' => 'Menu saved successfully!', + )); + } else { + $redir = site_url(); + header("location: $redir"); + } + } +}); + +// Manage users page +get('/admin/users', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('users', array( + 'title' => generate_title('is_default', i18n('User')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-users', + 'is_admin' => true, + 'bodyclass' => 'admin-users', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('User') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +get('/admin/add/user', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('add-user', array( + 'title' => generate_title('is_default', i18n('Add_user')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-users', + 'is_admin' => true, + 'bodyclass' => 'admin-users', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('add_user') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/admin/add/user', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $username = from($_REQUEST, 'username'); + $user_role = from($_REQUEST, 'user-role'); + $password = from($_REQUEST, 'password'); + if (login() && $proper) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + + if (!empty($username) && !empty($password)) { + create_user($username, $password, $user_role); + } else { + + $message['error'] = ''; + if (empty($username)) { + $message['error'] .= '
    65. ' . i18n('msg_error_field_req_username') . '
    66. '; + } + if (empty($password)) { + $message['error'] .= '
    67. ' . i18n('msg_error_field_req_password') . '
    68. '; + } + + render('add-user', array( + 'title' => generate_title('is_default', i18n('Add_user')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'type' => 'is_admin-users', + 'is_admin' => true, + 'username' => $username, + 'user_role' => $user_role, + 'password' => $password, + 'bodyclass' => 'admin-users', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('add_user') + )); + } + $redir = site_url() . 'admin/users'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +get('/admin/users/:username/edit', function ($username) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('edit-user', array( + 'title' => generate_title('is_default', $username), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-users', + 'username' => $username, + 'is_admin' => true, + 'bodyclass' => 'admin-users', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $username + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted Config page data +post('/admin/users/:username/edit', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if (login() && $proper) { + $username = from($_REQUEST, 'username'); + $user_role = from($_REQUEST, 'role-name'); + $new_password = from($_REQUEST, 'password'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $old_password = user('password', $username); + if ($role === 'admin') { + $file = 'config/users/' . $username . '.ini'; + if (file_exists($file)) { + if (empty($new_password)) { + file_put_contents($file, "password = " . $old_password . "\n" . + "encryption = password_hash\n" . + "role = " . $user_role . "\n", LOCK_EX); + } else { + update_user($username, $new_password, $user_role); + } + } + $redir = site_url() . 'admin/users'; + header("location: $redir"); + } else { + $redir = site_url(); + header("location: $redir"); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +get('/admin/users/:username/delete', function ($username) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'admin') { + render('delete-user', array( + 'title' => generate_title('is_default', $username), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-users', + 'username' => $username, + 'is_admin' => true, + 'bodyclass' => 'admin-users', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $username + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-menu', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/admin/users/:username/delete', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $file = from($_REQUEST, 'file'); + $username = from($_REQUEST, 'username'); + $user_role = user('role', $username); + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + if ($role === 'admin') { + if ($user_role !== 'admin') { + unlink($file); + } + } + $redir = site_url() . 'admin/users'; + header("location: $redir"); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +post('/admin/gallery', function () { + + if (login()) { + $page = from($_REQUEST, 'page'); + $images = image_gallery(null, $page, 40); + echo json_encode(array('images' => $images)); + } +}); + +// Show category page +get('/admin/categories', function () { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + render('categories', array( + 'title' => generate_title('is_default', i18n('Categories')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-categories', + 'is_admin' => true, + 'bodyclass' => 'admin-categories', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Categories') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-categories', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Show the category page +get('/admin/categories/:category', function ($category) { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('category.perpage'); + + if (empty($perpage)) { + $perpage = 10; + } + + $posts = get_category($category, $page, $perpage); + + $desc = get_category_info($category); + + if(!empty($desc)) { + $desc = $desc[0]; + } + + if (empty($desc)) { + // a non-existing page + not_found(); + } + + $total = $desc->count; + + render('category-list', array( + 'title' => generate_title('is_default', $desc->title), + 'description' => $desc->description, + 'canonical' => $desc->url, + 'metatags' => generate_meta(null, null), + 'page' => $page, + 'posts' => $posts, + 'category' => $desc, + 'bodyclass' => 'in-category category-' . strtolower($category), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Categories') .' » ' . $desc->title, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_category' => true, + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', 'Categories'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-categories', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '', + )); + } + } else { + $login = site_url() . 'login'; + } +}); + +// Show the category page +get('/category/:category', function ($category) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('category.perpage'); + + if (empty($perpage)) { + $perpage = 10; + } + + $posts = get_category($category, $page, $perpage); + + $desc = get_category_info($category); + + + if(!empty($desc)) { + $desc = $desc[0]; + } + + if (empty($posts) || $page < 1) { + // a non-existing page + not_found(); + } + + $total = $desc->count; + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--category--'. strtolower($category) .'.html.php'; + $ls = $vroot . '/layout--category.html.php'; + if (file_exists($lt)) { + $layout = 'layout--category--' . strtolower($category); + } else if (file_exists($ls)) { + $layout = 'layout--category'; + } else { + $layout = ''; + } + + $pv = $vroot . '/main--category--'. strtolower($category) .'.html.php'; + $ps = $vroot . '/main--category.html.php'; + if (file_exists($pv)) { + $pview = 'main--category--' . strtolower($category); + } else if (file_exists($ps)) { + $pview = 'main--category'; + } else { + $pview = 'main'; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_category', $desc), + 'description' => $desc->description, + 'canonical' => $desc->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_category', $desc), + 'page' => $page, + 'posts' => $posts, + 'category' => $desc, + 'taxonomy' => $desc, + 'bodyclass' => 'in-category category-' . strtolower($category), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $desc->title, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_category' => true, + 'is_taxonomy' => true + ), $layout); +}); + +// Show the RSS feed +get('/category/:category/feed', function ($category) { + + header('Content-Type: application/rss+xml'); + + $posts = get_category($category, 1, config('rss.count')); + + $data = get_category_info($category); + + if(!empty($data)) { + $data = $data[0]; + } + + // Show an RSS feed + echo generate_rss($posts, $data); +}); + +// Show edit the category page +get('/category/:category/edit', function ($category) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = get_category_info($category); + + if(empty($post)) { + not_found(); + } + + $post = $post[0]; + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit_category')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'edit-category', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Category') . ': ' . $post->title, + 'p' => $post, + 'static' => $post, + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get edited data from category page +post('/category/:category/edit', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $oldfile = from($_REQUEST, 'oldfile'); + $destination = from($_GET, 'destination'); + $description = from($_REQUEST, 'description'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + edit_category($title, $url, $content, $oldfile, $destination, $description); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    69. ' . i18n('msg_error_field_req_title') . '
    70. '; + } + if (empty($content)) { + $message['error'] .= '
    71. ' . i18n('msg_error_field_req_content') . '
    72. '; + } + if (!$proper) { + $message['error'] .= '
    73. ' . i18n('Token_Error') . '
    74. '; + } + config('views.root', 'system/admin/views'); + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit_category')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'oldfile' => $oldfile, + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'edit-category', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Edit_category') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Delete category +get('/category/:category/delete', function ($category) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = get_category_info($category); + + if(empty($post)) { + not_found(); + } + + $post = $post[0]; + + render('delete-category', array( + 'title' => generate_title('is_default', i18n('Delete') . ' ' . i18n('Category')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_category', + 'is_admin' => true, + 'bodyclass' => 'delete-category', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Category') . ': ' . $post->title, + 'p' => $post, + 'static' => $post, + 'type' => 'categoryPage', + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get deleted category data +post('/category/:category/delete', function () { + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $file = from($_REQUEST, 'file'); + $destination = from($_GET, 'destination'); + delete_page($file, $destination); + } else { + $redir = site_url(); + header("location: $redir"); + } + } +}); + +// Show the type page +get('/type/:type', function ($type) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('type.perpage'); + + if (empty($perpage)) { + $perpage = 10; + } + + $posts = get_type($type, $page, $perpage); + + $total = get_typecount($type); + + $ttype = new stdClass; + $ttype->title = ucfirst($type); + $ttype->url = site_url() . 'type/' . strtolower($type); + $ttype->count = $total; + $ttype->description = i18n('Posts_with_type') . ' ' . ucfirst($type) . ' ' . i18n('by') . ' ' . blog_title(); + $ttype->body = $ttype->description; + $ttype->rss = $ttype->url . '/feed'; + $ttype->slug = strtolower($type); + + if (empty($posts) || $page < 1) { + // a non-existing page + not_found(); + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--type--'. strtolower($type) .'.html.php'; + $ls = $vroot . '/layout--type.html.php'; + if (file_exists($lt)) { + $layout = 'layout--type--' . strtolower($type); + } else if (file_exists($ls)) { + $layout = 'layout--type'; + } else { + $layout = ''; + } + + $pv = $vroot . '/main--type--'. strtolower($type) .'.html.php'; + $ps = $vroot . '/main--type.html.php'; + if (file_exists($pv)) { + $pview = 'main--type--' . strtolower($type); + } else if (file_exists($ps)) { + $pview = 'main--type'; + } else { + $pview = 'main'; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_type', $ttype), + 'description' => $ttype->description, + 'canonical' => $ttype->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_type', $ttype), + 'page' => $page, + 'posts' => $posts, + 'type' => $ttype, + 'taxonomy' => $ttype, + 'bodyclass' => 'in-type type-' . strtolower($type), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . ucfirst($type), + 'pagination' => has_pagination($total, $perpage, $page), + 'is_type' => true, + 'is_taxonomy' => true + ), $layout); +}); + +// Show the RSS feed +get('/type/:type/feed', function ($type) { + + header('Content-Type: application/rss+xml'); + + $posts = get_type($type, 1, config('rss.count')); + $data = new stdClass; + $data->title = ucfirst($type); + $data->url = site_url() . 'type/' . strtolower($type); + $data->body = i18n('Posts_with_type') . ' ' . ucfirst($type) . ' ' . i18n('by') . ' ' . blog_title(); + + // Show an RSS feed + echo generate_rss($posts, $data); +}); + +// Show the tag page +get('/tag/:tag', function ($tag) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('tag.perpage'); + + $posts = get_tag($tag, $page, $perpage); + + $total = get_tagcount($tag); + + $ttag = new stdClass; + $ttag->title = tag_i18n($tag); + $ttag->url = site_url() . 'tag/' . strtolower($tag); + $ttag->count = $total; + $ttag->description = i18n('All_posts_tagged') . ' ' . tag_i18n($tag) . ' ' . i18n('by') . ' ' . blog_title(); + $ttag->body = $ttag->description; + $ttag->rss = $ttag->url . '/feed'; + $ttag->slug = strtolower($tag); + + if (empty($posts) || $page < 1) { + // a non-existing page + not_found(); + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--tag--' . strtolower($tag) . '.html.php'; + $ls = $vroot . '/layout--tag.html.php'; + if (file_exists($lt)) { + $layout = 'layout--tag--' . strtolower($tag); + } else if (file_exists($ls)) { + $layout = 'layout--tag'; + } else { + $layout = ''; + } + + $pv = $vroot . '/main--tag--' . strtolower($tag) . '.html.php'; + $ps = $vroot . '/main--tag.html.php'; + if (file_exists($pv)) { + $pview = 'main--tag--' . strtolower($tag); + } elseif (file_exists($ps)) { + $pview = 'main--tag'; + } else { + $pview = 'main'; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_tag', $ttag), + 'description' => $ttag->description, + 'canonical' => $ttag->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_tag', $ttag), + 'page' => $page, + 'posts' => $posts, + 'tag' => $ttag, + 'taxonomy' => $ttag, + 'bodyclass' => 'in-tag tag-' . strtolower($tag), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Posts_tagged') . ' ' . tag_i18n($tag), + 'pagination' => has_pagination($total, $perpage, $page), + 'is_tag' => true, + 'is_taxonomy' => true + ), $layout); +}); + +// Show the RSS feed +get('/tag/:tag/feed', function ($tag) { + + header('Content-Type: application/rss+xml'); + + $posts = get_tag($tag, 1, config('rss.count')); + $data = new stdClass; + $data->title = tag_i18n($tag); + $data->url = site_url() . 'tag/' . strtolower($tag); + $data->body = i18n('All_posts_tagged') . ' ' . tag_i18n($tag) . ' ' . i18n('by') . ' ' . blog_title(); + + // Show an RSS feed + echo generate_rss($posts, $data); +}); + +// Show the archive page +get('/archive/:req', function ($req) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('archive.perpage'); + + $posts = get_archive($req, $page, $perpage); + + $total = get_count($req, 'basename'); + + if (empty($posts) || $page < 1) { + // a non-existing page + not_found(); + } + + $time = explode('-', $req); + $date = strtotime($req); + + if (isset($time[0]) && isset($time[1]) && isset($time[2])) { + $timestamp = format_date($date, 'd F Y'); + } elseif (isset($time[0]) && isset($time[1])) { + $timestamp = format_date($date, 'F Y'); + } else { + $timestamp = $req; + } + + $tarchive = new stdClass; + $tarchive->title = $timestamp; + $tarchive->url = site_url() . 'archive/' . $req; + $tarchive->count = $total; + $tarchive->description = i18n('Archive_page_for') . ' ' . $timestamp . ' ' . i18n('by') . ' ' . blog_title(); + $tarchive->body = $tarchive->description; + $tarchive->rss = $tarchive->url . '/feed'; + $tarchive->slug = strtolower($req); + + if (!$date) { + // a non-existing page + not_found(); + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--archive.html.php'; + if (file_exists($lt)) { + $layout = 'layout--archive'; + } else { + $layout = ''; + } + + $pv = $vroot . '/main--archive.html.php'; + if (file_exists($pv)) { + $pview = 'main--archive'; + } else { + $pview = 'main'; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_archive', $tarchive), + 'description' => $tarchive->description, + 'canonical' => $tarchive->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_archive', $tarchive), + 'page' => $page, + 'posts' => $posts, + 'archive' => $tarchive, + 'taxonomy' => $tarchive, + 'bodyclass' => 'in-archive archive-' . strtolower($req), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Archive_for') . ' ' . $timestamp, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_archive' => true, + 'is_taxonomy' => true + ), $layout); +}); + +// Show the RSS feed +get('/archive/:req/feed', function ($req) { + + header('Content-Type: application/rss+xml'); + + $posts = get_archive($req, 1, config('rss.count')); + + $time = explode('-', $req); + $date = strtotime($req); + + if (isset($time[0]) && isset($time[1]) && isset($time[2])) { + $timestamp = format_date($date, 'd F Y'); + } elseif (isset($time[0]) && isset($time[1])) { + $timestamp = format_date($date, 'F Y'); + } else { + $timestamp = $req; + } + + $data = new stdClass; + $data->title = $timestamp; + $data->url = site_url() . 'archive/' . $req; + $data->body = i18n('Archive_page_for') . ' ' . $timestamp . ' ' . i18n('by') . ' ' . blog_title(); + + // Show an RSS feed + echo generate_rss($posts, $data); +}); + +// Show the search page +get('/search/:keyword', function ($keyword) { + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('search.perpage'); + + $posts = get_keyword($keyword, $page, $perpage); + $total = keyword_count($keyword); + + $tsearch = new stdClass; + $tsearch->title = $keyword; + $tsearch->url = site_url() . 'search/' . strtolower($keyword); + $tsearch->count = $total; + $tsearch->description = i18n('Search_results_for') . ' ' . $keyword . ' ' . i18n('by') . ' ' . blog_title(); + $tsearch->body = $tsearch->description; + $tsearch->rss = $tsearch->url . '/feed'; + $tsearch->slug = strtolower($keyword); + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--search.html.php'; + if (file_exists($lt)) { + $layout = 'layout--search'; + } else { + $layout = ''; + } + + if (!$posts || $page < 1) { + // a non-existing page or no search result + render('404-search', array( + 'title' => i18n('Search_results_not_found') . ' - ' . blog_title(), + 'description' => i18n('Search_results_not_found'), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'search' => $tsearch, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('No_search_results'), + 'canonical' => site_url(), + 'bodyclass' => 'error-404-search', + 'is_404search' => true, + ), $layout); + die; + } + + $pv = $vroot . '/main--search.html.php'; + if (file_exists($pv)) { + $pview = 'main--search'; + } else { + $pview = 'main'; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_search', $tsearch), + 'description' => $tsearch->description, + 'canonical' => $tsearch->url . $CanonicalPageNum, + 'metatags' => generate_meta('is_search', $tsearch), + 'page' => $page, + 'posts' => $posts, + 'search' => $tsearch, + 'taxonomy' => $tsearch, + 'bodyclass' => 'in-search search-' . strtolower($keyword), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Search_results_for') . ' ' . $keyword, + 'pagination' => has_pagination($total, $perpage, $page), + 'is_search' => true, + 'is_taxonomy' => true + ), $layout); +}); + +// Show the RSS feed +get('/search/:keyword/feed', function ($keyword) { + + header('Content-Type: application/rss+xml'); + + $posts = get_keyword($keyword, 1, config('rss.count')); + + $data = new stdClass; + $data->title = $keyword; + $data->url = site_url() . 'search/' . strtolower($keyword); + $data->body = i18n('Search_results_for') . ' ' . $keyword . ' ' . i18n('by') . ' ' . blog_title(); + + // Show an RSS feed + echo generate_rss($posts, $data); +}); + +// The JSON API +get('/api/json', function () { + + header('Content-type: application/json'); + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('json.count'); + + echo generate_json(get_posts(null, $page, $perpage)); +}); + +// Show the RSS feed +get('/feed/rss', function () { + + header('Content-Type: application/rss+xml'); + + // Show an RSS feed with the 30 latest posts + echo generate_rss(get_posts(null, 1, config('rss.count'))); +}); + +// Generate OPML file +get('/feed/opml', function () { + + header('Content-Type: text/xml'); + + // Generate OPML file for the RSS + echo generate_opml(); +}); + +// Show blog post without year-month +get('/'. permalink_type() .'/:name', function ($name) { + + if (permalink_type() == 'default') { + $post = find_post(null, null, $name); + if (is_null($post)) { + not_found(); + } else { + $current = $post['current']; + } + $redir = site_url() . date('Y/m', $current->date) . '/' . $name; + header("location: $redir", TRUE, 301); + } + + if (config("views.counter") != "true") { + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } else { + add_view('post_' . $name); + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } + + $post = find_post(null, null, $name); + + if (is_null($post)) { + not_found('post_' . $name); + } else { + $current = $post['current']; + } + + $author = new stdClass; + $author->url = $current->authorUrl; + $author->name = $current->authorName; + $author->description = $current->authorDescription; + $author->about = $current->authorAbout; + $author->avatar = $current->authorAvatar; + $author->rss = $current->authorRss; + $author->slug = $current->author; + + if (array_key_exists('prev', $post)) { + $prev = $post['prev']; + } else { + $prev = array(); + } + + if (array_key_exists('next', $post)) { + $next = $post['next']; + } else { + $next = array(); + } + + if (isset($current->image)) { + $var = 'imagePost'; + } elseif (isset($current->link)) { + $var = 'linkPost'; + } elseif (isset($current->quote)) { + $var = 'quotePost'; + } elseif (isset($current->audio)) { + $var = 'audioPost'; + } elseif (isset($current->video)) { + $var = 'videoPost'; } + else { + $var = 'blogPost'; + } + + if (config('blog.enable') === 'true') { + $blog = ' » '; + } else { + $blog = ''; + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--post--' . $current->ct . '.html.php'; + $pt = $vroot . '/layout--post--' . $current->type . '.html.php'; + $ls = $vroot . '/layout--post.html.php'; + if (file_exists($lt)) { + $layout = 'layout--post--' . $current->ct; + } else if (file_exists($pt)) { + $layout = 'layout--post--' . $current->type; + } else if (file_exists($ls)) { + $layout = 'layout--post'; + } else { + $layout = ''; + } + + $pv = $vroot . '/post--' . $current->ct . '.html.php'; + $pvt = $vroot . '/post--' . $current->type . '.html.php'; + if (file_exists($pv)) { + $pview = 'post--' . $current->ct; + } else if(file_exists($pvt)) { + $pview = 'post--' . $current->type; + } else { + $pview = 'post'; + } + + render($pview, array( + 'title' => generate_title('is_post', $current), + 'description' => $current->description, + 'canonical' => $current->url, + 'metatags' => generate_meta('is_post', $current), + 'p' => $current, + 'post' => $current, + 'author' => $author, + 'bodyclass' => 'in-post category-' . $current->ct . ' type-' . $current->type, + 'breadcrumb' => '', + 'prev' => has_prev($prev), + 'next' => has_next($next), + 'type' => $var, + 'is_post' => true + ), $layout); + +}); + +// Edit blog post +get('/'. permalink_type() .'/:name/edit', function ($name) { + + if (login()) { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + config('views.root', 'system/admin/views'); + $post = find_post(null, null, $name); + + if (!$post) { + $post = find_draft(null, null, $name); + if (!$post) { + $post = find_scheduled(null, null, $name); + if (!$post) { + not_found(); + } + } + + } + + $current = $post['current']; + + if (isset($current->image)) { + $type= 'is_image'; + } elseif (isset($current->link)) { + $type = 'is_link'; + } elseif (isset($current->quote)) { + $type = 'is_quote'; + } elseif (isset($current->audio)) { + $type = 'is_audio'; + } elseif (isset($current->video)) { + $type = 'is_video'; + } else { + $type = 'is_post'; + } + + if ($user === $current->author || $role === 'editor' || $role === 'admin') { + render('edit-content', array( + 'title' => generate_title('is_default', $current->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'type' => $type, + 'is_admin' => true, + 'bodyclass' => 'edit-post', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', $current->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'bodyclass' => 'denied', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get edited data from blog post +post('/'. permalink_type() .'/:name/edit', function () { + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $title = from($_REQUEST, 'title'); + $is_post = from($_REQUEST, 'is_post'); + $image = from($_REQUEST, 'image'); + $is_image = from($_REQUEST, 'is_image'); + $video = from($_REQUEST, 'video'); + $is_video = from($_REQUEST, 'is_video'); + $link = from($_REQUEST, 'link'); + $is_link = from($_REQUEST, 'is_link'); + $audio = from($_REQUEST, 'audio'); + $is_audio = from($_REQUEST, 'is_audio'); + $quote = from($_REQUEST, 'quote'); + $is_quote = from($_REQUEST, 'is_quote'); + $tag = from($_REQUEST, 'tag'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $oldfile = from($_REQUEST, 'oldfile'); + $destination = from($_GET, 'destination'); + $description = from($_REQUEST, 'description'); + $date = from($_REQUEST, 'date'); + $time = from($_REQUEST, 'time'); + $dateTime = null; + $revertPost = from($_REQUEST, 'revertpost'); + $publishDraft = from($_REQUEST, 'publishdraft'); + $category = from($_REQUEST, 'category'); + if ($date !== null && $time !== null) { + $dateTime = $date . ' ' . $time; + } + + if (!empty($is_image)) { + $type = 'is_image'; + } elseif (!empty($is_video)) { + $type = 'is_video'; + } elseif (!empty($is_link)) { + $type = 'is_link'; + } elseif (!empty($is_quote)) { + $type = 'is_quote'; + } elseif (!empty($is_audio)) { + $type = 'is_audio'; + } elseif (!empty($is_post)) { + $type = 'is_post'; + } + + if (empty($url)) { + $url = $title; + } + + $arr = explode('/', $oldfile); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($image)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'image', $destination, $description, $dateTime, $image); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($video)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'video', $destination, $description, $dateTime, $video); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($link)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'link', $destination, $description, $dateTime, $link); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($quote)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'quote', $destination, $description, $dateTime, $quote); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($audio)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'audio', $destination, $description, $dateTime, $audio); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($is_post)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'post', $destination, $description, $dateTime, null); + + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    75. ' . i18n('msg_error_field_req_title') . '
    76. '; + } + if (empty($tag)) { + $message['error'] .= '
    77. ' . i18n('msg_error_field_req_tag') . '
    78. '; + } + if (empty($content)) { + $message['error'] .= '
    79. ' . i18n('msg_error_field_req_content') . '
    80. '; + } + if (!$proper) { + $message['error'] .= '
    81. ' . i18n('Token_Error') . '
    82. '; + } + + if (!empty($is_image)) { + if (empty($image)) { + $message['error'] .= '
    83. ' . i18n('msg_error_field_req_image') . '
    84. '; + } + } elseif (!empty($is_video)) { + if (empty($video)) { + $message['error'] .= '
    85. ' . i18n('msg_error_field_req_video') . '
    86. '; + } + } elseif (!empty($is_link)) { + if (empty($link)) { + $message['error'] .= '
    87. ' . i18n('msg_error_field_req_link') . '
    88. '; + } + } elseif (!empty($is_quote)) { + if (empty($quote)) { + $message['error'] .= '
    89. ' . i18n('msg_error_field_req_quote') . '
    90. '; + } + } elseif (!empty($is_audio)) { + if (empty($audio)) { + $message['error'] .= '
    91. ' . i18n('msg_error_field_req_audio') . '
    92. '; + } + } + + config('views.root', 'system/admin/views'); + + render('edit-content', array( + 'title' => generate_title('is_default', $title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'oldfile' => $oldfile, + 'postTitle' => $title, + 'postImage' => $image, + 'postVideo' => $video, + 'postLink' => $link, + 'postQuote' => $quote, + 'postAudio' => $audio, + 'postTag' => $tag, + 'postUrl' => $url, + 'type' => $type, + 'is_admin' => true, + 'postContent' => $content, + 'bodyclass' => 'edit-post', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Edit_content') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Delete blog post +get('/'. permalink_type() .'/:name/delete', function ($name) { + + if (login()) { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + config('views.root', 'system/admin/views'); + $post = find_post(null, null, $name); + + if (!$post) { + $post = find_draft(null, null, $name); + if (!$post) { + $post = find_scheduled(null, null, $name); + if (!$post) { + not_found(); + } + } + + } + + $current = $post['current']; + + if (config('blog.enable') === 'true') { + $blog = ' » '; + } else { + $blog = ''; + } + + if ($user === $current->author || $role === 'editor' || $role === 'admin') { + render('delete-post', array( + 'title' => generate_title('is_default', i18n('Delete')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'is_admin' => true, + 'bodyclass' => 'delete-post', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', 'Delete post'), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'is_admin' => true, + 'bodyclass' => 'delete-post', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get deleted data from blog post +post('/'. permalink_type() .'/:name/delete', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + $file = from($_REQUEST, 'file'); + $destination = from($_GET, 'destination'); + $arr = explode('/', $file); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + delete_post($file, $destination); + } else { + $redir = site_url(); + header("location: $redir"); + } + } +}); + +// Show various page (top-level), admin, login, sitemap, static page. +get('/:static', function ($static) { + + if (strpos($static, ".xml") !== false) { + if ($static === 'sitemap.xml') { + $sitemap = 'index.xml'; + } else { + $sitemap = str_replace('sitemap.', '', $static); + } + header('Content-Type: text/xml'); + generate_sitemap($sitemap); + die; + } elseif ($static === 'admin') { + if (login()) { + config('views.root', 'system/admin/views'); + render('main', array( + 'title' => generate_title('is_default', i18n('Admin')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'admin-front', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Admin') + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; + } elseif ($static === 'login') { + if (session_status() == PHP_SESSION_NONE) session_start(); + config('views.root', 'system/admin/views'); + render('login', array( + 'title' => generate_title('is_default', i18n('Login')), + 'description' => 'Login page from ' . blog_title() . '.', + 'canonical' => site_url() . '/login', + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'in-login', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Login') + )); + die; + } elseif ($static === 'logout') { + if (login()) { + config('views.root', 'system/admin/views'); + render('logout', array( + 'title' => generate_title('is_default', i18n('Logout')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'in-logout', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Logout') + )); + } else { + $login = site_url() . 'login'; + header("location: $login"); + } + die; + } elseif ($static === blog_path()) { + + if(config('blog.enable') !== 'true') { + $url = site_url(); + header("Location: $url"); + } + + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + + $page = from($_GET, 'page'); + $page = $page ? (int)$page : 1; + $perpage = config('posts.perpage'); + + $posts = get_posts(null, $page, $perpage); + + $total = ''; + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--blog.html.php'; + if (file_exists($lt)) { + $layout = 'layout--blog'; + } else { + $layout = ''; + } + + $pv = $vroot . '/main--blog.html.php'; + if (file_exists($pv)) { + $pview = 'main--blog'; + } else { + $pview = 'main'; + } + + $tblog = new stdClass; + $tblog->title = blog_string(); + $tblog->url = site_url() . blog_path(); + $tblog->count = count(get_blog_posts()); + $tblog->description = i18n('all_blog_posts') . ' ' . i18n('by') . ' ' . blog_title(); + $tblog->body = $tblog->description; + $tblog->rss = site_url() . 'feed/rss'; + $tblog->slug = blog_path(); + + if (empty($posts) || $page < 1) { + + // a non-existing page + render('no-posts', array( + 'title' => generate_title('is_blog', null), + 'description' => blog_title() . ' ' . blog_string(), + 'canonical' => site_url(), + 'metatags' => generate_meta('is_blog', null), + 'bodyclass' => 'no-posts', + 'is_front' => true, + ), $layout); + + die; + } + + if ($page > 1) { + $CanonicalPageNum = '?page=' . $page; + } else { + $CanonicalPageNum = NULL; + } + + render($pview, array( + 'title' => generate_title('is_blog', null), + 'description' => blog_title() . ' ' . blog_string(), + 'canonical' => site_url() . blog_path() . $CanonicalPageNum, + 'metatags' => generate_meta('is_blog', null), + 'page' => $page, + 'posts' => $posts, + 'taxonomy' => $tblog, + 'bodyclass' => 'in-blog', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . blog_string(), + 'pagination' => has_pagination($total, $perpage, $page), + 'is_blog' => true, + 'is_taxonomy' => true + ), $layout); + } elseif ($static === 'front') { + + $redir = site_url(); + header("location: $redir", TRUE, 301); + + } else { + + if (config("views.counter") != "true") { + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } else { + add_view('page_' . $static); + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } + + $post = find_page($static); + + if (!$post) { + not_found('page_' . $static); + } + + if (array_key_exists('prev', $post)) { + $prev = $post['prev']; + } else { + $prev = array(); + } + + if (array_key_exists('next', $post)) { + $next = $post['next']; + } else { + $next = array(); + } + + $post = $post['current']; + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--' . strtolower($static) . '.html.php'; + $ls = $vroot . '/layout--static.html.php'; + if (file_exists($lt)) { + $layout = 'layout--' . strtolower($static); + } else if (file_exists($ls)) { + $layout = 'layout--static'; + } else { + $layout = ''; + } + + $pv = $vroot . '/static--' . strtolower($static) . '.html.php'; + if (file_exists($pv)) { + $pview = 'static--' . strtolower($static); + } else { + $pview = 'static'; + } + + render($pview, array( + 'title' => generate_title('is_page', $post), + 'description' => $post->description, + 'canonical' => $post->url, + 'metatags' => generate_meta('is_page', $post), + 'bodyclass' => 'in-page ' . strtolower($static), + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $post->title, + 'p' => $post, + 'static' => $post, + 'type' => 'is_page', + 'prev' => static_prev($prev), + 'next' => static_next($next), + 'is_page' => true + ), $layout); + } +}); + +// Show the add sub static page +get('/:static/add', function ($static) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = find_page($static); + + if (!$post) { + not_found(); + } + + $post = $post['current']; + + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_new_page')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_subpage', + 'parent' => $static, + 'is_admin' => true, + 'bodyclass' => 'add-page', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $post->title . ' » ' . i18n('Add_new_page') + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted data from add sub static page +post('/:static/add', function ($static) { + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $description = from($_REQUEST, 'description'); + $draft = from($_REQUEST, 'draft'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + add_sub_page($title, $url, $content, $static, $draft, $description); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    93. ' . i18n('msg_error_field_req_title') . '
    94. '; + } + if (empty($content)) { + $message['error'] .= '
    95. ' . i18n('msg_error_field_req_content') . '
    96. '; + } + if (!$proper) { + $message['error'] .= '
    97. ' . i18n('Token_Error') . '
    98. '; + } + config('views.root', 'system/admin/views'); + render('add-page', array( + 'title' => generate_title('is_default', i18n('Add_new_page')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'type' => 'is_subpage', + 'is_admin' => true, + 'bodyclass' => 'add-page', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $title . ' » ' . i18n('Add_new_page') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Show edit the static page +get('/:static/edit', function ($static) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = find_page($static); + + if (!$post) { + $post = find_draft_page($static); + if (!$post) { + not_found(); + } else { + $post = $post[0]; + } + } else { + $post = $post['current']; + } + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit') . ': ' . $post->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'edit-page', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' .i18n('pages').' » ' . $post->title, + 'p' => $post, + 'static' => $post, + 'type' => 'is_page', + 'parent' => '' + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_page', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get edited data from static page +post('/:static/edit', function () { + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $oldfile = from($_REQUEST, 'oldfile'); + $destination = from($_GET, 'destination'); + $description = from($_REQUEST, 'description'); + $revertPage = from($_REQUEST, 'revertpage'); + $publishDraft = from($_REQUEST, 'publishdraft'); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + edit_page($title, $url, $content, $oldfile, $revertPage, $publishDraft, $destination, $description); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    99. ' . i18n('msg_error_field_req_title') . '
    100. '; + } + if (empty($content)) { + $message['error'] .= '
    101. ' . i18n('msg_error_field_req_content') . '
    102. '; + } + if (!$proper) { + $message['error'] .= '
    103. ' . i18n('Token_Error') . '
    104. '; + } + config('views.root', 'system/admin/views'); + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit') . ': ' . $post->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'oldfile' => $oldfile, + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'bodyclass' => 'edit-page', + 'is_admin' => true, + 'type' => 'is_page', + 'parent' => '', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Edit') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Deleted the static page +get('/:static/delete', function ($static) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = find_page($static); + + if (!$post) { + $post = find_draft_page($static); + if (!$post) { + not_found(); + } else { + $post = $post[0]; + } + } else { + $post = $post['current']; + } + + render('delete-page', array( + 'title' => generate_title('is_default', i18n('Delete') . ': ' . $post->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'delete-page', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Delete') . ': ' . $post->title, + 'p' => $post, + 'static' => $post, + 'type' => 'is_page', + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_admin-config', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get deleted data for static page +post('/:static/delete', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $file = from($_REQUEST, 'file'); + $destination = from($_GET, 'destination'); + delete_page($file, $destination); + } else { + $redir = site_url(); + header("location: $redir"); + } + } +}); + +// Show the sb static page +get('/:static/:sub', function ($static, $sub) { + + if ($static === 'front') { + $redir = site_url(); + header("location: $redir", TRUE, 301); + } + + if (config("views.counter") != "true") { + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } else { + add_view('subpage_' . $static.'.'.$sub); + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } + + $parent_post = find_page($static); + if (!$parent_post) { + not_found('subpage_' . $static.'.'.$sub); + } + $post = find_subpage($static, $sub); + + if (!$post) { + not_found('subpage_' . $static.'.'.$sub); + } + + if (array_key_exists('prev', $post)) { + $prev = $post['prev']; + } else { + $prev = array(); + } + + if (array_key_exists('next', $post)) { + $next = $post['next']; + } else { + $next = array(); + } + + $post = $post['current']; + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--' . strtolower($static) . '--' . strtolower($sub) . '.html.php'; + $ls = $vroot . '/layout--' . strtolower($static) . '.html.php'; + $lf = $vroot . '/layout--static.html.php'; + if (file_exists($lt)) { + $layout = 'layout--' . strtolower($static) . '--' . strtolower($sub); + } else if (file_exists($ls)) { + $layout = 'layout--' . strtolower($static); + } else if (file_exists($lf)) { + $layout = 'layout--static'; + } else { + $layout = ''; + } + + $pv = $vroot . '/static--' . strtolower($static) . '--' . strtolower($sub) . '.html.php'; + $ps = $vroot . '/static--' . strtolower($static) . '.html.php'; + if (file_exists($pv)) { + $pview = 'static--' . strtolower($static) . '--' . strtolower($sub); + } else if (file_exists($ps)) { + $pview = 'static--' . strtolower($static); + } else { + $pview = 'static'; + } + + render($pview, array( + 'title' => generate_title('is_subpage', $post), + 'description' => $post->description, + 'canonical' => $post->url, + 'metatags' => generate_meta('is_subpage', $post), + 'bodyclass' => 'in-page ' . strtolower($static) . ' ' . strtolower($sub) , + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $parent_post['current']->title . ' » ' . $post->title, + 'p' => $post, + 'static' => $post, + 'parent' => $parent_post, + 'prev' => static_prev($prev), + 'next' => static_next($next), + 'type' => 'is_subpage', + 'is_subpage' => true + ), $layout); +}); + +// Edit the sub static page +get('/:static/:sub/edit', function ($static, $sub) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = find_page($static); + + if (!$post) { + not_found(); + } + + $post = $post['current']; + + $page = find_subpage($static, $sub); + + if (!$page) { + $page = find_draft_subpage($static, $sub); + if (!$page) { + not_found(); + } else { + $page = $page[0]; + } + } else { + $page = $page['current']; + } + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit') . ': ' . $page->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'edit-page', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $post->title . ' » ' . $page->title, + 'p' => $page, + 'static' => $page, + 'type' => 'is_subpage', + 'parent' => $static + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_subpage', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted data from edit sub static page +post('/:static/:sub/edit', function ($static, $sub) { + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $title = from($_REQUEST, 'title'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $oldfile = from($_REQUEST, 'oldfile'); + $destination = from($_GET, 'destination'); + $description = from($_REQUEST, 'description'); + $revertPage = from($_REQUEST, 'revertpage'); + $publishDraft = from($_REQUEST, 'publishdraft'); + if ($destination === null) { + $destination = $static . "/" . $sub; + } + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (empty($url)) { + $url = $title; + } + if ($role === 'editor' || $role === 'admin') { + if ($proper && !empty($title) && !empty($content)) { + edit_page($title, $url, $content, $oldfile, $revertPage, $publishDraft, $destination, $description, $static); + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    105. ' . i18n('msg_error_field_req_title') . '
    106. '; + } + if (empty($content)) { + $message['error'] .= '
    107. ' . i18n('msg_error_field_req_content') . '
    108. '; + } + if (!$proper) { + $message['error'] .= '
    109. ' . i18n('Token_Error') . '
    110. '; + } + config('views.root', 'system/admin/views'); + + render('edit-page', array( + 'title' => generate_title('is_default', i18n('Edit') . ': ' . $page->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'oldfile' => $oldfile, + 'postTitle' => $title, + 'postUrl' => $url, + 'postContent' => $content, + 'static' => $static, + 'sub' => $sub, + 'type' => 'is_subpage', + 'bodyclass' => 'edit-page', + 'is_admin' => true, + 'parent' => $static, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Edit') + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Delete sub static page +get('/:static/:sub/delete', function ($static, $sub) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if (login()) { + config('views.root', 'system/admin/views'); + if ($role === 'editor' || $role === 'admin') { + $post = find_page($static); + + if (!$post) { + not_found(); + } + + $post = $post['current']; + + $page = find_subpage($static, $sub); + + if (!$page) { + $page = find_draft_subpage($static, $sub); + if (!$page) { + not_found(); + } else { + $page = $page[0]; + } + } else { + $page = $page['current']; + } + + render('delete-page', array( + 'title' => generate_title('is_default', i18n('Delete') . ': ' . $page->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'bodyclass' => 'delete-page', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $post->title . ' » ' . $page->title, + 'p' => $page, + 'static' => $page, + 'type' => 'is_subpage', + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Denied')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'type' => 'is_subpage', + 'is_admin' => true, + 'bodyclass' => 'denied', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . i18n('Denied') + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Submitted data from delete sub static page +post('/:static/:sub/delete', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($role === 'editor' || $role === 'admin') { + $file = from($_REQUEST, 'file'); + $destination = from($_GET, 'destination'); + delete_page($file, $destination); + } else { + $redir = site_url(); + header("location: $redir"); + } + } +}); + +// Show blog post with year-month +get('/:year/:month/:name', function ($year, $month, $name) { + + if (permalink_type() !== 'default') { + $redir = site_url() . permalink_type() . '/' . $name; + header("location: $redir", TRUE, 301); + } + + if (config("views.counter") != "true") { + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } else { + add_view('post_' . $name); + if (!login()) { + file_cache($_SERVER['REQUEST_URI']); + } + } + + $post = find_post($year, $month, $name); + + if (is_null($post)) { + not_found('post_'. $name); + } else { + $current = $post['current']; + } + + $author = new stdClass; + $author->url = $current->authorUrl; + $author->name = $current->authorName; + $author->description = $current->authorDescription; + $author->about = $current->authorAbout; + $author->avatar = $current->authorAvatar; + $author->rss = $current->authorRss; + $author->slug = $current->author; + + if (array_key_exists('prev', $post)) { + $prev = $post['prev']; + } else { + $prev = array(); + } + + if (array_key_exists('next', $post)) { + $next = $post['next']; + } else { + $next = array(); + } + + if (isset($current->image)) { + $var = 'imagePost'; + } elseif (isset($current->link)) { + $var = 'linkPost'; + } elseif (isset($current->quote)) { + $var = 'quotePost'; + } elseif (isset($current->audio)) { + $var = 'audioPost'; + } elseif (isset($current->video)) { + $var = 'videoPost'; } + else { + $var = 'blogPost'; + } + + if (config('blog.enable') === 'true') { + $blog = ' » '; + } else { + $blog = ''; + } + + $vroot = rtrim(config('views.root'), '/'); + + $lt = $vroot . '/layout--post--' . $current->ct . '.html.php'; + $pt = $vroot . '/layout--post--' . $current->type . '.html.php'; + $ls = $vroot . '/layout--post.html.php'; + if (file_exists($lt)) { + $layout = 'layout--post--' . $current->ct; + } else if (file_exists($pt)) { + $layout = 'layout--post--' . $current->type; + } else if (file_exists($ls)) { + $layout = 'layout--post'; + } else { + $layout = ''; + } + + $pv = $vroot . '/post--' . $current->ct . '.html.php'; + $pvt = $vroot . '/post--' . $current->type . '.html.php'; + if (file_exists($pv)) { + $pview = 'post--' . $current->ct; + } else if(file_exists($pvt)) { + $pview = 'post--' . $current->type; + } else { + $pview = 'post'; + } + + render($pview, array( + 'title' => generate_title('is_post', $current), + 'description' => $current->description, + 'canonical' => $current->url, + 'metatags' => generate_meta('is_post', $current), + 'p' => $current, + 'post' => $current, + 'author' => $author, + 'bodyclass' => 'in-post category-' . $current->ct . ' type-' . $current->type, + 'breadcrumb' => '', + 'prev' => has_prev($prev), + 'next' => has_next($next), + 'type' => $var, + 'is_post' => true + ), $layout); + +}); + +// Edit blog post +get('/:year/:month/:name/edit', function ($year, $month, $name) { + + if (login()) { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + config('views.root', 'system/admin/views'); + $post = find_post($year, $month, $name); + + if (!$post) { + $post = find_draft($year, $month, $name); + if (!$post) { + $post = find_scheduled($year, $month, $name); + if (!$post) { + not_found(); + } + } + + } + + $current = $post['current']; + + if (isset($current->image)) { + $type= 'is_image'; + } elseif (isset($current->link)) { + $type = 'is_link'; + } elseif (isset($current->quote)) { + $type = 'is_quote'; + } elseif (isset($current->audio)) { + $type = 'is_audio'; + } elseif (isset($current->video)) { + $type = 'is_video'; + } else { + $type = 'is_post'; + } + + if ($user === $current->author || $role === 'editor' || $role === 'admin') { + render('edit-content', array( + 'title' => generate_title('is_default', $current->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'type' => $type, + 'bodyclass' => 'edit-post', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', $current->title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'bodyclass' => 'denied', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get edited data from blog post +post('/:year/:month/:name/edit', function () { + + if(!login()) { + $login = site_url() . 'login'; + header("location: $login"); + } + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + $title = from($_REQUEST, 'title'); + $is_post = from($_REQUEST, 'is_post'); + $image = from($_REQUEST, 'image'); + $is_image = from($_REQUEST, 'is_image'); + $video = from($_REQUEST, 'video'); + $is_video = from($_REQUEST, 'is_video'); + $link = from($_REQUEST, 'link'); + $is_link = from($_REQUEST, 'is_link'); + $audio = from($_REQUEST, 'audio'); + $is_audio = from($_REQUEST, 'is_audio'); + $quote = from($_REQUEST, 'quote'); + $is_quote = from($_REQUEST, 'is_quote'); + $tag = from($_REQUEST, 'tag'); + $url = from($_REQUEST, 'url'); + $content = from($_REQUEST, 'content'); + $oldfile = from($_REQUEST, 'oldfile'); + $destination = from($_GET, 'destination'); + $description = from($_REQUEST, 'description'); + $date = from($_REQUEST, 'date'); + $time = from($_REQUEST, 'time'); + $dateTime = null; + $revertPost = from($_REQUEST, 'revertpost'); + $publishDraft = from($_REQUEST, 'publishdraft'); + $category = from($_REQUEST, 'category'); + if ($date !== null && $time !== null) { + $dateTime = $date . ' ' . $time; + } + + if (!empty($is_image)) { + $type = 'is_image'; + } elseif (!empty($is_video)) { + $type = 'is_video'; + } elseif (!empty($is_link)) { + $type = 'is_link'; + } elseif (!empty($is_quote)) { + $type = 'is_quote'; + } elseif (!empty($is_audio)) { + $type = 'is_audio'; + } elseif (!empty($is_post)) { + $type = 'is_post'; + } + + if (empty($url)) { + $url = $title; + } + + $arr = explode('/', $oldfile); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + + if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($image)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'image', $destination, $description, $dateTime, $image); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($video)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'video', $destination, $description, $dateTime, $video); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($link)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'link', $destination, $description, $dateTime, $link); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($quote)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'quote', $destination, $description, $dateTime, $quote); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($audio)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'audio', $destination, $description, $dateTime, $audio); + + } else if ($proper && !empty($title) && !empty($tag) && !empty($content) && !empty($is_post)) { + + edit_content($title, $tag, $url, $content, $oldfile, $revertPost, $publishDraft, $category, 'post', $destination, $description, $dateTime, null); + + } else { + $message['error'] = ''; + if (empty($title)) { + $message['error'] .= '
    111. ' . i18n('msg_error_field_req_title') . '
    112. '; + } + if (empty($tag)) { + $message['error'] .= '
    113. ' . i18n('msg_error_field_req_tag') . '
    114. '; + } + if (empty($content)) { + $message['error'] .= '
    115. ' . i18n('msg_error_field_req_content') . '
    116. '; + } + if (!$proper) { + $message['error'] .= '
    117. ' . i18n('Token_Error') . '
    118. '; + } + + if (!empty($is_image)) { + if (empty($image)) { + $message['error'] .= '
    119. ' . i18n('msg_error_field_req_image') . '
    120. '; + } + } elseif (!empty($is_video)) { + if (empty($video)) { + $message['error'] .= '
    121. ' . i18n('msg_error_field_req_video') . '
    122. '; + } + } elseif (!empty($is_link)) { + if (empty($link)) { + $message['error'] .= '
    123. ' . i18n('msg_error_field_req_link') . '
    124. '; + } + } elseif (!empty($is_quote)) { + if (empty($quote)) { + $message['error'] .= '
    125. ' . i18n('msg_error_field_req_quote') . '
    126. '; + } + } elseif (!empty($is_audio)) { + if (empty($audio)) { + $message['error'] .= '
    127. ' . i18n('msg_error_field_req_audio') . '
    128. '; + } + } + + config('views.root', 'system/admin/views'); + + render('edit-content', array( + 'title' => generate_title('is_default', $title), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'error' => '
        ' . $message['error'] . '
      ', + 'oldfile' => $oldfile, + 'postTitle' => $title, + 'postImage' => $image, + 'postVideo' => $video, + 'postLink' => $link, + 'postQuote' => $quote, + 'postAudio' => $audio, + 'postTag' => $tag, + 'postUrl' => $url, + 'type' => $type, + 'postContent' => $content, + 'is_admin' => true, + 'bodyclass' => 'edit-post', + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $title + )); + } + } else { + $redir = site_url(); + header("location: $redir"); + } +}); + +// Delete blog post +get('/:year/:month/:name/delete', function ($year, $month, $name) { + + if (login()) { + + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + + config('views.root', 'system/admin/views'); + $post = find_post($year, $month, $name); + + if (!$post) { + $post = find_draft($year, $month, $name); + if (!$post) { + $post = find_scheduled($year, $month, $name); + if (!$post) { + not_found(); + } + } + + } + + $current = $post['current']; + + if ($user === $current->author || $role === 'editor' || $role === 'admin') { + render('delete-post', array( + 'title' => generate_title('is_default', i18n('Delete')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'bodyclass' => 'delete-post', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } else { + render('denied', array( + 'title' => generate_title('is_default', i18n('Delete')), + 'description' => safe_html(strip_tags(blog_description())), + 'canonical' => site_url(), + 'metatags' => generate_meta(null, null), + 'p' => $current, + 'post' => $current, + 'bodyclass' => 'delete-post', + 'is_admin' => true, + 'breadcrumb' => '' . config('breadcrumb.home') . ' » ' . $current->categoryb . ' » ' . $current->title + )); + } + } else { + $login = site_url() . 'login'; + header("location: $login"); + } +}); + +// Get deleted data from blog post +post('/:year/:month/:name/delete', function () { + + $proper = is_csrf_proper(from($_REQUEST, 'csrf_token')); + if ($proper && login()) { + $file = from($_REQUEST, 'file'); + $destination = from($_GET, 'destination'); + $arr = explode('/', $file); + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + if ($user === $arr[1] || $role === 'editor' || $role === 'admin') { + delete_post($file, $destination); + } + } +}); + +// If we get here, it means that +// nothing has been matched above +get('.*', function () { + not_found(); +}); + +// Serve the blog +dispatch(); diff --git a/system/includes/.htaccess b/system/includes/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/system/includes/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/system/includes/dispatch.php b/system/includes/dispatch.php new file mode 100644 index 0000000..f5ae7c6 --- /dev/null +++ b/system/includes/dispatch.php @@ -0,0 +1,720 @@ + $value) { + $value = json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + $map = array('\r\n' => ' \n ', '\r' => ' \n '); + $value = trim(strtr($value, $map)); + $string = preg_replace("/^" . $word . " = .+$/m", $word . ' = ' . $value, $string); + } + $string = rtrim($string); + foreach ($new as $word => $value) { + $value = json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + $map = array('\r\n' => ' \n ', '\r' => ' \n '); + $value = trim(strtr($value, $map)); + $string .= "\n" . $word . ' = ' . $value . "\n"; + } + $string = rtrim($string); + return file_put_contents($config_file, $string, LOCK_EX); +} + +function get_search_query() +{ + if (isset($_GET['search'])) { + $search = _h($_GET['search']); + $url = site_url() . 'search/' . remove_accent($search); + header("Location: $url"); + die; + } +} + +function to_b64($str) +{ + $str = base64_encode($str); + $str = preg_replace('/\//', '_', $str); + $str = preg_replace('/\+/', '.', $str); + $str = preg_replace('/\=/', '-', $str); + return trim($str, '-'); +} + +function from_b64($str) +{ + $str = preg_replace('/\_/', '/', $str); + $str = preg_replace('/\./', '+', $str); + $str = preg_replace('/\-/', '=', $str); + $str = base64_decode($str); + return $str; +} + +if (extension_loaded('mcrypt')) { + + function encrypt($decoded, $algo = MCRYPT_RIJNDAEL_256, $mode = MCRYPT_MODE_CBC) + { + if (($secret = config('cookies.secret')) == null) + error(500, '[cookies.secret] is not set'); + + $secret = mb_substr($secret, 0, mcrypt_get_key_size($algo, $mode)); + $iv_size = mcrypt_get_iv_size($algo, $mode); + $iv_code = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); + $encrypted = to_b64(mcrypt_encrypt($algo, $secret, $decoded, $mode, $iv_code)); + + return sprintf('%s|%s', $encrypted, to_b64($iv_code)); + } + + function decrypt($encoded, $algo = MCRYPT_RIJNDAEL_256, $mode = MCRYPT_MODE_CBC) + { + if (($secret = config('cookies.secret')) == null) + error(500, '[cookies.secret] is not set'); + + $secret = mb_substr($secret, 0, mcrypt_get_key_size($algo, $mode)); + list($enc_str, $iv_code) = explode('|', $encoded); + $enc_str = from_b64($enc_str); + $iv_code = from_b64($iv_code); + $enc_str = mcrypt_decrypt($algo, $secret, $enc_str, $mode, $iv_code); + + return rtrim($enc_str, "\0"); + } + +} + +function set_cookie($name, $value, $expire = 31536000, $path = '/') +{ + $value = (function_exists('encrypt') ? encrypt($value) : $value); + setcookie($name, $value, time() + $expire, $path); +} + +function get_cookie($name) +{ + $value = from($_COOKIE, $name); + + if ($value) + $value = (function_exists('decrypt') ? decrypt($value) : $value); + + return $value; +} + +function delete_cookie() +{ + $cookies = func_get_args(); + foreach ($cookies as $ck) + setcookie($ck, '', -10, '/'); +} + +// if we have APCu loaded, enable cache functions +if (extension_loaded('apcu')) { + + function cache($key, $func, $ttl = 0) + { + if (($data = apcu_fetch($key)) === false) { + $data = call_user_func($func); + if ($data !== null) { + apcu_store($key, $data, $ttl); + } + } + return $data; + } + + function cache_invalidate() + { + foreach (func_get_args() as $key) { + apcu_delete($key); + } + } + +} + +function warn($name = null, $message = null) +{ + static $warnings = array(); + + if ($name == '*') + return $warnings; + + if (!$name) + return count(array_keys($warnings)); + + if (!$message) + return isset($warnings[$name]) ? $warnings[$name] : null; + + $warnings[$name] = $message; +} + +function _u($str) +{ + return urlencode($str); +} + +function _h($str, $enc = 'UTF-8', $flags = ENT_QUOTES) +{ + return htmlentities($str, $flags, $enc); +} + +function from($source, $name) +{ + $map = array("\r\n" => "\n", "\r" => "\n"); + if (is_array($name)) { + $data = array(); + foreach ($name as $k) + $data[$k] = isset($source[$k]) ? trim(strtr($source[$k], $map)) : null; + return $data; + } + return isset($source[$name]) ? trim(strtr($source[$name], $map)) : null; +} + +function stash($name, $value = null) +{ + static $_stash = array(); + + if ($value === null) + return isset($_stash[$name]) ? $_stash[$name] : null; + + $_stash[$name] = $value; + + return $value; +} + +function method($verb = null) +{ + if ($verb == null || (strtoupper($verb) == strtoupper($_SERVER['REQUEST_METHOD']))) + return strtoupper($_SERVER['REQUEST_METHOD']); + + error(400, 'bad request'); +} + +function client_ip() +{ + if (isset($_SERVER['HTTP_CLIENT_IP'])) + return $_SERVER['HTTP_CLIENT_IP']; + elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) + return $_SERVER['HTTP_X_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; +} + +function redirect(/* $code_or_path, $path_or_cond, $cond */) +{ + $argv = func_get_args(); + $argc = count($argv); + + $path = null; + $code = 302; + $cond = true; + + switch ($argc) { + case 3: + list($code, $path, $cond) = $argv; + break; + case 2: + if (is_string($argv[0]) ? $argv[0] : $argv[1]) { + $code = 302; + $path = $argv[0]; + $cond = $argv[1]; + } else { + $code = $argv[0]; + $path = $argv[1]; + } + break; + case 1: + if (!is_string($argv[0])) + error(500, 'bad call to redirect()'); + $path = $argv[0]; + break; + default: + error(500, 'bad call to redirect()'); + } + + $cond = (is_callable($cond) ? !!call_user_func($cond) : !!$cond); + + if (!$cond) + return; + + header('Location: ' . $path, true, $code); + exit; +} + +function partial($view, $locals = null) +{ + if (is_array($locals) && count($locals)) { + extract($locals, EXTR_SKIP); + } + + if (($view_root = config('views.root')) == null) + error(500, "[views.root] is not set"); + + $path = basename($view); + $view = preg_replace('/' . $path . '$/', "_{$path}", $view); + $view = "{$view_root}/{$view}.html.php"; + + if (file_exists($view)) { + ob_start(); + require $view; + return ob_get_clean(); + } else { + error(500, "partial [{$view}] not found"); + } + + return ''; +} + +function content($value = null) +{ + return stash('$content$', $value); +} + +function render($view, $locals = null, $layout = null) +{ + if (!login()) { + $c = str_replace('/', '#', str_replace('?', '~', rawurldecode($_SERVER['REQUEST_URI']))); + $dir = 'cache/page'; + $cachefile = $dir . '/' . $c . '.cache'; + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + } + + if (is_array($locals) && count($locals)) { + extract($locals, EXTR_SKIP); + } + + if (($view_root = config('views.root')) == null) + error(500, "[views.root] is not set"); + + $fnc = "{$view_root}/functions.php"; + + ob_start(); + if (file_exists($fnc)) { + include $fnc; + } + include "{$view_root}/{$view}.html.php"; + content(trim(ob_get_clean())); + + if ($layout !== false) { + if ($layout == null) { + $layout = config('views.layout'); + $layout = ($layout == null) ? 'layout' : $layout; + } + $layout = "{$view_root}/{$layout}.html.php"; + header('Content-type: text/html; charset=utf-8'); + if (config('generation.time') == 'true') { + ob_start(); + require $layout; + $time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $total_time = round($time, 4); + echo "\n" . ''; + } else { + ob_start(); + require $layout; + } + if (!login() && $view != '404' && $view != '404-search' && $view != 'login-mfa' && config('cache.off') == "false") { + if (config('cache.timestamp') == 'true') { + echo "\n" . ''; + } + if (isset($cachefile)) + file_put_contents($cachefile, ob_get_contents(), LOCK_EX); + } + echo trim(ob_get_clean()); + } else { + echo content(); + } +} + +function json($obj, $code = 200) +{ + header('Content-type: application/json', true, $code); + echo json_encode($obj); + exit; +} + +function save_json_pretty($filename, $arr) +{ + if (defined("JSON_PRETTY_PRINT")) { + file_put_contents($filename, json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX); + } else { + file_put_contents($filename, json_encode($arr, JSON_UNESCAPED_UNICODE), LOCK_EX); + } +} + +function file_get_data($filename) +{ + $thisFile = fopen($filename, 'r'); + if (flock($thisFile, LOCK_SH)) { + $fileData = file_get_contents($filename); + flock($thisFile, LOCK_UN); + } else { + $fileData = json_encode(array('flock_fail' => 'reading')); + } + fclose($thisFile); + return $fileData; +} + +function condition() +{ + static $cb_map = array(); + + $argv = func_get_args(); + $argc = count($argv); + + if (!$argc) + error(500, 'bad call to condition()'); + + $name = array_shift($argv); + $argc = $argc - 1; + + if (!$argc && is_callable($cb_map[$name])) + return call_user_func($cb_map[$name]); + + if (is_callable($argv[0])) + return ($cb_map[$name] = $argv[0]); + + if (is_callable($cb_map[$name])) + return call_user_func_array($cb_map[$name], $argv); + + error(500, 'condition [' . $name . '] is undefined'); +} + +function middleware($cb_or_path = null) +{ + static $cb_map = array(); + + if ($cb_or_path == null || is_string($cb_or_path)) { + foreach ($cb_map as $cb) { + call_user_func($cb, $cb_or_path); + } + } else { + array_push($cb_map, $cb_or_path); + } +} + +function filter($sym, $cb_or_val = null) +{ + static $cb_map = array(); + + if (is_callable($cb_or_val)) { + $cb_map[$sym] = $cb_or_val; + return; + } + + if (is_array($sym) && count($sym) > 0) { + foreach ($sym as $s) { + $s = substr($s, 1); + if (isset($cb_map[$s]) && isset($cb_or_val[$s])) + call_user_func($cb_map[$s], $cb_or_val[$s]); + } + return; + } + + error(500, 'bad call to filter()'); +} + +function route_to_regex($route) +{ + $route = preg_replace_callback('@:[\w]+@i', function ($matches) { + $token = str_replace(':', '', $matches[0]); + return '(?P<' . $token . '>[a-z0-9_\0-\.]+)'; + }, $route); + return '@^' . rtrim($route, '/') . '$@i'; +} + +function route($method, $pattern, $callback = null) +{ + // callback map by request type + static $route_map = array( + 'GET' => array(), + 'POST' => array() + ); + + $method = strtoupper($method); + + if (!in_array($method, array('GET', 'POST'))) + error(500, 'Only GET and POST are supported'); + + // a callback was passed, so we create a route defiition + if ($callback !== null) { + + // create a route entry for this pattern + $route_map[$method][$pattern] = array( + 'xp' => route_to_regex($pattern), + 'cb' => $callback + ); + + } else { + + + // callback is null, so this is a route invokation. look up the callback. + foreach ($route_map[$method] as $pat => $obj) { + + // if the requested uri ($pat) has a matching route, let's invoke the cb + if (!preg_match($obj['xp'], $pattern, $vals)) + continue; + + // call middleware + middleware($pattern); + + // construct the params for the callback + array_shift($vals); + preg_match_all('@:([\w]+)@', $pat, $keys, PREG_PATTERN_ORDER); + $keys = array_shift($keys); + $argv = array(); + + foreach ($keys as $index => $id) { + $id = substr($id, 1); + if (isset($vals[$id])) { + array_push($argv, trim(urldecode($vals[$id]))); + } + } + + // call filters if we have symbols + if (count($keys)) { + filter(array_values($keys), $vals); + } + + // if cb found, invoke it + if (is_callable($obj['cb'])) { + call_user_func_array($obj['cb'], $argv); + } + + // leave after first match + break; + + } + } + +} + +function get($path, $cb) +{ + route('GET', $path, $cb); +} + +function post($path, $cb) +{ + route('POST', $path, $cb); +} + +function flash($key, $msg = null, $now = false) +{ + static $x = array(), + $f = null; + + $f = (config('cookies.flash') ? config('cookies.flash') : '_F'); + + if ($c = get_cookie($f)) + $c = json_decode($c, true); + else + $c = array(); + + if ($msg == null) { + + if (isset($c[$key])) { + $x[$key] = $c[$key]; + unset($c[$key]); + set_cookie($f, json_encode($c)); + } + + return (isset($x[$key]) ? $x[$key] : null); + } + + if (!$now) { + $c[$key] = $msg; + set_cookie($f, json_encode($c)); + } + + $x[$key] = $msg; +} + +function create_thumb($src, $desired_width = null, $desired_height = null) { + + if (!extension_loaded('gd')) { + return $src; + } + + $dir = 'content/images/thumbnails'; + + if (!is_dir($dir)) { + mkdir($dir); + } + + $w = config('thumbnail.width'); + if (empty($w)) { + $w = 500; + } + + if (is_null($desired_width)) { + $desired_width = $w; + } + + if (!is_null($desired_height)) { + $h = 'x' . $desired_height; + } else { + $h = null; + } + + $fileName = pathinfo($src, PATHINFO_FILENAME); + $thumbFile = $dir . '/' . $fileName . '-' . $desired_width . $h .'.webp'; + + if (file_exists($thumbFile)) { + return site_url() . $thumbFile; + } else { + + /* read the source image */ + $source_image = imagecreatefromstring(file_get_contents($src)); + if ($source_image === false) { + return $src; + } + $width = imagesx($source_image); + $height = imagesy($source_image); + + /* find the "desired height" of this thumbnail, relative to the desired width */ + if (is_null($desired_height)) { + $desired_height = floor($height * ($desired_width / $width)); + } + + $ratio = max($desired_width/$width, $desired_height/$height); + $height = floor($desired_height / $ratio); + $x = floor(($width - $desired_width / $ratio) / 2); + $width = floor($desired_width / $ratio); + + /* create a new, "virtual" image */ + $virtual_image = imagecreatetruecolor($desired_width, $desired_height); + imageAlphaBlending($virtual_image, false); + imageSaveAlpha($virtual_image, true); + + /* copy source image at a resized size */ + imagecopyresampled($virtual_image, $source_image, 0, 0, $x, 0, $desired_width, $desired_height, $width, $height); + + /* create the physical thumbnail image to its destination */ + imagewebp($virtual_image, $thumbFile, 75); + imagedestroy($virtual_image); + + return site_url() . $thumbFile; + + } +} + +function dispatch() +{ + $path = $_SERVER['REQUEST_URI']; + + if (config('site.url') !== null) + $path = preg_replace('@^' . preg_quote(site_path()) . '@', '', $path); + + $parts = preg_split('/\?/', $path, -1, PREG_SPLIT_NO_EMPTY); + + $uri = trim($parts[0], '/'); + $uri = strlen($uri) ? $uri : 'index'; + + route(method(), "/{$uri}"); +} diff --git a/system/includes/functions.php b/system/includes/functions.php new file mode 100644 index 0000000..132140b --- /dev/null +++ b/system/includes/functions.php @@ -0,0 +1,4146 @@ + $b['basename']) ? 1 : -1); +} + +// usort function. +function sortfile_d($a, $b) +{ + return $a['basename'] == $b['basename'] ? 0 : (($a['basename'] < $b['basename']) ? 1 : -1); +} + +// usort function. Sort by date. +function sortdate($a, $b) +{ + return $a->date == $b->date ? 0 : (($a->date < $b->date) ? 1 : -1); +} + +// Rebuilt cache index +function rebuilt_cache($type = null) +{ + $dir = 'cache/index'; + $posts_cache = array(); + $page_cache = array(); + $subpage_cache = array(); + $author_cache = array(); + $scheduled_cache = array(); + $category_cache = array(); + $draft_cache = array(); + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + // Rebuilt posts index + $tmp = array(); + $ctmp = array(); + $tmp = glob('content/*/blog/*/*/*.md', GLOB_NOSORT); + if (is_array($tmp)) { + foreach ($tmp as $file) { + if(strpos($file, '/draft/') === false) { + $posts_cache[] = pathinfo($file); + $pc = explode('/', $file); + $ctmp[] = $pc[3]; + } + } + } + usort($posts_cache, "sortfile_d"); + $posts_string = serialize($posts_cache); + file_put_contents('cache/index/index-posts.txt', print_r($posts_string, true), LOCK_EX); + + // Rebuilt scheduled posts index + $stmp = array(); + $stmp = glob('content/*/*/*/*/scheduled/*.md', GLOB_NOSORT); + if (is_array($stmp)) { + foreach ($stmp as $file) { + $scheduled_cache[] = pathinfo($file); + $ss = explode('/', $file); + $ctmp[] = $ss[3]; + } + } + usort($scheduled_cache, "sortfile_d"); + $scheduled_string = serialize($scheduled_cache); + file_put_contents('cache/index/index-scheduled.txt', print_r($scheduled_string, true), LOCK_EX); + + // Rebuilt draft posts index + $drf = array(); + $drf = glob('content/*/*/*/draft/*.md', GLOB_NOSORT); + if (is_array($drf)) { + foreach ($drf as $file) { + $draft_cache[] = pathinfo($file); + $dd = explode('/', $file); + $ctmp[] = $dd[3]; + } + } + usort($draft_cache, "sortfile_d"); + $draft_string = serialize($draft_cache); + file_put_contents('cache/index/index-draft.txt', print_r($draft_string, true), LOCK_EX); + + // Rebuilt category files index + $ftmp = array(); + $ftmp = glob('content/data/category/*.md', GLOB_NOSORT); + if (is_array($ftmp)) { + foreach ($ftmp as $file) { + $category_cache[] = pathinfo($file); + $ctmp[] = pathinfo($file, PATHINFO_FILENAME); + } + } + usort($category_cache, "sortfile_a"); + $category_string = serialize($category_cache); + file_put_contents('cache/index/index-category-files.txt', print_r($category_string, true), LOCK_EX); + + // Rebuilt category slug index + $dirc = array(); + $dirc = array_push($ctmp, 'uncategorized'); + $dirc = array_unique($ctmp, SORT_REGULAR); + file_put_contents('cache/index/index-category.txt', print_r(serialize($dirc), true), LOCK_EX); + + // Rebuilt static page index + $ptmp = array(); + $ptmp = glob('content/static/*.md', GLOB_NOSORT); + natsort($ptmp); + if (is_array($ptmp)) { + foreach ($ptmp as $file) { + if(strpos($file, '/draft/') === false) { + $page_cache[] = pathinfo($file); + } + } + } + $page_string = serialize($page_cache); + file_put_contents('cache/index/index-pages.txt', print_r($page_string, true), LOCK_EX); + + // Rebuilt subpage index + $sptmp = array(); + $sptmp = glob('content/static/*/*.md', GLOB_NOSORT); + natsort($sptmp); + if (is_array($sptmp)) { + foreach ($sptmp as $file) { + if(strpos($file, '/draft/') === false) { + $subpage_cache[] = pathinfo($file); + } + } + } + $subpage_string = serialize($subpage_cache); + file_put_contents('cache/index/index-subpages.txt', print_r($subpage_string, true), LOCK_EX); + + // Rebuilt user profile index + $atmp = array(); + $atmp = glob('content/*/author.md', GLOB_NOSORT); + if (is_array($atmp)) { + foreach ($atmp as $file) { + $author_cache[] = pathinfo($file); + } + } + usort($author_cache, "sortfile_a"); + $author_string = serialize($author_cache); + file_put_contents('cache/index/index-author.txt', print_r($author_string, true), LOCK_EX); + + // Remove the widget cache + foreach (glob('cache/widget/*.cache', GLOB_NOSORT) as $file) { + unlink($file); + } + +} + +// Return blog posts. +function get_posts($posts, $page = 1, $perpage = 0) +{ + if (empty($posts)) { + $posts = get_blog_posts(); + } + + $tmp = array(); + + // Extract a specific page with results + $posts = array_slice($posts, ($page - 1) * $perpage, $perpage); + + $cList = category_list(true); + + $auto = config('toc.automatic'); + $counter = config('views.counter'); + $caption = config('fig.captions'); + + if ($counter == 'true') { + $viewsFile = "content/data/views.json"; + if (file_exists($viewsFile)) { + $views = json_decode(file_get_contents($viewsFile), true); + } + } + + foreach ($posts as $index => $v) { + + $post = new stdClass; + + $filepath = $v['dirname'] . '/' . $v['basename']; + + // Extract the date + $arr = explode('_', $v['basename']); + + // dirname string + $dirname = $v['dirname']; + + // Author string + $str = explode('/', $dirname); + $author = $str[1]; + + foreach ($cList as $a => $t) { + if ($t['0'] === $str[3]) { + $post->category = '' . $t['1'] . ''; + $post->categoryUrl = site_url() . 'category/' . $t['0']; + $post->categoryCount = $t['2']; + $post->categorySlug = $t['0']; + $post->categoryMd = $t['0'] . '.md'; + $post->categoryTitle = $t['1']; + $post->categoryb = '' . $t['1'] . ''; + } + } + + $type = $str[4]; + $post->ct = $str[3]; + + // The post author + author url + $post->author = $author; + $post->authorUrl = site_url() . 'author/' . $author; + $post->authorRss = site_url() . 'author/' . $author . '/feed'; + + $profile = get_author($author); + if (isset($profile[0])) { + $post->authorName = $profile[0]->name; + $post->authorDescription = $profile[0]->description; + $post->authorAbout = $profile[0]->about; + $post->authorAvatar = $profile[0]->avatar; + } else { + $post->authorName = $author; + $post->authorDescription = i18n('Author_Description'); + $post->authorAbout = i18n('Author_Description'); + $post->authorAvatar = site_url() . 'system/resources/images/logo-small.png'; + } + + $post->type = $type; + $dt = str_replace($dirname, '', $arr[0]); + $t = str_replace('-', '', $dt); + $time = new DateTime($t); + $timestamp = $time->format("Y-m-d H:i:s"); + + // The post date + $post->date = strtotime($timestamp); + $post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($filepath))); + + // The archive per day + $post->archive = site_url() . 'archive/' . date('Y-m', $post->date); + + if (permalink_type() == 'default') { + $post->url = site_url() . date('Y/m', $post->date) . '/' . str_replace('.md', '', $arr[2]); + } else { + $post->url = site_url() . permalink_type() . '/' . str_replace('.md', '', $arr[2]); + } + + $post->slug = str_replace('.md', '', $arr[2]); + + $post->file = $filepath; + + $content = file_get_contents($filepath); + + // Extract the title and body + $post->title = get_content_tag('t', $content, 'Untitled post: ' . format_date($post->lastMod, 'l, j F Y, H:i')); + $post->image = get_content_tag('image', $content); + $post->video = get_content_tag('video', $content); + $post->link = get_content_tag('link', $content); + $post->quote = get_content_tag('quote', $content); + $post->audio = get_content_tag('audio', $content); + + $tag = array(); + $url = array(); + $bc = array(); + $rel = array(); + + $tagt = get_content_tag('tag', $content); + $t = explode(',', rtrim($arr[1], ',')); + + if(!empty($tagt)) { + $tl = explode(',', rtrim($tagt, ',')); + if (count($tl) == count($t)) { + $tCom = array_combine($t, $tl); + } else { + $tCom = array_combine($t, $t); + } + foreach ($tCom as $key => $val) { + if(!empty($val)) { + $tag[] = array($val, site_url() . 'tag/' . strtolower($key)); + } else { + $tag[] = array($key, site_url() . 'tag/' . strtolower($key)); + } + } + } else { + foreach ($t as $tt) { + $tag[] = array($tt, site_url() . 'tag/' . strtolower($tt)); + } + } + + foreach ($tag as $a) { + $url[] = ''; + $bc[] = '' . $a[0] . ''; + } + + $post->tag = implode(' ', $url); + + $post->tagb = implode(' » ', $bc); + + $post->related = $post->categorySlug. ',' .$post->url; + + $more = explode('', $content); + if (isset($more['1'])) { + $content = $more['0'] . '
      ' . $more['1']; + } + + // Get the contents and convert it to HTML + $post->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + $post->description = get_content_tag("d", $content, get_description($post->body)); + + $word_count = str_word_count(strip_tags($post->body)); + $post->readTime = ceil($word_count / 200); + + $toc = explode('', $post->body); + if (isset($toc['1'])) { + $post->body = insert_toc('post-' . $post->date, $toc['0'], $toc['1']); + } else { + if ($auto === 'true') { + $post->body = automatic_toc($post->body, 'post-' . $post->date); + } + } + + // Convert image tags to figures + if ($caption == 'true') { + $post->body = preg_replace( '/

      ()<\/p>/', '

      $1
      $2
      ', $post->body ); + } + + if ($counter == 'true') { + $post->views = get_views('post_' . $post->slug, $post->file, $views); + } else { + $post->views = null; + } + + $tmp[] = $post; + } + + return $tmp; +} + +function get_pages($pages, $page = 1, $perpage = 0) +{ + if (empty($pages)) { + $pages = get_static_pages(); + } + + $tmp = array(); + + $auto = config('toc.automatic'); + $counter = config('views.counter'); + + if ($counter == 'true') { + $viewsFile = "content/data/views.json"; + if (file_exists($viewsFile)) { + $views = json_decode(file_get_contents($viewsFile), true); + } + } + + // Extract a specific page with results + $pages = array_slice($pages, ($page - 1) * $perpage, $perpage); + + foreach ($pages as $index => $v) { + $post = new stdClass; + + // The static page URL + $fn = explode('.', $v['filename']); + + if (isset($fn[1])) { + $url = $fn[1]; + } else { + $url= $v['filename']; + } + + $post->url = site_url() . $url; + + $post->file = $v['dirname'] . '/' . $v['basename']; + $post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file))); + + $post->md = $v['basename']; + $post->slug = $url; + $post->parent = null; + $post->parentSlug = null; + + // Get the contents and convert it to HTML + $content = file_get_contents($post->file); + + // Extract the title and body + $post->title = get_content_tag('t', $content, 'Untitled static page: ' . format_date($post->lastMod, 'l, j F Y, H:i')); + + // Get the contents and convert it to HTML + $post->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + $post->description = get_content_tag("d", $content, get_description($post->body)); + + $word_count = str_word_count(strip_tags($post->body)); + $post->readTime = ceil($word_count / 200); + + $toc = explode('', $post->body); + if (isset($toc['1'])) { + $post->body = insert_toc('page-' . $post->slug, $toc['0'], $toc['1']); + } else { + if ($auto === 'true') { + $post->body = automatic_toc($post->body, 'page-' . $post->slug); + } + } + + if ($counter == 'true') { + $post->views = get_views('page_' . $post->slug, $post->file, $views); + } else { + $post->views = null; + } + + $tmp[] = $post; + } + + return $tmp; + +} + +function get_subpages($sub_pages, $page = 1, $perpage = 0) +{ + if (empty($sub_pages)) { + $sub_pages = get_static_subpages(); + } + + $tmp = array(); + + $auto = config('toc.automatic'); + $counter = config('views.counter'); + + if ($counter == 'true') { + $viewsFile = "content/data/views.json"; + if (file_exists($viewsFile)) { + $views = json_decode(file_get_contents($viewsFile), true); + } + } + + // Extract a specific page with results + $sub_pages = array_slice($sub_pages, ($page - 1) * $perpage, $perpage); + + foreach ($sub_pages as $index => $v) { + + $post = new stdClass; + + $fd = str_replace(dirname($v['dirname']) . '/', '', $v['dirname']); + + $st = explode('.', $fd); + if (isset($st[1])) { + $static = $st[1]; + } else { + $static = $fd; + } + + // The static page URL + $fn = explode('.', $v['filename']); + + if (isset($fn[1])) { + $url = $fn[1]; + } else { + $url= $v['filename']; + } + + $post->url = site_url() . $static . "/" . $url; + + $post->file = $v['dirname'] . '/' . $v['basename']; + $post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file))); + + $post->md = $v['basename']; + $post->slug = $url; + $post->parent = $fd; + $post->parentSlug = $static; + + // Get the contents and convert it to HTML + $content = file_get_contents($post->file); + + // Extract the title and body + $post->title = get_content_tag('t', $content, 'Untitled static subpage: ' . format_date($post->lastMod, 'l, j F Y, H:i')); + + // Get the contents and convert it to HTML + $post->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + $post->description = get_content_tag("d", $content, get_description($post->body)); + + $word_count = str_word_count(strip_tags($post->body)); + $post->readTime = ceil($word_count / 200); + + $toc = explode('', $post->body); + if (isset($toc['1'])) { + $post->body = insert_toc('subpage-' . $post->slug, $toc['0'], $toc['1']); + } else { + if ($auto === 'true') { + $post->body = automatic_toc($post->body, 'subpage-' . $post->slug); + } + } + + if ($counter == 'true') { + $post->views = get_views('subpage_' . $post->parentSlug .'.'. $post->slug, $post->file, $views); + } else { + $post->views = null; + } + + $tmp[] = $post; + } + + return $tmp; + +} + +// Find post by year, month and name, previous, and next. +function find_post($year, $month, $name) +{ + $posts = get_blog_posts(); + + foreach ($posts as $index => $v) { + $arr = explode('_', $v['basename']); + if ((strpos($arr[0], "$year-$month") !== false && strtolower($arr[2]) === strtolower($name . '.md')) || ($year === NULL && strtolower($arr[2]) === strtolower($name . '.md'))) { + + // Use the get_posts method to return + // a properly parsed object + + $ar = get_posts($posts, $index + 1, 1); + $nx = get_posts($posts, $index, 1); + $pr = get_posts($posts, $index + 2, 1); + + if ($index == 0) { + if (isset($pr[0])) { + return array( + 'current' => $ar[0], + 'prev' => $pr[0] + ); + } else { + return array( + 'current' => $ar[0], + 'prev' => null + ); + } + } elseif (count($posts) == $index + 1) { + return array( + 'current' => $ar[0], + 'next' => $nx[0] + ); + } else { + return array( + 'current' => $ar[0], + 'next' => $nx[0], + 'prev' => $pr[0] + ); + } + } + } +} + +// Return static page. +function find_page($static = null) +{ + $pages = get_static_pages(); + + $tmp = array(); + + if (!empty($pages)) { + + foreach ($pages as $index => $v) { + if (is_null($static)) { + + return get_pages($pages, 1, null); + + } elseif (stripos($v['basename'], $static . '.md') !== false) { + + // Use the get_posts method to return + // a properly parsed object + + $ar = get_pages($pages, $index + 1, 1); + $nx = get_pages($pages, $index, 1); + $pr = get_pages($pages, $index + 2, 1); + + if ($index == 0) { + if (isset($pr[0])) { + return array( + 'current' => $ar[0], + 'prev' => $pr[0] + ); + } else { + return array( + 'current' => $ar[0], + 'prev' => null + ); + } + } elseif (count($pages) == $index + 1) { + return array( + 'current' => $ar[0], + 'next' => $nx[0] + ); + } else { + return array( + 'current' => $ar[0], + 'next' => $nx[0], + 'prev' => $pr[0] + ); + } + } + } + } + + return $tmp; +} + +// Return static subpage. +function find_subpage($static, $sub_static = null) +{ + $sub_pages = array_values(get_static_subpages($static)); + + $tmp = array(); + + if (!empty($sub_pages)) { + + foreach ($sub_pages as $index => $v) { + + if (is_null($sub_static)) { + + return get_subpages($sub_pages, 1, null); + + } elseif (stripos($v['basename'], $sub_static . '.md') !== false) { + + // Use the get_posts method to return + // a properly parsed object + + $ar = get_subpages($sub_pages, $index + 1, 1); + $nx = get_subpages($sub_pages, $index, 1); + $pr = get_subpages($sub_pages, $index + 2, 1); + + if ($index == 0) { + if (isset($pr[0])) { + return array( + 'current' => $ar[0], + 'prev' => $pr[0] + ); + } else { + return array( + 'current' => $ar[0], + 'prev' => null + ); + } + } elseif (count($sub_pages) == $index + 1) { + return array( + 'current' => $ar[0], + 'next' => $nx[0] + ); + } else { + return array( + 'current' => $ar[0], + 'next' => $nx[0], + 'prev' => $pr[0] + ); + } + } + } + } + + return $tmp; +} + +// Return category page. +function get_category($category, $page, $perpage, $random = null) +{ + $posts = get_blog_posts(); + + if ($random === true) { + shuffle($posts); + } + + $tmp = array(); + + if (empty($perpage)) { + $perpage = 10; + } + + foreach ($posts as $index => $v) { + + // dirname string + $dirname = $v['dirname']; + + $str = explode('/', $dirname); + + if (strtolower($category) === strtolower($str[3])) { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return false; + } + + $tmp = array_unique($tmp, SORT_REGULAR); + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return category info. +function get_category_info($category = null) +{ + + $tmp = array(); + $cslug= get_category_slug(); + if (!empty($cslug)) { + asort($cslug); + if (is_null($category)) { + foreach ($cslug as $key => $c){ + $ctmp = read_category_info($c); + if (!empty($ctmp[0])) { + $tmp[] = $ctmp[0]; + } else { + $tmp[] = default_category($c); + } + } + } else { + foreach ($cslug as $key => $c){ + if ($c === $category) { + $ctmp = read_category_info($category); + if (!empty($ctmp[0])) { + $tmp[] = $ctmp[0]; + } else { + $tmp[] = default_category($category); + } + } + } + } + } else { + $tmp[] = default_category($category); + } + return $tmp; +} + +function read_category_info($category) +{ + $tmp = array(); + $cFiles = get_category_files(); + + if (!empty($cFiles)) { + foreach ($cFiles as $index => $v) { + if ($v['basename'] == $category . '.md' ) { + + $desc = new stdClass; + + // The filename + $filename = $v['dirname'] . '/' . $v['basename']; + + $url= $v['filename']; + + $desc->url = site_url() . 'category/' . $url; + + $desc->md = $v['basename']; + + $desc->slug = $url; + + $desc->count = get_categorycount($url); + + $desc->file = $filename; + + $desc->rss = $desc->url . '/feed'; + + // Get the contents and convert it to HTML + $content = file_get_contents($desc->file); + + // Extract the title and body + $desc->title = get_content_tag('t', $content, $category); + + // Get the contents and convert it to HTML + $desc->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + $desc->description = get_content_tag("d", $content, get_description($desc->body)); + + $toc = explode('', $desc->body); + if (isset($toc['1'])) { + $desc->body = insert_toc('taxonomy-' . $desc->slug, $toc['0'], $toc['1']); + } + + $tmp[] = $desc; + } + } + } + return $tmp; +} + +// Return default category +function default_category($category = null) +{ + $tmp = array(); + $desc = new stdClass; + + if (is_null($category) || $category == 'uncategorized') { + $desc->title = i18n("Uncategorized"); + $desc->url = site_url() . 'category/uncategorized'; + $desc->slug = 'uncategorized'; + $desc->body = '

      ' . i18n('Uncategorized_comment') . '

      '; + $desc->md = 'uncategorized.md'; + $desc->description = i18n('Uncategorized_comment'); + $desc->file = ''; + $desc->count = get_categorycount($desc->slug); + $desc->rss = $desc->url . '/feed'; + } else{ + $desc->title = $category; + $desc->url = site_url() . 'category/' . $category; + $desc->slug = $category; + $desc->body = '

      ' . i18n('All_blog_posts') . ': ' . $category . '

      '; + $desc->md = $category . '.md'; + $desc->description = i18n('All_blog_posts') . ': ' . $category; + $desc->file = ''; + $desc->count = get_categorycount($category); + $desc->rss = $desc->url . '/feed'; + } + + return $tmp[] = $desc; +} + +// Return category list +function category_list($custom = null) +{ + $dir = "cache/widget"; + $filename = "cache/widget/category.list.cache"; + $tmp = array(); + $cat = array(); + $list = array(); + $cList = ''; + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + if (file_exists($filename)) { + $cat = unserialize(file_get_contents($filename)); + } else { + $arr = get_category_info(null); + foreach ($arr as $i => $a) { + $cat[] = array($a->slug, $a->title, $a->count, $a->description); + } + + $tmp = serialize($cat); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + + if(!empty($custom)) { + return $cat; + } + + $cList .= '
        '; + + foreach ($cat as $k => $v) { + if ($v['2'] !== 0) { + $cList .= '
      • ' . $v['1'] . ' ('. $v['2'] .')
      • '; + } + } + + $cList .= '
      '; + return $cList; + +} + +// Return type page. +function get_type($type, $page, $perpage) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + if (empty($perpage)) { + $perpage = 10; + } + + foreach ($posts as $index => $v) { + + // dirname string + $dirname = $v['dirname']; + + if (strpos($dirname, '/' . strtolower($type)) !== false) { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return $tmp; + } + + $tmp = array_unique($tmp, SORT_REGULAR); + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return tag page. +function get_tag($tag, $page, $perpage, $random = null) +{ + $posts = get_blog_posts(); + + if ($random === true) { + shuffle($posts); + } + + $tmp = array(); + + foreach ($posts as $index => $v) { + $str = explode('_', $v['basename']); + $mtag = explode(',', rtrim($str[1], ',')); + $etag = explode(',', $tag); + foreach ($mtag as $t) { + foreach ($etag as $e) { + $e = trim($e); + if (strtolower($t) === strtolower($e)) { + $tmp[] = $v; + } + } + } + } + + if (empty($tmp)) { + return $tmp; + } + + $tmp = array_unique($tmp, SORT_REGULAR); + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return archive page. +function get_archive($req, $page, $perpage) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + $str = explode('_', $v['basename']); + if (strpos($str[0], "$req") !== false) { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return false; + } + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return posts list on profile. +function get_profile_posts($name, $page, $perpage) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + $str = explode('/', $v['dirname']); + if (strtolower($name) === strtolower($str[1])) { + $tmp[] = $v; + } + } + + if (empty($tmp)) { + return false; + } + + return $tmp = get_posts($tmp, $page, $perpage); +} + +// Return author info. +function get_author($name) +{ + $names = get_author_name(); + + $tmp = array(); + + if (!empty($names)) { + + foreach ($names as $index => $v) { + + $author = new stdClass; + + // dirname string + $dirname = $v['dirname']; + + // Author string + $str = explode('/', $dirname); + $profile = $str[1]; + + if ($name === $profile) { + // Profile URL + $filename = $v['dirname'] . '/' . $v['basename']; + + $author->file = $filename; + + $author->url = site_url() . 'author/' . $profile; + $author->slug = $profile; + + // Get the contents and convert it to HTML + $content = file_get_contents($author->file); + + // Extract the title and body + $author->name = get_content_tag('t', $content, $author); + + // Get the contents and convert it to HTML + $author->about = MarkdownExtra::defaultTransform(remove_html_comments($content)); + + $author->description = get_content_tag("d", $content, get_description($author->about)); + + $author->avatar = get_content_tag("image", $content, site_url() . 'system/resources/images/logo-small.png'); + + $author->rss = $author->url . '/feed'; + + $toc = explode('', $author->about); + if (isset($toc['1'])) { + $author->about = insert_toc('profile-' . $author->slug, $toc['0'], $toc['1']); + } + + $author->body = $author->about; + $author->title = $author->name; + + $tmp[] = $author; + } + } + } + + if (!empty($tmp)) { + return $tmp; + } else { + return false; + } +} + +// Return default profile +function default_profile($name) +{ + $tmp = array(); + $author = new stdClass; + + $author->name = $name; + $author->title = $name; + $author->about = '

      ' . i18n('Author_Description') . '

      '; + $author->body = '

      ' . i18n('Author_Description') . '

      '; + $author->description = i18n('Author_Description'); + $author->avatar = site_url() . 'system/resources/images/logo-small.png'; + $author->url = site_url(). 'author/' . $name; + $author->slug = $name; + $author->file = ''; + $author->rss = $author->url . '/feed'; + + return $tmp[] = $author; +} + +// Return frontpage content +function get_frontpage() +{ + $front = new stdClass; + + $filename = 'content/data/frontpage/frontpage.md'; + + if (file_exists($filename)) { + $content = file_get_contents($filename); + $front->file = $filename; + $front->title = get_content_tag('t', $content, 'Welcome'); + $front->url = site_url() . 'front'; + $front->slug = 'front'; + $front->parent = null; + $front->parentSlug = null; + // Get the contents and convert it to HTML + $front->body = MarkdownExtra::defaultTransform(remove_html_comments($content)); + $front->description = get_content_tag("d", $content, get_description($front->body)); + $word_count = str_word_count(strip_tags($front->body)); + $front->readTime = ceil($word_count / 200); + $front->views = null; + $toc = explode('', $front->body); + if (isset($toc['1'])) { + $front->body = insert_toc('page-front', $toc['0'], $toc['1']); + } + } else { + $front->title = 'Welcome'; + $front->url = site_url() . 'front'; + $front->body = 'Welcome to our website.'; + $front->file = null; + $front->slug = 'front'; + $front->parent = null; + $front->parentSlug = null; + $front->description = $front->body; + $word_count = str_word_count(strip_tags($front->body)); + $front->readTime = ceil($word_count / 200); + $front->views = null; + } + + return $front; +} + +// Return search page. +function get_keyword($keyword, $page, $perpage) +{ + if (strlen($keyword) >= 3) { // three-character minimum + + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + $filepath = $v['dirname'] . '/' . $v['basename']; + + $findRxWhole = '\b' . preg_quote($keyword, '~') . '\b'; // whole-words only + + $findRx = "~{$findRxWhole}~iu"; // Case-insensitive and UTF-8 mode + + $lines = file($filepath); + + foreach ($lines as $line) { + if (preg_match ($findRx, $line)) { + if (!in_array($v, $tmp)) { + $tmp[] = $v; + } + } + } + } + + if (empty($tmp)) { + return false; + } + + return $tmp = get_posts($tmp, $page, $perpage); + + } +} + +// Get related posts base on post category. +function get_related($tag, $custom = null, $count = null) +{ + if (empty($count)) { + $count = config('related.count'); + if (empty($count)) { + $count = 3; + } + } + + $tmp = array(); + $exp = explode(',', $tag); + $posts = get_category($exp[0], 1, $count + 1, true); + $related = ''; + + foreach ($posts as $post) { + if ($post->url !== $exp[1]) { + $tmp[] = $post; + } + } + + if (empty($custom)) { + if (!empty($tmp)) { + $i = 1; + $related .= '
        '; + foreach ($tmp as $post) { + $related .= '
      • ' . $post->title . '
      • '; + if ($i++ >= $count) + break; + } + $related .= '
      '; + return $related; + } else { + $related .= '
      • ' . i18n('No_related_post_found') . '
      '; + return $related; + } + + } else { + return $tmp; + } + +} + +// Return post count. Matching $var and $str provided. +function get_count($var, $str) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + if ($str === 'basename') { + $arr = explode('_', $v[$str]); + $url = $arr[0]; + if (stripos($url, "$var") !== false) { + $tmp[] = $v; + } + } else { + if (stripos($v[$str], $var) !== false) { + $tmp[] = $v; + } + } + } + + return count($tmp); +} + +// Return category count. Matching $var +function get_categorycount($var) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + if (stripos($v['dirname'], '/' . $var . '/') !== false) { + $tmp[] = $v; + } + + } + + return count($tmp); +} + +// Return type count. Matching $var +function get_typecount($var) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + if (stripos($v['dirname'], '/' . $var) !== false) { + $tmp[] = $v; + } + + } + + return count($tmp); +} + + +// Return draft count. Matching $var +function get_draftcount($var) +{ + $posts = get_draft_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + if (stripos($v['dirname'], '/' . $var . '/') !== false) { + $tmp[] = $v; + } + + } + return count($tmp); +} + +// Return scheduled post count. Matching $var +function get_scheduledcount($var) +{ + $posts = get_scheduled_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + if (stripos($v['dirname'], '/' . $var . '/') !== false) { + $tmp[] = $v; + } + + } + + return count($tmp); + +} + +// Return tag count. Matching $var +function get_tagcount($var) +{ + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + $arr = explode('_', $v['basename']); + $mtag = explode(',', rtrim($arr[1], ',')); + foreach ($mtag as $t) { + if (strtolower($t) === strtolower($var)) { + $tmp[] = $v; + } + } + } + + return count($tmp); +} + +// Return search result count +function keyword_count($keyword) +{ + if (strlen($keyword) >= 3) { // three-character minimum + + $posts = get_blog_posts(); + + $tmp = array(); + + foreach ($posts as $index => $v) { + + $filepath = $v['dirname'] . '/' . $v['basename']; + + $findRxWhole = '\b' . preg_quote($keyword, '~') . '\b'; // whole-words only + + $findRx = "~{$findRxWhole}~iu"; // Case-insensitive and UTF-8 mode + + $lines = file($filepath); + + foreach ($lines as $line) { + if (preg_match ($findRx, $line)) { + if (!in_array($v, $tmp)) { + $tmp[] = $v; + } + } + } + } + + $tmp = array_unique($tmp, SORT_REGULAR); + return count($tmp); + } +} + +// Return recent posts lists +function recent_posts($custom = null, $count = null) +{ + if (empty($count)) { + $count = config('recent.count'); + if (empty($count)) { + $count = 5; + } + } + + $dir = "cache/widget"; + $filename = "cache/widget/recent.cache"; + $tmp = array(); + $posts = array(); + $recent = ''; + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + if (file_exists($filename)) { + $posts = unserialize(file_get_contents($filename)); + if (count($posts) < $count) { + $posts = get_posts(null, 1, $count); + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + } else { + $posts = get_posts(null, 1, $count); + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + + if (!empty($custom)) { + $arr = array(); + $i = 1; + foreach ($posts as $post) { + $arr[] = $post; + if ($i++ >= $count) + break; + } + return $arr; + } else { + $i = 1; + $recent .= '
        '; + foreach ($posts as $post) { + $recent .= '
      • ' . $post->title . '
      • '; + if ($i++ >= $count) + break; + } + if (empty($posts)) { + $recent .= '
      • ' . i18n('No_posts_found') . '
      • '; + } + $recent .= '
      '; + return $recent; + } +} + +// Return recent type lists +function recent_type($type, $count = null, $custom = null) +{ + if (empty($count)) { + $count = config('recent.count'); + if (empty($count)) { + $count = 5; + } + } + + $dir = 'cache/widget'; + $filename = 'cache/widget/recent.' . $type . '.cache'; + $tmp = array(); + $posts = array(); + $recent = ''; + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + if (file_exists($filename)) { + $posts = unserialize(file_get_contents($filename)); + if (count($posts) < $count) { + $posts = get_type($type, 1, $count); + if (!empty($posts)) { + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + } + } else { + $posts = get_type($type, 1, $count); + if (!empty($posts)) { + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + } + + if (!empty($custom)) { + $arr = array(); + $i = 1; + foreach ($posts as $post) { + $arr[] = $post; + if ($i++ >= $count) + break; + } + return $arr; + } else { + $i = 1; + $recent .= '
        '; + foreach ($posts as $post) { + $recent .= '
      • ' . $post->title . '
      • '; + if ($i++ >= $count) + break; + } + if (empty($posts)) { + $recent .= '
      • No recent ' . $type . ' found
      • '; + } + $recent .= '
      '; + return $recent; + } +} + +// Return recent tag posts list +function recent_tag($tag, $count = null, $custom = null) +{ + if (empty($count)) { + $count = config('recent.count'); + if (empty($count)) { + $count = 5; + } + } + + $dir = 'cache/widget'; + $filename = 'cache/widget/recent.tag.' . $tag . '.cache'; + $tmp = array(); + $posts = array(); + $recent = ''; + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + if (file_exists($filename)) { + $posts = unserialize(file_get_contents($filename)); + if (count($posts) < $count) { + $posts = get_tag($tag, 1, $count); + if (!empty($posts)) { + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + } + } else { + $posts = get_tag($tag, 1, $count); + if (!empty($posts)) { + $tmp = serialize($posts); + file_put_contents($filename, print_r($tmp, true), LOCK_EX); + } + } + + if (!empty($custom)) { + $arr = array(); + $i = 1; + foreach ($posts as $post) { + $arr[] = $post; + if ($i++ >= $count) + break; + } + return $arr; + } else { + $i = 1; + $recent .= '
        '; + foreach ($posts as $post) { + $recent .= '
      • ' . $post->title . '
      • '; + if ($i++ >= $count) + break; + } + if (empty($posts)) { + $recent .= '
      • No recent ' . $tag . ' found
      • '; + } + $recent .= '
      '; + return $recent; + } +} + +// Return popular posts lists +function popular_posts($custom = null, $count = null) +{ + static $_views = array(); + $tmp = array(); + $posts_list = get_blog_posts(); + $pop = ''; + + if (empty($count)) { + $count = config('popular.count'); + if (empty($count)) { + $count = 5; + } + } + + if (config('views.counter') == 'true') { + if (empty($_views)) { + $filename = 'content/data/views.json'; + if (file_exists($filename)) { + $_views = json_decode(file_get_contents($filename), true); + if(is_array($_views)) { + arsort($_views); + $i = 1; + foreach ($_views as $key => $val) { + $arr = explode('post_', $key); + if (isset($arr[1])) { + foreach($posts_list as $in => $f) { + if (strpos($f['basename'], $arr[1] . '.md') !== false ) { + $tmp[] = $f; + if ($i++ >= $count) + break; + } + } + } + + } + + $dir = "cache/widget"; + $filecache = "cache/widget/popular.cache"; + $ar = array(); + $posts = array(); + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + if (file_exists($filecache)) { + $posts = unserialize(file_get_contents($filecache)); + if (count($posts) < $count) { + $posts = get_posts($tmp, 1, $count); + $ar = serialize($posts); + file_put_contents($filecache, print_r($ar, true), LOCK_EX); + } + } else { + $posts = get_posts($tmp, 1, $count); + $ar = serialize($posts); + file_put_contents($filecache, print_r($ar, true), LOCK_EX); + } + + if (empty($custom)) { + $ix = 1; + $pop .= '
        '; + foreach ($posts as $post) { + $pop .= '
      • ' . $post->title . '
      • '; + if ($ix++ >= $count) + break; + } + $pop .= '
      '; + return $pop; + } else { + $arp = array(); + $ix = 1; + foreach ($posts as $post) { + $arp[] = $post; + if ($ix++ >= $count) + break; + } + return $arp; + } + } else { + if(empty($custom)) { + $pop .= '
      • No popular posts found
      '; + return $pop; + } else { + return $tmp; + } + } + } else { + if (empty($custom)) { + $pop .= '
      • No popular posts found
      '; + return $pop; + } else { + return $tmp; + } + } + } + } else { + if (empty($custom)) { + $pop .= '
      • No popular posts found
      '; + return $pop; + } else { + return $tmp; + } + } +} + +// Return an archive list, categorized by year and month. +function archive_list($custom = null) +{ + $dir = "cache/widget"; + $filename = "cache/widget/archive.cache"; + $ar = array(); + $arch = ''; + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + $posts = get_blog_posts(); + $by_year = array(); + $col = array(); + + if (!empty($posts)) { + + if (!file_exists($filename)) { + foreach ($posts as $index => $v) { + + $arr = explode('_', $v['filename']); + + $date = $arr[0]; + $data = explode('-', $date); + $col[] = $data; + } + + foreach ($col as $row) { + + $y = $row['0']; + $m = $row['1']; + $by_year[$y][] = $m; + } + + $ar = serialize($by_year); + file_put_contents($filename, print_r($ar, true), LOCK_EX); + + } else { + $by_year = unserialize(file_get_contents($filename)); + } + + # Most recent year first + krsort($by_year); + + # Iterate for display + $i = 0; + $len = count($by_year); + + if (empty($custom)) { + $cache_d = "cache/widget/archive.default.cache"; + if (file_exists($cache_d)) { + $arch = unserialize(file_get_contents($cache_d)); + return $arch; + } else { + foreach ($by_year as $year => $months) { + if ($i == 0) { + $class = 'expanded'; + $arrow = '▼'; + } else { + $class = 'collapsed'; + $arrow = '►'; + } + $i++; + + $by_month = array_count_values($months); + # Sort the months + krsort($by_month); + + $script = << -1){this.parentNode.className = 'collapsed';this.innerHTML = '►';} else {this.parentNode.className = 'expanded';this.innerHTML = '▼';} +EOF; + $arch .= '
        '; + $arch .= '
      • '; + $arch .= '' . $arrow . ' '; + $arch .= '' . $year . ' '; + $arch .= '(' . count($months) . ')'; + $arch .= '
          '; + + foreach ($by_month as $month => $count) { + $name = format_date(mktime(0, 0, 0, $month, 1, 2010), 'F'); + $arch .= '
        • ' . $name . ''; + $arch .= ' (' . $count . ')
        • '; + } + + $arch .= '
        '; + $arch .= '
      • '; + $arch .= '
      '; + } + + $ar = serialize($arch); + file_put_contents($cache_d, $ar, LOCK_EX); + return $arch; + } + } elseif ($custom === 'month-year') { + $cache_my = "cache/widget/archive.month-year.cache"; + if (file_exists($cache_my)) { + $arch = unserialize(file_get_contents($cache_my)); + return $arch; + } else { + foreach ($by_year as $year => $months) { + $by_month = array_count_values($months); + # Sort the months + krsort($by_month); + foreach ($by_month as $month => $count) { + $name = format_date(mktime(0, 0, 0, $month, 1, 2010), 'F'); + $arch .= '
    129. ' . $name . ' ' . $year .' ('.$count.')
    130. '; + } + } + $ar = serialize($arch); + file_put_contents($cache_my, $ar, LOCK_EX); + return $arch; + } + } elseif ($custom === 'year') { + $cache_y = "cache/widget/archive.year.cache"; + if (file_exists($cache_y)) { + $arch = unserialize(file_get_contents($cache_y)); + return $arch; + } else { + foreach ($by_year as $year => $months) { + $by_month = array_count_values($months); + # Sort the months + krsort($by_month); + $arch .= '
    131. ' . $year .' ('. count($months) .')
    132. '; + } + $ar = serialize($arch); + file_put_contents($cache_y, $ar, LOCK_EX); + return $arch; + } + } else { + return $by_year; + } + } +} + +// Return tag cloud. +function tag_cloud($custom = null) +{ + $dir = "cache/widget"; + $filename = "cache/widget/tags.cache"; + $tg = array(); + + if (!is_dir($dir)) { + mkdir($dir, 0775, true); + } + + $posts = get_blog_posts(); + $tags = array(); + + $tagcloud_count = config('tagcloud.count'); + if(empty($tagcloud_count)) { + $tagcloud_count = 40; + } + + if (!empty($posts)) { + + if (!file_exists($filename)) { + foreach ($posts as $index => $v) { + $arr = explode('_', $v['filename']); + $data = rtrim($arr[1], ','); + $mtag = explode(',', $data); + foreach ($mtag as $etag) { + $tags[] = strtolower($etag); + } + } + $tag_collection = array_count_values($tags); + ksort($tag_collection); + $tg = serialize($tag_collection); + file_put_contents($filename, print_r($tg, true), LOCK_EX); + } else { + $tag_collection = unserialize(file_get_contents($filename)); + } + + if(empty($custom)) { + $wrapper = ''; + $cache_t = "cache/widget/tags.default.cache"; + if (file_exists($cache_t)) { + $wrapper = unserialize(file_get_contents($cache_t)); + return $wrapper; + } else { + // Font sizes + $max_size = 22; // max font size in % + $min_size = 8; // min font size in % + + // Get the largest and smallest array values + $max_qty = max(array_values($tag_collection)); + $min_qty = min(array_values($tag_collection)); + + // Find the range of values + $spread = $max_qty - $min_qty; + if (0 == $spread) { // we don't want to divide by zero + $spread = 1; + } + + // Font-size increment + // this is the increase per tag quantity (times used) + $step = ($max_size - $min_size)/($spread); + + arsort($tag_collection); + $sliced_tags = array_slice($tag_collection, 0, $tagcloud_count, true); + ksort($sliced_tags); + foreach ($sliced_tags as $tag => $count) { + $size = $min_size + (($count - $min_qty) * $step); + $wrapper .= ' '.tag_i18n($tag).' '; + } + $ar = serialize($wrapper); + file_put_contents($cache_t, $ar, LOCK_EX); + return $wrapper; + } + + } else { + return $tag_collection; + } + } else { + if(empty($custom)) return; + return $tags; + } +} + +// Helper function to determine whether +// to show the previous buttons +function has_prev($prev) +{ + if (!empty($prev)) { + return array( + 'url' => $prev->url, + 'title' => $prev->title, + 'date' => $prev->date, + 'body' => $prev->body, + 'description' => $prev->description, + 'tag' => $prev->tag, + 'author' => $prev->author, + 'authorName' => $prev->authorName, + 'authorDescription' => $prev->authorDescription, + 'authorAbout' => $prev->authorAbout, + 'authorUrl' => $prev->authorUrl, + 'authorAvatar' => $prev->authorAvatar, + 'authorRss' => $prev->authorRss, + 'related' => $prev->related, + 'views' => $prev->views, + 'type' => $prev->type, + 'file' => $prev->file, + 'image' => $prev->image, + 'video' => $prev->video, + 'audio' => $prev->audio, + 'quote' => $prev->quote, + 'link' => $prev->link, + 'slug' => $prev->slug, + 'category' => $prev->category, + 'categoryUrl' => $prev->categoryUrl, + 'categoryCount' => $prev->categoryCount, + 'categorySlug' => $prev->categorySlug, + 'categoryMd' => $prev->categoryMd, + 'categoryTitle' => $prev->categoryTitle, + 'readTime' => $prev->readTime, + 'lastMod' => $prev->lastMod + ); + } +} + +// Helper function to determine whether +// to show the next buttons +function has_next($next) +{ + if (!empty($next)) { + return array( + 'url' => $next->url, + 'title' => $next->title, + 'date' => $next->date, + 'body' => $next->body, + 'description' => $next->description, + 'tag' => $next->tag, + 'author' => $next->author, + 'authorName' => $next->authorName, + 'authorDescription' => $next->authorDescription, + 'authorAbout' => $next->authorAbout, + 'authorUrl' => $next->authorUrl, + 'authorAvatar' => $next->authorAvatar, + 'authorRss' => $next->authorRss, + 'related' => $next->related, + 'views' => $next->views, + 'type' => $next->type, + 'file' => $next->file, + 'image' => $next->image, + 'video' => $next->video, + 'audio' => $next->audio, + 'quote' => $next->quote, + 'link' => $next->link, + 'slug' => $next->slug, + 'category' => $next->category, + 'categoryUrl' => $next->categoryUrl, + 'categoryCount' => $next->categoryCount, + 'categorySlug' => $next->categorySlug, + 'categoryMd' => $next->categoryMd, + 'categoryTitle' => $next->categoryTitle, + 'readTime' => $next->readTime, + 'lastMod' => $next->lastMod + ); + } +} + +function static_prev($prev) +{ + if (!empty($prev)) { + return array( + 'url' => $prev->url, + 'title' => $prev->title, + 'body' => $prev->body, + 'description' => $prev->description, + 'views' => $prev->views, + 'md' => $prev->md, + 'slug' => $prev->slug, + 'parent' => $prev->parent, + 'parentSlug' => $prev->parentSlug, + 'file' => $prev->file, + 'readTime' => $prev->readTime, + 'lastMod' => $prev->lastMod + ); + } +} + +function static_next($next) +{ + if (!empty($next)) { + return array( + 'url' => $next->url, + 'title' => $next->title, + 'body' => $next->body, + 'description' => $next->description, + 'views' => $next->views, + 'md' => $next->md, + 'slug' => $next->slug, + 'parent' => $next->parent, + 'parentSlug' => $next->parentSlug, + 'file' => $next->file, + 'readTime' => $next->readTime, + 'lastMod' => $next->lastMod + ); + } +} + +// Helper function to determine whether +// to show the pagination buttons +function has_pagination($total, $perpage, $page = 1) +{ + if (!$total) { + $total = count(get_blog_posts()); + } + $totalPage = ceil($total / $perpage); + $number = i18n('Page') . ' ' . $page . ' ' . i18n('of') . ' ' . $totalPage; + $pager = get_pagination($total, $page, $perpage, 2); + return array( + 'prev' => $page > 1, + 'next' => $total > $page * $perpage, + 'pagenum' => $number, + 'html' => $pager, + 'items' => $total, + 'perpage' => $perpage + ); +} + +//function to return the pagination string +function get_pagination($totalitems, $page = 1, $perpage = 10, $adjacents = 1, $pagestring = '?page=') +{ + //defaults + if(!$adjacents) $adjacents = 1; + if(!$perpage) $perpage = 10; + if(!$page) $page = 1; + + //other vars + $prev = $page - 1; //previous page is page - 1 + $next = $page + 1; //next page is page + 1 + $lastpage = ceil($totalitems / $perpage); //lastpage is = total items / items per page, rounded up. + $lpm1 = $lastpage - 1; //last page minus 1 + + /* + Now we apply our rules and draw the pagination object. + We're actually saving the code to a variable in case we want to draw it more than once. + */ + $pagination = ''; + $curpage = strtok($_SERVER["REQUEST_URI"], '?'); + + if($lastpage > 1) + { + $pagination .= '
        '; + + //newer button + if ($page > 2) + $pagination .= '
      • « '. i18n('Newer') .'
      • '; + else if ($page == 2) + $pagination .= '
      • « '. i18n('Newer') .'
      • '; + else + $pagination .= '
      • « '. i18n('Newer') . '
      • '; + + //pages + if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up + { + for ($counter = 1; $counter <= $lastpage; $counter++) + { + if ($counter == 1 && $counter !== $page) // link 1st pagination page to parent page instead of ?page=1 for SEO + $pagination .= '
      • 1
      • '; + else if ($counter == $page) + $pagination .= '
      • '. $counter.'
      • '; + else + $pagination .= '
      • '. $counter .'
      • '; + } + } + elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some + { + //close to beginning; only hide later pages + if($page < 1 + ($adjacents * 3)) + { + for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) + { + if ($counter == 1) // link 1st pagination page to parent page instead of ?page=1 for SEO + $pagination .= '
      • 1
      • '; + else if ($counter == $page) + $pagination .= '
      • '. $counter .'
      • '; + else + $pagination .= '
      • '. $counter .'
      • '; + } + $pagination .= '
      • ...
      • '; + $pagination .= '
      • '. $lpm1 .'
      • '; + $pagination .= '
      • '. $lastpage .'
      • '; + } + //in middle; hide some front and some back + elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) + { + $pagination .= '
      • 1
      • '; + $pagination .= '
      • 2
      • '; + $pagination .= '
      • ...
      • '; + for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) + { + if ($counter == $page) + $pagination .= '
      • '. $counter .'
      • '; + else + $pagination .= '
      • '. $counter .'
      • '; + } + $pagination .= '
      • ...
      • '; + $pagination .= '
      • '. $lpm1 .'
      • '; + $pagination .= '
      • '. $lastpage .'
      • '; + } + //close to end; only hide early pages + else + { + $pagination .= '
      • 1
      • '; + $pagination .= '
      • 2
      • '; + $pagination .= '
      • ...
      • '; + for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++) + { + if ($counter == $page) + $pagination .= '
      • '. $counter .'
      • '; + else + $pagination .= '
      • '. $counter .'
      • '; + } + } + } + + //older button + if ($page < $counter - 1) + $pagination .= '
      • '. i18n('Older') .' »
      • '; + else + $pagination .= '
      • '. i18n('Older') .' »
      • '; + $pagination .= '
      '; + } + + return $pagination; + +} + +// Get the meta description +function get_description($string, $char = null) +{ + if(empty($char)) { + $char = config('description.char'); + if(empty($char)) { + $char = 150; + } + } + if (strlen(strip_tags($string)) < $char) { + return safe_html(strip_tags($string)); + } else { + $string = safe_html(strip_tags($string)); + $string = substr($string, 0, $char); + $string = substr($string, 0, strrpos($string, ' ')); + return $string; + } + +} + +// Get the teaser +function get_teaser($string, $url = null, $char = null) +{ + $teaserType = config('teaser.type'); + $more = config('read.more'); + $behave = config('teaser.behave'); + + if(empty($more)) { + $more = 'Read more'; + } + + if(empty($char)) { + $char = config('teaser.char'); + if(empty($char)) { + $char = 200; + } + } + + if ($teaserType === 'full') { + $readMore = explode('', $string); + if (isset($readMore['1'])) { + $string = replace_href($readMore['0'], 'a', 'footnote-ref', $url); + return $string . ''; + } else { + return $string; + } + } else { + if ($behave === 'check') { + $readMore = explode('', $string); + if (isset($readMore['1'])) { + $string = shorten($readMore[0]); + return $string; + } else { + $string = shorten($string, $char); + return $string; + } + } else { + $string = shorten($string, $char); + return $string; + } + } +} + +// Shorten the string +function shorten($string = null, $char = null) +{ + if(empty($string)) { + return; + } + $string = str_replace(''. config('toc.label') .'', '', $string); + libxml_use_internal_errors(true); + $dom = new DOMDocument(); + $dom->loadHTML('' . $string); + $tags_to_remove = array('script', 'style'); + foreach($tags_to_remove as $tag){ + $element = $dom->getElementsByTagName($tag); + foreach($element as $item){ + $item->parentNode->removeChild($item); + } + } + $string = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', mb_convert_encoding($dom->saveHTML($dom->documentElement), 'UTF-8')); + $string = preg_replace('/\s\s+/', ' ', strip_tags($string)); + $string = ltrim(rtrim($string)); + $string = str_replace('', '', $string); + if (!empty($char)) { + if (strlen($string) > $char) { + $string = substr($string, 0, $char); + $string = substr($string, 0, strrpos($string, ' ')); + } + } + return $string; + +} + +// Get thumbnail from image and Youtube. +function get_thumbnail($text, $url = null) +{ + if (config('img.thumbnail') == 'true') { + + $teaserType = config('teaser.type'); + + if (strlen(strip_tags($text)) > config('teaser.char') && $teaserType === 'trimmed') { + + libxml_use_internal_errors(true); + $default = config('default.thumbnail'); + $dom = new DOMDocument(); + $dom->loadHtml('' . $text); + $imgTags = $dom->getElementsByTagName('img'); + $vidTags = $dom->getElementsByTagName('iframe'); + if ($imgTags->length > 0) { + $imgElement = $imgTags->item(0); + $imgSource = $imgElement->getAttribute('src'); + if (!empty($url)) { + return $imgSource; + } else { + return '
      '; + } + } elseif ($vidTags->length > 0) { + $vidElement = $vidTags->item(0); + $vidSource = $vidElement->getAttribute('src'); + $fetch = explode("embed/", $vidSource); + if (isset($fetch[1])) { + $vidThumb = '//img.youtube.com/vi/' . $fetch[1] . '/default.jpg'; + if (!empty($url)) { + return $vidThumb; + } else { + return '
      '; + } + } + } else { + if (!empty($default)) { + if (!empty($url)) { + return $default; + } else { + return '
      '; + } + } + } + } else { + // Ignore + } + } +} + +// Get image from post and Youtube thumbnail. +function get_image($text, $width = null, $height = null) +{ + libxml_use_internal_errors(true); + $dom = new DOMDocument(); + $dom->loadHtml('' . $text); + $imgTags = $dom->getElementsByTagName('img'); + $vidTags = $dom->getElementsByTagName('iframe'); + if ($imgTags->length > 0) { + $imgElement = $imgTags->item(0); + $imgSource = $imgElement->getAttribute('src'); + if(is_null($width)) { + return $imgSource; + } else { + return create_thumb($imgSource, $width, $height); + } + } elseif ($vidTags->length > 0) { + $vidElement = $vidTags->item(0); + $vidSource = $vidElement->getAttribute('src'); + $fetch = explode("embed/", $vidSource); + if (isset($fetch[1])) { + $vidThumb = '//img.youtube.com/vi/' . $fetch[1] . '/sddefault.jpg'; + return $vidThumb; + } + } else{ + return false; + } +} + +// Return edit tab on post +function tab($p) +{ + $user = $_SESSION[site_url()]['user']; + $role = user('role', $user); + $tab = ''; + if (isset($p->author)) { + if ($user === $p->author || $role === 'editor' || $role === 'admin') { + $tab = ''; + } + } else { + if ($p->url) { + if ($role === 'editor' || $role === 'admin') { + $tab = ''; + } + } + } + return $tab; +} + +// Social links +function social($class = null) +{ + $bluesky = config('social.bluesky'); + $twitter = config('social.twitter'); + $facebook = config('social.facebook'); + $instagram = config('social.instagram'); + $linkedin = config('social.linkedin'); + $github = config('social.github'); + $youtube = config('social.youtube'); + $mastodon = config('social.mastodon'); + $tiktok = config('social.tiktok'); + $rss = site_url() . 'feed/rss'; + $social = ''; + + $social .= ''; + return $social; +} + +// Copyright +function copyright() +{ + $blogcp = blog_copyright(); + $credit = 'Powered by HTMLy'; + + if (!empty($blogcp)) { + return $copyright = '' . $blogcp . ' ' . $credit . ''; + } else { + return $credit = '' . $credit . ''; + } +} + +// Disqus on post. +function disqus($title = null, $url = null) +{ + $comment = config('comment.system'); + $disqus = config('disqus.shortname'); + $script = << + var getAbsolutePath = function(href) { + var link = document.createElement('a'); + link.href = href; + return link.href; + }; + var disqus_shortname = '{$disqus}'; + var disqus_title = '{$title}'; + var disqus_url = getAbsolutePath('{$url}'); + (function () { + var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; + dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); + })(); + +EOF; + if (!empty($disqus) && $comment == 'disqus') { + return $script; + } +} + +// Disqus comment count on teaser +function disqus_count() +{ + $comment = config('comment.system'); + $disqus = config('disqus.shortname'); + $script = << + var disqus_shortname = '{$disqus}'; + (function () { + var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; + dsq.src = '//' + disqus_shortname + '.disqus.com/count.js'; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); + })(); + +EOF; + if (!empty($disqus) && $comment == 'disqus') { + return $script; + } +} + +// Disqus recent comments +function recent_comments() +{ + $comment = config('comment.system'); + $disqus = config('disqus.shortname'); + $script = << +EOF; + if (!empty($disqus) && $comment == 'disqus') { + return $script; + } +} + +// Facebook comments +function facebook() +{ + $comment = config('comment.system'); + $appid = config('fb.appid'); + $lang = locale_language(); + $script = << + + +EOF; + + if (!empty($appid) && $comment == 'facebook') { + return $script; + } +} + +// Google Publisher (Google+ page). +function publisher() +{ + $publisher = config('google.publisher'); + if (!empty($publisher)) { + return $publisher; + } +} + +// Google Analytics +function analytics() +{ + $analytics = config('google.analytics.id'); + $gtag = config('google.gtag.id'); + $script = << + (function (i,s,o,g,r,a,m) {i['GoogleAnalyticsObject']=r;i[r]=i[r]||function () { + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{$analytics}', 'auto'); + ga('send', 'pageview'); + +EOF; + $gtagScript = << + + +EOF; + if (!empty($gtag)) { + return $gtagScript; + } elseif (!empty($analytics)) { + return $script; + } +} + +function slashUrl($url) +{ + return rtrim($url, '/') . '/'; +} + +function parseNodes($nodes, $child = null, $class = null) +{ + if (empty($child)) { + $ul = ''; + return $ul; + } else { + $ul = ''; + return $ul; + } +} + +function parseNode($node, $child = null) +{ + $req = strtok($_SERVER["REQUEST_URI"],'?'); + $url = parse_url(slashUrl($node->slug)); + $su = parse_url(site_url()); + if (empty($child)) { + + if (isset($url['host']) && isset($su['host'])) { + if ($url['host'] == $su['host']) { + if (slashUrl($url['path']) == slashUrl($req)) { + $li = ''; + return $li; + } else { + + if (isset($url['host']) && isset($su['host'])) { + if ($url['host'] == $su['host']) { + if (slashUrl($url['path']) == slashUrl($req)) { + $li = ''; + return $li; + } +} + +// Menu +function menu($class = null) +{ + $filename = "content/data/menu.json"; + if (file_exists($filename)) { + $json = json_decode(file_get_contents('content/data/menu.json', true)); + $nodes = json_decode($json); + if (empty($nodes)) { + return get_menu($class); + } else { + $html = parseNodes($nodes, null, $class); + $output = ''; + libxml_use_internal_errors(true); + $doc = new DOMDocument(); + $doc->loadHTML('' . $html); + + $finder = new DOMXPath($doc); + $elements = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' dropdown-menu ')]"); + + // loop through all