Full Code of dignajar/bludit for AI

master 9cf5ebd0819d cached
672 files
3.4 MB
934.6k tokens
1508 symbols
1 requests
Download .txt
Showing preview only (3,896K chars total). Download the full file or copy to clipboard to get everything.
Repository: dignajar/bludit
Branch: master
Commit: 9cf5ebd0819d
Files: 672
Total size: 3.4 MB

Directory structure:
gitextract_3ux4dkd8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── config.yml
│   └── workflows/
│       └── close_inactive_issues.yml
├── .gitignore
├── .htaccess
├── .prettierrc
├── LICENSE
├── README.ar.md
├── README.de.md
├── README.es.md
├── README.fr.md
├── README.hi.md
├── README.it.md
├── README.ja.md
├── README.md
├── README.pt.md
├── README.ru.md
├── README.zh.md
├── bl-content/
│   └── .keep
├── bl-kernel/
│   ├── abstract/
│   │   ├── dbjson.class.php
│   │   ├── dblist.class.php
│   │   └── plugin.class.php
│   ├── admin/
│   │   ├── controllers/
│   │   │   ├── about.php
│   │   │   ├── api.php
│   │   │   ├── categories.php
│   │   │   ├── configure-plugin.php
│   │   │   ├── content.php
│   │   │   ├── dashboard.php
│   │   │   ├── developers.php
│   │   │   ├── edit-category.php
│   │   │   ├── edit-content.php
│   │   │   ├── edit-user.php
│   │   │   ├── install-plugin.php
│   │   │   ├── install-theme.php
│   │   │   ├── login.php
│   │   │   ├── logout.php
│   │   │   ├── new-category.php
│   │   │   ├── new-content.php
│   │   │   ├── new-user.php
│   │   │   ├── plugins-position.php
│   │   │   ├── plugins.php
│   │   │   ├── settings.php
│   │   │   ├── themes.php
│   │   │   ├── uninstall-plugin.php
│   │   │   ├── user-password.php
│   │   │   └── users.php
│   │   ├── themes/
│   │   │   └── booty/
│   │   │       ├── css/
│   │   │       │   ├── bludit.bootstrap.css
│   │   │       │   └── bludit.css
│   │   │       ├── html/
│   │   │       │   ├── alert.php
│   │   │       │   ├── media.php
│   │   │       │   ├── navbar.php
│   │   │       │   └── sidebar.php
│   │   │       ├── index.php
│   │   │       ├── init.php
│   │   │       └── login.php
│   │   └── views/
│   │       ├── about.php
│   │       ├── blocks.php
│   │       ├── categories.php
│   │       ├── configure-plugin.php
│   │       ├── content.php
│   │       ├── dashboard.php
│   │       ├── developers.php
│   │       ├── edit-category.php
│   │       ├── edit-content.php
│   │       ├── edit-user.php
│   │       ├── login.php
│   │       ├── new-category.php
│   │       ├── new-content.php
│   │       ├── new-user.php
│   │       ├── plugins-position.php
│   │       ├── plugins.php
│   │       ├── settings.php
│   │       ├── themes.php
│   │       ├── user-password.php
│   │       └── users.php
│   ├── ajax/
│   │   ├── change-type.php
│   │   ├── clippy.php
│   │   ├── content-get-list.php
│   │   ├── delete-image.php
│   │   ├── generate-slug.php
│   │   ├── get-published.php
│   │   ├── list-images.php
│   │   ├── logo-remove.php
│   │   ├── logo-upload.php
│   │   ├── profile-picture-upload.php
│   │   ├── save-as-draft.php
│   │   └── upload-images.php
│   ├── boot/
│   │   ├── admin.php
│   │   ├── init.php
│   │   ├── rules/
│   │   │   ├── 60.plugins.php
│   │   │   ├── 60.router.php
│   │   │   ├── 69.pages.php
│   │   │   ├── 99.header.php
│   │   │   ├── 99.paginator.php
│   │   │   ├── 99.security.php
│   │   │   └── 99.themes.php
│   │   ├── site.php
│   │   └── variables.php
│   ├── categories.class.php
│   ├── category.class.php
│   ├── css/
│   │   └── bootstrap-icons/
│   │       ├── bootstrap-icons.css
│   │       └── bootstrap-icons.json
│   ├── functions.php
│   ├── helpers/
│   │   ├── alert.class.php
│   │   ├── cookie.class.php
│   │   ├── date.class.php
│   │   ├── dom.class.php
│   │   ├── email.class.php
│   │   ├── filesystem.class.php
│   │   ├── image.class.php
│   │   ├── log.class.php
│   │   ├── paginator.class.php
│   │   ├── redirect.class.php
│   │   ├── sanitize.class.php
│   │   ├── session.class.php
│   │   ├── tcp.class.php
│   │   ├── text.class.php
│   │   ├── theme.class.php
│   │   └── valid.class.php
│   ├── js/
│   │   ├── bludit-ajax.php
│   │   ├── functions.js
│   │   └── variables.php
│   ├── language.class.php
│   ├── login.class.php
│   ├── pages.class.php
│   ├── pagex.class.php
│   ├── parsedown.class.php
│   ├── security.class.php
│   ├── site.class.php
│   ├── syslog.class.php
│   ├── tag.class.php
│   ├── tags.class.php
│   ├── url.class.php
│   ├── user.class.php
│   ├── users.class.php
│   └── vendors/
│       └── bootstrap-icons/
│           ├── bootstrap-icons.css
│           └── bootstrap-icons.json
├── bl-languages/
│   ├── ar_MA.json
│   ├── bg_BG.json
│   ├── ckb.json
│   ├── cs_CZ.json
│   ├── da.json
│   ├── de_AT.json
│   ├── de_CH.json
│   ├── de_DE.json
│   ├── en.json
│   ├── es.json
│   ├── fa_IR.json
│   ├── fi_FI.json
│   ├── fr_FR.json
│   ├── gr.json
│   ├── he_IL.json
│   ├── hu_HU.json
│   ├── id_ID.json
│   ├── it_IT.json
│   ├── ja_JP.json
│   ├── lt.json
│   ├── ms_MY.json
│   ├── nl_NL.json
│   ├── pl_PL.json
│   ├── pt_BR.json
│   ├── pt_PT.json
│   ├── ro_RO.json
│   ├── ru.json
│   ├── sv_SE.json
│   ├── tr_TR.json
│   ├── uk_UA.json
│   ├── vi_VN.json
│   ├── zh_CN.json
│   └── zh_TW.json
├── bl-plugins/
│   ├── about/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── alternative/
│   │   ├── languages/
│   │   │   ├── de_AT.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── api/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── canonical/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── categories/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── custom-fields-parser/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── en.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   └── ru.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── disqus/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── easymde/
│   │   ├── css/
│   │   │   └── bludit.css
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it_IT.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── hit-counter/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── html-code/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── links/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── maintenance-mode/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   ├── uk_UA.json
│   │   │   └── zh_TW.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── navigation/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── opengraph/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr.json
│   │   │   ├── uk_UA.json
│   │   │   └── zh_TW.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── popeye/
│   │   ├── languages/
│   │   │   ├── de_AT.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── ja_JP.json
│   │   │   └── nl_NL.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── remote-content/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── robots/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── rss/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── search/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   ├── plugin.php
│   │   └── vendors/
│   │       └── fuzz.php
│   ├── sitemap/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── static-pages/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── tags/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── tinymce/
│   │   ├── css/
│   │   │   ├── tinymce_content.css
│   │   │   └── tinymce_toolbar.css
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   ├── plugin.php
│   │   └── tinymce/
│   │       ├── langs/
│   │       │   └── README.md
│   │       ├── license.md
│   │       ├── notices.txt
│   │       ├── plugins/
│   │       │   ├── emoticons/
│   │       │   │   └── js/
│   │       │   │       ├── emojiimages.js
│   │       │   │       └── emojis.js
│   │       │   └── help/
│   │       │       └── js/
│   │       │           └── i18n/
│   │       │               └── keynav/
│   │       │                   ├── ar.js
│   │       │                   ├── bg-BG.js
│   │       │                   ├── bg_BG.js
│   │       │                   ├── ca.js
│   │       │                   ├── cs.js
│   │       │                   ├── da.js
│   │       │                   ├── de.js
│   │       │                   ├── el.js
│   │       │                   ├── en.js
│   │       │                   ├── es.js
│   │       │                   ├── eu.js
│   │       │                   ├── fa.js
│   │       │                   ├── fi.js
│   │       │                   ├── fr-FR.js
│   │       │                   ├── fr_FR.js
│   │       │                   ├── he-IL.js
│   │       │                   ├── he_IL.js
│   │       │                   ├── hi.js
│   │       │                   ├── hr.js
│   │       │                   ├── hu-HU.js
│   │       │                   ├── hu_HU.js
│   │       │                   ├── id.js
│   │       │                   ├── it.js
│   │       │                   ├── ja.js
│   │       │                   ├── kk.js
│   │       │                   ├── ko-KR.js
│   │       │                   ├── ko_KR.js
│   │       │                   ├── ms.js
│   │       │                   ├── nb-NO.js
│   │       │                   ├── nb_NO.js
│   │       │                   ├── nl.js
│   │       │                   ├── pl.js
│   │       │                   ├── pt-BR.js
│   │       │                   ├── pt-PT.js
│   │       │                   ├── pt_BR.js
│   │       │                   ├── pt_PT.js
│   │       │                   ├── ro.js
│   │       │                   ├── ru.js
│   │       │                   ├── sk.js
│   │       │                   ├── sl-SI.js
│   │       │                   ├── sl_SI.js
│   │       │                   ├── sv-SE.js
│   │       │                   ├── sv_SE.js
│   │       │                   ├── th-TH.js
│   │       │                   ├── th_TH.js
│   │       │                   ├── tr.js
│   │       │                   ├── uk.js
│   │       │                   ├── vi.js
│   │       │                   ├── zh-CN.js
│   │       │                   ├── zh-TW.js
│   │       │                   ├── zh_CN.js
│   │       │                   └── zh_TW.js
│   │       ├── skins/
│   │       │   ├── content/
│   │       │   │   ├── dark/
│   │       │   │   │   └── content.js
│   │       │   │   ├── default/
│   │       │   │   │   └── content.js
│   │       │   │   ├── document/
│   │       │   │   │   └── content.js
│   │       │   │   ├── tinymce-5/
│   │       │   │   │   └── content.js
│   │       │   │   ├── tinymce-5-dark/
│   │       │   │   │   └── content.js
│   │       │   │   └── writer/
│   │       │   │       └── content.js
│   │       │   └── ui/
│   │       │       ├── oxide/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       ├── oxide-dark/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       ├── tinymce-5/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       └── tinymce-5-dark/
│   │       │           ├── content.inline.js
│   │       │           ├── content.js
│   │       │           ├── skin.js
│   │       │           └── skin.shadowdom.js
│   │       └── tinymce.d.ts
│   ├── twitter-cards/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── version/
│   │   ├── js/
│   │   │   └── version.js
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   └── visits-stats/
│       ├── languages/
│       │   ├── de_AT.json
│       │   ├── de_CH.json
│       │   ├── de_DE.json
│       │   ├── en.json
│       │   ├── it_IT.json
│       │   ├── ja_JP.json
│       │   └── nl_NL.json
│       ├── metadata.json
│       └── plugin.php
├── bl-themes/
│   ├── alternative/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── init.php
│   │   ├── languages/
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── footer.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       └── page.php
│   ├── blogx/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── languages/
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── footer.php
│   │       ├── head.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       ├── page.php
│   │       └── sidebar.php
│   ├── flavor/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── languages/
│   │   │   └── en.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── 404.php
│   │       ├── footer.php
│   │       ├── head.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       └── page.php
│   └── popeye/
│       ├── css/
│       │   ├── 01-style.css
│       │   ├── 02-helpers.css
│       │   └── 99-darkmode.css
│       ├── index.php
│       ├── init.php
│       ├── languages/
│       │   ├── de_AT.json
│       │   ├── de_CH.json
│       │   ├── de_DE.json
│       │   ├── en.json
│       │   └── ja_JP.json
│       ├── metadata.json
│       └── php/
│           ├── footer.php
│           ├── home.php
│           ├── navbar.php
│           └── page.php
├── index.php
└── install.php

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug Report
about: Describe a bug or problem
title: ''
labels: bug
assignees: ''
---

> Please complete the following steps. Issues that do not follow this template may be closed without review.

### Describe the problem
<!-- A clear and concise description of what the bug is. -->

### Expected behavior
<!-- What did you expect to happen? -->

### Actual behavior
<!-- What actually happened? -->

### Steps to reproduce
<!--
1. Go to '...'
2. Click on '...'
3. See error
-->

### Bludit version
<!-- e.g. 3.15.0 -->

### PHP version
<!-- e.g. 8.1 — run `php -v` if unsure -->

### PHP error logs
<!--
The location of the PHP error log varies by OS and configuration.
It is usually set in php.ini:
- Linux: /var/log/php_errors.log
- Windows (IIS): C:\log_files\php_errors.log

Paste any relevant log entries here, or remove this section if not applicable.
-->

### Additional context
<!-- Screenshots, browser console errors, or any other relevant information. -->


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/workflows/close_inactive_issues.yml
================================================
name: "Close inactive issues"
on:
  schedule:
    - cron: '30 1 * * *'

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v9
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          days-before-pr-stale: -1
          days-before-pr-close: -1
          # The labels you want to PROTECT from being closed
          exempt-issue-labels: 'Bug,New request'

          # Standard configuration
          stale-issue-message: 'This issue is inactive and will be closed in 7 days.'
          close-issue-message: 'Closed due to inactivity.'
          days-before-stale: 14
          days-before-close: 7


================================================
FILE: .gitignore
================================================
.DS_Store
dbgenerator.php
bl-content/*
!bl-content/.keep
bl-content-migrator
bl-plugins/gallery
bl-plugins/timemachine
bl-plugins/timemachine-x
bl-plugins/backup-manager
bl-plugins/discovery
bl-plugins/updater
bl-plugins/medium-editor
bl-plugins/quill
bl-plugins/yandex-metrica/
bl-plugins/domain-migrator/
bl-plugins/tail-writer/
bl-kernel/bludit.pro.*.php
bl-kernel/admin/themes/gris
bl-themes/docs
bl-themes/typerite
bl-themes/docsx
bl-themes/editorial
bl-themes/mediumish
bl-themes/clean-blog
bl-themes/grayscale
bl-themes/massively
bl-themes/hyperspace
bl-themes/striped
bl-themes/log
bl-themes/micro
bl-themes/tagg
bl-themes/small
bl-themes/future-imperfect
bl-themes/social-network
test-server.sh
test-php85-compatibility.php
php85-server.log
analyze-logs.sh
scripts/*
logs/*


================================================
FILE: .htaccess
================================================
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>

# Enable rewrite rules
RewriteEngine on

# Base directory
RewriteBase /

# Deny direct access to the next directories
RewriteRule ^bl-content/(databases|workspaces|pages|tmp)/.*$ - [R=404,L]

# All URL process by index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php [PT,L]

</IfModule>

================================================
FILE: .prettierrc
================================================
{
  "semi": true,
  "singleQuote": true,
  "useTabs": false,
  "tabWidth": 2,
  "printWidth": 100
}


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015-2023 Diego Najar

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.


================================================
FILE: README.ar.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - نظام إدارة المحتوى البسيط والسريع والمرن.

مع Bludit، يمكنك بناء موقعك الإلكتروني أو مدونتك في ثوانٍ معدودة. إنه مجاني تمامًا، مفتوح المصدر، وسهل الاستخدام. يخزن Bludit المحتوى بتنسيق JSON، مما يلغي الحاجة إلى تثبيت أو تهيئة قاعدة بيانات. كل ما تحتاجه هو خادم ويب يدعم PHP.

كـ Flat-File CMS، يقدم Bludit مرونة وسرعة لا مثيل لهما. بالإضافة إلى ذلك، مع دعم كود Markdown وHTML، أصبح إنشاء وإدارة المحتوى أسهل من أي وقت مضى.

## الموارد

- [الإضافات](https://plugins.bludit.com)
- [القوالب](https://themes.bludit.com)
- [الوثائق](https://docs.bludit.com)
- الأخبار والإعلانات على [تويتر](https://twitter.com/bludit)، [فيسبوك](https://www.facebook.com/bluditcms)، و[ريديت](https://www.reddit.com/r/bludit/)
- الحديث والدردشة على [ديسكورد](https://discord.gg/CFaXEdZWds)
- المساعدة والدعم على [المنتدى](https://forum.bludit.org)
- تقارير الأخطاء على [مشكلات غيت هب](https://github.com/bludit/bludit/issues)

## المتطلبات

- خادم ويب يدعم PHP.
- إصدار PHP 8.0 أو أعلى.
- وحدة PHP [mbstring](http://php.net/manual/en/book.mbstring.php) لدعم UTF-8 الكامل.
- وحدة PHP [gd](http://php.net/manual/en/book.image.php) لمعالجة الصور.
- وحدة PHP [dom](http://php.net/manual/en/book.dom.php) للتعامل مع DOM.
- وحدة PHP [json](http://php.net/manual/en/book.json.php) للتعامل مع JSON.

## التثبيت

1. قم بتنزيل الإصدار الأحدث من الصفحة الرسمية: [Bludit.com](https://www.bludit.com)
2. استخرج ملف الـ zip إلى دليل، مثل `bludit`.
3. ارفع دليل `bludit` إلى خادم الويب أو الاستضافة الخاص بك.
4. قم بزيارة نطاقك (مثل https://example.com/bludit/).
5. اتبع مثبت Bludit لإعداد موقعك.

## تثبيت سريع للاختبار

يمكنك استخدام خادم الويب المدمج في PHP (`php -S localhost:8000`) أو Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

ثم افتح http://localhost:8000

## ترقية Bludit

قبل ترقية Bludit، **قم دائمًا بعمل نسخة احتياطية من موقعك**. هذا يشمل:
- مجلد `bl-content/` بأكمله (يحتوي على صفحاتك، القاعدة، الوسائط، الإعدادات)
- أي تخصيصات قمت بها على المواضيع أو الإضافات

### خطوات الترقية

1. **قم بتنزيل أحدث نسخة**: احصل على أحدث إصدار من Bludit من [الموقع الرسمي](https://www.bludit.com) أو [GitHub](https://github.com/bludit/bludit/releases)

2. **قم بعمل نسخة احتياطية**: انسخ المجلدات التالية إلى مكان آمن:
   - `bl-content/` (الأهم - يحتوي على جميع بياناتك)
   - أي مواضيع أو إضافات مخصصة قمت بتعديلها

3. **حذف المجلدات القديمة**: احذف هذه المجلدات من تثبيت Bludit الحالي:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`

4. **تحميل الملفات الجديدة**: من حزمة Bludit الجديدة، قم بتحميل:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`
   - `index.php`
   - `install.php`
   - `.htaccess` (إذا كان موجودًا)

5. **الاحتفاظ بمحتواك**: **لا تستبدل** مجلد `bl-content/` - فهو يحتوي على جميع بياناتك

6. **تحديث Bludit**: افتح موقعك في متصفح. سيكتشف Bludit الإصدار الجديد ويقوم بتشغيل عملية الترقية تلقائيًا

7. **التحقق من موقعك**: بعد الترقية:
   - تسجيل الدخول إلى لوحة الإدارة
   - التحقق من ظهور محتواك بشكل صحيح
   - اختبار المواضيع والإضافات
   - مراجعة إعداداتك

8. **مسح ذاكرة التخزين المؤقت**: إذا واجهت مشاكل:
   - مسح ذاكرة التخزين المؤقت للمتصفح
   - إذا كنت تستخددم إضافة للتخزين المؤقت، امسح ذاكرتها المؤقتة
   - تحقق من سجلات الخادم للأخطاء

> **ملاحظة**: يحفظ Bludit جميع بياناتك كملفات JSON في `bl-content/databases/`. طالما حافظت على هذا المجلد سليمًا، فإن بياناتك آمنة.

## دعم Bludit

Bludit مفتوح المصدر ومجاني الاستخدام، لكن إذا وجدت المشروع مفيدًا وترغب في دعم تطويره، يمكنك المساهمة على [باتيريون](https://www.patreon.com/join/bludit). كرمز لتقديرنا، سيحصل الداعمون على Bludit PRO.

إذا كنت تفضل، يمكنك أيضًا تقديم تبرع لمرة واحدة لشراء قهوة أو بيرة لنا. كل مساهمة تساعدنا على مواصلة تحسين Bludit وتقديم أفضل تجربة ممكنة لمستخدمينا.

- [باي بال](https://www.paypal.me/bludit/10)
- BTC (بيتكوين): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (إيثريوم): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## الترخيص

Bludit هو برمجية مفتوحة المصدر مرخصة بموجب [ترخيص MIT](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.de.md
================================================
# [Bludit](https://www.bludit.com/de/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - das einfache, schnelle und flexible CMS.

Mit Bludit können Sie Ihre eigene Website oder Ihren Blog in Sekunden erstellen. Es ist völlig kostenlos, open-source und einfach zu bedienen. Bludit speichert Inhalte im JSON-Format, sodass keine Datenbankinstallation oder -konfiguration erforderlich ist. Alles, was Sie brauchen, ist ein Webserver mit PHP-Unterstützung.

Als Flat-File-CMS bietet Bludit unvergleichliche Flexibilität und Geschwindigkeit. Zudem macht die Unterstützung für Markdown- und HTML-Code das Erstellen und Verwalten von Inhalten einfacher denn je.

## Ressourcen

- [Plugins](https://plugins.bludit.com)
- [Themes](https://themes.bludit.com)
- [Dokumentation](https://docs.bludit.com)
- Neuigkeiten und Ankündigungen auf [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms) und [Reddit](https://www.reddit.com/r/bludit/)
- Gespräche und Chat auf [Discord](https://discord.gg/CFaXEdZWds)
- Hilfe und Support auf [Forum](https://forum.bludit.org)
- Fehlermeldungen auf [Github Issues](https://github.com/bludit/bludit/issues)

## Anforderungen

- Webserver mit PHP-Unterstützung.
- PHP Version 8.0 oder höher.
- PHP-Modul [mbstring](http://php.net/manual/en/book.mbstring.php) für vollständige UTF-8-Unterstützung.
- PHP-Modul [gd](http://php.net/manual/en/book.image.php) für Bildverarbeitung.
- PHP-Modul [dom](http://php.net/manual/en/book.dom.php) für DOM-Manipulation.
- PHP-Modul [json](http://php.net/manual/en/book.json.php) für JSON-Manipulation.

## Installation

1. Laden Sie die neueste Version von der offiziellen Seite herunter: [Bludit.com](https://www.bludit.com/de/)
2. Entpacken Sie die Zip-Datei in ein Verzeichnis, wie `bludit`.
3. Laden Sie das Verzeichnis `bludit` auf Ihren Webserver oder Ihr Hosting hoch.
4. Besuchen Sie Ihre Domain (z. B. https://example.com/bludit/).
5. Folgen Sie dem Bludit-Installer, um Ihre Website einzurichten.

## Schnelle Installation zum Testen

Sie können den integrierten PHP-Webserver (`php -S localhost:8000`) oder Docker verwenden:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Dann öffnen Sie http://localhost:8000

## Bludit aktualisieren

Die folgenden Schritte gelten für die Aktualisierung auf jede Version von Bludit derselben Hauptversion. Die Hauptversion ist die erste Ziffer in der Versionsnummer, zum Beispiel Bludit v3.x.

1. **Erstellen Sie ein vollständiges Backup**, keine Diskussion hier, vollständiges Backup der Dateien und Verzeichnisse. Das bedeutet, ALLE Dateien in einen neuen Ordner zu kopieren.
2. **Merken Sie sich, welche Version von Bludit Sie verwenden** für ein mögliches Rollback.
3. **Laden Sie die neueste Version** von der [offiziellen Seite](https://www.bludit.com) herunter.
4. **Entpacken Sie die Zip-Datei**.
5. **Ersetzen Sie vorhandene Dateien** durch die neuen Dateien.
6. **Löschen Sie Ihren Browser-Cache**, und lesen Sie bitte den Hinweis unten.
7. **Melden Sie sich im Administrationsbereich an** und überprüfen Sie Ihre Einstellungen.
8. Fertig.

> **Hinweis:** Wenn Ihre Website hinter einem Server-Cache-System steht (z.B. bietet Cloudflare standardmäßig eines an), müssen Sie die Dateien dort ebenfalls löschen. Es ist auch eine gute Idee, Ihren Browser-Cache zu löschen. Bludit versucht, die Dateien mit den neuen zu laden, aber einige Komponenten wie TinyMCE werden möglicherweise nicht neu geladen und können Probleme in der Benutzeroberfläche verursachen oder JavaScript-Fehler werfen.

## Bludit unterstützen

Bludit ist open-source und kostenlos zu verwenden, aber wenn Sie das Projekt nützlich finden und seine Entwicklung unterstützen möchten, können Sie auf [Patreon](https://www.patreon.com/join/bludit) beitragen. Als Zeichen unserer Wertschätzung erhalten Unterstützer Bludit PRO.

Falls gewünscht, können Sie auch eine einmalige Spende machen, um uns einen Kaffee oder ein Bier zu spenden. Jeder Beitrag hilft uns, Bludit weiter zu verbessern und die beste Erfahrung für unsere Nutzer zu bieten.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Lizenz

Bludit ist open-source-Software unter der [MIT-Lizenz](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.es.md
================================================
# [Bludit](https://www.bludit.com/es/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - CMS simple, rápido y flexible.

Con Bludit, puedes crear tu propio sitio web o blog en solo segundos. Es completamente gratuito, de código abierto y fácil de usar. Bludit almacena el contenido en formato JSON, eliminando la necesidad de instalar o configurar una base de datos. Todo lo que necesitas es un servidor web con soporte PHP.

Como CMS de archivos planos, Bludit ofrece una flexibilidad y velocidad inigualables. Además, con soporte para código Markdown y HTML, crear y gestionar contenido nunca ha sido tan fácil.

## Recursos

- [Plugins](https://plugins.bludit.com)
- [Temas](https://themes.bludit.com)
- [Documentación](https://docs.bludit.com)
- Noticias y anuncios en [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms) y [Reddit](https://www.reddit.com/r/bludit/)
- Charla y chat en [Discord](https://discord.gg/CFaXEdZWds)
- Ayuda y soporte en [Foro](https://forum.bludit.org)
- Reportes de errores en [Github Issues](https://github.com/bludit/bludit/issues)

## Requisitos

- Servidor web con soporte PHP.
- PHP versión 8.0 o superior.
- Módulo PHP [mbstring](http://php.net/manual/en/book.mbstring.php) para soporte completo de UTF-8.
- Módulo PHP [gd](http://php.net/manual/en/book.image.php) para procesamiento de imágenes.
- Módulo PHP [dom](http://php.net/manual/en/book.dom.php) para manipulación de DOM.
- Módulo PHP [json](http://php.net/manual/en/book.json.php) para manipulación de JSON.

## Instalación

1. Descarga la última versión desde la página oficial: [Bludit.com](https://www.bludit.com/es/)
2. Extrae el archivo zip en un directorio, como `bludit`.
3. Sube el directorio `bludit` a tu servidor web o hosting.
4. Visita tu dominio (por ejemplo, https://example.com/bludit/).
5. Sigue el instalador de Bludit para configurar tu sitio.

## Instalación rápida para pruebas

Puedes usar el servidor web incorporado de PHP (`php -S localhost:8000`) o Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Luego abre http://localhost:8000

## Actualizar Bludit

Los siguientes pasos son válidos para actualizar a cualquier versión de Bludit de la misma versión mayor. La versión mayor es el primer dígito en el número de versión, por ejemplo, Bludit v3.x.

1. **Haz una copia de seguridad completa**, sin discusión aquí, copia de seguridad completa de los archivos y directorios. Eso significa copiar TODOS los archivos en una nueva carpeta.
2. **Recuerda qué versión de Bludit estás usando** para una posible reversión.
3. **Descarga la última versión** desde la [página oficial](https://www.bludit.com).
4. **Extrae el archivo zip**.
5. **Reemplaza los archivos existentes** con los nuevos archivos.
6. **Limpia la caché de tu navegador**, y por favor lee la nota a continuación.
7. **Inicia sesión en el área de administración** y verifica tu configuración.
8. Listo.

> **Nota:** Si tu sitio web está detrás de algún tipo de sistema de caché de servidor (por ejemplo, Cloudflare proporciona uno por defecto) necesitas purgar los archivos allí también. También es una buena idea limpiar la caché de tu navegador. Bludit intenta recargar los archivos con los nuevos, pero algunos componentes como TinyMCE pueden no recargarse y provocar problemas en la interfaz de usuario o generar errores de JavaScript.

## Apoya a Bludit

Bludit es de código abierto y gratuito para usar, pero si encuentras el proyecto útil y quieres apoyar su desarrollo, puedes contribuir en [Patreon](https://www.patreon.com/join/bludit). Como muestra de nuestra apreciación, los supporters recibirán Bludit PRO.

Si prefieres, también puedes hacer una donación única para comprarnos un café o una cerveza. Cada contribución nos ayuda a continuar mejorando Bludit y proporcionar la mejor experiencia posible a nuestros usuarios.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Licencia

Bludit es software de código abierto licenciado bajo la [licencia MIT](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.fr.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - le CMS simple, rapide et flexible.

Avec Bludit, vous pouvez créer votre propre site web ou blog en quelques secondes. Il est complètement gratuit, open-source et facile à utiliser. Bludit stocke le contenu au format JSON, éliminant le besoin d'installer ou de configurer une base de données. Tout ce dont vous avez besoin est un serveur web avec support PHP.

En tant que CMS flat-file, Bludit offre une flexibilité et une vitesse inégalées. De plus, avec le support pour le code Markdown et HTML, créer et gérer du contenu n'a jamais été aussi simple.

## Ressources

- [Plugins](https://plugins.bludit.com)
- [Thèmes](https://themes.bludit.com)
- [Documentation](https://docs.bludit.com)
- Actualités et annonces sur [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms) et [Reddit](https://www.reddit.com/r/bludit/)
- Discussion et chat sur [Discord](https://discord.gg/CFaXEdZWds)
- Aide et support sur [Forum](https://forum.bludit.org)
- Rapports de bugs sur [Github Issues](https://github.com/bludit/bludit/issues)

## Exigences

- Serveur web avec support PHP.
- PHP version 8.0 ou supérieure.
- Module PHP [mbstring](http://php.net/manual/en/book.mbstring.php) pour un support UTF-8 complet.
- Module PHP [gd](http://php.net/manual/en/book.image.php) pour le traitement d'images.
- Module PHP [dom](http://php.net/manual/en/book.dom.php) pour la manipulation DOM.
- Module PHP [json](http://php.net/manual/en/book.json.php) pour la manipulation JSON.

## Installation

1. Téléchargez la dernière version depuis la page officielle : [Bludit.com](https://www.bludit.com)
2. Extrayez le fichier zip dans un répertoire, tel que `bludit`.
3. Téléchargez le répertoire `bludit` sur votre serveur web ou hébergement.
4. Visitez votre domaine (par exemple, https://example.com/bludit/).
5. Suivez l'installateur Bludit pour configurer votre site.

## Installation rapide pour tests

Vous pouvez utiliser le serveur web intégré de PHP (`php -S localhost:8000`) ou Docker :

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Ensuite, ouvrez http://localhost:8000

## Mettre à jour Bludit

Avant de mettre à jour Bludit, **faites toujours une sauvegarde de votre site**. Cela inclut :
- L'intégralité du dossier `bl-content/` (contient vos pages, bases de données, médias, paramètres)
- Toute personnalisation apportée aux thèmes ou plugins

### Étapes de mise à jour

1. **Téléchargez la dernière version** : Obtenez la dernière version de Bludit depuis le [site officiel](https://www.bludit.com) ou [GitHub](https://github.com/bludit/bludit/releases)

2. **Créez une sauvegarde** : Copiez les dossiers suivants dans un endroit sûr :
   - `bl-content/` (le plus important - contient toutes vos données)
   - Tout thème ou plugin personnalisé que vous avez modifié

3. **Supprimez les anciens dossiers** : De votre installation Bludit actuelle, supprimez ces dossiers :
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`

4. **Téléversez les nouveaux fichiers** : Depuis le nouveau package Bludit, téléversez :
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`
   - `index.php`
   - `install.php`
   - `.htaccess` (si présent)

5. **Conservez votre contenu** : **NE remplacez PAS** le dossier `bl-content/` - il contient toutes vos données

6. **Mettez à jour Bludit** : Ouvrez votre site dans un navigateur. Bludit détectera la nouvelle version et exécutera automatiquement le processus de mise à jour

7. **Vérifiez votre site** : Après la mise à jour :
   - Connectez-vous au panneau d'administration
   - Vérifiez que votre contenu s'affiche correctement
   - Testez les thèmes et plugins
   - Vérifiez vos paramètres

8. **Videz le cache** : Si vous rencontrez des problèmes :
   - Videz le cache de votre navigateur
   - Si vous utilisez un plugin de mise en cache, videz son cache
   - Vérifiez les journaux du serveur pour les erreurs

> **Note** : Bludit stocke toutes vos données sous forme de fichiers JSON dans `bl-content/databases/`. Tant que vous conservez ce dossier intact, vos données sont en sécurité.

## Soutenir Bludit

Bludit est open-source et gratuit à utiliser, mais si vous trouvez le projet utile et souhaitez soutenir son développement, vous pouvez contribuer sur [Patreon](https://www.patreon.com/join/bludit). En signe de notre appréciation, les supporters recevront Bludit PRO.

Si vous préférez, vous pouvez également faire un don unique pour nous offrir un café ou une bière. Chaque contribution nous aide à continuer d'améliorer Bludit et à fournir la meilleure expérience possible à nos utilisateurs.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Licence

Bludit est un logiciel open-source sous [licence MIT](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.hi.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - सरल, तेज और लचीला CMS.

Bludit के साथ, आप कुछ सेकंड में अपनी खुद की वेबसाइट या ब्लॉग बना सकते हैं। यह पूरी तरह से मुफ्त, ओपन-सोर्स और उपयोग में आसान है। Bludit सामग्री को JSON प्रारूप में संग्रहीत करता है, जो डेटाबेस इंस्टॉलेशन या कॉन्फ़िगरेशन की आवश्यकता को समाप्त कर देता है। आपको केवल PHP सपोर्ट वाले वेब सर्वर की आवश्यकता है।

एक Flat-File CMS के रूप में, Bludit अद्वितीय लचीलापन और गति प्रदान करता है। इसके अलावा, Markdown और HTML कोड के समर्थन के साथ, सामग्री बनाना और प्रबंधित करना कभी इतना आसान नहीं रहा।

## संसाधन

- [प्लगइन्स](https://plugins.bludit.com)
- [थीम्स](https://themes.bludit.com)
- [दस्तावेज़ीकरण](https://docs.bludit.com)
- समाचार और घोषणाएं [ट्विटर](https://twitter.com/bludit), [फेसबुक](https://www.facebook.com/bluditcms) और [रेडिट](https://www.reddit.com/r/bludit/) पर
- बातचीत और चैट [डिस्कॉर्ड](https://discord.gg/CFaXEdZWds) पर
- मदद और समर्थन [फोरम](https://forum.bludit.org) पर
- बग रिपोर्ट [गिटहब इश्यूज](https://github.com/bludit/bludit/issues) पर

## आवश्यकताएँ

- PHP सपोर्ट वाला वेबसर्वर।
- PHP v8.0 या उच्च संस्करण।
- पूर्ण UTF-8 समर्थन के लिए PHP [mbstring](http://php.net/manual/en/book.mbstring.php) मॉड्यूल।
- छवि प्रसंस्करण के लिए PHP [gd](http://php.net/manual/en/book.image.php) मॉड्यूल।
- DOM मैनिपुलेशन के लिए PHP [dom](http://php.net/manual/en/book.dom.php) मॉड्यूल।
- JSON मैनिपुलेशन के लिए PHP [json](http://php.net/manual/en/book.json.php) मॉड्यूल।

## इंस्टॉलेशन

1. आधिकारिक पेज से नवीनतम संस्करण डाउनलोड करें: [Bludit.com](https://www.bludit.com)
2. ज़िप फ़ाइल को एक डायरेक्टरी में निकालें, जैसे `bludit`।
3. `bludit` डायरेक्टरी को अपने वेब सर्वर या होस्टिंग पर अपलोड करें।
4. अपना डोमेन विज़िट करें (उदा., https://example.com/bludit/)।
5. अपनी वेबसाइट सेट अप करने के लिए Bludit इंस्टॉलर का पालन करें।

## परीक्षण के लिए त्वरित इंस्टॉलेशन

आप PHP बिल्ट-इन वेब सर्वर (`php -S localhost:8000`) या Docker का उपयोग कर सकते हैं:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

फिर http://localhost:8000 खोलें

## Bludit का अपग्रेड करें

Bludit को अपग्रेड करने से पहले, **हमेशा अपनी साइट का बैकअप लें**। इसमें शामिल हैं:
- संपूर्ण `bl-content/` फ़ोल्डर (इसमें आपके पेज, डेटाबेस, मीडिया, सेटिंग्स हैं)
- थीम या प्लगइन्स में किए गए कोई भी कस्टमाइज़ेशन

### अपग्रेड चरण

1. **नवीनतम संस्करण डाउनलोड करें**: [आधिकारिक वेबसाइट](https://www.bludit.com) या [GitHub](https://github.com/bludit/bludit/releases) से Bludit का नवीनतम संस्करण प्राप्त करें

2. **बैकअप बनाएं**: निम्नलिखित फ़ोल्डरों को सुरक्षित स्थान पर कॉपी करें:
   - `bl-content/` (सबसे महत्वपूर्ण - इसमें आपका सभी डेटा है)
   - कोई भी कस्टम थीम या प्लगइन्स जिन्हें आपने संशोधित किया है

3. **पुराने फ़ोल्डर हटाएं**: अपने वर्तमान Bludit इंस्टॉलेशन से ये फ़ोल्डर हटाएं:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`

4. **नई फाइलें अपलोड करें**: नए Bludit पैकेज से, अपलोड करें:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`
   - `index.php`
   - `install.php`
   - `.htaccess` (यदि मौजूद हो)

5. **अपनी सामग्री रखें**: `bl-content/` फ़ोल्डर को **प्रतिस्थापित न करें** - इसमें आपका सभी डेटा है

6. **Bludit अपडेट करें**: अपनी साइट को ब्राउज़र में खोलें। Bludit नए संस्करण का पता लगाएगा और स्वचालित रूप से अपग्रेड प्रक्रिया चलाएगा

7. **अपनी साइट सत्यापित करें**: अपग्रेड के बाद:
   - व्यवस्थापक पैनल में लॉग इन करें
   - सत्यापित करें कि आपकी सामग्री सही ढंग से दिखाई देती है
   - थीम और प्लगइन्स का परीक्षण करें
   - अपनी सेटिंग्स की समीक्षा करें

8. **कैश साफ़ करें**: यदि आपको समस्याएं आती हैं:
   - अपने ब्राउज़र का कैश साफ़ करें
   - यदि कैशिंग प्लगइन का उपयोग कर रहे हैं, तो इसका कैश साफ़ करें
   - त्रुटियों के लिए सर्वर लॉग जांचें

> **नोट**: Bludit आपके सभी डेटा को `bl-content/databases/` में JSON फाइलों के रूप में संग्रहीत करता है। जब तक आप इस फ़ोल्डर को बरकरार रखते हैं, आपका डेटा सुरक्षित है।

## Bludit का समर्थन करें

Bludit ओपन-सोर्स और उपयोग करने के लिए मुफ्त है, लेकिन यदि आपको प्रोजेक्ट उपयोगी लगता है और इसके विकास का समर्थन करना चाहते हैं, तो आप [पैट्रियन](https://www.patreon.com/join/bludit) पर योगदान दे सकते हैं। हमारी सराहना के प्रतीक के रूप में, समर्थक Bludit PRO प्राप्त करेंगे।

यदि आप चाहें, तो आप हमें कॉफी या बीयर खरीदने के लिए एक बार का दान भी कर सकते हैं। हर योगदान हमें Bludit को बेहतर बनाने और हमारे उपयोगकर्ताओं के लिए सर्वोत्तम संभव अनुभव प्रदान करने में मदद करता है।

- [पेपाल](https://www.paypal.me/bludit/10)
- BTC (बिटकॉइन): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (ईथीरियम): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)


## लाइसेंस

Bludit MIT लाइसेंस के तहत लाइसेंस प्राप्त ओपन सोर्स सॉफ्टवेयर है।


================================================
FILE: README.it.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - il CMS semplice, veloce e flessibile.

Con Bludit, puoi creare il tuo sito web o blog in pochi secondi. È completamente gratuito, open-source e facile da usare. Bludit memorizza i contenuti in formato JSON, eliminando la necessità di installare o configurare un database. Tutto ciò di cui hai bisogno è un server web con supporto PHP.

Come CMS flat-file, Bludit offre una flessibilità e velocità senza pari. Inoltre, con il supporto per codice Markdown e HTML, creare e gestire contenuti non è mai stato così facile.

## Risorse

- [Plugin](https://plugins.bludit.com)
- [Temi](https://themes.bludit.com)
- [Documentazione](https://docs.bludit.com)
- Notizie e annunci su [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms) e [Reddit](https://www.reddit.com/r/bludit/)
- Conversazioni e chat su [Discord](https://discord.gg/CFaXEdZWds)
- Aiuto e supporto su [Forum](https://forum.bludit.org)
- Segnalazioni di bug su [Github Issues](https://github.com/bludit/bludit/issues)

## Requisiti

- Server web con supporto PHP.
- PHP versione 8.0 o superiore.
- Modulo PHP [mbstring](http://php.net/manual/en/book.mbstring.php) per supporto completo UTF-8.
- Modulo PHP [gd](http://php.net/manual/en/book.image.php) per elaborazione immagini.
- Modulo PHP [dom](http://php.net/manual/en/book.dom.php) per manipolazione DOM.
- Modulo PHP [json](http://php.net/manual/en/book.json.php) per manipolazione JSON.

## Installazione

1. Scarica l'ultima versione dalla pagina ufficiale: [Bludit.com](https://www.bludit.com)
2. Estrai il file zip in una directory, come `bludit`.
3. Carica la directory `bludit` sul tuo server web o hosting.
4. Visita il tuo dominio (ad esempio, https://example.com/bludit/).
5. Segui l'installatore Bludit per configurare il tuo sito.

## Installazione rapida per test

Puoi usare il server web integrato di PHP (`php -S localhost:8000`) oppure Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Poi apri http://localhost:8000

## Aggiornare Bludit

Prima di aggiornare Bludit, **fai sempre un backup del tuo sito**. Questo include:
- L'intera cartella `bl-content/` (contiene le tue pagine, database, media, impostazioni)
- Qualsiasi personalizzazione fatta a temi o plugin

### Passaggi per l'Aggiornamento

1. **Scarica l'ultima versione**: Ottieni l'ultima versione di Bludit dal [sito ufficiale](https://www.bludit.com) o da [GitHub](https://github.com/bludit/bludit/releases)

2. **Crea un backup**: Copia le seguenti cartelle in un luogo sicuro:
   - `bl-content/` (più importante - contiene tutti i tuoi dati)
   - Qualsiasi tema o plugin personalizzato che hai modificato

3. **Elimina le vecchie cartelle**: Dalla tua installazione Bludit corrente, elimina queste cartelle:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`

4. **Carica i nuovi file**: Dal nuovo pacchetto Bludit, carica:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`
   - `index.php`
   - `install.php`
   - `.htaccess` (se presente)

5. **Mantieni il tuo contenuto**: **NON sostituire** la cartella `bl-content/` - contiene tutti i tuoi dati

6. **Aggiorna Bludit**: Apri il tuo sito in un browser. Bludit rileverà la nuova versione ed eseguirà automaticamente il processo di aggiornamento

7. **Verifica il tuo sito**: Dopo l'aggiornamento:
   - Accedi al pannello di amministrazione
   - Verifica che il tuo contenuto appaia correttamente
   - Testa temi e plugin
   - Controlla le tue impostazioni

8. **Cancella la cache**: Se riscontri problemi:
   - Cancella la cache del browser
   - Se usi un plugin di caching, cancella la sua cache
   - Controlla i log del server per errori

> **Nota**: Bludit memorizza tutti i tuoi dati come file JSON in `bl-content/databases/`. Finché mantieni questa cartella intatta, i tuoi dati sono al sicuro.

## Supporta Bludit

Bludit è open-source e gratuito da usare, ma se trovi il progetto utile e vuoi supportarne lo sviluppo, puoi contribuire su [Patreon](https://www.patreon.com/join/bludit). Come segno della nostra apprezzamento, i sostenitori riceveranno Bludit PRO.

Se preferisci, puoi anche fare una donazione una tantum per offrirci un caffè o una birra. Ogni contributo ci aiuta a continuare a migliorare Bludit e fornire la migliore esperienza possibile ai nostri utenti.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Licenza

Bludit è software open-source con licenza [MIT](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.ja.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - シンプルで高速で柔軟なCMS。

Bluditを使えば、数秒で自分のウェブサイトやブログを作成できます。完全に無料でオープンソースで使いやすいです。BluditはコンテンツをJSON形式で保存するため、データベースのインストールや設定は必要ありません。必要なのはPHPをサポートするウェブサーバーだけです。

フラットファイルCMSとして、Bluditは比類のない柔軟性と速度を提供します。さらに、MarkdownとHTMLコードのサポートにより、コンテンツの作成と管理がこれまで以上に簡単になりました。

## リソース

- [プラグイン](https://plugins.bludit.com)
- [テーマ](https://themes.bludit.com)
- [ドキュメント](https://docs.bludit.com)
- ニュースと発表は[Twitter](https://twitter.com/bludit)、[Facebook](https://www.facebook.com/bluditcms)、[Reddit](https://www.reddit.com/r/bludit/)で
- トークとチャットは[Discord](https://discord.gg/CFaXEdZWds)で
- ヘルプとサポートは[フォーラム](https://forum.bludit.org)で
- バグレポートは[Github Issues](https://github.com/bludit/bludit/issues)で

## 要件

- PHPをサポートするウェブサーバー。
- PHPバージョン8.0以上。
- UTF-8の完全サポートのためのPHP [mbstring](http://php.net/manual/en/book.mbstring.php)モジュール。
- 画像処理のためのPHP [gd](http://php.net/manual/en/book.image.php)モジュール。
- DOM操作のためのPHP [dom](http://php.net/manual/en/book.dom.php)モジュール。
- JSON操作のためのPHP [json](http://php.net/manual/en/book.json.php)モジュール。

## インストール

1. 公式ページから最新バージョンをダウンロード:[Bludit.com](https://www.bludit.com)
2. zipファイルをディレクトリに展開、例えば`bludit`。
3. `bludit`ディレクトリをウェブサーバーまたはホスティングにアップロード。
4. ドメインにアクセス(例: https://example.com/bludit/)。
5. Bluditインストーラーに従ってサイトを設定。

## テストのためのクイックインストール

PHPの組み込みウェブサーバー(`php -S localhost:8000`)またはDockerを使用できます:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

その後 http://localhost:8000 を開いてください

## Bluditのアップグレード

Bluditをアップグレードする前に、**必ずサイトをバックアップしてください**。これには以下が含まれます:
- `bl-content/` フォルダ全体(ページ、データベース、メディア、設定を含みます)
- テーマやプラグインへのカスタマイズ

### アップグレード手順

1. **最新バージョンをダウンロード**: [公式ウェブサイト](https://www.bludit.com)または[GitHub](https://github.com/bludit/bludit/releases)からBluditの最新バージョンを入手

2. **バックアップを作成**: 以下のフォルダを安全な場所にコピー:
   - `bl-content/`(最も重要 - すべてのデータが含まれています)
   - 変更したカスタムテーマやプラグイン

3. **古いフォルダを削除**: 現在のBluditインストールから以下のフォルダを削除:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`

4. **新しいファイルをアップロード**: 新しいBluditパッケージから以下をアップロード:
   - `bl-kernel/`
   - `bl-languages/`
   - `bl-plugins/`
   - `bl-themes/`
   - `index.php`
   - `install.php`
   - `.htaccess`(存在する場合)

5. **コンテンツを保持**: `bl-content/` フォルダは**置き換えないでください** - すべてのデータが含まれています

6. **Bluditを更新**: ブラウザでサイトを開きます。Bluditは新しいバージョンを検出し、自動的にアップグレードプロセスを実行します

7. **サイトを検証**: アップグレード後:
   - 管理パネルにログイン
   - コンテンツが正しく表示されることを確認
   - テーマとプラグインをテスト
   - 設定を確認

8. **キャッシュをクリア**: 問題が発生した場合:
   - ブラウザのキャッシュをクリア
   - キャッシングプラグインを使用している場合は、そのキャッシュをクリア
   - エラーがないかサーバーログを確認

> **注意**: Bluditはすべてのデータを`bl-content/databases/`にJSONファイルとして保存します。このフォルダを無傷に保つ限り、データは安全です。

## Bluditをサポート

Bluditはオープンソースで無料ですが、プロジェクトが有用だと感じて開発をサポートしたい場合は、[Patreon](https://www.patreon.com/join/bludit)で貢献できます。私たちの感謝の印として、サポーターはBludit PROを受け取ります。

好みに応じて、コーヒーやビールを買うための1回限りの寄付も可能です。すべての貢献がBluditの改善とユーザーへの最高の体験提供に役立ちます。

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## ライセンス

Bluditは[MITライセンス](https://tldrlegal.com/license/mit-license)下のオープンソースソフトウェアです。


================================================
FILE: README.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit the Simple, Fast, and Flexible CMS.

With Bludit, you can build your own website or blog in just seconds. It’s completely free, open-source, and easy to use. Bludit stores content in JSON format, eliminating the need for database installation or configuration. All you need is a web server with PHP support.

As a Flat-File CMS, Bludit offers unparalleled flexibility and speed. Plus, with support for both Markdown and HTML code, creating and managing content has never been easier.

## Resources

- [Plugins](https://plugins.bludit.com)
- [Themes](https://themes.bludit.com)
- [Documentation](https://docs.bludit.com)
- News and announcement on [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms), and [Reddit](https://www.reddit.com/r/bludit/)
- Talk & Chat on [Discord](https://discord.gg/CFaXEdZWds)
- Help and Support on [Forum](https://forum.bludit.org)
- Bugs reports on [Github Issues](https://github.com/bludit/bludit/issues)

## Requirements

- Webserver with PHP support.
- PHP v8.0 or higher version.
- PHP [mbstring](http://php.net/manual/en/book.mbstring.php) module for full UTF-8 support.
- PHP [gd](http://php.net/manual/en/book.image.php) module for image processing.
- PHP [dom](http://php.net/manual/en/book.dom.php) module for DOM manipulation.
- PHP [json](http://php.net/manual/en/book.json.php) module for JSON manipulation.

## Installation

1. Download the latest version from the official page: [Bludit.com](https://www.bludit.com)
2. Extract the zip file into a directory, such as `bludit`.
3. Upload the `bludit` directory to your web server or hosting.
4. Visit your domain (e.g., https://example.com/bludit/).
5. Follow the Bludit Installer to set up your website.

> **Note — running behind Cloudflare, nginx, Apache or another reverse proxy:** Bludit reads the client IP from `REMOTE_ADDR` only. Proxy headers like `X-Forwarded-For` or `CF-Connecting-IP` are **not** trusted at the PHP layer because any client can forge them. If your site sits behind a reverse proxy, configure the webserver to rewrite `REMOTE_ADDR` to the real client IP before PHP sees it — otherwise the login brute-force blocklist will block the proxy itself (locking out every visitor after enough failed logins) and visitor statistics will count all traffic as a single visitor.
>
> - **Apache** — enable [`mod_remoteip`](https://httpd.apache.org/docs/current/mod/mod_remoteip.html) and list your upstream's IP ranges with `RemoteIPTrustedProxy`. For Cloudflare, use the header `CF-Connecting-IP` and the IP ranges published at [cloudflare.com/ips-v4](https://www.cloudflare.com/ips-v4) and [cloudflare.com/ips-v6](https://www.cloudflare.com/ips-v6).
> - **nginx** — use the built-in [`ngx_http_realip_module`](https://nginx.org/en/docs/http/ngx_http_realip_module.html) with `set_real_ip_from` + `real_ip_header`.
>
> No configuration is needed for direct / localhost / intranet deployments.

## Quick installation for testing

You can use PHP Built-in web server (`php -S localhost:8000`) or Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Then open http://localhost:8000

## Upgrading Bludit

The following steps are valid for upgrading to any version of Bludit from the same major version. The major version is the first digit in the version number, for example, Bludit v3.x.

1. **Make a full backup**, no discussion here, entire backup of the files and directories. That means copy ALL files into a new folder.
2. **Remember which version of Bludit you are using** for a possible roll-back.
3. **Download the latest version** from the [official page](https://www.bludit.com).
4. **Extract the zip file**.
5. **Replace existing files** with the new files.
6. **Clean your browser cache**, and please read the note below.
7. **Log into the admin area** and check your settings.
8. Done.

> **Note:** If your website is behind some kind of server cache system (for example, Cloudflare provides one by default) you need to purge the files there, too. It's also a good idea to clear your browser cache. Bludit tries to reload the files with the new ones, but some components like TinyMCE may not reload, and provoke some issues in the UI or throw out JavaScript errors.

## Support Bludit

Bludit is open-source and free to use, but if you find the project useful and would like to support its development, you can contribute on [Patreon](https://www.patreon.com/join/bludit). As a token of our appreciation, supporters will receive Bludit PRO.

If you prefer, you can also make a one-time donation to buy us a coffee or beer. Every contribution helps us continue to improve Bludit and provide the best possible experience for our users.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## License

Bludit is open source software licensed under the [MIT license](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.pt.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - o CMS simples, rápido e flexível.

Com o Bludit, você pode criar seu próprio site ou blog em segundos. É completamente gratuito, de código aberto e fácil de usar. O Bludit armazena o conteúdo em formato JSON, eliminando a necessidade de instalação ou configuração de banco de dados. Tudo o que você precisa é de um servidor web com suporte a PHP.

Como um CMS de arquivos planos, o Bludit oferece flexibilidade e velocidade incomparáveis. Além disso, com suporte a código Markdown e HTML, criar e gerenciar conteúdo nunca foi tão fácil.

## Recursos

- [Plugins](https://plugins.bludit.com)
- [Temas](https://themes.bludit.com)
- [Documentação](https://docs.bludit.com)
- Notícias e anúncios no [Twitter](https://twitter.com/bludit), [Facebook](https://www.facebook.com/bluditcms) e [Reddit](https://www.reddit.com/r/bludit/)
- Conversa e chat no [Discord](https://discord.gg/CFaXEdZWds)
- Ajuda e suporte no [Fórum](https://forum.bludit.org)
- Relatórios de bugs no [Github Issues](https://github.com/bludit/bludit/issues)

## Requisitos

- Servidor web com suporte a PHP.
- PHP v8.0 ou versão superior.
- Módulo PHP [mbstring](http://php.net/manual/en/book.mbstring.php) para suporte completo a UTF-8.
- Módulo PHP [gd](http://php.net/manual/en/book.image.php) para processamento de imagens.
- Módulo PHP [dom](http://php.net/manual/en/book.dom.php) para manipulação de DOM.
- Módulo PHP [json](http://php.net/manual/en/book.json.php) para manipulação de JSON.

## Instalação

1. Baixe a versão mais recente da página oficial: [Bludit.com](https://www.bludit.com)
2. Extraia o arquivo zip em um diretório, como `bludit`.
3. Carregue o diretório `bludit` para o seu servidor web ou hospedagem.
4. Visite o seu domínio (ex.: https://example.com/bludit/).
5. Siga o instalador do Bludit para configurar o seu site.

## Instalação rápida para testes

Você pode usar o servidor web integrado do PHP (`php -S localhost:8000`) ou Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Em seguida, abra http://localhost:8000

## Atualizar o Bludit

As etapas a seguir são válidas para atualizar para qualquer versão do Bludit da mesma versão principal. A versão principal é o primeiro dígito no número da versão, por exemplo, Bludit v3.x.

1. **Faça um backup completo**, sem discussão aqui, backup completo dos arquivos e diretórios. Isso significa copiar TODOS os arquivos para uma nova pasta.
2. **Lembre-se de qual versão do Bludit você está usando** para um possível rollback.
3. **Baixe a versão mais recente** da [página oficial](https://www.bludit.com).
4. **Extraia o arquivo zip**.
5. **Substitua os arquivos existentes** pelos novos arquivos.
6. **Limpe o cache do seu navegador**, e por favor leia a nota abaixo.
7. **Faça login na área de administração** e verifique suas configurações.
8. Concluído.

> **Nota:** Se o seu site estiver atrás de algum tipo de sistema de cache de servidor (por exemplo, Cloudflare fornece um por padrão), você precisa limpar os arquivos lá também. Também é uma boa ideia limpar o cache do seu navegador. O Bludit tenta recarregar os arquivos com os novos, mas alguns componentes como TinyMCE podem não recarregar e provocar problemas na interface do usuário ou gerar erros de JavaScript.

## Apoie o Bludit

O Bludit é de código aberto e gratuito para uso, mas se você achar o projeto útil e quiser apoiar seu desenvolvimento, pode contribuir no [Patreon](https://www.patreon.com/join/bludit). Como sinal de nossa apreciação, os apoiadores receberão o Bludit PRO.

Se preferir, você também pode fazer uma doação única para nos comprar um café ou uma cerveja. Cada contribuição nos ajuda a continuar melhorando o Bludit e fornecer a melhor experiência possível aos nossos usuários.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Licença

O Bludit é software de código aberto licenciado sob a [licença MIT](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.ru.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - простой, быстрый и гибкий CMS.

С Bludit вы можете создать собственный веб-сайт или блог всего за несколько секунд. Это полностью бесплатный, с открытым исходным кодом и простой в использовании CMS. Bludit хранит контент в формате JSON, что устраняет необходимость установки или настройки базы данных. Все, что вам нужно — это веб-сервер с поддержкой PHP.

Как Flat-File CMS, Bludit предлагает непревзойденную гибкость и скорость. Кроме того, с поддержкой как Markdown, так и HTML кода, создание и управление контентом стало еще проще.

## Ресурсы

- [Плагины](https://plugins.bludit.com)
- [Темы](https://themes.bludit.com)
- [Документация](https://docs.bludit.com)
- Новости и объявления в [Твиттере](https://twitter.com/bludit), [Фейсбуке](https://www.facebook.com/bluditcms) и [Реддите](https://www.reddit.com/r/bludit/)
- Общение и чат в [Discord](https://discord.gg/CFaXEdZWds)
- Помощь и поддержка на [форуме](https://forum.bludit.org)
- Сообщения об ошибках на [Github Issues](https://github.com/bludit/bludit/issues)

## Требования

- Веб-сервер с поддержкой PHP.
- PHP версии 8.0 или выше.
- PHP-модуль [mbstring](http://php.net/manual/en/book.mbstring.php) для полной поддержки UTF-8.
- PHP-модуль [gd](http://php.net/manual/en/book.image.php) для обработки изображений.
- PHP-модуль [dom](http://php.net/manual/en/book.dom.php) для работы с DOM.
- PHP-модуль [json](http://php.net/manual/en/book.json.php) для работы с JSON.

## Установка

1. Скачайте последнюю версию с официальной страницы: [Bludit.com](https://www.bludit.com)
2. Распакуйте zip-файл в каталог, например `bludit`.
3. Загрузите каталог `bludit` на ваш веб-сервер или хостинг.
4. Перейдите на ваш домен (например, https://example.com/bludit/).
5. Следуйте установщику Bludit для настройки вашего сайта.

## Быстрая установка для тестирования

Вы можете использовать встроенный веб-сервер PHP (`php -S localhost:8000`) или Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

Затем откройте http://localhost:8000
## Обновление Bludit

Следующие шаги действительны для обновления до любой версии Bludit той же основной версии. Основная версия - это первая цифра в номере версии, например, Bludit v3.x.

1. **Сделайте полную резервную копию**, никаких обсуждений, полная резервная копия файлов и каталогов. Это означает копирование ВСЕХ файлов в новую папку.
2. **Запомните, какую версию Bludit вы используете** для возможного отката.
3. **Загрузите последнюю версию** с [официальной страницы](https://www.bludit.com).
4. **Извлеките zip-файл**.
5. **Замените существующие файлы** новыми файлами.
6. **Очистите кеш браузера**, и пожалуйста, прочитайте примечание ниже.
7. **Войдите в административную область** и проверьте свои настройки.
8. Готово.

> **Примечание:** Если ваш веб-сайт находится за какой-либо системой кеширования сервера (например, Cloudflare предоставляет ее по умолчанию), вам также необходимо очистить файлы там. Также рекомендуется очистить кеш браузера. Bludit пытается перезагрузить файлы с новыми, но некоторые компоненты, такие как TinyMCE, могут не перезагрузиться и вызвать проблемы в пользовательском интерфейсе или вызвать ошибки JavaScript.
## Поддержать Bludit

Bludit - это проект с открытым исходным кодом и бесплатный для использования, но если вы считаете его полезным и хотите поддержать развитие, вы можете сделать пожертвование на [Patreon](https://www.patreon.com/join/bludit). В знак нашей благодарности, поддерживающие получат Bludit PRO.

Если хотите, вы также можете сделать одноразовое пожертвование, чтобы угостить нас кофе или пивом. Каждое пожертвование помогает нам продолжать улучшать Bludit и предоставлять лучший опыт нашим пользователям.

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## Лицензия

Bludit - это программное обеспечение с открытым исходным кодом, лицензированное по [MIT лицензии](https://tldrlegal.com/license/mit-license).


================================================
FILE: README.zh.md
================================================
# [Bludit](https://www.bludit.com/)

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)
[![Español](https://img.shields.io/badge/Language-Español-green.svg)](README.es.md)
[![العربية](https://img.shields.io/badge/Language-العربية-yellow.svg)](README.ar.md)
[![中文](https://img.shields.io/badge/Language-中文-red.svg)](README.zh.md)
[![Français](https://img.shields.io/badge/Language-Français-purple.svg)](README.fr.md)
[![Deutsch](https://img.shields.io/badge/Language-Deutsch-orange.svg)](README.de.md)
[![हिंदी](https://img.shields.io/badge/Language-हिंदी-lightblue.svg)](README.hi.md)
[![日本語](https://img.shields.io/badge/Language-日本語-pink.svg)](README.ja.md)
[![Português](https://img.shields.io/badge/Language-Português-darkgreen.svg)](README.pt.md)
[![Русский](https://img.shields.io/badge/Language-Русский-cyan.svg)](README.ru.md)

Bludit - 简单、快速、灵活的CMS。

使用Bludit,您可以在几秒钟内构建自己的网站或博客。它完全免费、开源且易于使用。Bludit将内容存储在JSON格式中,消除了安装或配置数据库的需要。您只需要一个支持PHP的Web服务器。

作为Flat-File CMS,Bludit提供了无与伦比的灵活性和速度。而且,支持Markdown和HTML代码,创建和管理内容从未如此简单。

## 资源

- [插件](https://plugins.bludit.com)
- [主题](https://themes.bludit.com)
- [文档](https://docs.bludit.com)
- 新闻和公告在[Twitter](https://twitter.com/bludit)、[Facebook](https://www.facebook.com/bluditcms)和[Reddit](https://www.reddit.com/r/bludit/)上
- 对话和聊天在[Discord](https://discord.gg/CFaXEdZWds)上
- 帮助和支持在[论坛](https://forum.bludit.org)上
- 错误报告在[Github Issues](https://github.com/bludit/bludit/issues)上

## 要求

- 支持PHP的Web服务器。
- PHP版本8.0或更高。
- PHP [mbstring](http://php.net/manual/en/book.mbstring.php)模块用于完整的UTF-8支持。
- PHP [gd](http://php.net/manual/en/book.image.php)模块用于图像处理。
- PHP [dom](http://php.net/manual/en/book.dom.php)模块用于DOM操作。
- PHP [json](http://php.net/manual/en/book.json.php)模块用于JSON操作。

## 安装

1. 从官方页面下载最新版本:[Bludit.com](https://www.bludit.com)
2. 将zip文件解压到目录中,例如`bludit`。
3. 将`bludit`目录上传到您的Web服务器或托管。
4. 访问您的域名(例如,https://example.com/bludit/)。
5. 按照Bludit安装程序设置您的网站。

## 测试的快速安装

您可以使用PHP内置Web服务器(`php -S localhost:8000`)或 Docker:

```bash
docker pull bludit/docker:latest
docker run -d --name bludit -p 8000:80 bludit/docker:latest
```

然后打开 http://localhost:8000
## 升级 Bludit

以下步骤适用于从相同主版本升级到 Bludit 的任何版本。主版本是版本号中的第一位数字,例如 Bludit v3.x。

1. **进行完整备份**,这里不讨论,完整备份文件和目录。这意味着将所有文件复制到一个新文件夹。
2. **记住您正在使用的 Bludit 版本**,以便可能的回滚。
3. **从[官方页面](https://www.bludit.com)下载最新版本**。
4. **解压 zip 文件**。
5. **用新文件替换现有文件**。
6. **清除浏览器缓存**,请阅读下面的注释。
7. **登录管理区域**并检查您的设置。
8. 完成。

> **注意:** 如果您的网站位于某种服务器缓存系统后面(例如,Cloudflare 默认提供一个),您也需要在那里清除文件。清除浏览器缓存也是一个好主意。Bludit 尝试用新文件重新加载文件,但某些组件(如 TinyMCE)可能无法重新加载,并在 UI 中引发一些问题或抛出 JavaScript 错误。
## 支持Bludit

Bludit是开源且免费使用的,但如果您发现该项目有用并希望支持其开发,您可以在[Patreon](https://www.patreon.com/join/bludit)上贡献。作为我们感激的象征,支持者将收到Bludit PRO。

如果您愿意,您也可以进行一次性捐赠,为我们买杯咖啡或啤酒。每笔贡献都帮助我们继续改进Bludit并为用户提供最佳体验。

- [PayPal](https://www.paypal.me/bludit/10)
- BTC (Bitcoin): [bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph](https://www.blockchain.com/explorer/addresses/btc/bc1qtets5pdj73uyysjpegfh2gar4pfywra4rglcph)
- ETH (Ethereum): [0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7](https://www.blockchain.com/explorer/addresses/eth/0x0d7D58D848aA5f175D75Ce4bC746bAC107f331b7)

## 许可证

Bludit是根据[MIT许可证](https://tldrlegal.com/license/mit-license)许可的开源软件。


================================================
FILE: bl-content/.keep
================================================


================================================
FILE: bl-kernel/abstract/dbjson.class.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

class dbJSON {

	public $db;
	public $dbBackup;
	public $file;
	public $firstLine;

	// $file, the JSON file.
	// $firstLine, TRUE if you want to remove the first line, FALSE otherwise
	function __construct($file, $firstLine=true)
	{
		$this->file = $file;
		$this->db = array();
		$this->dbBackup = array();
		$this->firstLine = $firstLine;

		if (file_exists($file)) {
			// Read JSON file
			$lines = file($file);

			// Remove the first line, the first line is for security reasons
			if ($firstLine) {
				unset($lines[0]);
			}

			// Regenerate the JSON file
			$implode = implode('', $lines);

			// Unserialize, JSON to Array
			$array = $this->unserialize($implode);
			if (empty($array)) {
				$this->db = array();
				$this->dbBackup = array();
			} else {
				$this->db = $array;
				$this->dbBackup = $array;
			}
		}
	}

	public function restoreDB()
	{
		$this->db = $this->dbBackup;
		return true;
	}

	// Returns the number of rows in the database
	public function count()
	{
		return count($this->db);
	}

	// Returns the value from the field
	public function getField($field)
	{
		if (isset($this->db[$field])) {
			return $this->db[$field];
		}
		if (isset($this->dbFields[$field])) {
			return $this->dbFields[$field];
		}
		return null;
	}

	// Save the JSON file
	public function save()
	{
		$data = '';
		if ($this->firstLine) {
			$data  = "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>".PHP_EOL;
		}

		// Serialize database
		$data .= $this->serialize($this->db);

		// Backup the new database.
		$this->dbBackup = $this->db;

		// LOCK_EX flag to prevent anyone else writing to the file at the same time.
		if (file_put_contents($this->file, $data, LOCK_EX)) {
			return true;
		} else {
			Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.', LOG_TYPE_ERROR);
			return false;
		}
	}

	// Returns a JSON encoded string on success or FALSE on failure
	private function serialize($data)
	{
		if (DEBUG_MODE) {
			return json_encode($data, JSON_PRETTY_PRINT);
		}
		return json_encode($data);
	}

	// Returns the value encoded in json in appropriate PHP type
	private function unserialize($data)
	{
		// NULL is returned if the json cannot be decoded
		$decode = json_decode($data, true);
		if ($decode===NULL) {
			Log::set(__METHOD__.LOG_SEP.'Error trying to read the JSON file: '.$this->file, LOG_TYPE_ERROR);
			return false;
		}
		return $decode;
	}

	public function getDB()
	{
		return $this->db;
	}

	// Truncate all the rows
	public function truncate()
	{
		$this->db = array();
		return $this->save();
	}

}


================================================
FILE: bl-kernel/abstract/dblist.class.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

/*
Database structure

{
	"videos": {
		"name": "Videos",
		"template: "",
		"description: "",
		"list": [ "my-page", "second-page" ]
	},
	"pets": {
		"name": "Pets",
		"template: "",
		"description: "",
		"list": [ "cats-and-dogs" ]
	}
}
*/

class dbList extends dbJSON
{
	public $db = array();

	function __construct($file)
	{
		parent::__construct($file);
	}

	public function keys()
	{
		return array_keys($this->db);
	}

	// Returns the list of keys filter by pageNumber
	// $pageNumber start in 1
	public function getList($key, $pageNumber, $numberOfItems)
	{
		if (!isset($this->db[$key])) {
			Log::set(__METHOD__.LOG_SEP.'Error key does not exist '.$key);
			return false;
		}

		// List of keys
		$list = $this->db[$key]['list'];

		// Returns all the items from the list
		if ($numberOfItems==-1) {
			return $list;
		}

		// The first page number is 1, so the real is 0
		$realPageNumber = $pageNumber - 1;
		$chunks = array_chunk($list, $numberOfItems);
		if (isset($chunks[$realPageNumber])) {
			return $chunks[$realPageNumber];
		}

		// Out of index,returns FALSE
		return false;
	}

	public function generateKey($name)
	{
		global $L;

		$key = Text::cleanUrl($name);
		if (Text::isEmpty($key)) {
			$key = $L->g('empty');
		}
		while (isset($this->db[$key])) {
			$key++;
		}
		return $key;
	}

	// Add a new item to the dblist
	// $args => 'name', 'template', 'description', 'list'
	public function add($args)
	{
		$key = $this->generateKey($args['name']);

		$this->db[$key]['name'] 	= Sanitize::removeTags($args['name']);
		$this->db[$key]['template'] 	= isset($args['template'])?Sanitize::removeTags($args['template']):'';
		$this->db[$key]['description'] 	= isset($args['description'])?Sanitize::removeTags($args['description']):'';
		$this->db[$key]['list'] 	= isset($args['list'])?$args['list']:array();

		$this->sortAlphanumeric();
		$this->save();
		return $key;
	}

	public function remove($key)
	{
		if (!isset($this->db[$key])) {
			Log::set(__METHOD__.LOG_SEP.'The key does not exist, key: '.$key);
			return false;
		}

		unset($this->db[$key]);
		return $this->save();
	}

	// Edit an item to the dblist
	// $args => 'name', 'oldkey', 'newKey', 'template', 'description'
	public function edit($args)
	{
		if ( isset($this->db[$args['newKey']]) && ($args['newKey']!==$args['oldKey']) ) {
			Log::set(__METHOD__.LOG_SEP.'The new key already exists. Key: '.$args['newKey'], LOG_TYPE_WARN);
			return false;
		}

		$this->db[$args['newKey']]['name'] 	= Sanitize::removeTags($args['name']);
		$this->db[$args['newKey']]['template'] 	= isset($args['template'])?Sanitize::removeTags($args['template']):'';
		$this->db[$args['newKey']]['description'] = isset($args['description'])?Sanitize::removeTags($args['description']):'';
		$this->db[$args['newKey']]['list'] 	= $this->db[$args['oldKey']]['list'];

		// Remove the old category
		if ($args['oldKey'] !== $args['newKey']) {
			unset( $this->db[$args['oldKey']] );
		}

		$this->sortAlphanumeric();
		$this->save();
		return $args['newKey'];
	}

	// Sort the categories by "Natural order"
	public function sortAlphanumeric()
	{
		// Sort key alphanumeric strings, a01, a10, b10, c02
		return ksort($this->db);
	}

	// Returns the name associated to the key, FALSE if the key doesn't exist
	public function getName($key)
	{
		if (isset($this->db[$key])) {
			return $this->db[$key]['name'];
		}
		return false;
	}

	// Returns an array with key=>name of the list
	public function getKeyNameArray()
	{
		$tmp = array();
		foreach($this->db as $key=>$fields) {
			$tmp[$key] = $fields['name'];
		}
		return $tmp;
	}

	// Returns the number of items in the list
	public function countItems($key)
	{
		if (isset($this->db[$key])) {
			return count($this->db[$key]['list']);
		}
		return 0;
	}

	public function exists($key)
	{
		return isset( $this->db[$key] );
	}

	public function existsName($name)
	{
		foreach ($this->db as $key=>$fields) {
			if ($name==$fields['name']) {
				return true;
			}
		}
		return false;
	}

	// Returns an array with a portion of the database filtered by key
	// Returns array( 'key'=>'', 'name'=>'', 'template'=>'', 'description'=>'', list'=>array() )
	public function getMap($key)
	{
		if (isset($this->db[$key])) {
			$tmp = $this->db[$key];
			$tmp['key'] = $key;
			return $tmp;
		}
		return false;
	}

}

================================================
FILE: bl-kernel/abstract/plugin.class.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

class Plugin
{

	// (string) directory name, just the name
	// Ex: sitemap
	public $directoryName;

	// (string) Absolute database filename and path
	// Ex: /www/bludit/bl-content/plugins/sitemap/db.php
	public $filenameDb;

	// (string) Absolute metadata filename and path
	// Ex: /www/bludit/bl-plugins/sitemap/metadata.json
	public $filenameMetadata;

	// (array) Plugin metadata
	// Ex: array('author'=>'',...., 'notes'=>'')
	public $metadata;

	// (string) Class name
	// Ex: pluginSitemap
	public $className;

	// (array) Database unserialized
	public $db;

	// (array) Database fields, only for initialize
	public $dbFields;

	// (boolean) Enable or disable default Save and Cancel button on plugin settings
	public $formButtons;

	// (array) List of custom hooks
	public $customHooks;

	function __construct()
	{
		$this->dbFields = array();
		$this->customHooks = array();

		$reflector = new ReflectionClass(get_class($this));

		// Directory name
		$this->directoryName = basename(dirname($reflector->getFileName()));

		// Class Name
		$this->className = $reflector->getName();

		$this->formButtons = true;

		// Call the method init() from the children
		$this->init();

		// Init empty database with default values
		$this->db = $this->dbFields;

		$this->filenameDb = PATH_PLUGINS_DATABASES . $this->directoryName . DS . 'db.php';

		// --- Metadata ---
		$this->filenameMetadata = PATH_PLUGINS . $this->directoryName() . DS . 'metadata.json';
		$metadataString = file_get_contents($this->filenameMetadata);
		$this->metadata = json_decode($metadataString, true);

		// If the plugin is installed then get the database
		if ($this->installed()) {
			$Tmp = new dbJSON($this->filenameDb);
			$this->db = $Tmp->db;
			$this->prepare();
		}
	}

	public function save()
	{
		$tmp = new dbJSON($this->filenameDb);
		$tmp->db = $this->db;
		return $tmp->save();
	}

	public function includeCSS($filename)
	{
		return '<link rel="stylesheet" type="text/css" href="' . $this->domainPath() . 'css/' . $filename . '?version=' . BLUDIT_VERSION . '">' . PHP_EOL;
	}

	public function includeJS($filename)
	{
		return '<script charset="utf-8" src="' . $this->domainPath() . 'js/' . $filename . '?version=' . BLUDIT_VERSION . '"></script>' . PHP_EOL;
	}

	// Returns absolute URL and path of the plugin directory
	// This function helps to include CSS or Javascript files with absolute URL
	public function domainPath()
	{
		return DOMAIN_PLUGINS . $this->directoryName . '/';
	}

	// Returns relative path of the plugin directory
	// This function helps to include CSS or Javascript files with relative URL
	public function htmlPath()
	{
		return HTML_PATH_PLUGINS . $this->directoryName . '/';
	}

	// Returns absolute path of the plugin directory
	// This function helps to include PHP libraries or some file at server level
	public function phpPath()
	{
		return PATH_PLUGINS . $this->directoryName . DS;
	}

	public function phpPathDB()
	{
		return PATH_PLUGINS_DATABASES . $this->directoryName . DS;
	}

	// Returns the value of the key from the metadata of the plugin, FALSE if the key doesn't exist
	public function getMetadata($key)
	{
		if (isset($this->metadata[$key])) {
			return $this->metadata[$key];
		}

		return false;
	}

	// Set a key / value on the metadata of the plugin
	public function setMetadata($key, $value)
	{
		$this->metadata[$key] = $value;
		return true;
	}

	// Returns the value of the field from the database
	// (string) $field
	// (boolean) $html, TRUE returns the value sanitized, FALSE unsanitized
	public function getValue($field, $html = true)
	{
		if (isset($this->db[$field])) {
			if ($html) {
				return $this->db[$field];
			} else {
				return Sanitize::htmlDecode($this->db[$field]);
			}
		}
		return $this->dbFields[$field];
	}

	public function label()
	{
		return $this->getMetadata('label');
	}

	public function name()
	{
		return $this->getMetadata('name');
	}

	public function description()
	{
		return $this->getMetadata('description');
	}

	public function author()
	{
		return $this->getMetadata('author');
	}

	public function email()
	{
		return $this->getMetadata('email');
	}

	public function website()
	{
		return $this->getMetadata('website');
	}

	public function position()
	{
		return $this->getValue('position');
	}

	public function version()
	{
		return $this->getMetadata('version');
	}

	public function releaseDate()
	{
		return $this->getMetadata('releaseDate');
	}

	public function className()
	{
		return $this->className;
	}

	public function formButtons()
	{
		return $this->formButtons;
	}

	public function isCompatible()
	{
		$bluditRoot = explode('.', BLUDIT_VERSION);
		$compatible = explode(',', $this->getMetadata('compatible'));
		foreach ($compatible as $version) {
			$root = explode('.', $version);
			if ($root[0] == $bluditRoot[0] && $root[1] == $bluditRoot[1]) {
				return true;
			}
		}
		return false;
	}

	public function directoryName()
	{
		return $this->directoryName;
	}

	// Return TRUE if the installation success, otherwise FALSE.
	public function install($position = 1)
	{
		if ($this->installed()) {
			return false;
		}

		// Create workspace
		$workspace = $this->workspace();
		mkdir($workspace, DIR_PERMISSIONS, true);

		// Create plugin directory for the database
		mkdir(PATH_PLUGINS_DATABASES . $this->directoryName, DIR_PERMISSIONS, true);

		$this->dbFields['position'] = $position;
		// Sanitize default values to store in the file
		foreach ($this->dbFields as $key => $value) {
			$value = Sanitize::html($value);
			settype($value, gettype($this->dbFields[$key]));
			$this->db[$key] = $value;
		}

		// Create the database
		return $this->save();
	}

	public function uninstall()
	{
		// Delete database
		$path = PATH_PLUGINS_DATABASES . $this->directoryName;
		Filesystem::deleteRecursive($path);

		// Delete workspace
		$workspace = $this->workspace();
		Filesystem::deleteRecursive($workspace);

		return true;
	}

	// Returns TRUE if the plugin is installed
	// This function just check if the database of the plugin is created
	public function installed()
	{
		return file_exists($this->filenameDb);
	}

	public function workspace()
	{
		return PATH_WORKSPACES . $this->directoryName . DS;
	}

	public function init()
	{
		// This method is used on children classes
		// The user can define his own field of the database
	}

	public function prepare()
	{
		// This method is used on children classes
		// The user can prepare the plugin, when it is installed
	}

	public function post()
	{
		$args = $_POST;
		foreach ($this->dbFields as $field => $value) {
			if (isset($args[$field])) {
				$finalValue = Sanitize::html($args[$field]);
				if ($finalValue === 'false') {
					$finalValue = false;
				} elseif ($finalValue === 'true') {
					$finalValue = true;
				}
				settype($finalValue, gettype($value));
				$this->db[$field] = $finalValue;
			}
		}
		return $this->save();
	}

	public function type()
	{
		return $this->getMetadata('type');
	}

	public function setField($field, $value)
	{
		$this->db[$field] = Sanitize::html($value);
		return $this->save();
	}

	public function setPosition($position)
	{
		return $this->setField('position', $position);
	}

	// Returns the parameters after the URI, FALSE if the URI doesn't match with the webhook
	// Example: https://www.mybludit.com/api/foo/bar
	public function webhook($URI = false, $returnsAfterURI = false, $fixed = true)
	{
		global $url;

		if (empty($URI)) {
			return false;
		}

		// Check URI start with the webhook
		$startString = HTML_PATH_ROOT . $URI;
		$URI = $url->uri();
		$length = mb_strlen($startString, CHARSET);
		if (mb_substr($URI, 0, $length) != $startString) {
			return false;
		}

		$afterURI = mb_substr($URI, $length);
		if (!empty($afterURI)) {
			if ($fixed) {
				return false;
			}
			if ($afterURI[0] != '/') {
				return false;
			}
		}

		if ($returnsAfterURI) {
			return $afterURI;
		}

		Log::set(__METHOD__ . LOG_SEP . 'Webhook requested.');
		return true;
	}
}


================================================
FILE: bl-kernel/admin/controllers/about.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// Title of the page
$layout['title'] = $L->g('About') . ' - ' . $layout['title'];

================================================
FILE: bl-kernel/admin/controllers/api.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

activatePlugin('pluginAPI');
$apiURL = DOMAIN_BASE.'api/';
$pluginAPI = getPlugin('pluginAPI');
$apiToken = $pluginAPI->getToken();
$username = $login->username();
$admin = new User($username);
$authToken = $admin->tokenAuth();
$output = array(
	'apiURL'=>$apiURL,
	'username'=>$username,
	'apiToken'=>$apiToken,
	'authToken'=>$authToken
);
exit(json_encode($output));

?>

================================================
FILE: bl-kernel/admin/controllers/categories.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Categories');

================================================
FILE: bl-kernel/admin/controllers/configure-plugin.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================
$plugin = false;
$pluginClassName = $layout['parameters'];

// Check if the plugin exists
if (isset($plugins['all'][$pluginClassName])) {
	$plugin = $plugins['all'][$pluginClassName];
} else {
	Redirect::page('plugins');
}

// Check if the plugin has the method form()
if (!method_exists($plugin, 'form')) {
	Redirect::page('plugins');
}

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	// Add to syslog
	$syslog->add(array(
		'dictionaryKey'=>'plugin-configured',
		'notes'=>$plugin->name()
	));

	// Call the method post of the plugin
	$plugin->post();
	Alert::set( $L->g('The changes have been saved') );
	Redirect::page('configure-plugin/'.$plugin->className());
}

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] = $L->g('Plugin').' - '.$plugin->name().' - '.$layout['title'];

================================================
FILE: bl-kernel/admin/controllers/content.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin', 'editor', 'author'));

// ============================================================================
// Functions
// ============================================================================

// Returns the content belongs to the current user if the user has the role Editor
function filterContentOwner($list) {
	global $login;
	global $pages;
	$tmp = array();
	foreach ($list as $pageKey) {
		if ($pages->db[$pageKey]['username']==$login->username()) {
			array_push($tmp, $pageKey);
		}
	}
	return $tmp;
}

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

$published = $pages->getList($url->pageNumber(), ITEMS_PER_PAGE_ADMIN);
$drafts = $pages->getDraftDB(true);
$scheduled = $pages->getScheduledDB(true);
$static = $pages->getStaticDB(true);
$sticky = $pages->getStickyDB(true);
$autosave = $pages->getAutosaveDB(true);

// If the user is an Author filter the content he/she can edit
if (checkRole(array('author'), false)) {
	$published 	= filterContentOwner($published);
	$drafts 	= filterContentOwner($drafts);
	$scheduled 	= filterContentOwner($scheduled);
	$static 	= filterContentOwner($static);
	$sticky 	= filterContentOwner($sticky);
}

// Check if out of range the pageNumber
if (empty($published) && $url->pageNumber()>1) {
	Redirect::page('content');
}

// Title of the page
$layout['title'] .= ' - '.$L->g('Manage content');

================================================
FILE: bl-kernel/admin/controllers/dashboard.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Functions
// ============================================================================
function updateBludit() {
	global $site;
	global $syslog;

	// New installation
	if ($site->currentBuild()==0) {
		$site->set(array('currentBuild'=>BLUDIT_BUILD));
	}

	// Check if Bludit need to be updated
	if ( ($site->currentBuild() < BLUDIT_BUILD) || isset($_GET['update']) ) {
		Log::set('UPDATE SYSTEM - Starting.');

		// Updates only for version less than Bludit v3.0 rc-3
		if ($site->currentBuild()<='20180910') {
			@mkdir(PATH_WORKSPACES, DIR_PERMISSIONS, true);
			$plugins = array('pluginVisitsStats', 'pluginRSS', 'pluginSitemap', 'pluginTimeMachineX', 'pluginBackup');
			foreach ($plugins as $plugin) {
				if (pluginActivated($plugin)) {
					Log::set('UPDATE SYSTEM - Re-enable plugin: '.$plugin);
					deactivatePlugin($plugin);
					activatePlugin($plugin);
				}
			}
		}

		// Updates only for version less than Bludit v3.1
		if ($site->currentBuild()<='20180921') {
			@mkdir(PATH_UPLOADS_PAGES, DIR_PERMISSIONS, true);
			$site->set(array('imageRelativeToAbsolute'=>true, 'imageRestrict'=>false));
		}

		// Set the current build number
		$site->set(array('currentBuild'=>BLUDIT_BUILD));
		Log::set('UPDATE SYSTEM - Finished.');

		// Add to syslog
		$syslog->add(array(
			'dictionaryKey'=>'system-updated',
			'notes'=>'Bludit v'.BLUDIT_VERSION
		));
	}
}

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// Try update Bludit
updateBludit();

// Title of the page
$layout['title'] .= ' - '.$L->g('Dashboard');

================================================
FILE: bl-kernel/admin/controllers/developers.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// This function is used on the VIEW to show the tables
function printTable($title, $array) {
	echo '<h2 class="mb-2 mt-4">'.$title.'</h2>';
	echo '<table class="table table-striped mt-3">
		<tbody>
	';

	foreach ($array as $key=>$value) {
		if($value===false) { $value = 'false'; }
		elseif($value===true) { $value = 'true'; }
		echo '<tr>';
		echo '<td>'.$key.'</td>';
		if (is_array($value)) {
			echo '<td>'.json_encode($value).'</td>';
		} else {
			echo '<td>'.Sanitize::html($value).'</td>';
		}
		echo '</tr>';
	}

	echo '
		</tbody>
		</table>
	';
}

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

$layout['title'] .= ' - '.$L->g('Developers');

================================================
FILE: bl-kernel/admin/controllers/edit-category.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	if ($_POST['action']=='delete') {
		deleteCategory($_POST);
	} elseif ($_POST['action']=='edit') {
		editCategory($_POST);
	}

	Redirect::page('categories');
}

// ============================================================================
// Main after POST
// ============================================================================
$categoryKey = $layout['parameters'];

if (!$categories->exists($categoryKey)) {
	Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to get the category: '.$categoryKey);
	Redirect::page('categories');
}

$categoryMap = $categories->getMap($categoryKey);

// Title of the page
$layout['title'] .= ' - '.$L->g('Edit Category').' [ '.$categoryMap['name'] . ' ] ';

================================================
FILE: bl-kernel/admin/controllers/edit-content.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

if (checkRole(array('author'), false)) {
	try {
		$pageKey = isset($_POST['key']) ? $_POST['key'] : $layout['parameters'];
		$page = new Page($pageKey);
	} catch (Exception $e) {
		Alert::set($L->g('You do not have sufficient permissions'));
		Redirect::page('dashboard');
	}

	if ($page->username()!==$login->username()) {
		// Add to syslog
		$syslog->add(array(
			'dictionaryKey'=>'access-denied',
			'notes'=>$login->username()
		));

		Alert::set($L->g('You do not have sufficient permissions'));
		Redirect::page('dashboard');
	}
}

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	if ($_POST['type']==='delete') {
		// Get the page type before deleting to redirect to the correct tab
		if (empty($_POST['tab'])) {
			try {
				$pageToDelete = new Page($_POST['key']);
				$pageType = $pageToDelete->type();
				if ($pageType === 'autosave') {
					$_POST['tab'] = 'autosave';
				} elseif ($pageType === 'draft') {
					$_POST['tab'] = 'draft';
				} elseif ($pageType === 'scheduled') {
					$_POST['tab'] = 'scheduled';
				} elseif ($pageType === 'static') {
					$_POST['tab'] = 'static';
				} else {
					$_POST['tab'] = 'pages';
				}
			} catch (Exception $e) {
				$_POST['tab'] = 'pages';
			}
		}

		if (deletePage($_POST['key'])) {
			Alert::set( $L->g('The changes have been saved') );
		}
	} else {
		$key = editPage($_POST);
		if ($key!==false) {
			Alert::set( $L->g('The changes have been saved') );
			Redirect::page('edit-content/'.$key);
		}
	}

	if (!empty($_POST['tab'])) {
		$tab = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['tab']);
		Redirect::page('content#'.$tab);
	}
	Redirect::page('content');
}

// ============================================================================
// Main after POST
// ============================================================================
try {
	$pageKey = $layout['parameters'];
	$page = new Page($pageKey);
} catch (Exception $e) {
	Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to get the page: '.$pageKey, LOG_TYPE_ERROR);
	Redirect::page('content');
}

// Images prefix directory
define('PAGE_IMAGES_KEY', $page->uuid());

// Images and thubmnails directories
if (IMAGE_RESTRICT) {
	define('PAGE_IMAGES_DIRECTORY', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : HTML_PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/'));
	define('PAGE_IMAGES_URL', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : DOMAIN_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/'));
	define('PAGE_THUMBNAILS_DIRECTORY', PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.DS.'thumbnails'.DS);
	define('PAGE_THUMBNAILS_HTML', HTML_PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/thumbnails/');
	define('PAGE_THUMBNAILS_URL', DOMAIN_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/thumbnails/');
} else {
	define('PAGE_IMAGES_DIRECTORY', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : HTML_PATH_UPLOADS));
	define('PAGE_IMAGES_URL', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : DOMAIN_UPLOADS));
	define('PAGE_THUMBNAILS_DIRECTORY', PATH_UPLOADS_THUMBNAILS);
	define('PAGE_THUMBNAILS_HTML', HTML_PATH_UPLOADS_THUMBNAILS);
	define('PAGE_THUMBNAILS_URL', DOMAIN_UPLOADS_THUMBNAILS);
}

// Title of the page
$layout['title'] .= ' - '.$L->g('Edit content').' - '.$page->title();


================================================
FILE: bl-kernel/admin/controllers/edit-user.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	// Prevent non-administrators to change other users
	if ($login->role()!=='admin') {
		$_POST['username'] = $login->username();
		unset($_POST['role']);
	}

	if (isset($_POST['deleteUserAndDeleteContent']) && ($login->role()==='admin')) {
		$_POST['deleteContent'] = true;
		deleteUser($_POST);
	} elseif (isset($_POST['deleteUserAndKeepContent']) && ($login->role()==='admin')) {
		$_POST['deleteContent'] = false;
		deleteUser($_POST);
	} elseif (isset($_POST['disableUser']) && ($login->role()==='admin')) {
		disableUser(array('username'=>$_POST['username']));
	} else {
		editUser($_POST);
	}

	Alert::set($L->g('The changes have been saved'));

	if ($login->role()==='admin') {
		Redirect::page('users');
	}
	Redirect::page('edit-user/'.$login->username());
}

// ============================================================================
// Main after POST
// ============================================================================

$username = $layout['parameters'];

// Prevent non-administrators to change other users
if ($login->role()!=='admin') {
	$username = $login->username();
}

try {
	$user = new User($username);
} catch (Exception $e) {
	Redirect::page('users');
}

// Title of the page
$layout['title'] = $L->g('Edit user').' - '.$layout['title'];

================================================
FILE: bl-kernel/admin/controllers/install-plugin.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================
$pluginClassName = $layout['parameters'];
if (!activatePlugin($pluginClassName)) {
	Log::set('Fail when try to activate the plugin.', LOG_TYPE_ERROR);
}

if (isset($plugins['all'][$pluginClassName])) {
	$plugin = $plugins['all'][$pluginClassName];
} else {
	Redirect::page('plugins');
}

if (method_exists($plugin, 'form')) {
	Redirect::page('configure-plugin/'.$pluginClassName);
}

Redirect::page('plugins#'.$pluginClassName);


================================================
FILE: bl-kernel/admin/controllers/install-theme.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================
$themeDirectory = $layout['parameters'];

// Activate theme
activateTheme($themeDirectory);

// Redirect
Redirect::page('themes');


================================================
FILE: bl-kernel/admin/controllers/login.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

// ============================================================================
// Functions
// ============================================================================

function checkLogin($args)
{
	global $security;
	global $login;
	global $L;

	if ($security->isBlocked()) {
		Alert::set($L->g('IP address has been blocked').'<br>'.$L->g('Try again in a few minutes'), ALERT_STATUS_FAIL);
		return false;
	}

	if ($login->verifyUser($_POST['username'], $_POST['password'])) {
		if (isset($_POST['remember'])) {
			$login->setRememberMe($_POST['username']);
		}
		// Renew the token. This token will be the same inside the session for multiple forms.
		$security->generateTokenCSRF();

		if (isset($_GET['enableAPI'])) {
			Redirect::page('api');
		}
		Redirect::page('dashboard');
		return true;
	}

	// Bruteforce protection, add IP to the blacklist
	$security->addToBlacklist();

	// Create alert
	Alert::set($L->g('Username or password incorrect'), ALERT_STATUS_FAIL);
	return false;
}

function checkRememberMe()
{
	global $security;
	global $login;

	if ($security->isBlocked()) {
		return false;
	}

	if ($login->verifyUserByRemember()) {
		$security->generateTokenCSRF();
		Redirect::page('dashboard');
		return true;
	}

	return false;
}

// ============================================================================
// Main before POST
// ============================================================================

if ($_SERVER['REQUEST_METHOD']!=='POST') {
	checkRememberMe();
}

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD']=='POST') {
	checkLogin($_POST);
}

// ============================================================================
// Main after POST
// ============================================================================


================================================
FILE: bl-kernel/admin/controllers/logout.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

if ($login->logout()) {
	Redirect::admin();
}


================================================
FILE: bl-kernel/admin/controllers/new-category.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	if (createCategory($_POST)) {
		Redirect::page('categories');
	}
}

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('New category');

================================================
FILE: bl-kernel/admin/controllers/new-content.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin', 'editor', 'author'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	createPage($_POST);
	Redirect::page('content');
}

// ============================================================================
// Main after POST
// ============================================================================

// UUID of the page is need it for autosave and media manager
$uuid = $pages->generateUUID();

// Images prefix directory
define('PAGE_IMAGES_KEY', $uuid);

// Images and thubmnails directories
if (IMAGE_RESTRICT) {
	define('PAGE_IMAGES_DIRECTORY', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : HTML_PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/'));
	define('PAGE_IMAGES_URL', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : DOMAIN_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/'));
	define('PAGE_THUMBNAILS_DIRECTORY', PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.DS.'thumbnails'.DS);
	define('PAGE_THUMBNAILS_HTML', HTML_PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/thumbnails/');
	define('PAGE_THUMBNAILS_URL', DOMAIN_UPLOADS_PAGES.PAGE_IMAGES_KEY.'/thumbnails/');
} else {
	define('PAGE_IMAGES_DIRECTORY', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : HTML_PATH_UPLOADS));
	define('PAGE_IMAGES_URL', (IMAGE_RELATIVE_TO_ABSOLUTE? '' : DOMAIN_UPLOADS));
	define('PAGE_THUMBNAILS_DIRECTORY', PATH_UPLOADS_THUMBNAILS);
	define('PAGE_THUMBNAILS_HTML', HTML_PATH_UPLOADS_THUMBNAILS);
	define('PAGE_THUMBNAILS_URL', DOMAIN_UPLOADS_THUMBNAILS);
}

// Title of the page
$layout['title'] = $L->g('New content').' - '.$layout['title'];

================================================
FILE: bl-kernel/admin/controllers/new-user.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	if (createUser($_POST)) {
		Redirect::page('users');
	}
}

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Add a new user');

================================================
FILE: bl-kernel/admin/controllers/plugins-position.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	changePluginsPosition(explode(',',$_POST['plugin-list']));
	Redirect::page('plugins-position');
}
// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Plugins');

================================================
FILE: bl-kernel/admin/controllers/plugins.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Plugins');

================================================
FILE: bl-kernel/admin/controllers/settings.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	editSettings($_POST);
	Redirect::page('settings');
}

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Advanced Settings');

================================================
FILE: bl-kernel/admin/controllers/themes.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Main after POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

$themes = buildThemes();

// Title of the page
$layout['title'] .= ' - '.$L->g('Themes');

================================================
FILE: bl-kernel/admin/controllers/uninstall-plugin.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================
$pluginClassName = $layout['parameters'];
deactivatePlugin($pluginClassName);
Redirect::page('plugins');

================================================
FILE: bl-kernel/admin/controllers/user-password.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main before POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	// Prevent non-administrators to change other users
	$username = $_POST['username'];
	if ($login->role()!=='admin') {
	    $username = $login->username();
	}

	if (changeUserPassword(array(
		'username'=>$username,
		'newPassword'=>$_POST['newPassword'],
		'confirmPassword'=>$_POST['confirmPassword']
	))) {
		if ($login->role()==='admin') {
			Redirect::page('users');
		}
		Redirect::page('edit-user/'.$login->username());
	}
}

// ============================================================================
// Main after POST
// ============================================================================

// Prevent non-administrators to change other users
if ($login->role()!=='admin') {
	$layout['parameters'] = $login->username();
}

try {
	$username = $layout['parameters'];
	$user = new User($username);
} catch (Exception $e) {
	Redirect::page('users');
}

// Title of the page
$layout['title'] = $L->g('Change password').' - '.$layout['title'];

================================================
FILE: bl-kernel/admin/controllers/users.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

// ============================================================================
// Check role
// ============================================================================

checkRole(array('admin'));

// ============================================================================
// Functions
// ============================================================================

// ============================================================================
// Main after POST
// ============================================================================

// ============================================================================
// POST Method
// ============================================================================

if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
	$site->set($_POST);
}

// ============================================================================
// Main after POST
// ============================================================================

// Title of the page
$layout['title'] .= ' - '.$L->g('Users');

================================================
FILE: bl-kernel/admin/themes/booty/css/bludit.bootstrap.css
================================================
a {
	color: var(--primary-blue, #1e88e5);
	transition: color 0.2s ease;
}

a:hover {
	color: var(--primary-blue-dark, #1565c0);
	text-decoration: none;
}

.bg-success {
	background-color: #8BC34A!important;
}

.text-primary {
	color: var(--primary-blue, #1e88e5)!important;
}

.text-danger {
	color: #D40000!important;
}
a.text-danger:focus,
a.text-danger:hover {
	color: #790000!important;
}

/* Buttons */
.btn {
	font-weight: var(--font-weight-medium, 550);
	font-size: var(--font-size-base, 0.945rem);
	padding: 12px 24px;
	border-radius: var(--radius-sm, 4px);
	transition: all 0.3s ease;
}

.btn-primary {
	background: var(--primary-blue, #0078D4);
	border: none;
	font-weight: var(--font-weight-semibold, 650);
}

.btn-primary:hover {
	background: var(--primary-blue-dark, #005A9E);
	border: none;
	transform: translateY(-1px);
}

.btn-secondary {
	background-color: var(--color-secondary, #64748B);
	border: none;
	font-weight: var(--font-weight-semibold, 650);
}

.btn-secondary:hover {
	background-color: var(--color-secondary-dark, #475569);
	border: none;
	transform: translateY(-1px);
}

.btn-light {
	background-color: var(--bg-light, #f8f9fa);
	border: 2px solid var(--border-color, #e2e8f0);
	font-weight: var(--font-weight-medium, 550);
}

.btn-light:hover {
	background-color: var(--bg-sidebar, #F1F5F9);
	border-color: var(--border-light, #cbd5e1);
	transform: translateY(-1px);
}

.btn-danger {
	background: var(--color-danger, #DC2626);
	border: none;
	font-weight: var(--font-weight-semibold, 650);
}

.btn-danger:hover {
	background: var(--color-danger-dark, #B91C1C);
	border: none;
	transform: translateY(-1px);
}

.btn-success {
	background: var(--color-success, #16A34A);
	border: none;
	font-weight: var(--font-weight-semibold, 650);
}

.btn-success:hover {
	background: var(--color-success-dark, #15803D);
	border: none;
	transform: translateY(-1px);
}

.btn-sm {
	padding: 8px 16px;
	font-size: var(--font-size-sm, 0.925rem);
}

.btn-lg {
	padding: 16px 32px;
	font-size: var(--font-size-lg, 1.08rem);
}

.btn-light.focus, .btn-light:focus {
	box-shadow: none;
}

.btn.focus, .btn:focus {
	box-shadow: none;
}

/* Form */
.form-control {
	font-size: var(--font-size-base, 0.945rem);
	font-weight: var(--font-weight-normal, 450);
	padding: 12px 16px;
	border: 2px solid var(--border-color, #e2e8f0);
	border-radius: var(--radius-sm, 4px);
	transition: all 0.2s ease;
}

label {
	font-weight: var(--font-weight-semibold, 650);
	color: var(--text-primary, #0F172A);
	margin-bottom: 8px;
	font-size: var(--font-size-base, 0.945rem);
}

/* Cards */
.card {
	border: none;
	border-radius: var(--radius-md, 8px);
}

.card:hover {
}

.card-header {
	background: transparent;
	border-bottom: 1px solid var(--border-color, #e2e8f0);
	font-weight: var(--font-weight-bold, 750);
	font-size: var(--font-size-lg, 1.08rem);
}

/* Tables */
.table-striped tbody tr:nth-of-type(odd) {
	background-color: var(--bg-warm, #faf8f5);
}

.table-striped tbody tr:hover {
	background-color: var(--bg-warm-card, #f7f5f2);
}

.table thead th {
	font-size: var(--font-size-xs, 0.8rem);
	text-transform: uppercase!important;
	font-weight: var(--font-weight-bold, 750);
	color: var(--text-secondary, #475569);
	letter-spacing: 0.8px;
	border-bottom: 2px solid var(--border-color, #e2e8f0);
}

.table td {
	font-size: var(--font-size-base, 0.945rem);
	font-weight: var(--font-weight-normal, 450);
	vertical-align: middle;
}

/* Headings */
h1, h2, h3, h4, h5, h6 {
	color: var(--text-primary, #0F172A);
	font-weight: var(--font-weight-bold, 750);
	letter-spacing: -0.02em;
}

h1 { font-size: var(--font-size-3xl, 2.25rem); }
h2 { font-size: var(--font-size-2xl, 1.75rem); }
h3 { font-size: var(--font-size-xl, 1.4rem); }
h4 { font-size: var(--font-size-lg, 1.08rem); }
h5 { font-size: var(--font-size-base, 0.945rem); }
h6 { font-size: var(--font-size-sm, 0.925rem); }

/* Badge */
.badge {
	font-size: var(--font-size-xs, 0.8rem);
	font-weight: var(--font-weight-semibold, 650);
	padding: 6px 12px;
	border-radius: var(--radius-sm, 4px);
}

.badge-primary {
	background: var(--primary-blue, #0078D4);
}


================================================
FILE: bl-kernel/admin/themes/booty/css/bludit.css
================================================
:root {
	/* Dynamic font sizing */
	--font-size-xs: 0.72rem;
	--font-size-sm: 0.833rem;
	--font-size-base: 0.945rem;
	--font-size-lg: 1.08rem;
	--font-size-xl: 1.26rem;
	--font-size-2xl: 1.575rem;
	--font-size-3xl: 2.025rem;

	/* Font weights */
	--font-weight-normal: 450;
	--font-weight-medium: 550;
	--font-weight-semibold: 650;
	--font-weight-bold: 750;

	/* Royal Azure Solid Blue colors */
	--primary-blue: #0078D4;
	--primary-blue-dark: #005A9E;
	--primary-blue-darker: #004578;
	--primary-gradient: #0078D4;

	/* UI colors */
	--bg-main: #F8FAFC;
	--bg-sidebar: #F1F5F9;
	--text-primary: #1E293B;
	--text-secondary: #475569;
	--text-muted: #94A3B8;
	--border-color: #E2E8F0;
	--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
	--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);

	/* Warm neutral accents */
	--bg-warm: #faf8f5;
	--bg-warm-card: #f7f5f2;
	--border-warm: #e8e6e3;

	/* Radius scale */
	--radius-sm: 4px;
	--radius-md: 8px;

	/* Semantic colors */
	--color-info: #0078D4;
	--color-danger: #DC2626;
	--color-danger-dark: #B91C1C;
	--color-success: #16A34A;
	--color-success-dark: #15803D;
	--color-secondary: #64748B;
	--color-secondary-dark: #475569;
	--bg-card: #FFFFFF;
	--bg-light: #f8f9fa;
	--border-light: #cbd5e1;
	--primary-blue-hover-bg: rgba(0, 120, 212, 0.06);
}

html {
	height: 100%;
	font-size: var(--font-size-base);
	background: var(--bg-main);
}

body {
	background: var(--bg-main);
	color: var(--text-primary);
	font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
	line-height: 1.6;
	font-weight: var(--font-weight-normal);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* Prevent events in iframes */
/* iframe{
	pointer-events: none;
} */

/*
	ICONS
*/
.fa {
	margin-right: .5rem !important;
	line-height: inherit;
}

/*
	SIDEBAR
*/

div.sidebar {
	background: var(--bg-sidebar);
	border-right: 1px solid var(--border-color);
	border-left: 1px solid var(--border-color);
	padding: 10px 15px;
}

div.sidebar .nav-item a {
	padding-left: 5px;
	padding-right: 5px;
	color: var(--text-primary);
	padding-top: 6px;
	padding-bottom: 6px;
	font-size: var(--font-size-base);
	font-weight: var(--font-weight-normal);
	transition: color 0.2s ease, transform 0.2s ease;
}

div.sidebar .nav-item a:hover {
	color: var(--primary-blue);
	transform: translateX(3px);
}

div.sidebar .nav-item a.active,
div.sidebar .nav-item a:focus {
	color: var(--primary-blue);
}

div.sidebar .nav-item h4 {
	font-size: var(--font-size-xs);
	text-transform: uppercase;
	font-weight: var(--font-weight-bold);
	margin-top: 15px;
	padding-left: 5px;
	color: var(--text-secondary);
	letter-spacing: 0.8px;
}

/*
	QUICK SEARCH - SPOTLIGHT STYLE
*/

/* Trigger Button */
.quick-search-trigger {
	position: relative;
	width: 100%;
	padding: 16px;
	background: white;
	border: 2px solid var(--border-color);
	border-radius: var(--radius-sm);
	display: flex;
	align-items: center;
	gap: 12px;
	cursor: pointer;
	transition: all 0.2s ease;
}

.quick-search-trigger:hover {
	border-color: var(--primary-blue);
}

.quick-search-trigger .quick-search-icon {
	width: 40px;
	height: 40px;
	border-radius: var(--radius-sm);
	background: var(--primary-gradient);
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
}

.quick-search-trigger .quick-search-icon .fa {
	color: white;
	font-size: 16px;
	margin: 0 !important;
}

.quick-search-text {
	flex: 1;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

#hello-text {
	color: var(--text-primary);
	font-size: var(--font-size-base);
	font-weight: var(--font-weight-medium);
}

.quick-search-hint {
	color: var(--text-secondary);
	font-size: var(--font-size-sm);
	font-weight: var(--font-weight-normal);
}

.quick-search-shortcut {
	padding: 6px 12px;
	background: var(--bg-main);
	border: 1px solid var(--border-color);
	border-radius: var(--radius-sm);
	font-size: var(--font-size-sm);
	color: var(--text-secondary);
	font-weight: var(--font-weight-medium);
	font-family: monospace;
}

/* Modal Overlay */
.quick-search-modal {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	z-index: 9999;
	display: none;
	align-items: flex-start;
	justify-content: center;
	padding-top: 15vh;
}

.quick-search-modal.active {
	display: flex;
}

.quick-search-overlay {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background: rgba(0, 0, 0, 0.6);
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
	animation: fadeIn 0.2s ease;
}

@keyframes fadeIn {
	from { opacity: 0; }
	to { opacity: 1; }
}

/* Modal Content */
.quick-search-content {
	position: relative;
	width: 90%;
	max-width: 680px;
	max-height: 80vh;
	background: var(--bg-card);
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-md);
	animation: slideDown 0.3s cubic-bezier(0.16, 1, 0.3, 1);
	overflow: hidden;
	display: flex;
	flex-direction: column;
}

@keyframes slideDown {
	from {
		opacity: 0;
		transform: translateY(-20px) scale(0.96);
	}
	to {
		opacity: 1;
		transform: translateY(0) scale(1);
	}
}

.quick-search-header {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 24px;
	border-bottom: 1px solid var(--border-color);
	flex-shrink: 0;
}

.quick-search-header .fa-search {
	color: var(--text-secondary);
	font-size: 22px;
	margin: 0 !important;
	flex-shrink: 0;
}

.quick-search-input {
	flex: 1;
	border: none !important;
	background: transparent !important;
	padding: 0 !important;
	font-size: var(--font-size-xl) !important;
	font-weight: var(--font-weight-normal) !important;
	outline: none !important;
	box-shadow: none !important;
	line-height: 1.5 !important;
}

.quick-search-input::placeholder {
	color: var(--text-muted) !important;
	font-size: var(--font-size-xl) !important;
}

.quick-search-results {
	flex: 1;
	overflow-y: auto;
	min-height: 150px;
	max-height: calc(80vh - 120px);
}

.search-no-results {
	padding: 32px 24px;
	text-align: center;
	color: var(--text-secondary);
	font-size: var(--font-size-base);
}

.search-suggestion {
	display: block;
	padding: 12px 16px;
	transition: background 0.15s ease;
	cursor: pointer;
	border-bottom: 1px solid rgba(0, 0, 0, 0.04);
	text-decoration: none;
	color: inherit;
}

.search-suggestion:last-child {
	border-bottom: none;
}

.search-suggestion:hover {
	background: var(--primary-blue-hover-bg);
}

.search-suggestion .fa {
	color: var(--primary-blue);
	margin-right: 14px !important;
	width: 22px;
	text-align: center;
	font-size: 16px;
}

.search-suggestion-item {
	font-weight: var(--font-weight-medium);
	color: var(--text-primary);
	margin-bottom: 6px;
	font-size: var(--font-size-lg);
	line-height: 1.4;
}

.search-suggestion-options {
	font-size: var(--font-size-sm);
	padding-top: 4px;
}

.search-suggestion-options a {
	color: var(--primary-blue);
	margin-right: 16px;
	font-weight: var(--font-weight-medium);
	text-decoration: none;
	transition: color 0.2s ease;
}

.search-suggestion-options a:hover {
	color: var(--primary-blue-dark);
	text-decoration: underline;
}

/*
	BOOTSTRAP Hacks
*/

@media (min-width: 1200px) {
	.container {
		max-width: 1600px;
	}
}

/* for small devices */
@media (max-width: 575.98px) {

	#jsmediaManagerButton,
	#jscategoryButton,
	#jsdescriptionButton {
		width: 100%;
		text-align: left;
	}
}




.btn-light {
	color: #212529;
	background-color: #f3f3f3;
	border-color: #ced4d9;
}

.btn-form {
	background-color: #F3F3F3;
	border-color: #DDD;
	color: #000;
}

.btn-form:hover {
	background-color: rgb(228, 228, 228);
	border-color: #DDD;
	color: #000;
}



code {
	padding: 3px 5px 2px;
	margin: 0 1px;
	background: #eaeaea;
	background: rgba(0, 0, 0, .07);
	color: #444;
}

.list-group-sortable {
	cursor: pointer;
}

.modal-body {
	padding: 2rem;
}

.modal-footer {
	background-color: rgb(247, 247, 247);
}

.modal-dialog .btn-link {
	color: #000;
}

/*
	LOGIN
*/

body.login {
	background: rgb(255, 255, 255);
	background: linear-gradient(0deg, rgba(255, 255, 255, 1) 0%, rgba(250, 250, 250, 1) 53%);
	height: 100%;
}


/*
	DASHBOARD
*/

#dashboard ul.list-group.list-group-striped {
	border: 1px solid var(--border-color);
	border-radius: var(--radius-md);
	overflow: hidden;
	background: var(--bg-card);
}

#dashboard ul.list-group.list-group-striped li {
	border: none;
	overflow-wrap: anywhere;
	font-size: var(--font-size-sm);
	font-weight: var(--font-weight-normal);
	padding: 10px 18px;
	color: var(--text-primary);
	transition: background 0.2s ease;
}

#dashboard ul.list-group.list-group-striped li:first-child {
	background: var(--bg-card);
	color: var(--text-primary);
	padding: 14px 18px;
	border-bottom: 1px solid var(--border-color);
}

#dashboard ul.list-group.list-group-striped li:first-child h4 {
	color: var(--text-primary);
	font-size: var(--font-size-sm);
	font-weight: var(--font-weight-bold);
	text-transform: uppercase;
	letter-spacing: 0.6px;
	margin: 0;
}

#dashboard ul.list-group.list-group-striped li:nth-of-type(even):not(:first-child) {
	background: var(--bg-light);
}

#dashboard ul.list-group.list-group-striped li:hover:not(:first-child) {
	background: var(--primary-blue-hover-bg);
}

#dashboard ul.list-group.list-group-striped li .notification-date {
	color: var(--text-secondary);
	font-size: var(--font-size-xs);
	margin-top: 2px;
	display: block;
}

#dashboard div.quick-links-icons {
	font-size: 2.5em;
	width: 100%;
}

#dashboard a.quick-links {
	color: var(--text-secondary);
	transition: all 0.2s ease;
}

#dashboard a.quick-links:hover {
	text-decoration: none;
	color: var(--primary-blue);
	transform: translateY(-2px);
}


/*
	DASHBOARD METRIC CARDS
*/

.card.metric-card {
	border: 1px solid var(--border-color);
	border-radius: var(--radius-md);
	height: 100%;
	background: var(--bg-card);
	box-shadow: none;
}

.card.metric-card .card-body > .d-flex {
	padding-bottom: 12px;
	border-bottom: 1px solid var(--border-color);
}

.metric-card .card-body {
	padding: 22px;
}

.metric-card .card-title {
	font-size: var(--font-size-sm);
	font-weight: var(--font-weight-bold);
	color: var(--text-secondary);
	text-transform: uppercase;
	letter-spacing: 0.6px;
	margin: 0;
}

.metric-value {
	font-size: var(--font-size-2xl);
	font-weight: var(--font-weight-bold);
	color: var(--text-primary);
	line-height: 1.2;
	margin-bottom: 4px;
}

.metric-label {
	font-size: var(--font-size-xs);
	color: var(--text-muted);
	font-weight: var(--font-weight-medium);
	text-transform: uppercase;
	letter-spacing: 0.5px;
}

.metric-card-list {
	max-height: 300px;
	overflow-y: auto;
}


/*
	DASHBOARD ANALYTICS SECTION
*/

.analytics-section {
	padding: 22px;
	border: 1px solid var(--border-color);
	border-radius: var(--radius-md);
	background: var(--bg-card);
}

#dashboard .analytics-section ul.list-group.list-group-striped {
	border: none;
	border-radius: 0;
	background: transparent;
}

#dashboard .analytics-section ul.list-group.list-group-striped li:first-child {
	padding: 0 0 12px 0;
	background: transparent;
	border-bottom: 1px solid var(--border-color);
}

/*
	ALERT
*/

#alert {
	display: none;
	position: fixed;
	text-align: center;
	border-radius: var(--radius-md);
	border: 0;
	z-index: 1000;
	bottom: 20px;
	right: 20px;
	margin: 0;
	font-size: var(--font-size-base);
	padding: 16px 24px;
}

.alert-success {
	background: var(--primary-gradient);
	border-left: none !important;
	color: #ffffff;
}

.alert-danger {
	background: var(--color-danger);
	border-left: none !important;
	color: #ffffff;
}



/*
	PLUGINS
*/

.plugin-form label {
	display: block;
	margin-top: 1rem !important;
}

.plugin-form input[type="text"],
.plugin-form textarea,
.plugin-form select {
	display: block;
	width: 100%;
	padding: 8px 12px;
	font-size: var(--font-size-base);
	line-height: 1.5;
	color: var(--text-primary);
	background-color: var(--bg-card);
	background-clip: padding-box;
	border: 1px solid var(--border-color);
	border-radius: var(--radius-sm);
	transition: border-color .15s ease-in-out;
}

.plugin-form textarea {
	min-height: 120px;
}

.plugin-form span.tip {
	display: block;
	font-size: 80%;
	font-weight: 400;
	margin-top: .25rem;
	color: #6c757d !important;
}

/*
	Manage > Content
*/

td.child {
	padding-left: 30px;
}

/* Truncate the URL column with ellipsis when it doesn't fit. */
td.contentURL a {
	display: inline-block;
	max-width: 30em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	vertical-align: middle;
}

/* Kebab actions dropdown */
.actionsDropdownToggle {
	line-height: 1;
	font-size: 1.25rem;
}

.actionsDropdownToggle:focus,
.actionsDropdownToggle:hover {
	text-decoration: none;
	color: var(--text-primary, #1E293B);
}

.actionsDropdownToggle:focus-visible {
	outline: 2px solid var(--primary-blue);
	outline-offset: 2px;
}

.actionsDropdown .dropdown-item i.fa {
	width: 1.25em;
	text-align: center;
}

/*
	Manage > New Content
*/

#jseditor {
	background: #fff;
	padding: 10px 5% !important;
	font-size: 16px;
	line-height: 1.5em;
	border: 1px solid #ced4da;
}

#jseditorSidebar {
	display: none;
	height: calc(100% - 45px);
	width: 50%;
	max-width: 350px;
	position: absolute;
	z-index: 50;
	top: 45px;
	right: 15px;
	background-color: #fff;
	overflow-x: hidden;
	transition: 0.5s;
	border-left: 1px solid #ccc;
	border-right: 1px solid #ccc;
	border-top: 1px solid #ccc;
}

@media (max-width: 575.98px) {
	#jseditorSidebar {
		width: 100%;
		max-width: 100%;
		right: 0;
	}

	#jseditorToolbarRight button {
		font-size: 0px !important;
	}

	#jseditorToolbarRight button span {
		font-size: 16px !important;
	}

	.contentTools .btn {
		font-size: 0px !important;
		margin-right: 5px;
	}

	.contentTools .btn span {
		font-size: 16px !important;
	}
}

#jseditorSidebar nav {
	background: #f3f3f3;
}

#jseditorSidebar nav a {
	color: #000;
}

#jseditorSidebar .nav-tabs .nav-link {
	border: none;
}

#jseditorSidebar .nav-link.active {
	background: none;
	border: none;
	border-bottom: 3px solid #ccc;
}

#jsshadow {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	background-color: rgba(72, 72, 72, 0.7);
	z-index: 10;
	display: none;
}

img.profilePicture {
	width: 30px;
	height: 30px;
	border-radius: 4px;
	border: 1px solid #ccc;
}

/* Switch button */
.switch-button {
	font-size: 0.9em;
	text-transform: uppercase;
	cursor: pointer;
}

.switch-icon-publish {
	color: #1cb11c;
}

/* Subtle focus style for form elements */
input:focus,
textarea:focus,
select:focus,
.form-control:focus,
.custom-select:focus,
.btn:focus {
	border-color: #b0bec5 !important;
	box-shadow: none !important;
	outline: none !important;
}


================================================
FILE: bl-kernel/admin/themes/booty/html/alert.php
================================================
<script charset="utf-8">
	function showAlert(text) {
		console.log("[INFO] Function showAlert() called.");
		$("#alert").html(text);
		$("#alert").slideDown().delay(<?php echo ALERT_DISAPPEAR_IN*1000 ?>).slideUp();
	}

	<?php if (Alert::defined()): ?>
	setTimeout(function(){ showAlert("<?php echo Alert::get() ?>") }, 500);
	<?php endif; ?>

	$(window).click(function() {
		$("#alert").hide();
	});
</script>

<div id="alert" class="alert <?php echo (Alert::status()==ALERT_STATUS_FAIL)?'alert-danger':'alert-success' ?>"></div>


================================================
FILE: bl-kernel/admin/themes/booty/html/media.php
================================================
<?php
// Preload the first chunk of files to avoid an AJAX round-trip the first time
// the Media Manager is opened. Scans originals and resolves each thumbnail,
// mirroring the shape returned by ajax/list-images.
if (IMAGE_RESTRICT) {
	$mediaImagesPath = PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.DS;
	$mediaThumbnailsPath = PATH_UPLOADS_PAGES.PAGE_IMAGES_KEY.DS.'thumbnails'.DS;
} else {
	$mediaImagesPath = PATH_UPLOADS;
	$mediaThumbnailsPath = PATH_UPLOADS_THUMBNAILS;
}
$listOfFilesByPage = mediaManagerListImages($mediaImagesPath, $mediaThumbnailsPath, MEDIA_MANAGER_NUMBER_OF_FILES);
$preLoadFiles = !empty($listOfFilesByPage[0]) ? $listOfFilesByPage[0] : array();

// Amount of pages for the paginator
$numberOfPages = count($listOfFilesByPage);
?>

<div id="jsmediaManagerModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="container-fluid">
<div class="row">
	<div class="col p-3">

	<!--
		UPLOAD INPUT
	-->
		<h3 class="mt-2 mb-3"><i class="fa fa-image"></i> <?php $L->p('Images'); ?></h3>

		<div id="jsalertMedia" class="alert alert-warning d-none" role="alert"></div>

		<!-- Form and Input file -->
		<form name="bluditFormUpload" id="jsbluditFormUpload" enctype="multipart/form-data">
			<div class="custom-file">
				<input type="file" class="custom-file-input" id="jsimages" name="images[]" multiple>
				<label class="custom-file-label" for="jsimages"><?php $L->p('Choose images to upload'); ?></label>
			</div>
		</form>

		<!-- Progress bar -->
		<div class="progress mt-3">
			<div id="jsbluditProgressBar" class="progress-bar bg-primary" role="progressbar" style="width:0%"></div>
		</div>

	<!--
		IMAGES LIST
	-->
		<!-- Table for list files -->
		<table id="jsbluditMediaTable" class="table mt-3">
			<tr>
				<td><?php $L->p('There are no images'); ?></td>
			</tr>
		</table>

		<!-- Paginator -->
		<nav id="jsbluditMediaTablePagination"></nav>

	</div>
</div>
</div>
</div>
</div>
</div>

<script>

<?php
echo 'var preLoadFiles = '.json_encode($preLoadFiles).';';
?>

function openMediaManager() {
	$('#jsmediaManagerModal').modal('show');
}

function closeMediaManager() {
	$('#jsmediaManagerModal').modal('hide');
}

// Remove all files from the table
function cleanTable() {
	$('#jsbluditMediaTable').empty();
}

function showMediaAlert(message) {
	$("#jsalertMedia").html(message).removeClass('d-none');
}

function hideMediaAlert() {
	$("#jsalertMedia").addClass('d-none');
}

// Show the files in the table
function displayFiles(files, numberOfPages = <?= $numberOfPages ?>) {
	if (!Array.isArray(files)) {
		return false;
	}

	// Clean table
	cleanTable();

	// Regenerate the table
	if (files.length > 0) {
		$.each(files, function(key, item) {
			var filename = item.filename;
			var image = "<?php echo PAGE_IMAGES_URL; ?>"+filename;
			// item.thumbnail is empty when no thumbnail file exists (thumbnails
			// disabled, generation failed, format unsupported by GD). Fall back
			// to the original image so the preview never 404s.
			var thumbnail = item.thumbnail ? "<?php echo PAGE_THUMBNAILS_URL; ?>"+item.thumbnail : image;

			tableRow = '<tr id="js'+filename+'">'+
					'<td style="width:80px"><img class="img-thumbnail" alt="200x200" src="'+thumbnail+'" style="width: 50px; height: 50px;"><\/td>'+
					'<td class="information">'+
						'<div class="text-secondary pb-2">'+filename+'<\/div>'+
						'<div>'+
							'<a href="#" class="mr-3 text-primary" onClick="editorInsertMedia(\''+image+'\'); closeMediaManager();"><i class="fa fa-plus-circle"></i><?php $L->p('Insert') ?><\/a>'+
							'<a href="#" class="mr-3 text-primary" onClick="editorInsertMedia(\''+thumbnail+'\'); closeMediaManager();"><i class="fa fa-image"></i><?php $L->p('Insert thumbnail') ?><\/a>'+
							'<a href="#" class="mr-3 text-primary" onClick="editorInsertLinkedMedia(\''+thumbnail+'\',\''+image+'\'); closeMediaManager();"><i class="fa fa-link"></i><?php $L->p('Insert linked thumbnail') ?><\/a>'+
						'<a href="#" class="text-primary" onClick="setCoverImage(\''+filename+'\'); closeMediaManager();"><i class="fa fa-desktop"></i><?php $L->p('Set as cover image') ?><\/a>'+
							'<a href="#" class="float-right text-danger" onClick="deleteMedia(\''+filename+'\')"><i class="fa fa-trash-o"></i><?php $L->p('Delete') ?><\/a>'+
						'<\/div>'+
					'<\/td>'+
				'<\/tr>';
			$('#jsbluditMediaTable').append(tableRow);
		});

		mediaPagination = '<ul class="pagination justify-content-center flex-wrap">';
		for (var i = 1; i <= numberOfPages; i++) {
			mediaPagination += '<li class="page-item"><button type="button" class="btn btn-link page-link" onClick="getFiles('+i+')">'+i+'</button></li>';
		}
		mediaPagination += '</ul>';
		$('#jsbluditMediaTablePagination').html(mediaPagination);

	}

	if (files.length == 0) {
		$('#jsbluditMediaTable').html("<p><?php (IMAGE_RESTRICT ? $L->p('There are no images for the page') : $L->p('There are no images')) ?></p>");
		$('#jsbluditMediaTablePagination').html('');
	}
}

// Get the list of files via AJAX, filter by the page number
function getFiles(pageNumber) {
	$.post(HTML_PATH_ADMIN_ROOT+"ajax/list-images",
		{ 	tokenCSRF: tokenCSRF,
			pageNumber: pageNumber,
			uuid: "<?php echo PAGE_IMAGES_KEY ?>",
			path: "thumbnails" // the paths are defined in ajax/list-images
		},
		function(data) { // success function
			if (data.status==0) {
				displayFiles(data.files, data.numberOfPages);
			} else {
				console.log(data.message);
			}
		}
	);
}

// Delete the file and the thumbnail if exist
function deleteMedia(filename) {
	$.post(HTML_PATH_ADMIN_ROOT+"ajax/delete-image",
		{ 	tokenCSRF: tokenCSRF,
			filename: filename,
			uuid: "<?php echo PAGE_IMAGES_KEY; ?>"
		},
		function(data) { // success function
			if (data.status==0) {
				getFiles(1);
			} else {
				console.log(data.message);
			}
		}
	);
}

function setCoverImage(filename) {
	var image = "<?php echo PAGE_IMAGES_URL; ?>"+filename;
	$("#jscoverImage").val(filename);
	$("#jscoverImagePreview").attr("src", image);
}

function uploadImages() {
	// Remove current alerts
	hideMediaAlert();

	var images = $("#jsimages")[0].files;
	for (var i=0; i < images.length; i++) {
		// Check file type/extension
		const validImageTypes = ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml', 'image/webp'];
		if (!validImageTypes.includes(images[i].type)) {
			showMediaAlert("<?php echo $L->g('File type is not supported. Allowed types:').' '.implode(', ',$GLOBALS['ALLOWED_IMG_EXTENSION']) ?>");
			return false;
		}

		// Check file size and compare with PHP upload_max_filesize
		if (images[i].size > UPLOAD_MAX_FILESIZE) {
			showMediaAlert("<?php echo $L->g('Maximum load file size allowed:').' '.ini_get('upload_max_filesize') ?>");
			return false;
		}
	};

	// Clean progress bar
	$("#jsbluditProgressBar").removeClass().addClass("progress-bar bg-primary");
	$("#jsbluditProgressBar").width("0");

	// Data to send via AJAX
	var formData = new FormData($("#jsbluditFormUpload")[0]);
	formData.append("uuid", "<?php echo PAGE_IMAGES_KEY ?>");
	formData.append("tokenCSRF", tokenCSRF);

	$.ajax({
		url: HTML_PATH_ADMIN_ROOT+"ajax/upload-images",
		type: "POST",
		data: formData,
		cache: false,
		contentType: false,
		processData: false,
		xhr: function() {
			var xhr = $.ajaxSettings.xhr();
			if (xhr.upload) {
				xhr.upload.addEventListener("progress", function(e) {
					if (e.lengthComputable) {
						var percentComplete = (e.loaded / e.total)*100;
						$("#jsbluditProgressBar").width(percentComplete+"%");
					}
				}, false);
			}
			return xhr;
		}
	}).done(function(data) {
		if (data.status==0) {
			$("#jsbluditProgressBar").removeClass("bg-primary").addClass("bg-success");
			// Get the files for the first page, including uploaded files
			getFiles(1);
		} else {
			$("#jsbluditProgressBar").removeClass("bg-primary").addClass("bg-danger");
			showMediaAlert(data.message);
		}
	});
}

$(document).ready(function() {
	// Display the files preloaded for the first time
	displayFiles(preLoadFiles);

	// Select image event
	$("#jsimages").on("change", function(e) {
		uploadImages();
	});

	// Drag and drop image
	$(window).on("dragover dragenter", function(e) {
		e.preventDefault();
		e.stopPropagation();
		openMediaManager();
	});

	// Drag and drop image
	$(window).on("drop", function(e) {
		e.preventDefault();
		e.stopPropagation();
		$("#jsimages").prop("files", e.originalEvent.dataTransfer.files);
		uploadImages();
	});
});

</script>


================================================
FILE: bl-kernel/admin/themes/booty/html/navbar.php
================================================
<nav class="navbar navbar-expand-lg navbar-dark bg-dark text-uppercase d-block d-lg-none">
	<div class="container">
		<span class="navbar-brand">
			<?php echo (defined('BLUDIT_PRO'))?'BLUDIT PRO':'BLUDIT' ?></span>
		<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false"
		 aria-label="Toggle navigation">
			<span class="navbar-toggler-icon"></span>
		</button>
		<div class="collapse navbar-collapse" id="navbarNav">
			<ul class="navbar-nav">
				<li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'dashboard' ?>">
						<?php $L->p('Dashboard') ?></a>
				</li>
				<li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ROOT ?>">
						<?php $L->p('Website') ?></a>
				</li>
				<li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'new-content' ?>">
						<?php $L->p('New content') ?></a>
				</li>
				<li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'content' ?>">
						<?php $L->p('Content') ?></a>
				</li>
				<?php if (!checkRole(array('admin'),false)): ?>
				    <li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$login->username() ?>">
					    <?php $L->p('Profile') ?></a>
				    </li>
				<?php endif; ?>
				<?php if (checkRole(array('admin'),false)): ?>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'categories' ?>">
								<?php $L->p('Categories') ?></a>
						</li>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'users' ?>">
								<?php $L->p('Users') ?></a>
						</li>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'settings' ?>">
								<?php $L->p('Settings') ?></a>
						</li>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'plugins' ?>">
								<?php $L->p('Plugins') ?></a>
						</li>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'themes' ?>">
								<?php $L->p('Themes') ?></a>
						</li>
						<li class="nav-item">
							<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'about' ?>">
								<?php $L->p('About') ?></a>
						</li>
				<?php endif; ?>
				<?php if (checkRole(array('admin'),false)): ?>
				    <?php
				    if (!empty($plugins['adminSidebar'])) {
					foreach ($plugins['adminSidebar'] as $pluginSidebar) {
					    echo '<li class="nav-item">';
					    echo $pluginSidebar->adminSidebar();
					    echo '</li>';
					}
				    }
				    ?>
				<?php endif; ?>
				<li class="nav-item">
					<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'logout' ?>">
						<?php $L->p('Logout') ?></a>
				</li>
			</ul>
		</div>
	</div>
</nav>


================================================
FILE: bl-kernel/admin/themes/booty/html/sidebar.php
================================================
<!-- Use .flex-column to set a vertical direction -->
<ul class="nav flex-column pt-4">

	<li class="nav-item mb-4" style="display: flex; align-items: center;">
		<div style="display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; background: var(--primary-gradient); border-radius: 8px; box-shadow: var(--shadow-sm); flex-shrink: 0;">
			<img src="<?php echo HTML_PATH_CORE_IMG ?>logo.svg" width="18" height="18" alt="bludit-logo" style="filter: brightness(0) invert(1);">
		</div>
		<span style="margin-left: 10px; font-weight: 600; font-size: 1rem; color: var(--text-primary); line-height: 1;"><?php echo (defined('BLUDIT_PRO'))?'BLUDIT PRO':'BLUDIT' ?></span>
	</li>

	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'dashboard' ?>"><span class="fa fa-dashboard"></span><?php $L->p('Dashboard') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" target="_blank" href="<?php echo HTML_PATH_ROOT ?>"><span class="fa fa-home"></span><?php $L->p('Website') ?></a>
	</li>

	<li class="nav-item mt-3">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'new-content' ?>"><span class="fa fa-plus-circle text-primary"></span><?php $L->p('New content') ?></a>
	</li>

	<?php if (!checkRole(array('admin'),false)): ?>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'content' ?>"><span class="fa fa-archive"></span><?php $L->p('Content') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$login->username() ?>"><span class="fa fa-user"></span><?php $L->p('Profile') ?></a>
	</li>
	<?php endif; ?>

	<?php if (checkRole(array('admin'),false)): ?>

	<li class="nav-item mt-3">
		<h4><?php $L->p('Manage') ?></h4>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'content' ?>"><span class="fa fa-folder"></span><?php $L->p('Content') ?></a>
	</li>

	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'categories' ?>"><span class="fa fa-bookmark"></span><?php $L->p('Categories') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'users' ?>"><span class="fa fa-users"></span><?php $L->p('Users') ?></a>
	</li>

	<li class="nav-item mt-3">
		<h4><?php $L->p('Settings') ?></h4>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'settings' ?>"><span class="fa fa-gear"></span><?php $L->p('General') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'plugins' ?>"><span class="fa fa-puzzle-piece"></span><?php $L->p('Plugins') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'themes' ?>"><span class="fa fa-desktop"></span><?php $L->p('Themes') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'about' ?>"><span class="fa fa-info"></span><?php $L->p('About') ?></a>
	</li>

	<?php endif; ?>

	<?php if (checkRole(array('admin', 'editor'),false)): ?>

		<?php
			if (!empty($plugins['adminSidebar'])) {
				echo '<li class="nav-item"><hr></li>';
				foreach ($plugins['adminSidebar'] as $pluginSidebar) {
					echo '<li class="nav-item">';
					echo $pluginSidebar->adminSidebar();
					echo '</li>';
				}
			}
		?>

	<?php endif; ?>

	<li class="nav-item mt-5">
		<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'logout' ?>"><span class="fa fa-arrow-circle-right"></span><?php $L->p('Logout') ?></a>
	</li>
</ul>


================================================
FILE: bl-kernel/admin/themes/booty/index.php
================================================
<!DOCTYPE html>
<html>
<head>
	<title><?php echo $layout['title'] ?></title>
	<meta charset="<?php echo CHARSET ?>">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<meta name="robots" content="noindex,nofollow">
	<meta name="generator" content="Bludit">

	<!-- Favicon -->
	<link rel="shortcut icon" type="image/x-icon" href="<?php echo HTML_PATH_CORE_IMG.'favicon.png?version='.BLUDIT_VERSION ?>">

	<!-- CSS -->
	<?php
		echo Theme::cssBootstrap();
		echo Theme::cssLineAwesome();
		echo Theme::css(array(
			'bludit.css',
			'bludit.bootstrap.css'
		), DOMAIN_ADMIN_THEME_CSS);
		echo Theme::css(array(
			'jquery.datetimepicker.min.css',
			'select2.min.css',
			'select2-bootstrap4.min.css'
		), DOMAIN_CORE_CSS);
	?>

	<!-- Javascript -->
	<?php
		echo Theme::jquery();
		echo Theme::jsBootstrap();
		echo Theme::jsSortable();
		echo Theme::js(array(
			'jquery.datetimepicker.full.min.js',
			'select2.full.min.js',
			'functions.js'
		), DOMAIN_CORE_JS, null);
	?>

	<!-- Plugins -->
	<?php Theme::plugins('adminHead') ?>

</head>
<body class="h-100">

<!-- Plugins -->
<?php Theme::plugins('adminBodyBegin') ?>

<!-- Javascript dynamic generated by PHP -->
<?php
	echo '<script charset="utf-8">'.PHP_EOL;
	include(PATH_CORE_JS.'variables.php');
	echo '</script>'.PHP_EOL;

	echo '<script charset="utf-8">'.PHP_EOL;
	include(PATH_CORE_JS.'bludit-ajax.php');
	echo '</script>'.PHP_EOL;
?>

<!-- Overlay background -->
<div id="jsshadow"></div>

<!-- Alert -->
<?php include('html/alert.php'); ?>

<!-- Navbar, only for small devices -->
<?php include('html/navbar.php'); ?>

<div class="container min-vh-100">
	<!-- 25%/75% split on large devices, small, medium devices hide -->
	<div class="row min-vh-100 align-items-stretch">

		<!-- LEFT SIDEBAR - Display only on large devices -->
		<div class="sidebar col-lg-2 d-none d-lg-block">
		<?php include('html/sidebar.php'); ?>
		</div>

		<!-- RIGHT MAIN -->
		<div class="col-lg-10 pt-3 pb-1">
		<?php
			if (Sanitize::pathFile(PATH_ADMIN_VIEWS, $layout['view'].'.php')) {
				include(PATH_ADMIN_VIEWS.$layout['view'].'.php');
			} elseif ($layout['plugin'] && method_exists($layout['plugin'], 'adminView')) {
				echo $layout['plugin']->adminView();
			} else {
				echo '<h1 class="text-center">'.$L->g('Page not found').'</h1>';
				echo '<h2 class="text-center">'.$L->g('Choose a page from the sidebar.').'</h2>';
			}
		?>
		</div>
	</div>
</div>

<!-- Plugins -->
<?php Theme::plugins('adminBodyEnd') ?>

</body>
</html>


================================================
FILE: bl-kernel/admin/themes/booty/init.php
================================================
<?php

class Bootstrap
{

	public static function modal($args)
	{

		$buttonSecondary = $args['buttonSecondary'];
		$buttonSecondaryClass = $args['buttonSecondaryClass'];

		$buttonPrimary = $args['buttonPrimary'];
		$buttonPrimaryClass = $args['buttonPrimaryClass'];

		$modalText = $args['modalText'];
		$modalTitle = $args['modalTitle'];
		$modalId = $args['modalId'];


		return <<<EOF
<div id="$modalId" class="modal fade" tabindex="-1" role="dialog">
	<div class="modal-dialog" role="document">
		<div class="modal-content">
			<div class="modal-body">
				<h3>$modalTitle</h3>
				<p>$modalText</p>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn $buttonSecondaryClass" data-dismiss="modal">$buttonSecondary</button>
				<button type="button" class="btn $buttonPrimaryClass">$buttonPrimary</button>
			</div>
		</div>
	</div>
</div>
EOF;
	}

	public static function link($args)
	{
		$options = 'href="' . $args['href'] . '"';
		if (isset($args['class'])) {
			$options .= ' class="' . $args['class'] . '"';
		}
		if (isset($args['target'])) {
			$options .= ' target="' . $args['target'] . '"';
		}

		if (isset($args['icon'])) {
			return '<a ' . $options . '><span class="fa fa-' . $args['icon'] . '"></span>' . $args['title'] . '</a>';
		}

		return '<a ' . $options . '>' . $args['title'] . '</a>';
	}

	public static function pageTitle($args)
	{
		$icon = $args['icon'];
		$title = $args['title'];
		return <<<EOF
<h2 class="mt-0 mb-3">
	<span class="fa fa-$icon" style="font-size: 0.9em;"></span><span>$title</span>
</h2>
EOF;
	}

	public static function formOpen($args)
	{
		$class = empty($args['class']) ? '' : 'class="' . $args['class'] . '"';
		$id = empty($args['id']) ? '' : 'id="' . $args['id'] . '"';
		$enctype = empty($args['enctype']) ? '' : 'enctype="' . $args['enctype'] . '"';
		$action = empty($args['action']) ? 'action=""' : 'action="' . $args['action'] . '"';
		$method = empty($args['method']) ? 'method="post"' : 'method="' . $args['method'] . '"';
		$style = empty($args['style']) ? '' : 'style="' . $args['style'] . '"';

		return <<<EOF
<form $class $enctype $id $method $action $style autocomplete="off">
EOF;
	}

	public static function formClose()
	{
		return <<<EOF
</form>
<script>
$(document).ready(function() {
	// Prevent the form submit when press enter key.
	$("form").keypress(function(e) {
		if ((e.which == 13) && (e.target.type !== "textarea")) {
			return false;
		}
	});
});
</script>
EOF;
	}

	public static function formTitle($args)
	{
		$title = $args['title'];
		return <<<EOF
<h6 class="mt-4 mb-2 pb-2 border-bottom text-uppercase">$title</h6>
EOF;
	}

	public static function formInputTextBlock($args)
	{
		$name = $args['name'];
		$disabled = empty($args['disabled']) ? '' : 'disabled';
		$placeholder = isset($args['placeholder']) ? $args['placeholder'] : '';
		$value = isset($args['value']) ? $args['value'] : '';

		$id = 'js' . $name;
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$tip = '';
		if (!empty($args['tip'])) {
			$tip = '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}

		$class = 'form-group m-0';
		if (isset($args['class'])) {
			$class = $args['class'];
		}

		$labelClass = 'mt-4 mb-2 pb-2 border-bottom text-uppercase w-100';
		if (isset($args['labelClass'])) {
			$labelClass = $args['labelClass'];
		}

		$label = '';
		if (!empty($args['label'])) {
			$label = '<label class="' . $labelClass . '" for="' . $id . '">' . $args['label'] . '</label>';
		}

		$type = 'text';
		if (isset($args['type'])) {
			$type = $args['type'];
		}

		return <<<EOF
<div class="$class">
	$label
	<input type="text" dir="auto" value="$value" class="form-control" id="$id" name="$name" placeholder="$placeholder" $disabled>
	$tip
</div>
EOF;
	}

	public static function formInputFile($args)
	{
		$id = 'js' . $args['name'];
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$class = 'custom-file';
		if (isset($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$html  = '<div class="' . $class . '">';
		$html .= '<input type="file" class="custom-file-input" id="' . $id . '">';
		$html .= '<label class="custom-file-label" for="' . $id . '">' . $args['label'] . '</label>';
		$html .= '</div>';

		return $html;
	}

	public static function formTextarea($args)
	{
		$id = 'js' . $args['name'];
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$class = 'form-control';
		if (isset($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$html = '<div class="form-group row">';

		if (!empty($args['label'])) {
			$html .= '<label for="' . $id . '" class="col-sm-2 col-form-label">' . $args['label'] . '</label>';
		}

		$html .= '<div class="col-sm-10">';
		$html .= '<textarea class="' . $class . '" id="' . $id . '" name="' . $args['name'] . '" rows="' . $args['rows'] . '" placeholder="' . $args['placeholder'] . '">' . $args['value'] . '</textarea>';
		if (isset($args['tip'])) {
			$html .= '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}
		$html .= '</div>';
		$html .= '</div>';

		return $html;
	}

	public static function formTextareaBlock($args)
	{
		$id = 'js' . $args['name'];
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$class = 'form-control';
		if (!empty($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$html = '<div class="form-group m-0">';
		if (!empty($args['label'])) {
			$html .= '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100" for="' . $id . '">' . $args['label'] . '</label>';
		}

		$html .= '<textarea class="' . $class . '" id="' . $id . '" name="' . $args['name'] . '" rows="' . $args['rows'] . '" placeholder="' . $args['placeholder'] . '">' . $args['value'] . '</textarea>';
		if (!empty($args['tip'])) {
			$html .= '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}
		$html .= '</div>';

		return $html;
	}

	public static function formInputText($args)
	{
		$name = $args['name'];
		$disabled = empty($args['disabled']) ? '' : 'disabled';
		$readonly = empty($args['readonly']) ? '' : 'readonly';
		$placeholder = isset($args['placeholder']) ? $args['placeholder'] : '';
		$value = isset($args['value']) ? $args['value'] : '';

		$id = 'js' . $name;
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$tip = '';
		if (isset($args['tip'])) {
			$tip = '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}

		$label = '';
		if (isset($args['label'])) {
			$label = '<label for="' . $id . '" class="col-sm-2 col-form-label">' . $args['label'] . '</label>';
		}

		$class = 'form-control';
		if (isset($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$type = 'text';
		if (isset($args['type'])) {
			$type = $args['type'];
		}

		return <<<EOF
<div class="form-group row">
	$label
	<div class="col-sm-10">
		<input class="$class" id="$id" name="$name" value="$value" placeholder="$placeholder" type="$type" dir="auto" $disabled $readonly>
		$tip
	</div>
</div>
EOF;
	}

	public static function formCheckbox($args)
	{
		$labelForCheckbox = isset($args['labelForCheckbox']) ? $args['labelForCheckbox'] : '';
		$placeholder = isset($args['placeholder']) ? $args['placeholder'] : '';
		$tip = isset($args['tip']) ? '<small class="form-text text-muted">' . $args['tip'] . '</small>' : '';
		$value = isset($args['value']) ? $args['value'] : '';
		$name = $args['name'];
		$id = 'js' . $name;
		if (isset($args['id'])) {
			$id = $args['id'];
		}
		$disabled = isset($args['disabled']) ? 'disabled' : '';

		$class = 'form-group m-0';
		if (isset($args['class'])) {
			$class = $args['class'];
		}

		$labelClass = 'mt-4 mb-2 pb-2 border-bottom text-uppercase w-100';
		if (isset($args['labelClass'])) {
			$labelClass = $args['labelClass'];
		}

		$type = 'text';
		if (isset($args['type'])) {
			$type = $args['type'];
		}

		$label = '';
		if (!empty($args['label'])) {
			$label = '<label class="' . $labelClass . '">' . $args['label'] . '</label>';
		}

		$checked = $args['checked'] ? 'checked' : '';
		$value = $checked ? '1' : '0';

		return <<<EOF
<div class="$class">
	$label
	<div class="form-check">
		<input type="hidden" name="$name" value="$value"><input id="$id" type="checkbox" class="form-check-input" onclick="this.previousSibling.value=1-this.previousSibling.value" $checked>
		<label class="form-check-label" for="$id">$labelForCheckbox</label>
		$tip
	</div>
</div>
EOF;
	}

	public static function formSelect($args)
	{
		$id = 'js' . $args['name'];
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$class = 'custom-select';
		if (isset($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$html = '<div class="form-group row">';

		if (isset($args['label'])) {
			$html .= '<label for="' . $id . '" class="col-sm-2 col-form-label">' . $args['label'] . '</label>';
		}

		$html .= '<div class="col-sm-10">';
		$html .= '<select id="' . $id . '" name="' . $args['name'] . '" class="' . $class . '">';
		foreach ($args['options'] as $key => $value) {
			$html .= '<option ' . (($key == $args['selected']) ? 'selected' : '') . ' value="' . $key . '">' . $value . '</option>';
		}
		$html .= '</select>';
		if (isset($args['tip'])) {
			$html .= '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}
		$html .= '</div>';
		$html .= '</div>';

		return $html;
	}

	public static function formSelectBlock($args)
	{
		$id = 'js' . $args['name'];
		if (isset($args['id'])) {
			$id = $args['id'];
		}

		$class = 'custom-select';
		if (!empty($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$html = '<div class="form-group m-0">';

		if (!empty($args['label'])) {
			$html .= '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100" for="' . $id . '">' . $args['label'] . '</label>';
		}

		$html .= '<select id="' . $id . '" name="' . $args['name'] . '" class="' . $class . '">';
		if (!empty($args['emptyOption'])) {
			$html .= '<option value="">' . $args['emptyOption'] . '</option>';
		}
		foreach ($args['options'] as $key => $value) {
			$html .= '<option ' . (($key == $args['selected']) ? 'selected' : '') . ' value="' . $key . '">' . $value . '</option>';
		}
		$html .= '</select>';
		if (!empty($args['tip'])) {
			$html .= '<small class="form-text text-muted">' . $args['tip'] . '</small>';
		}
		$html .= '</div>';

		return $html;
	}

	public static function formInputHidden($args)
	{
		return '<input type="hidden" id="js' . $args['name'] . '" name="' . $args['name'] . '" value="' . $args['value'] . '">';
	}

	public static function alert($args)
	{
		$class = 'alert';
		if (!empty($args['class'])) {
			$class = $class . ' ' . $args['class'];
		}

		$text = $args['text'];

		return <<<EOF
<div class="$class" role="alert">$text</div>
EOF;
	}
}


================================================
FILE: bl-kernel/admin/themes/booty/login.php
================================================
<!DOCTYPE html>
<html lang="en">

<head>
  <title><?php echo (defined('BLUDIT_PRO') ? $site->title() : 'BLUDIT') ?> - Login</title>
  <meta charset="<?php echo CHARSET ?>">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="robots" content="noindex,nofollow">

  <!-- Favicon -->
  <link rel="shortcut icon" type="image/x-icon" href="<?php echo HTML_PATH_CORE_IMG . 'favicon.png?version=' . BLUDIT_VERSION ?>">

  <!-- CSS -->
  <?php
  echo Theme::cssBootstrap();
  echo Theme::css(array(
    'bludit.css',
    'bludit.bootstrap.css'
  ), DOMAIN_ADMIN_THEME_CSS);
  ?>

  <style>
    body.login {
      min-height: 100vh;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      background: linear-gradient(135deg, #1e88e5 0%, #1565c0 50%, #0d47a1 100%);
      padding: 20px;
    }

    .login-container {
      width: 100%;
      max-width: 420px;
    }

    .login-card {
      background: #ffffff;
      border-radius: 16px;
      box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
      padding: 40px;
      animation: fadeInUp 0.5s ease-out;
    }

    @keyframes fadeInUp {
      from {
        opacity: 0;
        transform: translateY(20px);
      }
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }

    .login-logo {
      text-align: center;
      margin-bottom: 30px;
    }

    .login-logo .logo-icon {
      width: 70px;
      height: 70px;
      background: linear-gradient(135deg, #1e88e5 0%, #1565c0 100%);
      border-radius: 16px;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      margin-bottom: 15px;
      box-shadow: 0 8px 20px rgba(21, 101, 192, 0.4);
    }

    .login-logo .logo-icon img {
      width: 36px;
      height: 36px;
      filter: brightness(0) invert(1);
    }

    .login-logo .logo-icon.custom-logo {
      background: transparent;
      box-shadow: none;
      width: auto;
      height: auto;
      max-width: 150px;
      max-height: 80px;
    }

    .login-logo .logo-icon.custom-logo img {
      width: auto;
      height: auto;
      max-width: 150px;
      max-height: 80px;
      filter: none;
      border-radius: 12px;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    }

    .login-logo h1 {
      font-size: 1.5rem;
      font-weight: 600;
      color: #1a1a2e;
      margin: 0;
    }

    .login-logo p {
      color: #6c757d;
      font-size: 0.9rem;
      margin-top: 5px;
    }

    .login-card .form-control {
      border: 2px solid #e9ecef;
      border-radius: 10px;
      padding: 12px 16px;
      font-size: 0.95rem;
      transition: all 0.3s ease;
      background-color: #f8f9fa;
    }

    .login-card .form-control:focus {
      border-color: #1e88e5;
      box-shadow: 0 0 0 4px rgba(30, 136, 229, 0.15);
      background-color: #fff;
    }

    .login-card .form-control::placeholder {
      color: #adb5bd;
    }

    .login-card .form-group {
      margin-bottom: 20px;
    }

    .login-card .form-group label {
      font-weight: 500;
      color: #495057;
      margin-bottom: 10px;
      font-size: 0.9rem;
    }

    .login-card .btn-login {
      background: linear-gradient(135deg, #1e88e5 0%, #1565c0 100%);
      border: none;
      border-radius: 10px;
      padding: 12px 18px;
      font-size: 0.95rem;
      font-weight: 600;
      color: white;
      width: 100%;
      transition: all 0.3s ease;
      box-shadow: 0 4px 15px rgba(21, 101, 192, 0.4);
    }

    .login-card .btn-login:hover {
      transform: translateY(-2px);
      box-shadow: 0 6px 20px rgba(21, 101, 192, 0.5);
    }

    .login-card .btn-login:active {
      transform: translateY(0);
    }

    .login-card .form-check {
      margin-bottom: 25px;
    }

    .login-card .form-check-input {
      width: 18px;
      height: 18px;
      margin-top: 0;
      border: 2px solid #dee2e6;
      border-radius: 4px;
    }

    .login-card .form-check-input:checked {
      background-color: #1e88e5;
      border-color: #1e88e5;
    }

    .login-card .form-check-label {
      color: #6c757d;
      font-size: 0.9rem;
      padding-left: 8px;
    }

    .login-footer {
      text-align: center;
      margin-top: 25px;
      padding-top: 20px;
      border-top: 1px solid #e9ecef;
    }

    .login-footer p {
      color: #6c757d;
      font-size: 0.85rem;
      margin: 0;
    }

    .login-footer a {
      color: #1e88e5;
      text-decoration: none;
    }

    /* Alert styles for login page */
    .login-alert {
      position: fixed;
      top: 20px;
      left: 50%;
      transform: translateX(-50%);
      z-index: 1050;
      min-width: 300px;
      max-width: 90%;
      border-radius: 10px;
      padding: 12px 20px;
      font-weight: 500;
      font-size: 0.9rem;
      animation: slideDown 0.4s ease-out;
    }

    @keyframes slideDown {
      from {
        opacity: 0;
        transform: translateX(-50%) translateY(-20px);
      }
      to {
        opacity: 1;
        transform: translateX(-50%) translateY(0);
      }
    }

    .login-alert.alert-danger {
      background: linear-gradient(135deg, #ff6b6b 0%, #ee5a5a 100%);
      color: white;
      border: none;
      box-shadow: 0 4px 15px rgba(238, 90, 90, 0.4);
    }

    .login-alert.alert-success {
      background: linear-gradient(135deg, #51cf66 0%, #40c057 100%);
      color: white;
      border: none;
      box-shadow: 0 4px 15px rgba(64, 192, 87, 0.4);
    }

    /* Input icons */
    .input-icon-wrapper {
      position: relative;
    }

    .input-icon-wrapper .form-control {
      padding-left: 40px;
    }

    .input-icon-wrapper .input-icon {
      position: absolute;
      left: 18px;
      top: 50%;
      transform: translateY(-50%);
      color: #adb5bd;
      pointer-events: none;
    }

    .input-icon-wrapper .form-control:focus + .input-icon,
    .input-icon-wrapper .form-control:not(:placeholder-shown) + .input-icon {
      color: #1e88e5;
    }
  </style>

  <!-- Javascript -->
  <?php
  echo Theme::jquery();
  echo Theme::jsBootstrap();
  ?>

  <!-- Plugins -->
  <?php Theme::plugins('loginHead') ?>
</head>

<body class="login">

  <!-- Plugins -->
  <?php Theme::plugins('loginBodyBegin') ?>

  <!-- Alert -->
  <?php if (Alert::defined()): ?>
  <div id="login-alert" class="login-alert alert <?php echo (Alert::status() == ALERT_STATUS_FAIL) ? 'alert-danger' : 'alert-success' ?>">
    <?php echo Alert::get() ?>
  </div>
  <script>
    setTimeout(function() {
      document.getElementById('login-alert').style.display = 'none';
    }, <?php echo ALERT_DISAPPEAR_IN * 1000 ?>);
  </script>
  <?php endif; ?>

  <div class="login-container">
    <div class="login-card">
      <?php
      if (Sanitize::pathFile(PATH_ADMIN_VIEWS, $layout['view'] . '.php')) {
        include(PATH_ADMIN_VIEWS . $layout['view'] . '.php');
      }
      ?>
    </div>
  </div>

  <!-- Plugins -->
  <?php Theme::plugins('loginBodyEnd') ?>

</body>

</html>


================================================
FILE: bl-kernel/admin/views/about.php
================================================
<?php

echo Bootstrap::pageTitle(array('title'=>$L->g('About'), 'icon'=>'info-circle'));

echo '
<table class="table table-striped mt-3">
	<tbody>
';

echo '<tr>';
echo '<td>Bludit Edition</td>';
if (defined('BLUDIT_PRO')) {
	echo '<td>PRO - '.$L->g('Thanks for supporting Bludit').' <span class="fa fa-heart" style="color: #ffc107"></span></td>';
} else {
	echo '<td>Standard - <a target="_blank" href="https://pro.bludit.com">'.$L->g('Upgrade to Bludit PRO').'</a></td>';
}
echo '</tr>';

echo '<tr>';
echo '<td>Bludit Version</td>';
echo '<td>'.BLUDIT_VERSION.'</td>';
echo '</tr>';

echo '<tr>';
echo '<td>Bludit Codename</td>';
echo '<td>'.BLUDIT_CODENAME.'</td>';
echo '</tr>';

echo '<tr>';
echo '<td>Bludit Build Number</td>';
echo '<td>'.BLUDIT_BUILD.'</td>';
echo '</tr>';

echo '<tr>';
echo '<td>Disk usage</td>';
echo '<td>'.Filesystem::bytesToHumanFileSize(Filesystem::getSize(PATH_ROOT)).'</td>';
echo '</tr>';

echo '<tr>';
echo '<td><a href="'.HTML_PATH_ADMIN_ROOT.'developers'.'">Bludit Developers</a></td>';
echo '<td></td>';
echo '</tr>';

echo '
	</tbody>
</table>
';


================================================
FILE: bl-kernel/admin/views/blocks.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>

<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>

<div class="align-middle">
	<div class="float-right mt-1">
		<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
		<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'themes' ?>" role="button"><?php $L->p('Cancel') ?></a>
	</div>
	<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Blocks'), 'icon'=>'box')); ?>
</div>

<?php
	// Token CSRF
	echo Bootstrap::formInputHidden(array(
		'name'=>'tokenCSRF',
		'value'=>$security->getTokenCSRF()
	));

	foreach ($blocks->getAll() as $block) {
		echo Bootstrap::formTitle(array('title'=>$block->title()));

		if (Text::isNotEmpty( $block->description() )) {
			echo Bootstrap::alert(array('class'=>'alert-primary', 'text'=>$block->description()));
		}

		echo Bootstrap::formInputText(array(
			'name'=>'key[]',
			'label'=>$L->g('Key'),
			'value'=>$block->key(),
			'class'=>'',
			'placeholder'=>'',
			'tip'=>'',
			'readonly'=>true
		));

		echo Bootstrap::formInputText(array(
			'name'=>'title[]',
			'label'=>$L->g('title'),
			'value'=>$block->title(),
			'class'=>'',
			'placeholder'=>'',
			'tip'=>''
		));

		echo Bootstrap::formTextarea(array(
			'name'=>'value[]',
			'label'=>$L->g('Value'),
			'value'=>$block->value(),
			'class'=>'',
			'placeholder'=>'',
			'tip'=>'',
			'rows'=>5
		));
	}

echo Bootstrap::formClose();

?>


================================================
FILE: bl-kernel/admin/views/categories.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.');

echo Bootstrap::pageTitle(array('title'=>$L->g('Categories'), 'icon'=>'tags'));

echo Bootstrap::link(array(
	'title'=>$L->g('Add a new category'),
	'href'=>HTML_PATH_ADMIN_ROOT.'new-category',
	'icon'=>'plus'
));

echo '
<table class="table table-striped mt-3">
	<thead>
		<tr>
			<th class="border-bottom-0" scope="col">'.$L->g('Name').'</th>
			<th class="border-bottom-0" scope="col">'.$L->g('URL').'</th>
		</tr>
	</thead>
	<tbody>
';

foreach ($categories->keys() as $key) {
	$category = new Category($key);
	echo '<tr>';
	echo '<td><a href="'.HTML_PATH_ADMIN_ROOT.'edit-category/'.$key.'">'.$category->name().'</a></td>';
	echo '<td><a href="'.$category->permalink().'">'.$url->filters('category', false).$key.'</a></td>';
	echo '</tr>';
}

echo '
	</tbody>
</table>
';


================================================
FILE: bl-kernel/admin/views/configure-plugin.php
================================================
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>

<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'plugin-form')); ?>

<div class="align-middle">
	<?php if ($plugin->formButtons()): ?>
	<div class="float-right mt-1">
		<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
		<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'plugins' ?>" role="button"><?php $L->p('Cancel') ?></a>
	</div>
	<?php endif; ?>
	<?php echo Bootstrap::pageTitle(array('title'=>$plugin->name(), 'icon'=>'cog')); ?>
</div>

<?php
	// Token CSRF
	echo Bootstrap::formInputHidden(array(
		'name'=>'tokenCSRF',
		'value'=>$security->getTokenCSRF()
	));

	// Compatibility warning
	if (!$plugin->isCompatible()) {
		echo '<div class="alert alert-warning mt-2">' . $L->g('This plugin may not be supported by this version of Bludit') . '</div>';
	}

	// Print the plugin form
	echo $plugin->form();
?>

<?php echo Bootstrap::formClose(); ?>

================================================
FILE: bl-kernel/admin/views/content.php
================================================
<?php

echo Bootstrap::pageTitle(array('title'=>$L->g('Content'), 'icon'=>'archive'));

function moveTypeIcon($type) {
	$icons = array(
		'published' => 'fa-file-text-o',
		'sticky'    => 'fa-thumb-tack',
		'static'    => 'fa-file',
		'draft'     => 'fa-pencil',
	);
	return isset($icons[$type]) ? $icons[$type] : 'fa-file';
}

function moveTypeLabel($current, $target, $L) {
	if ($target === 'sticky') {
		return $L->g('Sticky');
	}
	if ($current === 'sticky' && $target === 'published') {
		return $L->g('Unstick');
	}
	$labels = array(
		'published' => $L->g('Move to Page'),
		'static'    => $L->g('Move to Static'),
		'draft'     => $L->g('Move to Draft'),
	);
	return isset($labels[$target]) ? $labels[$target] : $target;
}

// Render a single row (or row + nested children) for a page key.
// $type controls which columns/buttons are shown; $isSticky adds the Sticky badge
// and flips the toggle button into "Unstick" mode.
function tableRow($pageKey, $type, $isSticky = false, $renderChildren = false) {
	global $url;
	global $L;

	try {
		$page = new Page($pageKey);
	} catch (Exception $e) {
		return;
	}

	$showURL = ($type === 'published' || $type === 'static' || $type === 'sticky');

	// Allowed "Move to" transitions per current type.
	$moves = array(
		'published' => array('sticky', 'static', 'draft'),
		'sticky'    => array('published', 'static', 'draft'),
		'draft'     => array('published', 'static'),
		'static'    => array('published', 'draft'),
	);

	$dateLabel = '';
	if ($type === 'scheduled') {
		$dateLabel = $L->g('Scheduled').': '.$page->date(SCHEDULED_DATE_FORMAT);
	} elseif ((ORDER_BY === 'position') || ($type !== 'published' && $type !== 'sticky')) {
		$dateLabel = $L->g('Position').': '.$page->position();
	} else {
		$dateLabel = $page->date(MANAGE_CONTENT_DATE_FORMAT);
	}

	echo '<tr>';
	echo '<td class="pt-3">';
	echo '<div>';
	echo '<a style="font-size: 1.1em" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'">';
	echo ($page->title() ? $page->title() : '<span class="label-empty-title">'.$L->g('Empty title').'</span> ');
	echo '</a>';
	if ($isSticky) {
		echo ' <span class="badge badge-warning align-middle ml-1" title="'.$L->g('Sticky').'"><i class="fa fa-thumb-tack"></i> '.$L->g('Sticky').'</span>';
	}
	echo '</div>';
	echo '<div><p style="font-size: 0.8em" class="m-0 text-uppercase text-muted">'.$dateLabel.'</p></div>';
	echo '</td>';

	if ($showURL) {
		$friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$page->key() : '/'.$url->filters('page').'/'.$page->key();
		echo '<td class="pt-3 d-none d-xl-table-cell contentURL"><a target="_blank" href="'.$page->permalink().'" title="'.$friendlyURL.'">'.$friendlyURL.'</a></td>';
	}

	echo '<td class="contentTools pt-3 text-center align-middle">'.PHP_EOL;
	echo '<div class="dropdown actionsDropdown">';
	echo '<button class="btn btn-link text-secondary p-1 actionsDropdownToggle" type="button" data-toggle="dropdown" data-boundary="viewport" aria-haspopup="true" aria-expanded="false" title="'.$L->g('Actions').'"><i class="fa fa-bars"></i></button>';
	echo '<div class="dropdown-menu dropdown-menu-right">';

	// View / Edit
	if ($showURL) {
		echo '<a class="dropdown-item" target="_blank" href="'.$page->permalink().'"><i class="fa fa-desktop fa-fw mr-2"></i>'.$L->g('View').'</a>';
	}
	echo '<a class="dropdown-item" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'"><i class="fa fa-edit fa-fw mr-2"></i>'.$L->g('Edit').'</a>';

	// Sticky / Unstick toggle, between View/Edit and Move-to.
	$stickyToggleTarget = false;
	if ($type === 'published') {
		$stickyToggleTarget = 'sticky';
	} elseif ($type === 'sticky') {
		$stickyToggleTarget = 'published';
	}
	if ($stickyToggleTarget) {
		echo '<div class="dropdown-divider"></div>';
		echo '<a href="#" class="dropdown-item changeTypeButton" data-key="'.$page->key().'" data-type="'.$stickyToggleTarget.'"><i class="fa '.moveTypeIcon($stickyToggleTarget).' fa-fw mr-2"></i>'.moveTypeLabel($type, $stickyToggleTarget, $L).'</a>';
	}

	// Move to ... (everything except the sticky toggle target rendered above).
	if (isset($moves[$type])) {
		$remaining = array();
		foreach ($moves[$type] as $target) {
			if ($target !== $stickyToggleTarget) {
				$remaining[] = $target;
			}
		}
		if (!empty($remaining)) {
			echo '<div class="dropdown-divider"></div>';
			foreach ($remaining as $target) {
				echo '<a href="#" class="dropdown-item changeTypeButton" data-key="'.$page->key().'" data-type="'.$target.'"><i class="fa '.moveTypeIcon($target).' fa-fw mr-2"></i>'.moveTypeLabel($type, $target, $L).'</a>';
			}
		}
	}

	if (count($page->children()) == 0) {
		echo '<div class="dropdown-divider"></div>';
		echo '<a href="#" class="dropdown-item text-danger deletePageButton" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$page->key().'"><i class="fa fa-trash fa-fw mr-2"></i>'.$L->g('Delete').'</a>';
	}
	echo '</div></div>';
	echo '</td>';
	echo '</tr>';

	if ($renderChildren) {
		foreach ($page->children() as $child) {
			echo '<tr>';
			echo '<td class="child">';
			echo '<div>';
			echo '<a style="font-size: 1.1em" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$child->key().'">';
			echo ($child->title() ? $child->title() : '<span class="label-empty-title">'.$L->g('Empty title').'</span> ');
			echo '</a>';
			echo '</div>';
			echo '<div><p style="font-size: 0.8em" class="m-0 text-uppercase text-muted">'.$L->g('Position').': '.$child->position().'</p></div>';
			echo '</td>';

			if ($showURL) {
				$friendlyChildURL = Text::isEmpty($url->filters('page')) ? '/'.$child->key() : '/'.$url->filters('page').'/'.$child->key();
				echo '<td class="d-none d-xl-table-cell contentURL"><a target="_blank" href="'.$child->permalink().'" title="'.$friendlyChildURL.'">'.$friendlyChildURL.'</a></td>';
			}

			echo '<td class="contentTools pt-3 text-center align-middle">'.PHP_EOL;
			echo '<div class="dropdown actionsDropdown">';
			echo '<button class="btn btn-link text-secondary p-1 actionsDropdownToggle" type="button" data-toggle="dropdown" data-boundary="viewport" aria-haspopup="true" aria-expanded="false" title="'.$L->g('Actions').'"><i class="fa fa-bars"></i></button>';
			echo '<div class="dropdown-menu dropdown-menu-right">';
			if ($showURL) {
				echo '<a class="dropdown-item" target="_blank" href="'.$child->permalink().'"><i class="fa fa-desktop fa-fw mr-2"></i>'.$L->g('View').'</a>';
			}
			echo '<a class="dropdown-item" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$child->key().'"><i class="fa fa-edit fa-fw mr-2"></i>'.$L->g('Edit').'</a>';
			echo '<div class="dropdown-divider"></div>';
			echo '<a href="#" class="dropdown-item text-danger deletePageButton" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$child->key().'"><i class="fa fa-trash fa-fw mr-2"></i>'.$L->g('Delete').'</a>';
			echo '</div></div>';
			echo '</td>';
			echo '</tr>';
		}
	}
}

// Render rows for a list, applying the parent/child nesting rules used by the
// Static tab and by the Pages/Sticky lists when ORDER_BY is "position".
function tableRows($list, $type, $isSticky = false) {
	$nestChildren = ($type === 'static') || (ORDER_BY === 'position');
	foreach ($list as $pageKey) {
		try {
			$page = new Page($pageKey);
		} catch (Exception $e) {
			continue;
		}
		if ($nestChildren) {
			if ($page->isChild()) {
				continue;
			}
			tableRow($pageKey, $type, $isSticky, true);
		} else {
			tableRow($pageKey, $type, $isSticky, false);
		}
	}
}

// Render a full table for a single tab (Static, Scheduled, Draft, Autosave).
function table($type) {
	global $L;
	global $drafts;
	global $scheduled;
	global $static;
	global $autosave;

	if ($type === 'draft') {
		$list = $drafts;
		$emptyMessage = $L->g('There are no draft pages at this moment.');
	} elseif ($type === 'scheduled') {
		$list = $scheduled;
		$emptyMessage = $L->g('There are no scheduled pages at this moment.');
	} elseif ($type === 'static') {
		$list = $static;
		$emptyMessage = $L->g('There are no static pages at this moment.');
	} elseif ($type === 'autosave') {
		$list = $autosave;
		$emptyMessage = '';
	} else {
		return;
	}

	if (empty($list) && $type !== 'autosave') {
		echo '<p class="mt-4 text-muted">'.$emptyMessage.'</p>';
		return;
	}

	echo '<table class="table mt-3"><thead><tr>';
	echo '<th class="border-0" scope="col">'.$L->g('Title').'</th>';
	if ($type === 'static') {
		echo '<th class="border-0 d-none d-xl-table-cell" scope="col">'.$L->g('URL').'</th>';
	}
	echo '<th class="border-0 text-center d-sm-table-cell" scope="col">'.$L->g('Actions').'</th>';
	echo '</tr></thead><tbody>';
	tableRows($list, $type);
	echo '</tbody></table>';
}

// Render the Pages tab: sticky rows first, then the paginated published list,
// in a single table.
function tablePages() {
	global $L;
	global $published;
	global $sticky;
	global $url;

	$isFirstPage = ($url->pageNumber() <= 1);

	if (empty($published) && (empty($sticky) || !$isFirstPage)) {
		echo '<p class="mt-4 text-muted">'.$L->g('There are no pages at this moment.').'</p>';
		return;
	}

	echo '<table class="table mt-3"><thead><tr>';
	echo '<th class="border-0" scope="col">'.$L->g('Title').'</th>';
	echo '<th class="border-0 d-none d-xl-table-cell" scope="col">'.$L->g('URL').'</th>';
	echo '<th class="border-0 text-center d-sm-table-cell" scope="col">'.$L->g('Actions').'</th>';
	echo '</tr></thead><tbody>';
	if (!empty($sticky) && $isFirstPage) {
		tableRows($sticky, 'sticky', true);
	}
	if (!empty($published)) {
		tableRows($published, 'published', false);
	}
	echo '</tbody></table>';
}

?>

<!-- TABS -->
<ul class="nav nav-tabs" role="tablist">
	<li class="nav-item">
		<a class="nav-link active" id="pages-tab" data-toggle="tab" href="#pages" role="tab"><?php $L->p('Pages') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" id="static-tab" data-toggle="tab" href="#static" role="tab"><?php $L->p('Static') ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" id="scheduled-tab" data-toggle="tab" href="#scheduled" role="tab"><?php $L->p('Scheduled') ?> <?php if (count($scheduled)>0) { echo '<span class="badge badge-danger">'.count($scheduled).'</span>'; } ?></a>
	</li>
	<li class="nav-item">
		<a class="nav-link" id="draft-tab" data-toggle="tab" href="#draft" role="tab"><?php $L->p('Draft') ?></a>
	</li>
	<?php if (!empty($autosave)): ?>
	<li class="nav-item">
		<a class="nav-link" id="autosave-tab" data-toggle="tab" href="#autosave" role="tab"><?php $L->p('Autosave') ?></a>
	</li>
	<?php endif; ?>
</ul>
<div class="tab-content">
	<!-- TABS PAGES (includes sticky on top) -->
	<div class="tab-pane show active" id="pages" role="tabpanel">

		<?php tablePages(); ?>

		<?php if (Paginator::numberOfPages() > 1): ?>
		<!-- Paginator -->
		<nav class="paginator">
			<ul class="pagination flex-wrap justify-content-center">

			<!-- First button -->
			<li class="page-item <?php if (!Paginator::showPrev()) echo 'disabled' ?>">
				<a class="page-link" href="<?php echo Paginator::firstPageUrl() ?>"><span class="align-middle fa fa-media-skip-backward"></span> <?php echo $L->get('First'); ?></a>
			</li>

			<!-- Previous button -->
			<li class="page-item <?php if (!Paginator::showPrev()) echo 'disabled' ?>">
				<a class="page-link" href="<?php echo Paginator::previousPageUrl() ?>"><?php echo $L->get('Previous'); ?></a>
			</li>

			<!-- Next button -->
			<li class="page-item <?php if (!Paginator::showNext()) echo 'disabled' ?>">
				<a class="page-link" href="<?php echo Paginator::nextPageUrl() ?>"><?php echo $L->get('Next'); ?></a>
			</li>

			<!-- Last button -->
			<li class="page-item <?php if (!Paginator::showNext()) echo 'disabled' ?>">
				<a class="page-link" href="<?php echo Paginator::lastPageUrl() ?>"><?php echo $L->get('Last'); ?> <span class="align-middle fa fa-media-skip-forward"></span></a>
			</li>

			</ul>
		</nav>
		<?php endif; ?>
	</div>

	<!-- TABS STATIC -->
	<div class="tab-pane" id="static" role="tabpanel">
	<?php table('static'); ?>
	</div>

	<!-- TABS SCHEDULED -->
	<div class="tab-pane" id="scheduled" role="tabpanel">
	<?php table('scheduled'); ?>
	</div>

	<!-- TABS DRAFT -->
	<div class="tab-pane" id="draft" role="tabpanel">
	<?php table('draft'); ?>
	</div>

	<!-- TABS AUTOSAVE -->
	<?php if (!empty($autosave)): ?>
	<div class="tab-pane" id="autosave" role="tabpanel">
	<?php table('autosave'); ?>
	</div>
	<?php endif; ?>
</div>

<!-- Modal for delete page -->
<?php
	echo Bootstrap::modal(array(
		'buttonPrimary'=>$L->g('Delete'),
		'buttonPrimaryClass'=>'btn-danger deletePageModalAcceptButton',
		'buttonSecondary'=>$L->g('Cancel'),
		'buttonSecondaryClass'=>'btn-link',
		'modalTitle'=>$L->g('Delete content'),
		'modalText'=>$L->g('Are you sure you want to delete this page'),
		'modalId'=>'jsdeletePageModal'
	));
?>
<script>
$(document).ready(function() {
	var key = false;

	// Button for delete a page in the table
	$(document).on("click", ".deletePageButton", function() {
		key = $(this).data('key');
	});

	// Event from button accept from the modal
	$(".deletePageModalAcceptButton").on("click", function() {
		var currentTab = window.location.hash ? window.location.hash.substring(1) : 'pages';

		var form = jQuery('<form>', {
			'action': HTML_PATH_ADMIN_ROOT+'edit-content/'+key,
			'method': 'post',
			'target': '_top'
		}).append(jQuery('<input>', {
			'type': 'hidden',
			'name': 'tokenCSRF',
			'value': tokenCSRF
		})).append(jQuery('<input>', {
			'type': 'hidden',
			'name': 'key',
			'value': key
		})).append(jQuery('<input>', {
			'type': 'hidden',
			'name': 'type',
			'value': 'delete'
		})).append(jQuery('<input>', {
			'type': 'hidden',
			'name': 'tab',
			'value': currentTab
		}));

		form.hide().appendTo("body").submit();
	});

	// Move-to: change page type via AJAX
	$(document).on("click", ".changeTypeButton", function(e) {
		e.preventDefault();
		var $btn = $(this);
		if ($btn.data('busy')) { return; }
		$btn.data('busy', true).css('opacity', 0.5);

		$.ajax({
			type: "POST",
			url: HTML_PATH_ADMIN_ROOT + "ajax/change-type",
			data: {
				tokenCSRF: tokenCSRF,
				key: $btn.data('key'),
				type: $btn.data('type')
			},
			dataType: "json"
		}).done(function(response) {
			if (response && response.status === 0) {
				window.location.reload();
			} else {
				$btn.data('busy', false).css('opacity', 1);
				alert((response && response.message) ? response.message : <?php echo json_encode($L->g('Failed to change type.')); ?>);
			}
		}).fail(function() {
			$btn.data('busy', false).css('opacity', 1);
			alert(<?php echo json_encode($L->g('Failed to change type.')); ?>);
		});
	});
});
</script>

<script>
	// Open the tab defined in the URL
	const anchor = window.location.hash;
	$(`a[href="${anchor}"]`).tab('show');
</script>


================================================
FILE: bl-kernel/admin/views/dashboard.php
================================================
<div id="dashboard" class="container">

            <!-- Search with welcome message -->
            <?php
            $username = $login->username();
            $user = new User($username);
            $name = '';
            if ($user->nickname()) {
                $name = $user->nickname();
            } elseif ($user->firstName()) {
                $name = $user->firstName();
            }
            ?>
            <div class="quick-search-trigger mb-4" id="searchTrigger">
                <div class="quick-search-icon">
                    <span class="fa fa-hand-spock-o" id="hello-icon"></span>
                </div>
                <span class="quick-search-text">
                    <span id="hello-text"><?php echo $L->g('welcome') . ($name ? ', ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') : '') ?></span>
                    <small class="quick-search-hint"><?php $L->p('click-here-for-quick-search') ?></small>
                </span>
                <span class="quick-search-shortcut">⌘K</span>
            </div>
            <script>
                $(document).ready(function() {
                    var date = new Date()
                    var hours = date.getHours()
                    var icon, greeting
                    var suffix = <?php echo json_encode($name ? ', ' . $name : '', JSON_HEX_TAG | JSON_UNESCAPED_UNICODE) ?>
                    if (hours >= 6 && hours < 12) {
                        icon = 'fa-sun-o'; greeting = <?php echo json_encode($L->g('good-morning'), JSON_HEX_TAG | JSON_UNESCAPED_UNICODE) ?> + suffix
                    } else if (hours >= 12 && hours < 18) {
                        icon = 'fa-sun-o'; greeting = <?php echo json_encode($L->g('good-afternoon'), JSON_HEX_TAG | JSON_UNESCAPED_UNICODE) ?> + suffix
                    } else if (hours >= 18 && hours < 22) {
                        icon = 'fa-moon-o'; greeting = <?php echo json_encode($L->g('good-evening'), JSON_HEX_TAG | JSON_UNESCAPED_UNICODE) ?> + suffix
                    } else {
                        icon = 'fa-moon-o'; greeting = <?php echo json_encode($L->g('good-night'), JSON_HEX_TAG | JSON_UNESCAPED_UNICODE) ?> + suffix
                    }
                    $('#hello-icon').attr('class', 'fa ' + icon)
                    $('#hello-text').text(greeting)
                });
            </script>

            <!-- Quick Search Modal -->
            <div class="quick-search-modal" id="searchModal">
                <div class="quick-search-overlay" id="searchOverlay"></div>
                <div class="quick-search-content">
                    <div class="quick-search-header">
                        <span class="fa fa-search"></span>
                        <input type="text" id="jsclippy" class="quick-search-input" placeholder="<?php $L->p('search-placeholder') ?>">
                    </div>
                    <div id="searchResults" class="quick-search-results"></div>
                </div>
            </div>

            <script>
                $(document).ready(function() {
                    var searchInput = $('#jsclippy');
                    var searchResults = $('#searchResults');
                    var modal = $('#searchModal');
                    var trigger = $('#searchTrigger');
                    var overlay = $('#searchOverlay');
                    var searchTimeout;

                    function openSearch() {
                        modal.addClass('active');
                        $('body').css('overflow', 'hidden');
                        setTimeout(function() {
                            searchInput.focus();
                        }, 150);
                    }

                    function closeSearch() {
                        modal.removeClass('active');
                        $('body').css('overflow', '');
                        searchInput.val('');
                        searchResults.empty();
                    }

                    function performSearch(query) {
                        if (!query) {
                            searchResults.empty();
                            return;
                        }

                        $.ajax({
                            url: HTML_PATH_ADMIN_ROOT + "ajax/clippy",
                            data: { query: query },
                            success: function(data) {
                                searchResults.empty();

                                if (data.results && data.results.length > 0) {
                                    data.results.forEach(function(item) {
                                        var resultHtml = '';
                                        if (item.type == 'menu') {
                                            resultHtml = '<a href="' + item.url + '" class="search-suggestion">';
                                            resultHtml += '<span class="fa fa-' + item.icon + '"></span>' + item.text + '</a>';
                                        } else {
                                            resultHtml = '<div class="search-suggestion">';
                                            resultHtml += '<div class="search-suggestion-item">' + item.text + ' <span class="badge badge-pill badge-light">' + item.type + '</span></div>';
                                            resultHtml += '<div class="search-suggestion-options">';
                                            resultHtml += '<a target="_blank" href="' + DOMAIN_PAGES + item.id + '"><?php $L->p('view') ?></a>';
                                            resultHtml += '<a class="ml-2" href="' + DOMAIN_ADMIN + 'edit-content/' + item.id + '"><?php $L->p('edit') ?></a>';
                                            resultHtml += '</div></div>';
                                        }
                                        searchResults.append(resultHtml);
                                    });
                                } else {
                                    searchResults.html('<div class="search-no-results"><?php $L->p("no-results-found") ?></div>');
                                }
                            }
                        });
                    }

                    searchInput.on('input', function() {
                        clearTimeout(searchTimeout);
                        var query = $(this).val();
                        searchTimeout = setTimeout(function() {
                            performSearch(query);
                        }, 300);
                    });

                    trigger.on('click', openSearch);
          
Download .txt
gitextract_3ux4dkd8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── config.yml
│   └── workflows/
│       └── close_inactive_issues.yml
├── .gitignore
├── .htaccess
├── .prettierrc
├── LICENSE
├── README.ar.md
├── README.de.md
├── README.es.md
├── README.fr.md
├── README.hi.md
├── README.it.md
├── README.ja.md
├── README.md
├── README.pt.md
├── README.ru.md
├── README.zh.md
├── bl-content/
│   └── .keep
├── bl-kernel/
│   ├── abstract/
│   │   ├── dbjson.class.php
│   │   ├── dblist.class.php
│   │   └── plugin.class.php
│   ├── admin/
│   │   ├── controllers/
│   │   │   ├── about.php
│   │   │   ├── api.php
│   │   │   ├── categories.php
│   │   │   ├── configure-plugin.php
│   │   │   ├── content.php
│   │   │   ├── dashboard.php
│   │   │   ├── developers.php
│   │   │   ├── edit-category.php
│   │   │   ├── edit-content.php
│   │   │   ├── edit-user.php
│   │   │   ├── install-plugin.php
│   │   │   ├── install-theme.php
│   │   │   ├── login.php
│   │   │   ├── logout.php
│   │   │   ├── new-category.php
│   │   │   ├── new-content.php
│   │   │   ├── new-user.php
│   │   │   ├── plugins-position.php
│   │   │   ├── plugins.php
│   │   │   ├── settings.php
│   │   │   ├── themes.php
│   │   │   ├── uninstall-plugin.php
│   │   │   ├── user-password.php
│   │   │   └── users.php
│   │   ├── themes/
│   │   │   └── booty/
│   │   │       ├── css/
│   │   │       │   ├── bludit.bootstrap.css
│   │   │       │   └── bludit.css
│   │   │       ├── html/
│   │   │       │   ├── alert.php
│   │   │       │   ├── media.php
│   │   │       │   ├── navbar.php
│   │   │       │   └── sidebar.php
│   │   │       ├── index.php
│   │   │       ├── init.php
│   │   │       └── login.php
│   │   └── views/
│   │       ├── about.php
│   │       ├── blocks.php
│   │       ├── categories.php
│   │       ├── configure-plugin.php
│   │       ├── content.php
│   │       ├── dashboard.php
│   │       ├── developers.php
│   │       ├── edit-category.php
│   │       ├── edit-content.php
│   │       ├── edit-user.php
│   │       ├── login.php
│   │       ├── new-category.php
│   │       ├── new-content.php
│   │       ├── new-user.php
│   │       ├── plugins-position.php
│   │       ├── plugins.php
│   │       ├── settings.php
│   │       ├── themes.php
│   │       ├── user-password.php
│   │       └── users.php
│   ├── ajax/
│   │   ├── change-type.php
│   │   ├── clippy.php
│   │   ├── content-get-list.php
│   │   ├── delete-image.php
│   │   ├── generate-slug.php
│   │   ├── get-published.php
│   │   ├── list-images.php
│   │   ├── logo-remove.php
│   │   ├── logo-upload.php
│   │   ├── profile-picture-upload.php
│   │   ├── save-as-draft.php
│   │   └── upload-images.php
│   ├── boot/
│   │   ├── admin.php
│   │   ├── init.php
│   │   ├── rules/
│   │   │   ├── 60.plugins.php
│   │   │   ├── 60.router.php
│   │   │   ├── 69.pages.php
│   │   │   ├── 99.header.php
│   │   │   ├── 99.paginator.php
│   │   │   ├── 99.security.php
│   │   │   └── 99.themes.php
│   │   ├── site.php
│   │   └── variables.php
│   ├── categories.class.php
│   ├── category.class.php
│   ├── css/
│   │   └── bootstrap-icons/
│   │       ├── bootstrap-icons.css
│   │       └── bootstrap-icons.json
│   ├── functions.php
│   ├── helpers/
│   │   ├── alert.class.php
│   │   ├── cookie.class.php
│   │   ├── date.class.php
│   │   ├── dom.class.php
│   │   ├── email.class.php
│   │   ├── filesystem.class.php
│   │   ├── image.class.php
│   │   ├── log.class.php
│   │   ├── paginator.class.php
│   │   ├── redirect.class.php
│   │   ├── sanitize.class.php
│   │   ├── session.class.php
│   │   ├── tcp.class.php
│   │   ├── text.class.php
│   │   ├── theme.class.php
│   │   └── valid.class.php
│   ├── js/
│   │   ├── bludit-ajax.php
│   │   ├── functions.js
│   │   └── variables.php
│   ├── language.class.php
│   ├── login.class.php
│   ├── pages.class.php
│   ├── pagex.class.php
│   ├── parsedown.class.php
│   ├── security.class.php
│   ├── site.class.php
│   ├── syslog.class.php
│   ├── tag.class.php
│   ├── tags.class.php
│   ├── url.class.php
│   ├── user.class.php
│   ├── users.class.php
│   └── vendors/
│       └── bootstrap-icons/
│           ├── bootstrap-icons.css
│           └── bootstrap-icons.json
├── bl-languages/
│   ├── ar_MA.json
│   ├── bg_BG.json
│   ├── ckb.json
│   ├── cs_CZ.json
│   ├── da.json
│   ├── de_AT.json
│   ├── de_CH.json
│   ├── de_DE.json
│   ├── en.json
│   ├── es.json
│   ├── fa_IR.json
│   ├── fi_FI.json
│   ├── fr_FR.json
│   ├── gr.json
│   ├── he_IL.json
│   ├── hu_HU.json
│   ├── id_ID.json
│   ├── it_IT.json
│   ├── ja_JP.json
│   ├── lt.json
│   ├── ms_MY.json
│   ├── nl_NL.json
│   ├── pl_PL.json
│   ├── pt_BR.json
│   ├── pt_PT.json
│   ├── ro_RO.json
│   ├── ru.json
│   ├── sv_SE.json
│   ├── tr_TR.json
│   ├── uk_UA.json
│   ├── vi_VN.json
│   ├── zh_CN.json
│   └── zh_TW.json
├── bl-plugins/
│   ├── about/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── alternative/
│   │   ├── languages/
│   │   │   ├── de_AT.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── api/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── canonical/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── categories/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── custom-fields-parser/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── en.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   └── ru.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── disqus/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── easymde/
│   │   ├── css/
│   │   │   └── bludit.css
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it_IT.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── hit-counter/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── html-code/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── links/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── maintenance-mode/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr_TR.json
│   │   │   ├── uk_UA.json
│   │   │   └── zh_TW.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── navigation/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── opengraph/
│   │   ├── languages/
│   │   │   ├── bg_BG.json
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── pl_PL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr.json
│   │   │   ├── uk_UA.json
│   │   │   └── zh_TW.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── popeye/
│   │   ├── languages/
│   │   │   ├── de_AT.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── ja_JP.json
│   │   │   └── nl_NL.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── remote-content/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   └── ru_RU.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── robots/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── rss/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── search/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   ├── plugin.php
│   │   └── vendors/
│   │       └── fuzz.php
│   ├── sitemap/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   ├── tr.json
│   │   │   └── uk_UA.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── static-pages/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── tags/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── tinymce/
│   │   ├── css/
│   │   │   ├── tinymce_content.css
│   │   │   └── tinymce_toolbar.css
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   ├── plugin.php
│   │   └── tinymce/
│   │       ├── langs/
│   │       │   └── README.md
│   │       ├── license.md
│   │       ├── notices.txt
│   │       ├── plugins/
│   │       │   ├── emoticons/
│   │       │   │   └── js/
│   │       │   │       ├── emojiimages.js
│   │       │   │       └── emojis.js
│   │       │   └── help/
│   │       │       └── js/
│   │       │           └── i18n/
│   │       │               └── keynav/
│   │       │                   ├── ar.js
│   │       │                   ├── bg-BG.js
│   │       │                   ├── bg_BG.js
│   │       │                   ├── ca.js
│   │       │                   ├── cs.js
│   │       │                   ├── da.js
│   │       │                   ├── de.js
│   │       │                   ├── el.js
│   │       │                   ├── en.js
│   │       │                   ├── es.js
│   │       │                   ├── eu.js
│   │       │                   ├── fa.js
│   │       │                   ├── fi.js
│   │       │                   ├── fr-FR.js
│   │       │                   ├── fr_FR.js
│   │       │                   ├── he-IL.js
│   │       │                   ├── he_IL.js
│   │       │                   ├── hi.js
│   │       │                   ├── hr.js
│   │       │                   ├── hu-HU.js
│   │       │                   ├── hu_HU.js
│   │       │                   ├── id.js
│   │       │                   ├── it.js
│   │       │                   ├── ja.js
│   │       │                   ├── kk.js
│   │       │                   ├── ko-KR.js
│   │       │                   ├── ko_KR.js
│   │       │                   ├── ms.js
│   │       │                   ├── nb-NO.js
│   │       │                   ├── nb_NO.js
│   │       │                   ├── nl.js
│   │       │                   ├── pl.js
│   │       │                   ├── pt-BR.js
│   │       │                   ├── pt-PT.js
│   │       │                   ├── pt_BR.js
│   │       │                   ├── pt_PT.js
│   │       │                   ├── ro.js
│   │       │                   ├── ru.js
│   │       │                   ├── sk.js
│   │       │                   ├── sl-SI.js
│   │       │                   ├── sl_SI.js
│   │       │                   ├── sv-SE.js
│   │       │                   ├── sv_SE.js
│   │       │                   ├── th-TH.js
│   │       │                   ├── th_TH.js
│   │       │                   ├── tr.js
│   │       │                   ├── uk.js
│   │       │                   ├── vi.js
│   │       │                   ├── zh-CN.js
│   │       │                   ├── zh-TW.js
│   │       │                   ├── zh_CN.js
│   │       │                   └── zh_TW.js
│   │       ├── skins/
│   │       │   ├── content/
│   │       │   │   ├── dark/
│   │       │   │   │   └── content.js
│   │       │   │   ├── default/
│   │       │   │   │   └── content.js
│   │       │   │   ├── document/
│   │       │   │   │   └── content.js
│   │       │   │   ├── tinymce-5/
│   │       │   │   │   └── content.js
│   │       │   │   ├── tinymce-5-dark/
│   │       │   │   │   └── content.js
│   │       │   │   └── writer/
│   │       │   │       └── content.js
│   │       │   └── ui/
│   │       │       ├── oxide/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       ├── oxide-dark/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       ├── tinymce-5/
│   │       │       │   ├── content.inline.js
│   │       │       │   ├── content.js
│   │       │       │   ├── skin.js
│   │       │       │   └── skin.shadowdom.js
│   │       │       └── tinymce-5-dark/
│   │       │           ├── content.inline.js
│   │       │           ├── content.js
│   │       │           ├── skin.js
│   │       │           └── skin.shadowdom.js
│   │       └── tinymce.d.ts
│   ├── twitter-cards/
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   ├── version/
│   │   ├── js/
│   │   │   └── version.js
│   │   ├── languages/
│   │   │   ├── da.json
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── fr_FR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── plugin.php
│   └── visits-stats/
│       ├── languages/
│       │   ├── de_AT.json
│       │   ├── de_CH.json
│       │   ├── de_DE.json
│       │   ├── en.json
│       │   ├── it_IT.json
│       │   ├── ja_JP.json
│       │   └── nl_NL.json
│       ├── metadata.json
│       └── plugin.php
├── bl-themes/
│   ├── alternative/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── init.php
│   │   ├── languages/
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── footer.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       └── page.php
│   ├── blogx/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── languages/
│   │   │   ├── de_CH.json
│   │   │   ├── de_DE.json
│   │   │   ├── en.json
│   │   │   ├── es.json
│   │   │   ├── fa_IR.json
│   │   │   ├── it.json
│   │   │   ├── ja_JP.json
│   │   │   ├── nl_NL.json
│   │   │   ├── ru_RU.json
│   │   │   └── tr_TR.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── footer.php
│   │       ├── head.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       ├── page.php
│   │       └── sidebar.php
│   ├── flavor/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── index.php
│   │   ├── languages/
│   │   │   └── en.json
│   │   ├── metadata.json
│   │   └── php/
│   │       ├── 404.php
│   │       ├── footer.php
│   │       ├── head.php
│   │       ├── home.php
│   │       ├── navbar.php
│   │       └── page.php
│   └── popeye/
│       ├── css/
│       │   ├── 01-style.css
│       │   ├── 02-helpers.css
│       │   └── 99-darkmode.css
│       ├── index.php
│       ├── init.php
│       ├── languages/
│       │   ├── de_AT.json
│       │   ├── de_CH.json
│       │   ├── de_DE.json
│       │   ├── en.json
│       │   └── ja_JP.json
│       ├── metadata.json
│       └── php/
│           ├── footer.php
│           ├── home.php
│           ├── navbar.php
│           └── page.php
├── index.php
└── install.php
Download .txt
SYMBOL INDEX (1508 symbols across 74 files)

FILE: bl-kernel/abstract/dbjson.class.php
  class dbJSON (line 3) | class dbJSON {
    method __construct (line 12) | function __construct($file, $firstLine=true)
    method restoreDB (line 43) | public function restoreDB()
    method count (line 50) | public function count()
    method getField (line 56) | public function getField($field)
    method save (line 68) | public function save()
    method serialize (line 91) | private function serialize($data)
    method unserialize (line 100) | private function unserialize($data)
    method getDB (line 111) | public function getDB()
    method truncate (line 117) | public function truncate()

FILE: bl-kernel/abstract/dblist.class.php
  class dbList (line 22) | class dbList extends dbJSON
    method __construct (line 26) | function __construct($file)
    method keys (line 31) | public function keys()
    method getList (line 38) | public function getList($key, $pageNumber, $numberOfItems)
    method generateKey (line 64) | public function generateKey($name)
    method add (line 80) | public function add($args)
    method remove (line 94) | public function remove($key)
    method edit (line 107) | public function edit($args)
    method sortAlphanumeric (line 130) | public function sortAlphanumeric()
    method getName (line 137) | public function getName($key)
    method getKeyNameArray (line 146) | public function getKeyNameArray()
    method countItems (line 156) | public function countItems($key)
    method exists (line 164) | public function exists($key)
    method existsName (line 169) | public function existsName($name)
    method getMap (line 181) | public function getMap($key)

FILE: bl-kernel/abstract/plugin.class.php
  class Plugin (line 3) | class Plugin
    method __construct (line 38) | function __construct()
    method save (line 74) | public function save()
    method includeCSS (line 81) | public function includeCSS($filename)
    method includeJS (line 86) | public function includeJS($filename)
    method domainPath (line 93) | public function domainPath()
    method htmlPath (line 100) | public function htmlPath()
    method phpPath (line 107) | public function phpPath()
    method phpPathDB (line 112) | public function phpPathDB()
    method getMetadata (line 118) | public function getMetadata($key)
    method setMetadata (line 128) | public function setMetadata($key, $value)
    method getValue (line 137) | public function getValue($field, $html = true)
    method label (line 149) | public function label()
    method name (line 154) | public function name()
    method description (line 159) | public function description()
    method author (line 164) | public function author()
    method email (line 169) | public function email()
    method website (line 174) | public function website()
    method position (line 179) | public function position()
    method version (line 184) | public function version()
    method releaseDate (line 189) | public function releaseDate()
    method className (line 194) | public function className()
    method formButtons (line 199) | public function formButtons()
    method isCompatible (line 204) | public function isCompatible()
    method directoryName (line 217) | public function directoryName()
    method install (line 223) | public function install($position = 1)
    method uninstall (line 248) | public function uninstall()
    method installed (line 263) | public function installed()
    method workspace (line 268) | public function workspace()
    method init (line 273) | public function init()
    method prepare (line 279) | public function prepare()
    method post (line 285) | public function post()
    method type (line 303) | public function type()
    method setField (line 308) | public function setField($field, $value)
    method setPosition (line 314) | public function setPosition($position)
    method webhook (line 321) | public function webhook($URI = false, $returnsAfterURI = false, $fixed...

FILE: bl-kernel/admin/controllers/content.php
  function filterContentOwner (line 14) | function filterContentOwner($list) {

FILE: bl-kernel/admin/controllers/dashboard.php
  function updateBludit (line 6) | function updateBludit() {

FILE: bl-kernel/admin/controllers/developers.php
  function printTable (line 14) | function printTable($title, $array) {

FILE: bl-kernel/admin/controllers/login.php
  function checkLogin (line 11) | function checkLogin($args)
  function checkRememberMe (line 44) | function checkRememberMe()

FILE: bl-kernel/admin/themes/booty/init.php
  class Bootstrap (line 3) | class Bootstrap
    method modal (line 6) | public static function modal($args)
    method link (line 38) | public static function link($args)
    method pageTitle (line 55) | public static function pageTitle($args)
    method formOpen (line 66) | public static function formOpen($args)
    method formClose (line 80) | public static function formClose()
    method formTitle (line 97) | public static function formTitle($args)
    method formInputTextBlock (line 105) | public static function formInputTextBlock($args)
    method formInputFile (line 151) | public static function formInputFile($args)
    method formTextarea (line 171) | public static function formTextarea($args)
    method formTextareaBlock (line 200) | public static function formTextareaBlock($args)
    method formInputText (line 226) | public static function formInputText($args)
    method formCheckbox (line 270) | public static function formCheckbox($args)
    method formSelect (line 318) | public static function formSelect($args)
    method formSelectBlock (line 351) | public static function formSelectBlock($args)
    method formInputHidden (line 385) | public static function formInputHidden($args)
    method alert (line 390) | public static function alert($args)

FILE: bl-kernel/admin/views/content.php
  function moveTypeIcon (line 5) | function moveTypeIcon($type) {
  function moveTypeLabel (line 15) | function moveTypeLabel($current, $target, $L) {
  function tableRow (line 33) | function tableRow($pageKey, $type, $isSticky = false, $renderChildren = ...
  function tableRows (line 163) | function tableRows($list, $type, $isSticky = false) {
  function table (line 183) | function table($type) {
  function tablePages (line 224) | function tablePages() {

FILE: bl-kernel/boot/rules/60.plugins.php
  function buildPlugins (line 53) | function buildPlugins()

FILE: bl-kernel/boot/rules/99.themes.php
  function buildThemes (line 12) | function buildThemes()

FILE: bl-kernel/categories.class.php
  class Categories (line 3) | class Categories extends dbList {
    method __construct (line 5) | function __construct()
    method numberOfPages (line 10) | function numberOfPages($key)
    method reindex (line 15) | public function reindex()

FILE: bl-kernel/category.class.php
  class Category (line 3) | class Category {
    method __construct (line 7) | function __construct($key)
    method getValue (line 24) | public function getValue($field)
    method key (line 32) | public function key()
    method name (line 37) | public function name()
    method permalink (line 42) | public function permalink()
    method template (line 47) | public function template()
    method description (line 52) | public function description()
    method pages (line 58) | public function pages()
    method json (line 64) | public function json($returnsArray=false)

FILE: bl-kernel/functions.php
  function reindexCategories (line 5) | function reindexCategories()
  function reindexTags (line 13) | function reindexTags()
  function buildErrorPage (line 20) | function buildErrorPage()
  function buildThePage (line 41) | function buildThePage()
  function buildPagesForHome (line 64) | function buildPagesForHome()
  function buildPagesByCategory (line 70) | function buildPagesByCategory()
  function buildPagesByTag (line 79) | function buildPagesByTag()
  function buildPagesFor (line 90) | function buildPagesFor($for, $categoryKey = false, $tagKey = false)
  function buildStaticPages (line 174) | function buildStaticPages()
  function buildPage (line 193) | function buildPage($pageKey)
  function buildParentPages (line 205) | function buildParentPages()
  function getPlugin (line 226) | function getPlugin($pluginClassName)
  function pluginActivated (line 237) | function pluginActivated($pluginClassName)
  function activatePlugin (line 247) | function activatePlugin($pluginClassName)
  function deactivatePlugin (line 271) | function deactivatePlugin($pluginClassName)
  function deactivateAllPlugin (line 296) | function deactivateAllPlugin()
  function changePluginsPosition (line 315) | function changePluginsPosition($pluginClassList)
  function createPage (line 344) | function createPage($args)
  function editPage (line 391) | function editPage($args)
  function deletePage (line 438) | function deletePage($key)
  function editUser (line 462) | function editUser($args)
  function disableUser (line 480) | function disableUser($args)
  function deleteUser (line 513) | function deleteUser($args)
  function createUser (line 557) | function createUser($args)
  function editSettings (line 610) | function editSettings($args)
  function changeUserPassword (line 697) | function changeUserPassword($args)
  function checkRole (line 741) | function checkRole($allowRoles, $redirect = true)
  function createCategory (line 767) | function createCategory($args)
  function editCategory (line 793) | function editCategory($args)
  function deleteCategory (line 825) | function deleteCategory($args)
  function getCategories (line 848) | function getCategories()
  function getCategory (line 861) | function getCategory($key)
  function getTags (line 873) | function getTags()
  function getTag (line 886) | function getTag($key)
  function activateTheme (line 897) | function activateTheme($themeDirectory)
  function ajaxResponse (line 930) | function ajaxResponse($status = 0, $message = "", $data = array())
  function transformImage (line 949) | function transformImage($file, $imageDir, $thumbnailDir = false)
  function mediaManagerListImages (line 1027) | function mediaManagerListImages($imagePath, $thumbnailPath, $chunk)
  function downloadRestrictedFile (line 1090) | function downloadRestrictedFile($file)

FILE: bl-kernel/helpers/alert.class.php
  class Alert (line 3) | class Alert {
    method set (line 6) | public static function set($value, $status=ALERT_STATUS_OK, $key='alert')
    method get (line 13) | public static function get($key='alert')
    method status (line 19) | public static function status()
    method p (line 24) | public static function p($key='alert')
    method defined (line 29) | public static function defined()

FILE: bl-kernel/helpers/cookie.class.php
  class Cookie (line 3) | class Cookie {
    method get (line 5) | public static function get($key)
    method set (line 13) | public static function set($key, $value, $daysToExpire=30, $options=ar...
    method remove (line 30) | public static function remove($key)
    method isEmpty (line 36) | public static function isEmpty($key)

FILE: bl-kernel/helpers/date.class.php
  class Date (line 3) | class Date {
    method translate (line 7) | public static function translate($date)
    method unixTime (line 25) | public static function unixTime()
    method current (line 31) | public static function current($format)
    method currentOffset (line 41) | public static function currentOffset($format, $offset)
    method offset (line 50) | public static function offset($date, $format, $offset)
    method format (line 60) | public static function format($date, $currentFormat, $outputFormat)
    method convertToUTC (line 73) | public static function convertToUTC($date, $currentFormat, $outputFormat)
    method timeago (line 82) | public static function timeago($time)
    method timezoneList (line 106) | public static function timezoneList()

FILE: bl-kernel/helpers/dom.class.php
  class DOM (line 3) | class DOM {
    method getFirstImage (line 5) | public static function getFirstImage($content)

FILE: bl-kernel/helpers/email.class.php
  class Email (line 3) | class Email {
    method send (line 6) | public static function send($args)

FILE: bl-kernel/helpers/filesystem.class.php
  class Filesystem (line 3) | class Filesystem
    method listDirectories (line 7) | public static function listDirectories($path, $regex = '*', $sortByDat...
    method listFiles (line 30) | public static function listFiles($path, $regex = '*', $extension = '*'...
    method mkdir (line 56) | public static function mkdir($pathname, $recursive = false)
    method rmdir (line 62) | public static function rmdir($pathname)
    method mv (line 68) | public static function mv($oldname, $newname)
    method rmfile (line 87) | public static function rmfile($filename)
    method fileExists (line 93) | public static function fileExists($filename)
    method directoryExists (line 98) | public static function directoryExists($path)
    method copyRecursive (line 107) | public static function copyRecursive($source, $destination, $skipDirec...
    method deleteRecursive (line 145) | public static function deleteRecursive($source, $deleteDirectory = true)
    method zip (line 173) | public static function zip($source, $destination)
    method unzip (line 211) | public static function unzip($source, $destination)
    method nextFilename (line 238) | public static function nextFilename($filename, $path = PATH_UPLOADS)
    method filename (line 270) | public static function filename($file)
    method extension (line 285) | public static function extension($file)
    method getSize (line 295) | public static function getSize($fileOrDirectory)
    method bytesToHumanFileSize (line 316) | public static function bytesToHumanFileSize($bytes, $decimals = 2)
    method mimeType (line 333) | public static function mimeType($file)
    method symlink (line 349) | public static function symlink($from, $to)

FILE: bl-kernel/helpers/image.class.php
  class Image (line 3) | class Image {
    method setImage (line 10) | public function setImage($fileName, $newWidth, $newHeight, $option="au...
    method saveImage (line 28) | public function saveImage($savePath, $imageQuality="100", $forceJPG=fa...
    method openImage (line 85) | private function openImage($file)
    method resizeImage (line 129) | private function resizeImage($newWidth, $newHeight, $option)
    method getDimensions (line 151) | private function getDimensions($newWidth, $newHeight, $option)
    method getSizeByFixedHeight (line 193) | private function getSizeByFixedHeight($newHeight)
    method getSizeByFixedWidth (line 200) | private function getSizeByFixedWidth($newWidth)
    method getSizeByAuto (line 207) | private function getSizeByAuto($newWidth, $newHeight)
    method getOptimalCrop (line 240) | private function getOptimalCrop($newWidth, $newHeight)
    method crop (line 258) | private function crop($optimalWidth, $optimalHeight, $newWidth, $newHe...

FILE: bl-kernel/helpers/log.class.php
  class Log (line 3) | class Log {
    method set (line 5) | public static function set($text, $type=LOG_TYPE_INFO)

FILE: bl-kernel/helpers/paginator.class.php
  class Paginator (line 3) | class Paginator {
    method set (line 18) | public static function set($key, $value)
    method get (line 23) | public static function get($key)
    method numberOfPages (line 28) | public static function numberOfPages()
    method currentPage (line 33) | public static function currentPage()
    method nextPage (line 38) | public static function nextPage()
    method prevPage (line 43) | public static function prevPage()
    method showNext (line 48) | public static function showNext()
    method showPrev (line 53) | public static function showPrev()
    method firstPage (line 58) | public static function firstPage()
    method firstPageUrl (line 64) | public static function firstPageUrl()
    method lastPageUrl (line 70) | public static function lastPageUrl()
    method nextPageUrl (line 76) | public static function nextPageUrl()
    method previousPageUrl (line 82) | public static function previousPageUrl()
    method numberUrl (line 88) | public static function numberUrl($pageNumber)
    method html (line 105) | public static function html($textPrevPage=false, $textNextPage=false, ...
    method bootstrap_html (line 147) | public static function bootstrap_html($textPrevPage=false, $textNextPa...

FILE: bl-kernel/helpers/redirect.class.php
  class Redirect (line 3) | class Redirect {
    method url (line 5) | public static function url($url, $httpCode=301)
    method page (line 15) | public static function page($page)
    method home (line 20) | public static function home()
    method admin (line 25) | public static function admin()

FILE: bl-kernel/helpers/sanitize.class.php
  class Sanitize (line 3) | class Sanitize {
    method removeTags (line 5) | public static function removeTags($text) {
    method html (line 10) | public static function html($text)
    method htmlDecode (line 22) | public static function htmlDecode($text)
    method pathFile (line 33) | public static function pathFile($path, $file=false)
    method email (line 70) | public static function email($email)
    method url (line 75) | public static function url($url)
    method int (line 80) | public static function int($value)

FILE: bl-kernel/helpers/session.class.php
  class Session (line 3) | class Session {
    method start (line 8) | public static function start($path, $secure)
    method started (line 49) | public static function started()
    method destroy (line 54) | public static function destroy()
    method set (line 66) | public static function set($key, $value)
    method get (line 73) | public static function get($key)
    method remove (line 83) | public static function remove($key)

FILE: bl-kernel/helpers/tcp.class.php
  class TCP (line 3) | class TCP {
    method http (line 5) | public static function http($url, $method='GET', $verifySSL=true, $tim...
    method download (line 43) | public static function download($url, $destination)

FILE: bl-kernel/helpers/text.class.php
  class Text (line 3) | class Text {
    method addSlashes (line 73) | public static function addSlashes($string, $begin=true, $end=true)
    method escapeQuotes (line 91) | public static function escapeQuotes($string)
    method startsWith (line 96) | public static function startsWith($string, $startString)
    method endsWith (line 103) | public static function endsWith($string, $endsString)
    method endsWithNumeric (line 109) | public static function endsWithNumeric($string)
    method randomText (line 114) | public static function randomText($length)
    method replaceAssoc (line 124) | public static function replaceAssoc(array $replace, $text)
    method removeSpecialCharacters (line 129) | public static function removeSpecialCharacters($string, $replace='')
    method removeQuotes (line 134) | public static function removeQuotes($string, $replace='')
    method removeLineBreaks (line 140) | public static function removeLineBreaks($string)
    method removeSpaces (line 146) | public static function removeSpaces($string, $replace='')
    method cleanUrl (line 155) | public static function cleanUrl($string, $separator='-')
    method replace (line 189) | public static function replace($search, $replace, $string)
    method lowercase (line 195) | public static function lowercase($string)
    method firstCharUp (line 201) | public static function firstCharUp($string)
    method stringPosition (line 212) | public static function stringPosition($string, $substring, $caseSensit...
    method stringContains (line 221) | public static function stringContains($string, $substring, $caseSensit...
    method cut (line 227) | public static function cut($string, $start, $length)
    method removeHTMLTags (line 238) | public static function removeHTMLTags($string)
    method length (line 244) | public static function length($string)
    method isEmpty (line 249) | public static function isEmpty($string)
    method isNotEmpty (line 260) | public static function isNotEmpty($string)
    method imgRel2Abs (line 265) | public static function imgRel2Abs($string, $base)
    method pre2htmlentities (line 273) | public static function pre2htmlentities($string)
    method truncate (line 283) | public static function truncate($string, $limit, $end='...')
    method toBytes (line 300) | public static function toBytes($value) {

FILE: bl-kernel/helpers/theme.class.php
  class Theme (line 3) | class Theme
    method socialNetworks (line 6) | public static function socialNetworks()
    method title (line 34) | public static function title()
    method description (line 40) | public static function description()
    method slogan (line 46) | public static function slogan()
    method footer (line 52) | public static function footer()
    method lang (line 58) | public static function lang()
    method rssUrl (line 64) | public static function rssUrl()
    method sitemapUrl (line 72) | public static function sitemapUrl()
    method siteUrl (line 83) | public static function siteUrl()
    method adminUrl (line 91) | public static function adminUrl()
    method metaTags (line 96) | public static function metaTags($tag)
    method metaTagTitle (line 105) | public static function metaTagTitle()
    method metaTagDescription (line 147) | public static function metaTagDescription()
    method headTitle (line 173) | public static function headTitle()
    method headDescription (line 180) | public static function headDescription()
    method charset (line 185) | public static function charset($charset)
    method viewport (line 190) | public static function viewport($content)
    method src (line 195) | public static function src($file, $base = DOMAIN_THEME)
    method css (line 200) | public static function css($files, $base = DOMAIN_THEME)
    method javascript (line 214) | public static function javascript($files, $base = DOMAIN_THEME, $attri...
    method js (line 228) | public static function js($files, $base = DOMAIN_THEME, $attributes = '')
    method plugins (line 233) | public static function plugins($type, $args = array())
    method favicon (line 241) | public static function favicon($file = 'favicon.png', $typeIcon = 'ima...
    method keywords (line 246) | public static function keywords($keywords)
    method jquery (line 254) | public static function jquery()
    method jsBootstrap (line 259) | public static function jsBootstrap($attributes = '')
    method cssBootstrap (line 264) | public static function cssBootstrap()
    method cssBootstrapIcons (line 269) | public static function cssBootstrapIcons()
    method cssLineAwesome (line 275) | public static function cssLineAwesome()
    method jsSortable (line 280) | public static function jsSortable($attributes = '')

FILE: bl-kernel/helpers/valid.class.php
  class Valid (line 3) | class Valid {
    method ip (line 5) | public static function ip($ip)
    method email (line 11) | public static function email($email)
    method int (line 16) | public static function int($int)
    method date (line 29) | public static function date($date, $format='Y-m-d H:i:s')

FILE: bl-kernel/js/functions.js
  function sanitizeHTML (line 1) | function sanitizeHTML(text) {
  function setCookie (line 13) | function setCookie(name, value, days) {
  function getCookie (line 23) | function getCookie(name) {
  function deleteCookie (line 34) | function deleteCookie(name) {

FILE: bl-kernel/language.class.php
  class Language (line 3) | class Language extends dbJSON {
    method __construct (line 10) | function __construct($currentLanguage)
    method locale (line 50) | public function locale()
    method currentLanguage (line 59) | public function currentLanguage()
    method currentLanguageShortVersion (line 64) | public function currentLanguageShortVersion()
    method get (line 72) | public function get($string)
    method g (line 90) | public function g($string)
    method printMe (line 96) | public function printMe($string)
    method p (line 102) | public function p($string)
    method add (line 109) | public function add($array)
    method getLanguageList (line 115) | public function getLanguageList()
    method getDates (line 131) | public function getDates()
    method getunicodeChars (line 137) | public function getunicodeChars()

FILE: bl-kernel/login.class.php
  class Login (line 3) | class Login
    method __construct (line 8) | function __construct()
    method username (line 29) | public function username()
    method role (line 35) | public function role()
    method isLogged (line 41) | public function isLogged()
    method setLogin (line 59) | public function setLogin($username, $role)
    method setRememberMe (line 72) | public function setRememberMe($username)
    method invalidateRememberMe (line 87) | public function invalidateRememberMe()
    method verifyUser (line 102) | public function verifyUser($username, $password)
    method verifyUserByRemember (line 135) | public function verifyUserByRemember()
    method fingerPrint (line 169) | public function fingerPrint()
    method logout (line 178) | public function logout()

FILE: bl-kernel/pages.class.php
  class Pages (line 3) | class Pages extends dbJSON
    method __construct (line 28) | function __construct()
    method getDefaultFields (line 33) | public function getDefaultFields()
    method getPageDB (line 39) | public function getPageDB($key)
    method exists (line 49) | public function exists($key)
    method add (line 56) | public function add($args)
    method edit (line 174) | public function edit($args)
    method reindexChildren (line 295) | public function reindexChildren($oldParentKey, $newParentKey)
    method delete (line 310) | public function delete($key)
    method deletePagesByUser (line 355) | public function deletePagesByUser($args)
    method transferPages (line 369) | public function transferPages($args)
    method setField (line 384) | public function setField($key, $field, $value)
    method getDB (line 397) | public function getDB($onlyKeys = true)
    method getPublishedDB (line 409) | public function getPublishedDB($onlyKeys = true)
    method getStaticDB (line 425) | public function getStaticDB($onlyKeys = true)
    method getDraftDB (line 441) | public function getDraftDB($onlyKeys = true)
    method getAutosaveDB (line 456) | public function getAutosaveDB($onlyKeys = true)
    method getScheduledDB (line 471) | public function getScheduledDB($onlyKeys = true)
    method getStickyDB (line 486) | public function getStickyDB($onlyKeys = true)
    method nextPositionNumber (line 501) | public function nextPositionNumber()
    method nextPageKey (line 513) | public function nextPageKey($currentKey)
    method previousPageKey (line 529) | public function previousPageKey($currentKey)
    method getList (line 549) | public function getList($pageNumber, $numberOfItems, $published = true...
    method count (line 587) | public function count($onlyPublished = true)
    method getParents (line 598) | public function getParents()
    method getChildren (line 610) | public function getChildren($parentKey)
    method sortBy (line 622) | public function sortBy()
    method sortByPosition (line 631) | public function sortByPosition($HighToLow = false)
    method sortByPositionLowToHigh (line 641) | private function sortByPositionLowToHigh($a, $b)
    method sortByPositionHighToLow (line 652) | private function sortByPositionHighToLow($a, $b)
    method sortByDate (line 664) | public function sortByDate($HighToLow = true)
    method sortByDateLowToHigh (line 674) | private function sortByDateLowToHigh($a, $b)
    method sortByDateHighToLow (line 678) | private function sortByDateHighToLow($a, $b)
    method generateUUID (line 683) | function generateUUID()
    method getUUID (line 689) | function getUUID($key)
    method getByUUID (line 699) | function getByUUID($uuid)
    method generateSlug (line 711) | private function generateSlug($text, $truncateLength = 60)
    method scheduler (line 720) | public function scheduler()
    method generateKey (line 752) | public function generateKey($text, $parent = false, $returnSlug = fals...
    method generateTags (line 796) | public function generateTags($tags)
    method changeCategory (line 814) | public function changeCategory($oldCategoryKey, $newCategoryKey)
    method setCustomFields (line 828) | public function setCustomFields($fields)

FILE: bl-kernel/pagex.class.php
  class Page (line 3) | class Page
    method __construct (line 8) | function __construct($key)
    method getValue (line 36) | public function getValue($field)
    method setField (line 44) | public function setField($field, $value)
    method contentRaw (line 53) | public function contentRaw($sanitize = false)
    method content (line 74) | public function content($sanitize = false)
    method contentBreak (line 106) | public function contentBreak($sanitize = false)
    method date (line 114) | public function date($format = false)
    method dateRaw (line 125) | public function dateRaw()
    method dateModified (line 132) | public function dateModified($format = false)
    method username (line 143) | public function username()
    method getDB (line 149) | public function getDB()
    method permalink (line 156) | public function permalink($absolute = true)
    method previousKey (line 169) | public function previousKey()
    method nextKey (line 176) | public function nextKey()
    method category (line 183) | public function category()
    method categoryTemplate (line 189) | public function categoryTemplate()
    method categoryDescription (line 195) | public function categoryDescription()
    method categoryKey (line 201) | public function categoryKey()
    method categoryPermalink (line 207) | public function categoryPermalink()
    method categoryMap (line 214) | public function categoryMap($field)
    method user (line 230) | public function user($method = false)
    method template (line 244) | public function template()
    method description (line 250) | public function description()
    method tags (line 258) | public function tags($returnsArray = false)
    method json (line 277) | public function json($returnsArray = false)
    method coverImage (line 307) | public function coverImage($absolute = true)
    method thumbCoverImage (line 330) | public function thumbCoverImage()
    method readMore (line 349) | public function readMore()
    method uuid (line 355) | public function uuid()
    method key (line 361) | public function key()
    method published (line 367) | public function published()
    method scheduled (line 373) | public function scheduled()
    method draft (line 379) | public function draft()
    method autosave (line 385) | public function autosave()
    method sticky (line 391) | public function sticky()
    method isStatic (line 397) | public function isStatic()
    method type (line 403) | public function type()
    method title (line 409) | public function title()
    method allowComments (line 415) | public function allowComments()
    method position (line 421) | public function position()
    method noindex (line 427) | public function noindex()
    method nofollow (line 433) | public function nofollow()
    method noarchive (line 439) | public function noarchive()
    method slug (line 445) | public function slug()
    method parent (line 452) | public function parent()
    method parentKey (line 458) | public function parentKey()
    method isParent (line 468) | public function isParent()
    method parentMethod (line 474) | public function parentMethod($method)
    method isChild (line 490) | public function isChild()
    method hasChildren (line 496) | public function hasChildren()
    method childrenKeys (line 503) | public function childrenKeys()
    method children (line 511) | public function children()
    method readingTime (line 529) | public function readingTime()
    method relativeTime (line 551) | public function relativeTime($complete = false)
    method custom (line 594) | public function custom($field, $options = false)
    method related (line 607) | public function related()

FILE: bl-kernel/parsedown.class.php
  class Parsedown (line 16) | class Parsedown
    method text (line 24) | function text($text)
    method textElements (line 37) | protected function textElements($text)
    method setBreaksEnabled (line 59) | function setBreaksEnabled($breaksEnabled)
    method setMarkupEscaped (line 68) | function setMarkupEscaped($markupEscaped)
    method setUrlsLinked (line 77) | function setUrlsLinked($urlsLinked)
    method setSafeMode (line 86) | function setSafeMode($safeMode)
    method setStrictMode (line 95) | function setStrictMode($strictMode)
    method lines (line 162) | protected function lines(array $lines)
    method linesElements (line 167) | protected function linesElements(array $lines)
    method extractElement (line 319) | protected function extractElement(array $Component)
    method isBlockContinuable (line 336) | protected function isBlockContinuable($Type)
    method isBlockCompletable (line 341) | protected function isBlockCompletable($Type)
    method blockCode (line 349) | protected function blockCode($Line, $Block = null)
    method blockCodeContinue (line 374) | protected function blockCodeContinue($Line, $Block)
    method blockCodeComplete (line 395) | protected function blockCodeComplete($Block)
    method blockComment (line 403) | protected function blockComment($Line)
    method blockCommentContinue (line 428) | protected function blockCommentContinue($Line, array $Block)
    method blockFencedCode (line 448) | protected function blockFencedCode($Line)
    method blockFencedCodeContinue (line 502) | protected function blockFencedCodeContinue($Line, $Block)
    method blockFencedCodeComplete (line 531) | protected function blockFencedCodeComplete($Block)
    method blockHeader (line 539) | protected function blockHeader($Line)
    method blockList (line 574) | protected function blockList($Line, ?array $CurrentBlock = null)
    method blockListContinue (line 643) | protected function blockListContinue($Line, array $Block)
    method blockListComplete (line 729) | protected function blockListComplete(array $Block)
    method blockQuote (line 748) | protected function blockQuote($Line)
    method blockQuoteContinue (line 767) | protected function blockQuoteContinue($Line, array $Block)
    method blockRule (line 792) | protected function blockRule($Line)
    method blockSetextHeader (line 811) | protected function blockSetextHeader($Line, ?array $Block = null)
    method blockMarkup (line 829) | protected function blockMarkup($Line)
    method blockMarkupContinue (line 857) | protected function blockMarkupContinue($Line, array $Block)
    method blockReference (line 872) | protected function blockReference($Line)
    method blockTable (line 897) | protected function blockTable($Line, ?array $Block = null)
    method blockTableContinue (line 1020) | protected function blockTableContinue($Line, array $Block)
    method paragraph (line 1078) | protected function paragraph($Line)
    method paragraphContinue (line 1093) | protected function paragraphContinue($Line, array $Block)
    method line (line 1130) | public function line($text, $nonNestables = array())
    method lineElements (line 1135) | protected function lineElements($text, $nonNestables = array())
    method inlineText (line 1239) | protected function inlineText($text)
    method inlineCode (line 1258) | protected function inlineCode($Excerpt)
    method inlineEmailTag (line 1277) | protected function inlineEmailTag($Excerpt)
    method inlineEmphasis (line 1307) | protected function inlineEmphasis($Excerpt)
    method inlineEscapeSequence (line 1342) | protected function inlineEscapeSequence($Excerpt)
    method inlineImage (line 1353) | protected function inlineImage($Excerpt)
    method inlineLink (line 1388) | protected function inlineLink($Excerpt)
    method inlineMarkup (line 1463) | protected function inlineMarkup($Excerpt)
    method inlineSpecialCharacter (line 1495) | protected function inlineSpecialCharacter($Excerpt)
    method inlineStrikethrough (line 1507) | protected function inlineStrikethrough($Excerpt)
    method inlineUrl (line 1530) | protected function inlineUrl($Excerpt)
    method inlineUrlTag (line 1558) | protected function inlineUrlTag($Excerpt)
    method unmarkedText (line 1579) | protected function unmarkedText($text)
    method handle (line 1589) | protected function handle(array $Element)
    method handleElementRecursive (line 1625) | protected function handleElementRecursive(array $Element)
    method handleElementsRecursive (line 1630) | protected function handleElementsRecursive(array $Elements)
    method elementApplyRecursive (line 1635) | protected function elementApplyRecursive($closure, array $Element)
    method elementApplyRecursiveDepthFirst (line 1651) | protected function elementApplyRecursiveDepthFirst($closure, array $El...
    method elementsApplyRecursive (line 1667) | protected function elementsApplyRecursive($closure, array $Elements)
    method elementsApplyRecursiveDepthFirst (line 1677) | protected function elementsApplyRecursiveDepthFirst($closure, array $E...
    method element (line 1687) | protected function element(array $Element)
    method elements (line 1771) | protected function elements(array $Elements)
    method li (line 1801) | protected function li($lines)
    method pregReplaceElements (line 1823) | protected static function pregReplaceElements($regexp, $Elements, $text)
    method parse (line 1855) | function parse($text)
    method sanitiseElement (line 1862) | protected function sanitiseElement(array $Element)
    method filterUnsafeUrlInAttribute (line 1901) | protected function filterUnsafeUrlInAttribute(array $Element, $attribute)
    method escape (line 1920) | protected static function escape($text, $allowQuotes = false)
    method striAtStart (line 1925) | protected static function striAtStart($string, $needle)
    method instance (line 1939) | static function instance($name = 'default')

FILE: bl-kernel/security.class.php
  class Security (line 3) | class Security extends dbJSON
    method __construct (line 11) | function __construct()
    method generateTokenCSRF (line 21) | public function generateTokenCSRF()
    method validateTokenCSRF (line 29) | public function validateTokenCSRF($token)
    method getTokenCSRF (line 36) | public function getTokenCSRF()
    method isBlocked (line 45) | public function isBlocked()
    method addToBlacklist (line 74) | public function addToBlacklist()
    method getNumberFailures (line 96) | public function getNumberFailures($ip=null)
    method getUserIp (line 115) | public function getUserIp()

FILE: bl-kernel/site.class.php
  class Site (line 3) | class Site extends dbJSON
    method __construct (line 60) | function __construct()
    method get (line 72) | function get()
    method set (line 77) | public function set($args)
    method uriFilters (line 97) | public function uriFilters($filter = '')
    method rss (line 120) | public function rss()
    method sitemap (line 126) | public function sitemap()
    method thumbnailEnable (line 131) | public function thumbnailEnable()
    method thumbnailWidth (line 136) | public function thumbnailWidth()
    method thumbnailHeight (line 141) | public function thumbnailHeight()
    method thumbnailQuality (line 146) | public function thumbnailQuality()
    method autosaveInterval (line 151) | public function autosaveInterval()
    method extremeFriendly (line 156) | public function extremeFriendly()
    method markdownParser (line 161) | public function markdownParser()
    method twitter (line 166) | public function twitter()
    method facebook (line 171) | public function facebook()
    method codepen (line 176) | public function codepen()
    method instagram (line 181) | public function instagram()
    method github (line 186) | public function github()
    method gitlab (line 191) | public function gitlab()
    method linkedin (line 196) | public function linkedin()
    method xing (line 201) | public function xing()
    method telegram (line 206) | public function telegram()
    method mastodon (line 211) | public function mastodon()
    method dribbble (line 216) | public function dribbble()
    method vk (line 221) | public function vk()
    method youtube (line 226) | public function youtube()
    method bluesky (line 231) | public function bluesky()
    method orderBy (line 236) | public function orderBy()
    method defaultContentStatus (line 241) | public function defaultContentStatus()
    method imageRestrict (line 246) | public function imageRestrict()
    method imageRelativeToAbsolute (line 251) | public function imageRelativeToAbsolute()
    method title (line 257) | public function title()
    method slogan (line 263) | public function slogan()
    method description (line 269) | public function description()
    method emailFrom (line 274) | public function emailFrom()
    method dateFormat (line 279) | public function dateFormat()
    method timeFormat (line 284) | public function timeFormat()
    method theme (line 290) | public function theme()
    method adminTheme (line 296) | public function adminTheme()
    method footer (line 302) | public function footer()
    method titleFormatPages (line 307) | public function titleFormatPages()
    method titleFormatHomepage (line 312) | public function titleFormatHomepage()
    method titleFormatCategory (line 317) | public function titleFormatCategory()
    method titleFormatTag (line 322) | public function titleFormatTag()
    method logo (line 329) | public function logo($absolute = true)
    method url (line 340) | public function url()
    method domain (line 347) | public function domain()
    method timezone (line 371) | public function timezone()
    method urlPath (line 376) | public function urlPath()
    method isHTTPS (line 382) | public function isHTTPS()
    method currentBuild (line 389) | public function currentBuild()
    method itemsPerPage (line 395) | public function itemsPerPage()
    method language (line 405) | public function language()
    method languageShortVersion (line 411) | public function languageShortVersion()
    method locale (line 419) | public function locale()
    method homepage (line 425) | public function homepage()
    method pageNotFound (line 435) | public function pageNotFound()
    method setLocale (line 442) | public function setLocale($locale)
    method setTimezone (line 459) | public function setTimezone($timezone)
    method customFields (line 465) | public function customFields()

FILE: bl-kernel/syslog.class.php
  class Syslog (line 3) | class Syslog extends dbJSON {
    method __construct (line 14) | function __construct()
    method exists (line 20) | public function exists($idExecution)
    method get (line 30) | public function get($idExecution)
    method add (line 40) | public function add($args)

FILE: bl-kernel/tag.class.php
  class Tag (line 3) | class Tag {
    method __construct (line 7) | function __construct($key)
    method getValue (line 22) | public function getValue($field)
    method key (line 30) | public function key()
    method name (line 35) | public function name()
    method permalink (line 40) | public function permalink()
    method pages (line 46) | public function pages()
    method json (line 52) | public function json($returnsArray=false)

FILE: bl-kernel/tags.class.php
  class Tags (line 3) | class Tags extends dbList {
    method __construct (line 5) | function __construct()
    method numberOfPages (line 10) | function numberOfPages($key)
    method reindex (line 15) | public function reindex()

FILE: bl-kernel/url.class.php
  class Url (line 3) | class Url
    method __construct (line 16) | function __construct()
    method checkFilters (line 38) | public function checkFilters($filters)
    method slug (line 92) | public function slug()
    method setSlug (line 97) | public function setSlug($slug)
    method activeFilter (line 102) | public function activeFilter()
    method explodeSlug (line 107) | public function explodeSlug($delimiter="/")
    method uri (line 112) | public function uri()
    method filters (line 118) | public function filters($type, $trim=true)
    method whereAmI (line 128) | public function whereAmI()
    method setWhereAmI (line 133) | public function setWhereAmI($where)
    method notFound (line 139) | public function notFound()
    method pageNumber (line 144) | public function pageNumber()
    method parameter (line 152) | public function parameter($field)
    method setNotFound (line 160) | public function setNotFound()
    method httpCode (line 168) | public function httpCode()
    method setHttpCode (line 173) | public function setHttpCode($code = 200)
    method httpMessage (line 178) | public function httpMessage()
    method setHttpMessage (line 183) | public function setHttpMessage($msg = 'OK')
    method sortByLength (line 188) | private function sortByLength($a, $b)

FILE: bl-kernel/user.class.php
  class User (line 3) | class User
    method __construct (line 7) | function __construct($username)
    method getValue (line 29) | public function getValue($field)
    method setField (line 37) | public function setField($field, $value)
    method getDB (line 43) | public function getDB()
    method username (line 48) | public function username()
    method description (line 53) | public function description()
    method nickname (line 58) | public function nickname()
    method firstName (line 63) | public function firstName()
    method lastName (line 68) | public function lastName()
    method tokenAuth (line 73) | public function tokenAuth()
    method role (line 78) | public function role()
    method password (line 83) | public function password()
    method enabled (line 88) | public function enabled()
    method salt (line 94) | public function salt()
    method email (line 99) | public function email()
    method registered (line 104) | public function registered()
    method twitter (line 109) | public function twitter()
    method facebook (line 114) | public function facebook()
    method codepen (line 119) | public function codepen()
    method instagram (line 124) | public function instagram()
    method github (line 129) | public function github()
    method gitlab (line 134) | public function gitlab()
    method linkedin (line 139) | public function linkedin()
    method xing (line 144) | public function xing()
    method telegram (line 149) | public function telegram()
    method mastodon (line 154) | public function mastodon()
    method vk (line 159) | public function vk()
    method youtube (line 164) | public function youtube()
    method bluesky (line 169) | public function bluesky()
    method profilePicture (line 174) | public function profilePicture()
    method json (line 189) | public function json($returnsArray = false)

FILE: bl-kernel/users.class.php
  class Users (line 3) | class Users extends dbJSON {
    method __construct (line 31) | function __construct()
    method getDefaultFields (line 36) | public function getDefaultFields()
    method getUserDB (line 42) | public function getUserDB($username)
    method exists (line 51) | public function exists($username)
    method disableUser (line 57) | public function disableUser($username)
    method add (line 64) | public function add($args)
    method set (line 99) | public function set($args)
    method delete (line 136) | public function delete($username)
    method generateAuthToken (line 142) | public function generateAuthToken()
    method generateRememberToken (line 147) | public function generateRememberToken()
    method generateSalt (line 152) | public function generateSalt()
    method generatePasswordHash (line 157) | public function generatePasswordHash($password, $salt)
    method setRememberToken (line 162) | public function setRememberToken($username, $token)
    method setPassword (line 171) | public function setPassword($args)
    method getByEmail (line 177) | public function getByEmail($email)
    method getByAuthToken (line 188) | public function getByAuthToken($token)
    method getByRememberToken (line 199) | public function getByRememberToken($token)
    method invalidateAllRememberTokens (line 213) | public function invalidateAllRememberTokens()
    method keys (line 221) | public function keys()

FILE: bl-plugins/about/plugin.php
  class pluginAbout (line 3) | class pluginAbout extends Plugin
    method init (line 6) | public function init()
    method form (line 14) | public function form()
    method siteSidebar (line 36) | public function siteSidebar()

FILE: bl-plugins/alternative/plugin.php
  class alternative (line 3) | class alternative extends Plugin
    method init (line 6) | public function init()
    method form (line 15) | public function form()
    method showPostInformation (line 51) | public function showPostInformation()
    method googleFonts (line 56) | public function googleFonts()
    method dateFormat (line 61) | public function dateFormat()

FILE: bl-plugins/api/plugin.php
  class pluginAPI (line 3) | class pluginAPI extends Plugin
    method init (line 8) | public function init()
    method getToken (line 19) | public function getToken()
    method form (line 24) | public function form()
    method beforeAll (line 56) | public function beforeAll()
    method isValidPageKey (line 224) | private function isValidPageKey($pageKey)
    method getMethod (line 235) | private function getMethod()
    method getMethodInputs (line 248) | private function getMethodInputs()
    method cleanInputs (line 276) | private function cleanInputs($inputs)
    method getEndpointParameters (line 293) | private function getEndpointParameters($URI)
    method response (line 312) | private function response($code = 200, $message = 'OK', $data = array())
    method getTags (line 321) | private function getTags()
    method getTag (line 338) | private function getTag($key)
    method getPages (line 368) | private function getPages($args)
    method getPage (line 411) | private function getPage($key)
    method createPage (line 428) | private function createPage($args)
    method editPage (line 451) | private function editPage($key, $args)
    method deletePage (line 475) | private function deletePage($key)
    method uploadImage (line 500) | private function uploadImage($inputs)
    method getSettings (line 563) | private function getSettings()
    method editSettings (line 581) | private function editSettings($args)
    method getCategories (line 602) | private function getCategories()
    method getCategory (line 626) | private function getCategory($key)
    method getUser (line 663) | private function getUser($username)
    method getUsers (line 687) | private function getUsers()
    method getFiles (line 712) | private function getFiles($pageKey)
    method uploadFile (line 753) | private function uploadFile($pageKey)

FILE: bl-plugins/canonical/plugin.php
  class pluginCanonical (line 3) | class pluginCanonical extends Plugin {
    method siteHead (line 5) | public function siteHead()

FILE: bl-plugins/categories/plugin.php
  class pluginCategories (line 3) | class pluginCategories extends Plugin
    method init (line 6) | public function init()
    method form (line 16) | public function form()
    method siteSidebar (line 42) | public function siteSidebar()

FILE: bl-plugins/custom-fields-parser/plugin.php
  class pluginCustomFieldsParser (line 3) | class pluginCustomFieldsParser extends Plugin {
    method init (line 5) | public function init()
    method form (line 13) | public function form()
    method post (line 39) | public function post()
    method parse (line 45) | public function parse($page)
    method beforeSiteLoad (line 79) | public function beforeSiteLoad()

FILE: bl-plugins/disqus/plugin.php
  class pluginDisqus (line 3) | class pluginDisqus extends Plugin
    method init (line 6) | public function init()
    method form (line 16) | public function form()
    method pageEnd (line 57) | public function pageEnd()
    method javascript (line 83) | private function javascript()

FILE: bl-plugins/easymde/plugin.php
  class plugineasyMDE (line 3) | class plugineasyMDE extends Plugin
    method init (line 12) | public function init()
    method form (line 21) | public function form()
    method adminHead (line 46) | public function adminHead()
    method adminBodyEnd (line 58) | public function adminBodyEnd()

FILE: bl-plugins/hit-counter/plugin.php
  class pluginHitCounter (line 3) | class pluginHitCounter extends Plugin
    method init (line 6) | public function init()
    method form (line 14) | public function form()
    method siteSidebar (line 50) | public function siteSidebar()

FILE: bl-plugins/html-code/plugin.php
  class pluginHTMLCode (line 3) | class pluginHTMLCode extends Plugin {
    method init (line 5) | public function init()
    method form (line 17) | public function form()
    method siteHead (line 68) | public function siteHead()
    method siteBodyBegin (line 73) | public function siteBodyBegin()
    method siteBodyEnd (line 78) | public function siteBodyEnd()
    method adminHead (line 83) | public function adminHead()
    method adminBodyBegin (line 88) | public function adminBodyBegin()
    method adminBodyEnd (line 93) | public function adminBodyEnd()

FILE: bl-plugins/links/plugin.php
  class pluginLinks (line 3) | class pluginLinks extends Plugin
    method init (line 6) | public function init()
    method post (line 25) | public function post()
    method form (line 65) | public function form()
    method siteSidebar (line 127) | public function siteSidebar()

FILE: bl-plugins/maintenance-mode/plugin.php
  class pluginMaintenanceMode (line 3) | class pluginMaintenanceMode extends Plugin
    method init (line 6) | public function init()
    method form (line 14) | public function form()
    method beforeAll (line 38) | public function beforeAll()

FILE: bl-plugins/navigation/plugin.php
  class pluginNavigation (line 3) | class pluginNavigation extends Plugin
    method init (line 6) | public function init()
    method form (line 17) | public function form()
    method siteSidebar (line 51) | public function siteSidebar()

FILE: bl-plugins/opengraph/plugin.php
  class pluginOpenGraph (line 3) | class pluginOpenGraph extends Plugin
    method init (line 6) | public function init()
    method form (line 15) | public function form()
    method sanitize (line 41) | private function sanitize($text, $maxLength = 0)
    method siteHead (line 57) | public function siteHead()

FILE: bl-plugins/popeye/plugin.php
  class popeye (line 3) | class popeye extends Plugin
    method init (line 6) | public function init()
    method form (line 16) | public function form()
    method darkMode (line 59) | public function darkMode()
    method googleFonts (line 64) | public function googleFonts()
    method dateFormat (line 69) | public function dateFormat()
    method showTags (line 74) | public function showTags()

FILE: bl-plugins/remote-content/plugin.php
  class pluginRemoteContent (line 3) | class pluginRemoteContent extends Plugin
    method init (line 6) | public function init()
    method form (line 18) | public function form()
    method beforeAll (line 59) | public function beforeAll()
    method downloadFiles (line 80) | private function downloadFiles()
    method deleteContent (line 103) | private function deleteContent()
    method cleanUp (line 119) | private function cleanUp()
    method generateContent (line 127) | private function generateContent()
    method response (line 166) | private function response($data = array())
    method parsePage (line 173) | private function parsePage($filename)

FILE: bl-plugins/robots/plugin.php
  class pluginRobots (line 3) | class pluginRobots extends Plugin {
    method init (line 5) | public function init()
    method form (line 12) | public function form()
    method siteHead (line 26) | public function siteHead()
    method beforeAll (line 56) | public function beforeAll()

FILE: bl-plugins/rss/plugin.php
  class pluginRSS (line 3) | class pluginRSS extends Plugin
    method init (line 6) | public function init()
    method form (line 15) | public function form()
    method encodeURL (line 37) | private function encodeURL($url)
    method createXML (line 44) | private function createXML()
    method install (line 100) | public function install($position = 0)
    method post (line 106) | public function post()
    method afterPageCreate (line 112) | public function afterPageCreate()
    method afterPageModify (line 117) | public function afterPageModify()
    method afterPageDelete (line 122) | public function afterPageDelete()
    method siteHead (line 127) | public function siteHead()
    method beforeAll (line 132) | public function beforeAll()

FILE: bl-plugins/search/plugin.php
  class pluginSearch (line 3) | class pluginSearch extends Plugin
    method init (line 10) | public function init()
    method form (line 26) | public function form()
    method siteSidebar (line 94) | public function siteSidebar()
    method siteHead (line 134) | public function siteHead()
    method siteBodyBegin (line 324) | public function siteBodyBegin()
    method install (line 395) | public function install($position = 0)
    method post (line 402) | public function post()
    method afterPageCreate (line 408) | public function afterPageCreate()
    method afterPageModify (line 413) | public function afterPageModify()
    method afterPageDelete (line 418) | public function afterPageDelete()
    method getSearchTerm (line 424) | public function getSearchTerm()
    method getResultCount (line 430) | public function getResultCount()
    method beforeAll (line 435) | public function beforeAll()
    method paginator (line 474) | public function paginator()
    method beforeSiteLoad (line 485) | public function beforeSiteLoad()
    method highlightTerms (line 511) | public function highlightTerms($text, $searchTerm)
    method getSearchExcerpt (line 540) | public function getSearchExcerpt($content, $searchTerm, $length = null)
    method createCache (line 595) | private function createCache()
    method cacheFile (line 647) | private function cacheFile()
    method search (line 655) | private function search($text)

FILE: bl-plugins/search/vendors/fuzz.php
  class Fuzz (line 18) | class Fuzz
    method __construct (line 35) | public function __construct($source, $maxResults, $searchMode, $useLCS)
    method search (line 59) | public function search($search, $minLCS = null, $maxDistance = null)
    method getLCS (line 124) | public function getLCS($source, $target)
    method getLevenshtein (line 155) | public function getLevenshtein($source, $target)
    method getJaroWinkler (line 206) | public function getJaroWinkler($first, $second)
    method _getCharMatch (line 254) | private function _getCharMatch($first, $second, $limit)
    method _getTranspositions (line 285) | private function _getTranspositions($first, $second)
    method _getPrefix (line 308) | private function _getPrefix($first, $second)
    method _getDiffIndex (line 332) | private function _getDiffIndex($first, $second)
    method _printMatrix (line 356) | private function _printMatrix($arr)

FILE: bl-plugins/sitemap/plugin.php
  class pluginSitemap (line 3) | class pluginSitemap extends Plugin {
    method init (line 5) | public function init()
    method form (line 14) | public function form()
    method createXML (line 48) | private function createXML()
    method ping (line 85) | private function ping()
    method install (line 98) | public function install($position=0)
    method post (line 104) | public function post()
    method afterPageCreate (line 110) | public function afterPageCreate()
    method afterPageModify (line 116) | public function afterPageModify()
    method afterPageDelete (line 122) | public function afterPageDelete()
    method beforeAll (line 128) | public function beforeAll()

FILE: bl-plugins/static-pages/plugin.php
  class pluginStaticPages (line 3) | class pluginStaticPages extends Plugin
    method init (line 6) | public function init()
    method form (line 16) | public function form()
    method siteSidebar (line 43) | public function siteSidebar()

FILE: bl-plugins/tags/plugin.php
  class pluginTags (line 3) | class pluginTags extends Plugin
    method init (line 6) | public function init()
    method form (line 13) | public function form()
    method siteSidebar (line 30) | public function siteSidebar()

FILE: bl-plugins/tinymce/plugin.php
  class pluginTinymce (line 3) | class pluginTinymce extends Plugin
    method init (line 11) | public function init()
    method form (line 22) | public function form()
    method adminHead (line 62) | public function adminHead()
    method adminBodyEnd (line 74) | public function adminBodyEnd()

FILE: bl-plugins/tinymce/tinymce/tinymce.d.ts
  type StringPathBookmark (line 1) | interface StringPathBookmark {
  type RangeBookmark (line 6) | interface RangeBookmark {
  type IdBookmark (line 10) | interface IdBookmark {
  type IndexBookmark (line 15) | interface IndexBookmark {
  type PathBookmark (line 19) | interface PathBookmark {
  type Bookmark (line 25) | type Bookmark = StringPathBookmark | RangeBookmark | IdBookmark | IndexB...
  type SchemaType (line 26) | type SchemaType = 'html4' | 'html5' | 'html5-strict';
  type ElementSettings (line 27) | interface ElementSettings {
  type SchemaSettings (line 40) | interface SchemaSettings extends ElementSettings {
  type Attribute (line 53) | interface Attribute {
  type DefaultAttribute (line 59) | interface DefaultAttribute {
  type AttributePattern (line 63) | interface AttributePattern extends Attribute {
  type ElementRule (line 66) | interface ElementRule {
  type SchemaElement (line 78) | interface SchemaElement extends ElementRule {
  type SchemaMap (line 83) | interface SchemaMap {
  type SchemaRegExpMap (line 86) | interface SchemaRegExpMap {
  type CustomElementSpec (line 89) | interface CustomElementSpec {
  type Schema (line 96) | interface Schema {
  type Attributes$1 (line 127) | type Attributes$1 = Array<{
  type AstNodeConstructor (line 133) | interface AstNodeConstructor {
  class AstNode (line 138) | class AstNode {
  type BlobInfoData (line 167) | interface BlobInfoData {
  type BlobInfo (line 176) | interface BlobInfo {
  type BlobCache (line 185) | interface BlobCache {
  type NotificationManagerImpl (line 198) | interface NotificationManagerImpl {
  type NotificationSpec (line 203) | interface NotificationSpec {
  type NotificationApi (line 210) | interface NotificationApi {
  type NotificationManager (line 220) | interface NotificationManager {
  type UploadFailure (line 225) | interface UploadFailure {
  type ProgressFn (line 229) | type ProgressFn = (percent: number) => void;
  type UploadFileData (line 230) | interface UploadFileData {
  type UploadHandler (line 234) | type UploadHandler<T extends UploadFileData | string = string> = (blobIn...
  type UploadResult$2 (line 235) | interface UploadResult$2 {
  type IsEmptyOptions (line 241) | interface IsEmptyOptions {
  type GeomRect (line 247) | interface GeomRect {
  type Rect (line 253) | interface Rect {
  type StyleMap (line 262) | type StyleMap = Record<string, string | number>;
  type StylesSettings (line 263) | interface StylesSettings {
  type Styles (line 269) | interface Styles {
  type NormalizedEvent (line 273) | type NormalizedEvent<E, T = any> = E & {
  type MappedEvent (line 283) | type MappedEvent<T extends {}, K extends string> = K extends keyof T ? T...
  type NativeEventMap (line 284) | interface NativeEventMap {
  type EditorEvent (line 326) | type EditorEvent<T> = NormalizedEvent<T>;
  type EventDispatcherSettings (line 327) | interface EventDispatcherSettings {
  type EventDispatcherConstructor (line 332) | interface EventDispatcherConstructor<T extends {}> {
  class EventDispatcher (line 337) | class EventDispatcher<T extends {}> {
  type EventUtilsCallback (line 351) | type EventUtilsCallback<T> = (event: EventUtilsEvent<T>) => void | boolean;
  type EventUtilsEvent (line 352) | type EventUtilsEvent<T> = NormalizedEvent<T> & {
  type Callback$1 (line 355) | interface Callback$1<T> {
  type CallbackList (line 359) | interface CallbackList<T> extends Array<Callback$1<T>> {
  type EventUtilsConstructor (line 364) | interface EventUtilsConstructor {
  class EventUtils (line 369) | class EventUtils {
  type StyleSheetLoaderSettings (line 389) | interface StyleSheetLoaderSettings {
  type StyleSheetLoader (line 395) | interface StyleSheetLoader {
  type SetAttribEvent (line 406) | interface SetAttribEvent {
  type DOMUtilsSettings (line 411) | interface DOMUtilsSettings {
  type Target (line 425) | type Target = Node | Window;
  type RunArguments (line 426) | type RunArguments<T extends Node = Node> = string | T | Array<string | T...
  type BoundEvent (line 427) | type BoundEvent = [
  type Callback (line 433) | type Callback<K extends string> = EventUtilsCallback<MappedEvent<HTMLEle...
  type RunResult (line 434) | type RunResult<T, R> = T extends Array<any> ? R[] : false | R;
  type DOMUtils (line 435) | interface DOMUtils {
  type BlockPatternTrigger (line 566) | type BlockPatternTrigger = 'enter' | 'space';
  type RawPattern (line 567) | interface RawPattern {
  type InlineBasePattern (line 576) | interface InlineBasePattern {
  type InlineFormatPattern (line 580) | interface InlineFormatPattern extends InlineBasePattern {
  type InlineCmdPattern (line 584) | interface InlineCmdPattern extends InlineBasePattern {
  type InlinePattern (line 589) | type InlinePattern = InlineFormatPattern | InlineCmdPattern;
  type BlockBasePattern (line 590) | interface BlockBasePattern {
  type BlockFormatPattern (line 594) | interface BlockFormatPattern extends BlockBasePattern {
  type BlockCmdPattern (line 598) | interface BlockCmdPattern extends BlockBasePattern {
  type BlockPattern (line 603) | type BlockPattern = BlockFormatPattern | BlockCmdPattern;
  type Pattern (line 604) | type Pattern = InlinePattern | BlockPattern;
  type DynamicPatternContext (line 605) | interface DynamicPatternContext {
  type DynamicPatternsLookup (line 609) | type DynamicPatternsLookup = (ctx: DynamicPatternContext) => Pattern[];
  type RawDynamicPatternsLookup (line 610) | type RawDynamicPatternsLookup = (ctx: DynamicPatternContext) => RawPatte...
  type AlertBannerSpec (line 611) | interface AlertBannerSpec {
  type ButtonSpec (line 618) | interface ButtonSpec {
  type FormComponentSpec (line 629) | interface FormComponentSpec {
  type FormComponentWithLabelSpec (line 633) | interface FormComponentWithLabelSpec extends FormComponentSpec {
  type CheckboxSpec (line 636) | interface CheckboxSpec extends FormComponentSpec {
  type CollectionSpec (line 642) | interface CollectionSpec extends FormComponentWithLabelSpec {
  type CollectionItem (line 646) | interface CollectionItem {
  type ColorInputSpec (line 651) | interface ColorInputSpec extends FormComponentWithLabelSpec {
  type ColorPickerSpec (line 656) | interface ColorPickerSpec extends FormComponentWithLabelSpec {
  type CustomEditorInit (line 659) | interface CustomEditorInit {
  type CustomEditorInitFn (line 664) | type CustomEditorInitFn = (elm: HTMLElement, settings: any) => Promise<C...
  type CustomEditorOldSpec (line 665) | interface CustomEditorOldSpec extends FormComponentSpec {
  type CustomEditorNewSpec (line 670) | interface CustomEditorNewSpec extends FormComponentSpec {
  type CustomEditorSpec (line 678) | type CustomEditorSpec = CustomEditorOldSpec | CustomEditorNewSpec;
  type DropZoneSpec (line 679) | interface DropZoneSpec extends FormComponentWithLabelSpec {
  type GridSpec (line 687) | interface GridSpec {
  type HtmlPanelSpec (line 692) | interface HtmlPanelSpec {
  type IframeSpec (line 699) | interface IframeSpec extends FormComponentWithLabelSpec {
  type ImagePreviewSpec (line 706) | interface ImagePreviewSpec extends FormComponentSpec {
  type InputSpec (line 710) | interface InputSpec extends FormComponentWithLabelSpec {
  type Alignment (line 718) | type Alignment = 'start' | 'center' | 'end';
  type LabelSpec (line 719) | interface LabelSpec {
  type ListBoxSingleItemSpec (line 726) | interface ListBoxSingleItemSpec {
  type ListBoxNestedItemSpec (line 730) | interface ListBoxNestedItemSpec {
  type ListBoxItemSpec (line 734) | type ListBoxItemSpec = ListBoxNestedItemSpec | ListBoxSingleItemSpec;
  type ListBoxSpec (line 735) | interface ListBoxSpec extends FormComponentWithLabelSpec {
  type PanelSpec (line 741) | interface PanelSpec {
  type SelectBoxItemSpec (line 746) | interface SelectBoxItemSpec {
  type SelectBoxSpec (line 750) | interface SelectBoxSpec extends FormComponentWithLabelSpec {
  type SizeInputSpec (line 757) | interface SizeInputSpec extends FormComponentWithLabelSpec {
  type SliderSpec (line 763) | interface SliderSpec extends FormComponentSpec {
  type TableSpec (line 769) | interface TableSpec {
  type TextAreaSpec (line 774) | interface TextAreaSpec extends FormComponentWithLabelSpec {
  type BaseToolbarButtonSpec (line 782) | interface BaseToolbarButtonSpec<I extends BaseToolbarButtonInstanceApi> {
  type BaseToolbarButtonInstanceApi (line 790) | interface BaseToolbarButtonInstanceApi {
  type ToolbarButtonSpec (line 796) | interface ToolbarButtonSpec extends BaseToolbarButtonSpec<ToolbarButtonI...
  type ToolbarButtonInstanceApi (line 801) | interface ToolbarButtonInstanceApi extends BaseToolbarButtonInstanceApi {
  type ToolbarGroupSetting (line 803) | interface ToolbarGroupSetting {
  type ToolbarConfig (line 807) | type ToolbarConfig = string | ToolbarGroupSetting[];
  type GroupToolbarButtonInstanceApi (line 808) | interface GroupToolbarButtonInstanceApi extends BaseToolbarButtonInstanc...
  type GroupToolbarButtonSpec (line 810) | interface GroupToolbarButtonSpec extends BaseToolbarButtonSpec<GroupTool...
  type CardImageSpec (line 814) | interface CardImageSpec {
  type CardTextSpec (line 820) | interface CardTextSpec {
  type CardItemSpec (line 826) | type CardItemSpec = CardContainerSpec | CardImageSpec | CardTextSpec;
  type CardContainerDirection (line 827) | type CardContainerDirection = 'vertical' | 'horizontal';
  type CardContainerAlign (line 828) | type CardContainerAlign = 'left' | 'right';
  type CardContainerValign (line 829) | type CardContainerValign = 'top' | 'middle' | 'bottom';
  type CardContainerSpec (line 830) | interface CardContainerSpec {
  type CommonMenuItemSpec (line 837) | interface CommonMenuItemSpec {
  type CommonMenuItemInstanceApi (line 845) | interface CommonMenuItemInstanceApi {
  type CardMenuItemInstanceApi (line 849) | interface CardMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type CardMenuItemSpec (line 851) | interface CardMenuItemSpec extends Omit<CommonMenuItemSpec, 'text' | 'sh...
  type ChoiceMenuItemSpec (line 858) | interface ChoiceMenuItemSpec extends CommonMenuItemSpec {
  type ChoiceMenuItemInstanceApi (line 863) | interface ChoiceMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type ContextMenuItem (line 867) | interface ContextMenuItem extends CommonMenuItemSpec {
  type ContextSubMenu (line 873) | interface ContextSubMenu extends CommonMenuItemSpec {
  type ContextMenuContents (line 879) | type ContextMenuContents = string | ContextMenuItem | SeparatorMenuItemS...
  type ContextMenuApi (line 880) | interface ContextMenuApi {
  type ResetImageItemSpec (line 883) | interface ResetImageItemSpec extends CommonMenuItemSpec {
  type ImageMenuItemSpec (line 890) | interface ImageMenuItemSpec extends CommonMenuItemSpec {
  type FancyActionArgsMap (line 896) | interface FancyActionArgsMap {
  type BaseFancyMenuItemSpec (line 908) | interface BaseFancyMenuItemSpec<T extends keyof FancyActionArgsMap> {
  type InsertTableMenuItemSpec (line 914) | interface InsertTableMenuItemSpec extends BaseFancyMenuItemSpec<'insertt...
  type ColorSwatchMenuItemSpec (line 918) | interface ColorSwatchMenuItemSpec extends BaseFancyMenuItemSpec<'colorsw...
  type ImageSelectMenuItemSpec (line 927) | interface ImageSelectMenuItemSpec extends BaseFancyMenuItemSpec<'imagese...
  type FancyMenuItemSpec (line 935) | type FancyMenuItemSpec = InsertTableMenuItemSpec | ColorSwatchMenuItemSp...
  type MenuItemSpec (line 936) | interface MenuItemSpec extends CommonMenuItemSpec {
  type MenuItemInstanceApi (line 942) | interface MenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type SeparatorMenuItemSpec (line 944) | interface SeparatorMenuItemSpec {
  type ToggleMenuItemSpec (line 948) | interface ToggleMenuItemSpec extends CommonMenuItemSpec {
  type ToggleMenuItemInstanceApi (line 955) | interface ToggleMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type NestedMenuItemContents (line 959) | type NestedMenuItemContents = string | MenuItemSpec | NestedMenuItemSpec...
  type NestedMenuItemSpec (line 960) | interface NestedMenuItemSpec extends CommonMenuItemSpec {
  type NestedMenuItemInstanceApi (line 966) | interface NestedMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type MenuButtonItemTypes (line 970) | type MenuButtonItemTypes = NestedMenuItemContents;
  type SuccessCallback$1 (line 971) | type SuccessCallback$1 = (menu: string | MenuButtonItemTypes[]) => void;
  type MenuButtonFetchContext (line 972) | interface MenuButtonFetchContext {
  type BaseMenuButtonSpec (line 975) | interface BaseMenuButtonSpec {
  type BaseMenuButtonInstanceApi (line 987) | interface BaseMenuButtonInstanceApi {
  type ToolbarMenuButtonSpec (line 996) | interface ToolbarMenuButtonSpec extends BaseMenuButtonSpec {
  type ToolbarMenuButtonInstanceApi (line 1000) | interface ToolbarMenuButtonInstanceApi extends BaseMenuButtonInstanceApi {
  type ToolbarSplitButtonItemTypes (line 1002) | type ToolbarSplitButtonItemTypes = ChoiceMenuItemSpec | SeparatorMenuIte...
  type SuccessCallback (line 1003) | type SuccessCallback = (menu: ToolbarSplitButtonItemTypes[]) => void;
  type SelectPredicate (line 1004) | type SelectPredicate = (value: string) => boolean;
  type PresetTypes (line 1005) | type PresetTypes = 'color' | 'normal' | 'listpreview' | 'imageselector';
  type ColumnTypes$1 (line 1006) | type ColumnTypes$1 = number | 'auto';
  type ToolbarSplitButtonSpec (line 1007) | interface ToolbarSplitButtonSpec {
  type ToolbarSplitButtonInstanceApi (line 1022) | interface ToolbarSplitButtonInstanceApi {
  type BaseToolbarToggleButtonSpec (line 1032) | interface BaseToolbarToggleButtonSpec<I extends BaseToolbarButtonInstanc...
  type BaseToolbarToggleButtonInstanceApi (line 1035) | interface BaseToolbarToggleButtonInstanceApi extends BaseToolbarButtonIn...
  type ToolbarToggleButtonSpec (line 1039) | interface ToolbarToggleButtonSpec extends BaseToolbarToggleButtonSpec<To...
  type ToolbarToggleButtonInstanceApi (line 1044) | interface ToolbarToggleButtonInstanceApi extends BaseToolbarToggleButton...
  type Id (line 1046) | type Id = string;
  type TreeSpec (line 1047) | interface TreeSpec {
  type BaseTreeItemSpec (line 1058) | interface BaseTreeItemSpec {
  type DirectorySpec (line 1065) | interface DirectorySpec extends BaseTreeItemSpec {
  type LeafSpec (line 1069) | interface LeafSpec extends BaseTreeItemSpec {
  type TreeItemSpec (line 1072) | type TreeItemSpec = DirectorySpec | LeafSpec;
  type UrlInputSpec (line 1073) | interface UrlInputSpec extends FormComponentWithLabelSpec {
  type UrlInputData (line 1080) | interface UrlInputData {
  type BodyComponentSpec (line 1086) | type BodyComponentSpec = BarSpec | ButtonSpec | CheckboxSpec | TextAreaS...
  type BarSpec (line 1087) | interface BarSpec {
  type DialogToggleMenuItemSpec (line 1091) | interface DialogToggleMenuItemSpec extends CommonMenuItemSpec {
  type DialogFooterMenuButtonItemSpec (line 1095) | type DialogFooterMenuButtonItemSpec = DialogToggleMenuItemSpec;
  type BaseDialogFooterButtonSpec (line 1096) | interface BaseDialogFooterButtonSpec {
  type DialogFooterNormalButtonSpec (line 1105) | interface DialogFooterNormalButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterMenuButtonSpec (line 1109) | interface DialogFooterMenuButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterToggleButtonSpec (line 1116) | interface DialogFooterToggleButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterButtonSpec (line 1123) | type DialogFooterButtonSpec = DialogFooterNormalButtonSpec | DialogFoote...
  type TabSpec (line 1124) | interface TabSpec {
  type TabPanelSpec (line 1129) | interface TabPanelSpec {
  type DialogDataItem (line 1133) | type DialogDataItem = any;
  type DialogData (line 1134) | type DialogData = Record<string, DialogDataItem>;
  type DialogInstanceApi (line 1135) | interface DialogInstanceApi<T extends DialogData> {
  type DialogActionDetails (line 1147) | interface DialogActionDetails {
  type DialogChangeDetails (line 1151) | interface DialogChangeDetails<T> {
  type DialogTabChangeDetails (line 1154) | interface DialogTabChangeDetails {
  type DialogActionHandler (line 1158) | type DialogActionHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogChangeHandler (line 1159) | type DialogChangeHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogSubmitHandler (line 1160) | type DialogSubmitHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogCloseHandler (line 1161) | type DialogCloseHandler = () => void;
  type DialogCancelHandler (line 1162) | type DialogCancelHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogTabChangeHandler (line 1163) | type DialogTabChangeHandler<T extends DialogData> = (api: DialogInstance...
  type DialogSize (line 1164) | type DialogSize = 'normal' | 'medium' | 'large';
  type DialogSpec (line 1165) | interface DialogSpec<T extends DialogData> {
  type UrlDialogInstanceApi (line 1178) | interface UrlDialogInstanceApi {
  type UrlDialogActionDetails (line 1184) | interface UrlDialogActionDetails {
  type UrlDialogMessage (line 1188) | interface UrlDialogMessage {
  type UrlDialogActionHandler (line 1192) | type UrlDialogActionHandler = (api: UrlDialogInstanceApi, actions: UrlDi...
  type UrlDialogCloseHandler (line 1193) | type UrlDialogCloseHandler = () => void;
  type UrlDialogCancelHandler (line 1194) | type UrlDialogCancelHandler = (api: UrlDialogInstanceApi) => void;
  type UrlDialogMessageHandler (line 1195) | type UrlDialogMessageHandler = (api: UrlDialogInstanceApi, message: UrlD...
  type UrlDialogFooterButtonSpec (line 1196) | interface UrlDialogFooterButtonSpec extends DialogFooterNormalButtonSpec {
  type UrlDialogSpec (line 1199) | interface UrlDialogSpec {
  type ColumnTypes (line 1210) | type ColumnTypes = number | 'auto';
  type SeparatorItemSpec (line 1211) | type SeparatorItemSpec = SeparatorMenuItemSpec;
  type AutocompleterItemSpec (line 1212) | interface AutocompleterItemSpec {
  type AutocompleterContents (line 1219) | type AutocompleterContents = SeparatorItemSpec | AutocompleterItemSpec |...
  type AutocompleterSpec (line 1220) | interface AutocompleterSpec {
  type AutocompleterInstanceApi (line 1231) | interface AutocompleterInstanceApi {
  type ContextPosition (line 1235) | type ContextPosition = 'node' | 'selection' | 'line';
  type ContextScope (line 1236) | type ContextScope = 'node' | 'editor';
  type ContextBarSpec (line 1237) | interface ContextBarSpec {
  type ContextFormLaunchButtonApi (line 1242) | interface ContextFormLaunchButtonApi extends BaseToolbarButtonSpec<BaseT...
  type ContextFormLaunchToggleButtonSpec (line 1245) | interface ContextFormLaunchToggleButtonSpec extends BaseToolbarToggleBut...
  type ContextFormButtonInstanceApi (line 1248) | interface ContextFormButtonInstanceApi extends BaseToolbarButtonInstance...
  type ContextFormToggleButtonInstanceApi (line 1250) | interface ContextFormToggleButtonInstanceApi extends BaseToolbarToggleBu...
  type ContextFormButtonSpec (line 1252) | interface ContextFormButtonSpec<T> extends BaseToolbarButtonSpec<Context...
  type ContextFormToggleButtonSpec (line 1258) | interface ContextFormToggleButtonSpec<T> extends BaseToolbarToggleButton...
  type ContextFormInstanceApi (line 1264) | interface ContextFormInstanceApi<T> {
  type SizeData (line 1272) | interface SizeData {
  type BaseContextFormSpec (line 1276) | interface BaseContextFormSpec<T> extends ContextBarSpec {
  type ContextInputFormSpec (line 1284) | interface ContextInputFormSpec extends BaseContextFormSpec<string> {
  type ContextSliderFormSpec (line 1288) | interface ContextSliderFormSpec extends BaseContextFormSpec<number> {
  type ContextSizeInputFormSpec (line 1293) | interface ContextSizeInputFormSpec extends BaseContextFormSpec<SizeData> {
  type ContextFormSpec (line 1296) | type ContextFormSpec = ContextInputFormSpec | ContextSliderFormSpec | Co...
  type ToolbarGroupSpec (line 1297) | interface ToolbarGroupSpec {
  type ContextToolbarLaunchButtonApi (line 1302) | interface ContextToolbarLaunchButtonApi extends BaseToolbarButtonSpec<Ba...
  type ContextToolbarSpec (line 1305) | interface ContextToolbarSpec extends ContextBarSpec {
  type PublicDialog_d_AlertBannerSpec (line 1310) | type PublicDialog_d_AlertBannerSpec = AlertBannerSpec;
  type PublicDialog_d_BarSpec (line 1311) | type PublicDialog_d_BarSpec = BarSpec;
  type PublicDialog_d_BodyComponentSpec (line 1312) | type PublicDialog_d_BodyComponentSpec = BodyComponentSpec;
  type PublicDialog_d_ButtonSpec (line 1313) | type PublicDialog_d_ButtonSpec = ButtonSpec;
  type PublicDialog_d_CheckboxSpec (line 1314) | type PublicDialog_d_CheckboxSpec = CheckboxSpec;
  type PublicDialog_d_CollectionItem (line 1315) | type PublicDialog_d_CollectionItem = CollectionItem;
  type PublicDialog_d_CollectionSpec (line 1316) | type PublicDialog_d_CollectionSpec = CollectionSpec;
  type PublicDialog_d_ColorInputSpec (line 1317) | type PublicDialog_d_ColorInputSpec = ColorInputSpec;
  type PublicDialog_d_ColorPickerSpec (line 1318) | type PublicDialog_d_ColorPickerSpec = ColorPickerSpec;
  type PublicDialog_d_CustomEditorSpec (line 1319) | type PublicDialog_d_CustomEditorSpec = CustomEditorSpec;
  type PublicDialog_d_CustomEditorInit (line 1320) | type PublicDialog_d_CustomEditorInit = CustomEditorInit;
  type PublicDialog_d_CustomEditorInitFn (line 1321) | type PublicDialog_d_CustomEditorInitFn = CustomEditorInitFn;
  type PublicDialog_d_DialogData (line 1322) | type PublicDialog_d_DialogData = DialogData;
  type PublicDialog_d_DialogSize (line 1323) | type PublicDialog_d_DialogSize = DialogSize;
  type PublicDialog_d_DialogSpec (line 1324) | type PublicDialog_d_DialogSpec<T extends DialogData> = DialogSpec<T>;
  type PublicDialog_d_DialogInstanceApi (line 1325) | type PublicDialog_d_DialogInstanceApi<T extends DialogData> = DialogInst...
  type PublicDialog_d_DialogFooterButtonSpec (line 1326) | type PublicDialog_d_DialogFooterButtonSpec = DialogFooterButtonSpec;
  type PublicDialog_d_DialogActionDetails (line 1327) | type PublicDialog_d_DialogActionDetails = DialogActionDetails;
  type PublicDialog_d_DialogChangeDetails (line 1328) | type PublicDialog_d_DialogChangeDetails<T> = DialogChangeDetails<T>;
  type PublicDialog_d_DialogTabChangeDetails (line 1329) | type PublicDialog_d_DialogTabChangeDetails = DialogTabChangeDetails;
  type PublicDialog_d_DropZoneSpec (line 1330) | type PublicDialog_d_DropZoneSpec = DropZoneSpec;
  type PublicDialog_d_GridSpec (line 1331) | type PublicDialog_d_GridSpec = GridSpec;
  type PublicDialog_d_HtmlPanelSpec (line 1332) | type PublicDialog_d_HtmlPanelSpec = HtmlPanelSpec;
  type PublicDialog_d_IframeSpec (line 1333) | type PublicDialog_d_IframeSpec = IframeSpec;
  type PublicDialog_d_ImagePreviewSpec (line 1334) | type PublicDialog_d_ImagePreviewSpec = ImagePreviewSpec;
  type PublicDialog_d_InputSpec (line 1335) | type PublicDialog_d_InputSpec = InputSpec;
  type PublicDialog_d_LabelSpec (line 1336) | type PublicDialog_d_LabelSpec = LabelSpec;
  type PublicDialog_d_ListBoxSpec (line 1337) | type PublicDialog_d_ListBoxSpec = ListBoxSpec;
  type PublicDialog_d_ListBoxItemSpec (line 1338) | type PublicDialog_d_ListBoxItemSpec = ListBoxItemSpec;
  type PublicDialog_d_ListBoxNestedItemSpec (line 1339) | type PublicDialog_d_ListBoxNestedItemSpec = ListBoxNestedItemSpec;
  type PublicDialog_d_ListBoxSingleItemSpec (line 1340) | type PublicDialog_d_ListBoxSingleItemSpec = ListBoxSingleItemSpec;
  type PublicDialog_d_PanelSpec (line 1341) | type PublicDialog_d_PanelSpec = PanelSpec;
  type PublicDialog_d_SelectBoxSpec (line 1342) | type PublicDialog_d_SelectBoxSpec = SelectBoxSpec;
  type PublicDialog_d_SelectBoxItemSpec (line 1343) | type PublicDialog_d_SelectBoxItemSpec = SelectBoxItemSpec;
  type PublicDialog_d_SizeInputSpec (line 1344) | type PublicDialog_d_SizeInputSpec = SizeInputSpec;
  type PublicDialog_d_SliderSpec (line 1345) | type PublicDialog_d_SliderSpec = SliderSpec;
  type PublicDialog_d_TableSpec (line 1346) | type PublicDialog_d_TableSpec = TableSpec;
  type PublicDialog_d_TabSpec (line 1347) | type PublicDialog_d_TabSpec = TabSpec;
  type PublicDialog_d_TabPanelSpec (line 1348) | type PublicDialog_d_TabPanelSpec = TabPanelSpec;
  type PublicDialog_d_TextAreaSpec (line 1349) | type PublicDialog_d_TextAreaSpec = TextAreaSpec;
  type PublicDialog_d_TreeSpec (line 1350) | type PublicDialog_d_TreeSpec = TreeSpec;
  type PublicDialog_d_TreeItemSpec (line 1351) | type PublicDialog_d_TreeItemSpec = TreeItemSpec;
  type PublicDialog_d_UrlInputData (line 1352) | type PublicDialog_d_UrlInputData = UrlInputData;
  type PublicDialog_d_UrlInputSpec (line 1353) | type PublicDialog_d_UrlInputSpec = UrlInputSpec;
  type PublicDialog_d_UrlDialogSpec (line 1354) | type PublicDialog_d_UrlDialogSpec = UrlDialogSpec;
  type PublicDialog_d_UrlDialogFooterButtonSpec (line 1355) | type PublicDialog_d_UrlDialogFooterButtonSpec = UrlDialogFooterButtonSpec;
  type PublicDialog_d_UrlDialogInstanceApi (line 1356) | type PublicDialog_d_UrlDialogInstanceApi = UrlDialogInstanceApi;
  type PublicDialog_d_UrlDialogActionDetails (line 1357) | type PublicDialog_d_UrlDialogActionDetails = UrlDialogActionDetails;
  type PublicDialog_d_UrlDialogMessage (line 1358) | type PublicDialog_d_UrlDialogMessage = UrlDialogMessage;
  type PublicInlineContent_d_AutocompleterSpec (line 1362) | type PublicInlineContent_d_AutocompleterSpec = AutocompleterSpec;
  type PublicInlineContent_d_AutocompleterItemSpec (line 1363) | type PublicInlineContent_d_AutocompleterItemSpec = AutocompleterItemSpec;
  type PublicInlineContent_d_AutocompleterContents (line 1364) | type PublicInlineContent_d_AutocompleterContents = AutocompleterContents;
  type PublicInlineContent_d_AutocompleterInstanceApi (line 1365) | type PublicInlineContent_d_AutocompleterInstanceApi = AutocompleterInsta...
  type PublicInlineContent_d_ContextPosition (line 1366) | type PublicInlineContent_d_ContextPosition = ContextPosition;
  type PublicInlineContent_d_ContextScope (line 1367) | type PublicInlineContent_d_ContextScope = ContextScope;
  type PublicInlineContent_d_ContextFormSpec (line 1368) | type PublicInlineContent_d_ContextFormSpec = ContextFormSpec;
  type PublicInlineContent_d_ContextFormInstanceApi (line 1369) | type PublicInlineContent_d_ContextFormInstanceApi<T> = ContextFormInstan...
  type PublicInlineContent_d_ContextFormButtonSpec (line 1370) | type PublicInlineContent_d_ContextFormButtonSpec<T> = ContextFormButtonS...
  type PublicInlineContent_d_ContextFormButtonInstanceApi (line 1371) | type PublicInlineContent_d_ContextFormButtonInstanceApi = ContextFormBut...
  type PublicInlineContent_d_ContextFormToggleButtonSpec (line 1372) | type PublicInlineContent_d_ContextFormToggleButtonSpec<T> = ContextFormT...
  type PublicInlineContent_d_ContextFormToggleButtonInstanceApi (line 1373) | type PublicInlineContent_d_ContextFormToggleButtonInstanceApi = ContextF...
  type PublicInlineContent_d_ContextToolbarSpec (line 1374) | type PublicInlineContent_d_ContextToolbarSpec = ContextToolbarSpec;
  type PublicInlineContent_d_SeparatorItemSpec (line 1375) | type PublicInlineContent_d_SeparatorItemSpec = SeparatorItemSpec;
  type PublicMenu_d_MenuItemSpec (line 1379) | type PublicMenu_d_MenuItemSpec = MenuItemSpec;
  type PublicMenu_d_MenuItemInstanceApi (line 1380) | type PublicMenu_d_MenuItemInstanceApi = MenuItemInstanceApi;
  type PublicMenu_d_NestedMenuItemContents (line 1381) | type PublicMenu_d_NestedMenuItemContents = NestedMenuItemContents;
  type PublicMenu_d_NestedMenuItemSpec (line 1382) | type PublicMenu_d_NestedMenuItemSpec = NestedMenuItemSpec;
  type PublicMenu_d_NestedMenuItemInstanceApi (line 1383) | type PublicMenu_d_NestedMenuItemInstanceApi = NestedMenuItemInstanceApi;
  type PublicMenu_d_FancyMenuItemSpec (line 1384) | type PublicMenu_d_FancyMenuItemSpec = FancyMenuItemSpec;
  type PublicMenu_d_ColorSwatchMenuItemSpec (line 1385) | type PublicMenu_d_ColorSwatchMenuItemSpec = ColorSwatchMenuItemSpec;
  type PublicMenu_d_InsertTableMenuItemSpec (line 1386) | type PublicMenu_d_InsertTableMenuItemSpec = InsertTableMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemSpec (line 1387) | type PublicMenu_d_ToggleMenuItemSpec = ToggleMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemInstanceApi (line 1388) | type PublicMenu_d_ToggleMenuItemInstanceApi = ToggleMenuItemInstanceApi;
  type PublicMenu_d_ChoiceMenuItemSpec (line 1389) | type PublicMenu_d_ChoiceMenuItemSpec = ChoiceMenuItemSpec;
  type PublicMenu_d_ChoiceMenuItemInstanceApi (line 1390) | type PublicMenu_d_ChoiceMenuItemInstanceApi = ChoiceMenuItemInstanceApi;
  type PublicMenu_d_SeparatorMenuItemSpec (line 1391) | type PublicMenu_d_SeparatorMenuItemSpec = SeparatorMenuItemSpec;
  type PublicMenu_d_ContextMenuApi (line 1392) | type PublicMenu_d_ContextMenuApi = ContextMenuApi;
  type PublicMenu_d_ContextMenuContents (line 1393) | type PublicMenu_d_ContextMenuContents = ContextMenuContents;
  type PublicMenu_d_ContextMenuItem (line 1394) | type PublicMenu_d_ContextMenuItem = ContextMenuItem;
  type PublicMenu_d_ContextSubMenu (line 1395) | type PublicMenu_d_ContextSubMenu = ContextSubMenu;
  type PublicMenu_d_CardMenuItemSpec (line 1396) | type PublicMenu_d_CardMenuItemSpec = CardMenuItemSpec;
  type PublicMenu_d_CardMenuItemInstanceApi (line 1397) | type PublicMenu_d_CardMenuItemInstanceApi = CardMenuItemInstanceApi;
  type PublicMenu_d_CardItemSpec (line 1398) | type PublicMenu_d_CardItemSpec = CardItemSpec;
  type PublicMenu_d_CardContainerSpec (line 1399) | type PublicMenu_d_CardContainerSpec = CardContainerSpec;
  type PublicMenu_d_CardImageSpec (line 1400) | type PublicMenu_d_CardImageSpec = CardImageSpec;
  type PublicMenu_d_CardTextSpec (line 1401) | type PublicMenu_d_CardTextSpec = CardTextSpec;
  type SidebarInstanceApi (line 1405) | interface SidebarInstanceApi {
  type SidebarSpec (line 1408) | interface SidebarSpec {
  type PublicSidebar_d_SidebarSpec (line 1415) | type PublicSidebar_d_SidebarSpec = SidebarSpec;
  type PublicSidebar_d_SidebarInstanceApi (line 1416) | type PublicSidebar_d_SidebarInstanceApi = SidebarInstanceApi;
  type PublicToolbar_d_ToolbarButtonSpec (line 1420) | type PublicToolbar_d_ToolbarButtonSpec = ToolbarButtonSpec;
  type PublicToolbar_d_ToolbarButtonInstanceApi (line 1421) | type PublicToolbar_d_ToolbarButtonInstanceApi = ToolbarButtonInstanceApi;
  type PublicToolbar_d_ToolbarSplitButtonSpec (line 1422) | type PublicToolbar_d_ToolbarSplitButtonSpec = ToolbarSplitButtonSpec;
  type PublicToolbar_d_ToolbarSplitButtonInstanceApi (line 1423) | type PublicToolbar_d_ToolbarSplitButtonInstanceApi = ToolbarSplitButtonI...
  type PublicToolbar_d_ToolbarMenuButtonSpec (line 1424) | type PublicToolbar_d_ToolbarMenuButtonSpec = ToolbarMenuButtonSpec;
  type PublicToolbar_d_ToolbarMenuButtonInstanceApi (line 1425) | type PublicToolbar_d_ToolbarMenuButtonInstanceApi = ToolbarMenuButtonIns...
  type PublicToolbar_d_ToolbarToggleButtonSpec (line 1426) | type PublicToolbar_d_ToolbarToggleButtonSpec = ToolbarToggleButtonSpec;
  type PublicToolbar_d_ToolbarToggleButtonInstanceApi (line 1427) | type PublicToolbar_d_ToolbarToggleButtonInstanceApi = ToolbarToggleButto...
  type PublicToolbar_d_GroupToolbarButtonSpec (line 1428) | type PublicToolbar_d_GroupToolbarButtonSpec = GroupToolbarButtonSpec;
  type PublicToolbar_d_GroupToolbarButtonInstanceApi (line 1429) | type PublicToolbar_d_GroupToolbarButtonInstanceApi = GroupToolbarButtonI...
  type ViewButtonApi (line 1433) | interface ViewButtonApi {
  type ViewToggleButtonApi (line 1436) | interface ViewToggleButtonApi extends ViewButtonApi {
  type BaseButtonSpec (line 1441) | interface BaseButtonSpec<Api extends ViewButtonApi> {
  type ViewNormalButtonSpec (line 1450) | interface ViewNormalButtonSpec extends BaseButtonSpec<ViewButtonApi> {
  type ViewToggleButtonSpec (line 1454) | interface ViewToggleButtonSpec extends BaseButtonSpec<ViewToggleButtonAp...
  type ViewButtonsGroupSpec (line 1459) | interface ViewButtonsGroupSpec {
  type ViewButtonSpec (line 1463) | type ViewButtonSpec = ViewNormalButtonSpec | ViewToggleButtonSpec | View...
  type ViewInstanceApi (line 1464) | interface ViewInstanceApi {
  type ViewSpec (line 1467) | interface ViewSpec {
  type PublicView_d_ViewSpec (line 1472) | type PublicView_d_ViewSpec = ViewSpec;
  type PublicView_d_ViewInstanceApi (line 1473) | type PublicView_d_ViewInstanceApi = ViewInstanceApi;
  type Registry$1 (line 1477) | interface Registry$1 {
  type AutocompleteLookupData (line 1506) | interface AutocompleteLookupData {
  type AutocompleterEventArgs (line 1513) | interface AutocompleterEventArgs {
  type RangeLikeObject (line 1516) | interface RangeLikeObject {
  type ApplyFormat (line 1522) | type ApplyFormat = BlockFormat | InlineFormat | SelectorFormat;
  type RemoveFormat (line 1523) | type RemoveFormat = RemoveBlockFormat | RemoveInlineFormat | RemoveSelec...
  type Format (line 1524) | type Format = ApplyFormat | RemoveFormat;
  type Formats (line 1525) | type Formats = Record<string, Format | Format[]>;
  type FormatAttrOrStyleValue (line 1526) | type FormatAttrOrStyleValue = string | ((vars?: FormatVars) => string | ...
  type FormatVars (line 1527) | type FormatVars = Record<string, string | null>;
  type BaseFormat (line 1528) | interface BaseFormat<T> {
  type Block (line 1544) | interface Block {
  type Inline (line 1549) | interface Inline {
  type Selector (line 1552) | interface Selector {
  type CommonFormat (line 1556) | interface CommonFormat<T> extends BaseFormat<T> {
  type BlockFormat (line 1566) | interface BlockFormat extends Block, CommonFormat<BlockFormat> {
  type InlineFormat (line 1568) | interface InlineFormat extends Inline, CommonFormat<InlineFormat> {
  type SelectorFormat (line 1570) | interface SelectorFormat extends Selector, CommonFormat<SelectorFormat> {
  type CommonRemoveFormat (line 1572) | interface CommonRemoveFormat<T> extends BaseFormat<T> {
  type RemoveBlockFormat (line 1576) | interface RemoveBlockFormat extends Block, CommonRemoveFormat<RemoveBloc...
  type RemoveInlineFormat (line 1578) | interface RemoveInlineFormat extends Inline, CommonRemoveFormat<RemoveIn...
  type RemoveSelectorFormat (line 1580) | interface RemoveSelectorFormat extends Selector, CommonRemoveFormat<Remo...
  type UndoLevelType (line 1582) | type UndoLevelType = 'fragmented' | 'complete';
  type BaseUndoLevel (line 1583) | interface BaseUndoLevel {
  type FragmentedUndoLevel (line 1588) | interface FragmentedUndoLevel extends BaseUndoLevel {
  type CompleteUndoLevel (line 1593) | interface CompleteUndoLevel extends BaseUndoLevel {
  type NewUndoLevel (line 1598) | type NewUndoLevel = CompleteUndoLevel | FragmentedUndoLevel;
  type UndoLevel (line 1599) | type UndoLevel = NewUndoLevel & {
  type UndoManager (line 1602) | interface UndoManager {
  type Filter (line 1618) | interface Filter<C extends Function> {
  type ParserArgs (line 1622) | interface ParserArgs {
  type ParserFilterCallback (line 1632) | type ParserFilterCallback = (nodes: AstNode[], name: string, args: Parse...
  type ParserFilter (line 1633) | interface ParserFilter extends Filter<ParserFilterCallback> {
  type DomParserSettings (line 1635) | interface DomParserSettings {
  type DomParser (line 1663) | interface DomParser {
  type Registry (line 1673) | type Registry = Registry$1;
  type EditorUiApi (line 1674) | interface EditorUiApi {
  type EditorUi (line 1680) | interface EditorUi extends EditorUiApi {
  type Ui_d_Registry (line 1684) | type Ui_d_Registry = Registry;
  type Ui_d_EditorUiApi (line 1685) | type Ui_d_EditorUiApi = EditorUiApi;
  type Ui_d_EditorUi (line 1686) | type Ui_d_EditorUi = EditorUi;
  type WindowParams (line 1690) | interface WindowParams {
  type InstanceApi (line 1695) | type InstanceApi<T extends DialogData> = UrlDialogInstanceApi | DialogIn...
  type WindowManagerImpl (line 1696) | interface WindowManagerImpl {
  type WindowManager (line 1703) | interface WindowManager {
  type ExecCommandEvent (line 1710) | interface ExecCommandEvent {
  type BeforeGetContentEvent (line 1715) | interface BeforeGetContentEvent extends GetContentArgs {
  type GetContentEvent (line 1718) | interface GetContentEvent extends BeforeGetContentEvent {
  type BeforeSetContentEvent (line 1721) | interface BeforeSetContentEvent extends SetContentArgs {
  type SetContentEvent (line 1725) | interface SetContentEvent extends BeforeSetContentEvent {
  type SaveContentEvent (line 1728) | interface SaveContentEvent extends GetContentEvent {
  type NewBlockEvent (line 1731) | interface NewBlockEvent {
  type NodeChangeEvent (line 1734) | interface NodeChangeEvent {
  type FormatEvent (line 1740) | interface FormatEvent {
  type ObjectResizeEvent (line 1745) | interface ObjectResizeEvent {
  type ObjectSelectedEvent (line 1751) | interface ObjectSelectedEvent {
  type ScrollIntoViewEvent (line 1755) | interface ScrollIntoViewEvent {
  type SetSelectionRangeEvent (line 1759) | interface SetSelectionRangeEvent {
  type ShowCaretEvent (line 1763) | interface ShowCaretEvent {
  type SwitchModeEvent (line 1768) | interface SwitchModeEvent {
  type ChangeEvent (line 1771) | interface ChangeEvent {
  type AddUndoEvent (line 1775) | interface AddUndoEvent extends ChangeEvent {
  type UndoRedoEvent (line 1778) | interface UndoRedoEvent {
  type WindowEvent (line 1781) | interface WindowEvent<T extends DialogData> {
  type ProgressStateEvent (line 1784) | interface ProgressStateEvent {
  type AfterProgressStateEvent (line 1788) | interface AfterProgressStateEvent {
  type PlaceholderToggleEvent (line 1791) | interface PlaceholderToggleEvent {
  type LoadErrorEvent (line 1794) | interface LoadErrorEvent {
  type PreProcessEvent (line 1797) | interface PreProcessEvent extends ParserArgs {
  type PostProcessEvent (line 1800) | interface PostProcessEvent extends ParserArgs {
  type PastePlainTextToggleEvent (line 1803) | interface PastePlainTextToggleEvent {
  type PastePreProcessEvent (line 1806) | interface PastePreProcessEvent {
  type PastePostProcessEvent (line 1810) | interface PastePostProcessEvent {
  type EditableRootStateChangeEvent (line 1814) | interface EditableRootStateChangeEvent {
  type NewTableRowEvent (line 1817) | interface NewTableRowEvent {
  type NewTableCellEvent (line 1820) | interface NewTableCellEvent {
  type TableEventData (line 1823) | interface TableEventData {
  type TableModifiedEvent (line 1827) | interface TableModifiedEvent extends TableEventData {
  type BeforeOpenNotificationEvent (line 1830) | interface BeforeOpenNotificationEvent {
  type OpenNotificationEvent (line 1833) | interface OpenNotificationEvent {
  type DisabledStateChangeEvent (line 1836) | interface DisabledStateChangeEvent {
  type EditorEventMap (line 1839) | interface EditorEventMap extends Omit<NativeEventMap, 'blur' | 'focus'> {
  type EditorManagerEventMap (line 1936) | interface EditorManagerEventMap {
  type EventTypes_d_ExecCommandEvent (line 1947) | type EventTypes_d_ExecCommandEvent = ExecCommandEvent;
  type EventTypes_d_BeforeGetContentEvent (line 1948) | type EventTypes_d_BeforeGetContentEvent = BeforeGetContentEvent;
  type EventTypes_d_GetContentEvent (line 1949) | type EventTypes_d_GetContentEvent = GetContentEvent;
  type EventTypes_d_BeforeSetContentEvent (line 1950) | type EventTypes_d_BeforeSetContentEvent = BeforeSetContentEvent;
  type EventTypes_d_SetContentEvent (line 1951) | type EventTypes_d_SetContentEvent = SetContentEvent;
  type EventTypes_d_SaveContentEvent (line 1952) | type EventTypes_d_SaveContentEvent = SaveContentEvent;
  type EventTypes_d_NewBlockEvent (line 1953) | type EventTypes_d_NewBlockEvent = NewBlockEvent;
  type EventTypes_d_NodeChangeEvent (line 1954) | type EventTypes_d_NodeChangeEvent = NodeChangeEvent;
  type EventTypes_d_FormatEvent (line 1955) | type EventTypes_d_FormatEvent = FormatEvent;
  type EventTypes_d_ObjectResizeEvent (line 1956) | type EventTypes_d_ObjectResizeEvent = ObjectResizeEvent;
  type EventTypes_d_ObjectSelectedEvent (line 1957) | type EventTypes_d_ObjectSelectedEvent = ObjectSelectedEvent;
  type EventTypes_d_ScrollIntoViewEvent (line 1958) | type EventTypes_d_ScrollIntoViewEvent = ScrollIntoViewEvent;
  type EventTypes_d_SetSelectionRangeEvent (line 1959) | type EventTypes_d_SetSelectionRangeEvent = SetSelectionRangeEvent;
  type EventTypes_d_ShowCaretEvent (line 1960) | type EventTypes_d_ShowCaretEvent = ShowCaretEvent;
  type EventTypes_d_SwitchModeEvent (line 1961) | type EventTypes_d_SwitchModeEvent = SwitchModeEvent;
  type EventTypes_d_ChangeEvent (line 1962) | type EventTypes_d_ChangeEvent = ChangeEvent;
  type EventTypes_d_AddUndoEvent (line 1963) | type EventTypes_d_AddUndoEvent = AddUndoEvent;
  type EventTypes_d_UndoRedoEvent (line 1964) | type EventTypes_d_UndoRedoEvent = UndoRedoEvent;
  type EventTypes_d_WindowEvent (line 1965) | type EventTypes_d_WindowEvent<T extends DialogData> = WindowEvent<T>;
  type EventTypes_d_ProgressStateEvent (line 1966) | type EventTypes_d_ProgressStateEvent = ProgressStateEvent;
  type EventTypes_d_AfterProgressStateEvent (line 1967) | type EventTypes_d_AfterProgressStateEvent = AfterProgressStateEvent;
  type EventTypes_d_PlaceholderToggleEvent (line 1968) | type EventTypes_d_PlaceholderToggleEvent = PlaceholderToggleEvent;
  type EventTypes_d_LoadErrorEvent (line 1969) | type EventTypes_d_LoadErrorEvent = LoadErrorEvent;
  type EventTypes_d_PreProcessEvent (line 1970) | type EventTypes_d_PreProcessEvent = PreProcessEvent;
  type EventTypes_d_PostProcessEvent (line 1971) | type EventTypes_d_PostProcessEvent = PostProcessEvent;
  type EventTypes_d_PastePlainTextToggleEvent (line 1972) | type EventTypes_d_PastePlainTextToggleEvent = PastePlainTextToggleEvent;
  type EventTypes_d_PastePreProcessEvent (line 1973) | type EventTypes_d_PastePreProcessEvent = PastePreProcessEvent;
  type EventTypes_d_PastePostProcessEvent (line 1974) | type EventTypes_d_PastePostProcessEvent = PastePostProcessEvent;
  type EventTypes_d_EditableRootStateChangeEvent (line 1975) | type EventTypes_d_EditableRootStateChangeEvent = EditableRootStateChange...
  type EventTypes_d_NewTableRowEvent (line 1976) | type EventTypes_d_NewTableRowEvent = NewTableRowEvent;
  type EventTypes_d_NewTableCellEvent (line 1977) | type EventTypes_d_NewTableCellEvent = NewTableCellEvent;
  type EventTypes_d_TableEventData (line 1978) | type EventTypes_d_TableEventData = TableEventData;
  type EventTypes_d_TableModifiedEvent (line 1979) | type EventTypes_d_TableModifiedEvent = TableModifiedEvent;
  type EventTypes_d_BeforeOpenNotificationEvent (line 1980) | type EventTypes_d_BeforeOpenNotificationEvent = BeforeOpenNotificationEv...
  type EventTypes_d_OpenNotificationEvent (line 1981) | type EventTypes_d_OpenNotificationEvent = OpenNotificationEvent;
  type EventTypes_d_DisabledStateChangeEvent (line 1982) | type EventTypes_d_DisabledStateChangeEvent = DisabledStateChangeEvent;
  type EventTypes_d_EditorEventMap (line 1983) | type EventTypes_d_EditorEventMap = EditorEventMap;
  type EventTypes_d_EditorManagerEventMap (line 1984) | type EventTypes_d_EditorManagerEventMap = EditorManagerEventMap;
  type Format_d_Formats (line 1988) | type Format_d_Formats = Formats;
  type Format_d_Format (line 1989) | type Format_d_Format = Format;
  type Format_d_ApplyFormat (line 1990) | type Format_d_ApplyFormat = ApplyFormat;
  type Format_d_BlockFormat (line 1991) | type Format_d_BlockFormat = BlockFormat;
  type Format_d_InlineFormat (line 1992) | type Format_d_InlineFormat = InlineFormat;
  type Format_d_SelectorFormat (line 1993) | type Format_d_SelectorFormat = SelectorFormat;
  type Format_d_RemoveFormat (line 1994) | type Format_d_RemoveFormat = RemoveFormat;
  type Format_d_RemoveBlockFormat (line 1995) | type Format_d_RemoveBlockFormat = RemoveBlockFormat;
  type Format_d_RemoveInlineFormat (line 1996) | type Format_d_RemoveInlineFormat = RemoveInlineFormat;
  type Format_d_RemoveSelectorFormat (line 1997) | type Format_d_RemoveSelectorFormat = RemoveSelectorFormat;
  type StyleFormat (line 2001) | type StyleFormat = BlockStyleFormat | InlineStyleFormat | SelectorStyleF...
  type AllowedFormat (line 2002) | type AllowedFormat = Separator | FormatReference | StyleFormat | NestedF...
  type Separator (line 2003) | interface Separator {
  type FormatReference (line 2006) | interface FormatReference {
  type NestedFormatting (line 2011) | interface NestedFormatting {
  type CommonStyleFormat (line 2015) | interface CommonStyleFormat {
  type BlockStyleFormat (line 2020) | interface BlockStyleFormat extends BlockFormat, CommonStyleFormat {
  type InlineStyleFormat (line 2022) | interface InlineStyleFormat extends InlineFormat, CommonStyleFormat {
  type SelectorStyleFormat (line 2024) | interface SelectorStyleFormat extends SelectorFormat, CommonStyleFormat {
  type EntityEncoding (line 2026) | type EntityEncoding = 'named' | 'numeric' | 'raw' | 'named,numeric' | 'n...
  type ContentLanguage (line 2027) | interface ContentLanguage {
  type ThemeInitFunc (line 2032) | type ThemeInitFunc = (editor: Editor, elm: HTMLElement) => {
  type DocumentsFileTypes (line 2039) | interface DocumentsFileTypes {
  type SetupCallback (line 2043) | type SetupCallback = (editor: Editor) => void;
  type FilePickerCallback (line 2044) | type FilePickerCallback = (callback: (value: string, meta?: Record<strin...
  type FilePickerValidationStatus (line 2045) | type FilePickerValidationStatus = 'valid' | 'unknown' | 'invalid' | 'none';
  type FilePickerValidationCallback (line 2046) | type FilePickerValidationCallback = (info: {
  type PastePreProcessFn (line 2053) | type PastePreProcessFn = (editor: Editor, args: PastePreProcessEvent) =>...
  type PastePostProcessFn (line 2054) | type PastePostProcessFn = (editor: Editor, args: PastePostProcessEvent) ...
  type URLConverter (line 2055) | type URLConverter = (url: string, name: string, elm?: string | Element) ...
  type URLConverterCallback (line 2056) | type URLConverterCallback = (url: string, node: Node | string | undefine...
  type ToolbarGroup (line 2057) | interface ToolbarGroup {
  type ToolbarMode (line 2062) | type ToolbarMode = 'floating' | 'sliding' | 'scrolling' | 'wrap';
  type ToolbarLocation (line 2063) | type ToolbarLocation = 'top' | 'bottom' | 'auto';
  type CrossOrigin (line 2064) | type CrossOrigin = (url: string, resourceType: 'script' | 'stylesheet') ...
  type BaseEditorOptions (line 2065) | interface BaseEditorOptions {
  type RawEditorOptions (line 2285) | interface RawEditorOptions extends BaseEditorOptions {
  type NormalizedEditorOptions (line 2290) | interface NormalizedEditorOptions extends BaseEditorOptions {
  type EditorOptions (line 2295) | interface EditorOptions extends NormalizedEditorOptions {
  type Content (line 2384) | type Content = string | AstNode;
  type ContentFormat (line 2385) | type ContentFormat = 'raw' | 'text' | 'html' | 'tree';
  type GetContentArgs (line 2386) | interface GetContentArgs {
  type SetContentArgs (line 2397) | interface SetContentArgs {
  type GetSelectionContentArgs (line 2408) | interface GetSelectionContentArgs extends GetContentArgs {
  type SetSelectionContentArgs (line 2412) | interface SetSelectionContentArgs extends SetContentArgs {
  type BlobInfoImagePair (line 2416) | interface BlobInfoImagePair {
  type UrlObject (line 2420) | interface UrlObject {
  type WaitState (line 2425) | type WaitState = 'added' | 'loaded';
  type AddOnConstructor (line 2426) | type AddOnConstructor<T> = (editor: Editor, url: string) => T;
  type AddOnManager (line 2427) | interface AddOnManager<T> {
  type LicenseKeyManagerAddon (line 2441) | type LicenseKeyManagerAddon = AddOnConstructor<LicenseKeyManager>;
  type ValidateData (line 2442) | interface ValidateData {
  type LicenseKeyManager (line 2446) | interface LicenseKeyManager {
  class NodeChange (line 2449) | class NodeChange {
  type SelectionOverrides (line 2456) | interface SelectionOverrides {
  type Quirks (line 2462) | interface Quirks {
  type DecoratorData (line 2466) | type DecoratorData = Record<string, any>;
  type Decorator (line 2467) | type Decorator = (uid: string, data: DecoratorData) => {
  type AnnotationListener (line 2471) | type AnnotationListener = (state: boolean, name: string, data?: {
  type AnnotationListenerApi (line 2475) | type AnnotationListenerApi = AnnotationListener;
  type AnnotatorSettings (line 2476) | interface AnnotatorSettings {
  type Annotator (line 2480) | interface Annotator {
  type ClientRect (line 2488) | interface ClientRect {
  type BookmarkManager (line 2496) | interface BookmarkManager {
  type ControlSelection (line 2500) | interface ControlSelection {
  type WriterSettings (line 2507) | interface WriterSettings {
  type Attributes (line 2515) | type Attributes = Array<{
  type Writer (line 2519) | interface Writer {
  type HtmlSerializerSettings (line 2530) | interface HtmlSerializerSettings extends WriterSettings {
  type HtmlSerializer (line 2534) | interface HtmlSerializer {
  type DomSerializerSettings (line 2537) | interface DomSerializerSettings extends DomParserSettings, WriterSetting...
  type DomSerializerArgs (line 2542) | interface DomSerializerArgs extends ParserArgs {
  type DomSerializerImpl (line 2546) | interface DomSerializerImpl {
  type DomSerializer (line 2565) | interface DomSerializer extends DomSerializerImpl {
  type EditorSelection (line 2567) | interface EditorSelection {
  type EditorCommandCallback (line 2622) | type EditorCommandCallback<S> = (this: S, ui: boolean, value: any, args?...
  type EditorCommandsCallback (line 2623) | type EditorCommandsCallback = (command: string, ui: boolean, value?: any...
  type Commands (line 2624) | interface Commands {
  type ExecCommandArgs (line 2629) | interface ExecCommandArgs {
  type EditorCommandsConstructor (line 2632) | interface EditorCommandsConstructor {
  class EditorCommands (line 2636) | class EditorCommands {
  type RawString (line 2654) | interface RawString {
  type Primitive (line 2657) | type Primitive = string | number | boolean | Record<string | number, any...
  type TokenisedString (line 2658) | type TokenisedString = [
  type Untranslated (line 2662) | type Untranslated = Primitive | TokenisedString | RawString | null | und...
  type TranslatedString (line 2663) | type TranslatedString = string;
  type I18n (line 2664) | interface I18n {
  type Observable (line 2673) | interface Observable<T extends {}> {
  type URISettings (line 2681) | interface URISettings {
  type URIConstructor (line 2684) | interface URIConstructor {
  type SafeUriOptions (line 2698) | interface SafeUriOptions {
  class URI (line 2703) | class URI {
  type EditorManager (line 2739) | interface EditorManager extends Observable<EditorManagerEventMap> {
  type EditorObservable (line 2770) | interface EditorObservable extends Observable<EditorEventMap> {
  type ProcessorSuccess (line 2775) | interface ProcessorSuccess<T> {
  type ProcessorError (line 2779) | interface ProcessorError {
  type SimpleProcessor (line 2783) | type SimpleProcessor = (value: unknown) => boolean;
  type Processor (line 2784) | type Processor<T> = (value: unknown) => ProcessorSuccess<T> | ProcessorE...
  type BuiltInOptionTypeMap (line 2785) | interface BuiltInOptionTypeMap {
  type BuiltInOptionType (line 2796) | type BuiltInOptionType = keyof BuiltInOptionTypeMap;
  type BaseOptionSpec (line 2797) | interface BaseOptionSpec {
  type BuiltInOptionSpec (line 2802) | interface BuiltInOptionSpec<K extends BuiltInOptionType> extends BaseOpt...
  type SimpleOptionSpec (line 2806) | interface SimpleOptionSpec<T> extends BaseOptionSpec {
  type OptionSpec (line 2810) | interface OptionSpec<T, U> extends BaseOptionSpec {
  type Options (line 2814) | interface Options {
  type UploadResult$1 (line 2831) | interface UploadResult$1 {
  type EditorUpload (line 2838) | interface EditorUpload {
  type FormatChangeCallback (line 2846) | type FormatChangeCallback = (state: boolean, data: {
  type FormatRegistry (line 2851) | interface FormatRegistry {
  type Formatter (line 2860) | interface Formatter extends FormatRegistry {
  type EditorMode (line 2874) | interface EditorMode {
  type EditorModeApi (line 2880) | interface EditorModeApi {
  type Model (line 2885) | interface Model {
  type ModelManager (line 2891) | type ModelManager = AddOnManager<Model>;
  type Plugin (line 2892) | interface Plugin {
  type PluginManager (line 2900) | type PluginManager = AddOnManager<void | Plugin>;
  type ShortcutsConstructor (line 2901) | interface ShortcutsConstructor {
  type CommandFunc (line 2905) | type CommandFunc = string | [
  class Shortcuts (line 2910) | class Shortcuts {
  type RenderResult (line 2924) | interface RenderResult {
  type Theme (line 2929) | interface Theme {
  type ThemeManager (line 2940) | type ThemeManager = AddOnManager<void | Theme>;
  type EditorConstructor (line 2941) | interface EditorConstructor {
  class Editor (line 2945) | class Editor implements EditorObservable {
  type UserId (line 3076) | type UserId = string;
  type User (line 3077) | interface User {
  type ExpectedUser (line 3083) | interface ExpectedUser {
  type UserLookup (line 3087) | interface UserLookup {
  type RangeUtils (line 3091) | interface RangeUtils {
  type ScriptLoaderSettings (line 3099) | interface ScriptLoaderSettings {
  type ScriptLoaderConstructor (line 3103) | interface ScriptLoaderConstructor {
  class ScriptLoader (line 3108) | class ScriptLoader {
  type TextProcessCallback (line 3129) | type TextProcessCallback = (node: Text, offset: number, text: string) =>...
  type Spot (line 3130) | interface Spot {
  type TextSeeker (line 3134) | interface TextSeeker {
  type DomTreeWalkerConstructor (line 3138) | interface DomTreeWalkerConstructor {
  class DomTreeWalker (line 3142) | class DomTreeWalker {
  type Version (line 3153) | interface Version {
  type Env (line 3157) | interface Env {
  type FakeClipboardItem (line 3196) | interface FakeClipboardItem {
  type FakeClipboard (line 3201) | interface FakeClipboard {
  type FocusManager (line 3207) | interface FocusManager {
  type EntitiesMap (line 3210) | interface EntitiesMap {
  type Entities (line 3213) | interface Entities {
  type IconPack (line 3221) | interface IconPack {
  type IconManager (line 3224) | interface IconManager {
  type Resource (line 3229) | interface Resource {
  type TextPatterns_d_Pattern (line 3236) | type TextPatterns_d_Pattern = Pattern;
  type TextPatterns_d_RawPattern (line 3237) | type TextPatterns_d_RawPattern = RawPattern;
  type TextPatterns_d_DynamicPatternsLookup (line 3238) | type TextPatterns_d_DynamicPatternsLookup = DynamicPatternsLookup;
  type TextPatterns_d_RawDynamicPatternsLookup (line 3239) | type TextPatterns_d_RawDynamicPatternsLookup = RawDynamicPatternsLookup;
  type TextPatterns_d_DynamicPatternContext (line 3240) | type TextPatterns_d_DynamicPatternContext = DynamicPatternContext;
  type TextPatterns_d_BlockCmdPattern (line 3241) | type TextPatterns_d_BlockCmdPattern = BlockCmdPattern;
  type TextPatterns_d_BlockPattern (line 3242) | type TextPatterns_d_BlockPattern = BlockPattern;
  type TextPatterns_d_BlockFormatPattern (line 3243) | type TextPatterns_d_BlockFormatPattern = BlockFormatPattern;
  type TextPatterns_d_InlineCmdPattern (line 3244) | type TextPatterns_d_InlineCmdPattern = InlineCmdPattern;
  type TextPatterns_d_InlinePattern (line 3245) | type TextPatterns_d_InlinePattern = InlinePattern;
  type TextPatterns_d_InlineFormatPattern (line 3246) | type TextPatterns_d_InlineFormatPattern = InlineFormatPattern;
  type Delay (line 3250) | interface Delay {
  type UploadResult (line 3254) | type UploadResult = UploadResult$2;
  type ImageUploader (line 3255) | interface ImageUploader {
  type ArrayCallback$1 (line 3258) | type ArrayCallback$1<T, R> = (this: any, x: T, i: number, xs: ArrayLike<...
  type ObjCallback$1 (line 3259) | type ObjCallback$1<T, R> = (this: any, value: T, key: string, obj: Recor...
  type ArrayCallback (line 3260) | type ArrayCallback<T, R> = ArrayCallback$1<T, R>;
  type ObjCallback (line 3261) | type ObjCallback<T, R> = ObjCallback$1<T, R>;
  type WalkCallback (line 3262) | type WalkCallback<T> = (this: any, o: T, i: string, n: keyof T | undefin...
  type Tools (line 3263) | interface Tools {
  type KeyboardLikeEvent (line 3289) | interface KeyboardLikeEvent {
  type VK (line 3295) | interface VK {
  type DOMUtilsNamespace (line 3313) | interface DOMUtilsNamespace {
  type RangeUtilsNamespace (line 3318) | interface RangeUtilsNamespace {
  type AddOnManagerNamespace (line 3325) | interface AddOnManagerNamespace {
  type BookmarkManagerNamespace (line 3334) | interface BookmarkManagerNamespace {
  type TinyMCE (line 3338) | interface TinyMCE extends EditorManager {

FILE: bl-plugins/twitter-cards/plugin.php
  class pluginTwitterCards (line 3) | class pluginTwitterCards extends Plugin
    method init (line 6) | public function init()
    method form (line 16) | public function form()
    method sanitize (line 51) | private function sanitize($text, $maxLength = 0)
    method siteHead (line 67) | public function siteHead()

FILE: bl-plugins/version/js/version.js
  function getLatestVersion (line 2) | function getLatestVersion() {

FILE: bl-plugins/version/plugin.php
  class pluginVersion (line 3) | class pluginVersion extends Plugin
    method init (line 6) | public function init()
    method form (line 14) | public function form()
    method adminSidebar (line 37) | public function adminSidebar()
    method adminBodyEnd (line 50) | public function adminBodyEnd()

FILE: bl-plugins/visits-stats/plugin.php
  class pluginVisitsStats (line 3) | class pluginVisitsStats extends Plugin
    method init (line 6) | public function init()
    method adminHead (line 15) | public function adminHead()
    method form (line 27) | public function form()
    method siteBodyEnd (line 50) | public function siteBodyEnd()
    method deleteOldLogs (line 61) | public function deleteOldLogs()
    method visits (line 72) | public function visits($date)
    method uniqueVisitors (line 93) | public function uniqueVisitors($date)
    method readCounts (line 115) | private function readCounts($date)
    method getLastDaysData (line 140) | public function getLastDaysData($days = 7)
    method addVisitor (line 155) | public function addVisitor()

FILE: install.php
  function getLanguageList (line 179) | function getLanguageList()
  function alreadyInstalled (line 194) | function alreadyInstalled()
  function checkSystem (line 200) | function checkSystem()
  function install (line 259) | function install($adminPassword, $timezone)
  function redirect (line 564) | function redirect($url)
Condensed preview — 672 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,049K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 976,
    "preview": "---\nname: Bug Report\nabout: Describe a bug or problem\ntitle: ''\nlabels: bug\nassignees: ''\n---\n\n> Please complete the fol"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/workflows/close_inactive_issues.yml",
    "chars": 644,
    "preview": "name: \"Close inactive issues\"\non:\n  schedule:\n    - cron: '30 1 * * *'\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    st"
  },
  {
    "path": ".gitignore",
    "chars": 783,
    "preview": ".DS_Store\ndbgenerator.php\nbl-content/*\n!bl-content/.keep\nbl-content-migrator\nbl-plugins/gallery\nbl-plugins/timemachine\nb"
  },
  {
    "path": ".htaccess",
    "chars": 393,
    "preview": "AddDefaultCharset UTF-8\n\n<IfModule mod_rewrite.c>\n\n# Enable rewrite rules\nRewriteEngine on\n\n# Base directory\nRewriteBase"
  },
  {
    "path": ".prettierrc",
    "chars": 100,
    "preview": "{\n  \"semi\": true,\n  \"singleQuote\": true,\n  \"useTabs\": false,\n  \"tabWidth\": 2,\n  \"printWidth\": 100\n}\n"
  },
  {
    "path": "LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2023 Diego Najar\n\nPermission is hereby granted, free of charge, to any person "
  },
  {
    "path": "README.ar.md",
    "chars": 5097,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.de.md",
    "chars": 5372,
    "preview": "# [Bludit](https://www.bludit.com/de/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n"
  },
  {
    "path": "README.es.md",
    "chars": 5196,
    "preview": "# [Bludit](https://www.bludit.com/es/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n"
  },
  {
    "path": "README.fr.md",
    "chars": 6017,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.hi.md",
    "chars": 5638,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.it.md",
    "chars": 5716,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.ja.md",
    "chars": 4160,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.md",
    "chars": 6099,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.pt.md",
    "chars": 5137,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.ru.md",
    "chars": 5118,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "README.zh.md",
    "chars": 3227,
    "preview": "# [Bludit](https://www.bludit.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md)\n[!["
  },
  {
    "path": "bl-content/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "bl-kernel/abstract/dbjson.class.php",
    "chars": 2628,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass dbJSON {\n\n\tpublic $db;\n\tpublic $dbBackup;\n\tpublic $file;\n\tpublic $"
  },
  {
    "path": "bl-kernel/abstract/dblist.class.php",
    "chars": 4366,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n/*\nDatabase structure\n\n{\n\t\"videos\": {\n\t\t\"name\": \"Videos\",\n\t\t\"template: \""
  },
  {
    "path": "bl-kernel/abstract/plugin.class.php",
    "chars": 8049,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Plugin\n{\n\n\t// (string) directory name, just the name\n\t// Ex: sitem"
  },
  {
    "path": "bl-kernel/admin/controllers/about.php",
    "chars": 130,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Title of the page\n$layout['title'] = $L->g('About') . ' - ' . $layout"
  },
  {
    "path": "bl-kernel/admin/controllers/api.php",
    "chars": 1334,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/categories.php",
    "chars": 1029,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/configure-plugin.php",
    "chars": 1729,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/content.php",
    "chars": 2081,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/dashboard.php",
    "chars": 2146,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/developers.php",
    "chars": 1568,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/edit-category.php",
    "chars": 1533,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/edit-content.php",
    "chars": 3863,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/edit-user.php",
    "chars": 1899,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/install-plugin.php",
    "chars": 1390,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/install-theme.php",
    "chars": 1092,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/login.php",
    "chars": 2145,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/logout.php",
    "chars": 980,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/new-category.php",
    "chars": 1144,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/new-content.php",
    "chars": 2228,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/new-user.php",
    "chars": 1137,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/plugins-position.php",
    "chars": 1168,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/plugins.php",
    "chars": 1026,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/settings.php",
    "chars": 1134,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/themes.php",
    "chars": 876,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/uninstall-plugin.php",
    "chars": 1065,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/user-password.php",
    "chars": 1582,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/controllers/users.php",
    "chars": 1092,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/admin/themes/booty/css/bludit.bootstrap.css",
    "chars": 4103,
    "preview": "a {\n\tcolor: var(--primary-blue, #1e88e5);\n\ttransition: color 0.2s ease;\n}\n\na:hover {\n\tcolor: var(--primary-blue-dark, #1"
  },
  {
    "path": "bl-kernel/admin/themes/booty/css/bludit.css",
    "chars": 14577,
    "preview": ":root {\n\t/* Dynamic font sizing */\n\t--font-size-xs: 0.72rem;\n\t--font-size-sm: 0.833rem;\n\t--font-size-base: 0.945rem;\n\t--"
  },
  {
    "path": "bl-kernel/admin/themes/booty/html/alert.php",
    "chars": 530,
    "preview": "<script charset=\"utf-8\">\n\tfunction showAlert(text) {\n\t\tconsole.log(\"[INFO] Function showAlert() called.\");\n\t\t$(\"#alert\")"
  },
  {
    "path": "bl-kernel/admin/themes/booty/html/media.php",
    "chars": 8496,
    "preview": "<?php\n// Preload the first chunk of files to avoid an AJAX round-trip the first time\n// the Media Manager is opened. Sca"
  },
  {
    "path": "bl-kernel/admin/themes/booty/html/navbar.php",
    "chars": 2912,
    "preview": "<nav class=\"navbar navbar-expand-lg navbar-dark bg-dark text-uppercase d-block d-lg-none\">\n\t<div class=\"container\">\n\t\t<s"
  },
  {
    "path": "bl-kernel/admin/themes/booty/html/sidebar.php",
    "chars": 3600,
    "preview": "<!-- Use .flex-column to set a vertical direction -->\n<ul class=\"nav flex-column pt-4\">\n\n\t<li class=\"nav-item mb-4\" styl"
  },
  {
    "path": "bl-kernel/admin/themes/booty/index.php",
    "chars": 2527,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<title><?php echo $layout['title'] ?></title>\n\t<meta charset=\"<?php echo CHARSET ?>\">\n\t<m"
  },
  {
    "path": "bl-kernel/admin/themes/booty/init.php",
    "chars": 10789,
    "preview": "<?php\n\nclass Bootstrap\n{\n\n\tpublic static function modal($args)\n\t{\n\n\t\t$buttonSecondary = $args['buttonSecondary'];\n\t\t$but"
  },
  {
    "path": "bl-kernel/admin/themes/booty/login.php",
    "chars": 6996,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <title><?php echo (defined('BLUDIT_PRO') ? $site->title() : 'BLUDIT') ?> - Lo"
  },
  {
    "path": "bl-kernel/admin/views/about.php",
    "chars": 1088,
    "preview": "<?php\n\necho Bootstrap::pageTitle(array('title'=>$L->g('About'), 'icon'=>'info-circle'));\n\necho '\n<table class=\"table tab"
  },
  {
    "path": "bl-kernel/admin/views/blocks.php",
    "chars": 1494,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-co"
  },
  {
    "path": "bl-kernel/admin/views/categories.php",
    "chars": 825,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\necho Bootstrap::pageTitle(array('title'=>$L->g('Categories'), 'icon'=>'t"
  },
  {
    "path": "bl-kernel/admin/views/configure-plugin.php",
    "chars": 992,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'plugin"
  },
  {
    "path": "bl-kernel/admin/views/content.php",
    "chars": 14771,
    "preview": "<?php\n\necho Bootstrap::pageTitle(array('title'=>$L->g('Content'), 'icon'=>'archive'));\n\nfunction moveTypeIcon($type) {\n\t"
  },
  {
    "path": "bl-kernel/admin/views/dashboard.php",
    "chars": 19367,
    "preview": "<div id=\"dashboard\" class=\"container\">\n\n            <!-- Search with welcome message -->\n            <?php\n            $"
  },
  {
    "path": "bl-kernel/admin/views/developers.php",
    "chars": 968,
    "preview": "<?php\n\necho Bootstrap::pageTitle(array('title'=>$L->g('Developers'), 'icon'=>'gears'));\n\necho '<h2 class=\"mb-4 mt-4\"><b>"
  },
  {
    "path": "bl-kernel/admin/views/edit-category.php",
    "chars": 2408,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform')); ?>\n\n<div class"
  },
  {
    "path": "bl-kernel/admin/views/edit-content.php",
    "chars": 18287,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php\n\n// FORM START\necho Bootstrap::formOpen(array(\n\t'id' => 'jsform"
  },
  {
    "path": "bl-kernel/admin/views/edit-user.php",
    "chars": 10128,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id' => 'jsform', 'class' => 'ta"
  },
  {
    "path": "bl-kernel/admin/views/login.php",
    "chars": 2868,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Logo and title\n$logoPath = HTML_PATH_CORE_IMG . 'logo.svg';\n$logoClas"
  },
  {
    "path": "bl-kernel/admin/views/new-category.php",
    "chars": 1112,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-co"
  },
  {
    "path": "bl-kernel/admin/views/new-content.php",
    "chars": 16840,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php\n\n// Start form\necho Bootstrap::formOpen(array(\n\t'id' => 'jsform"
  },
  {
    "path": "bl-kernel/admin/views/new-user.php",
    "chars": 1772,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-co"
  },
  {
    "path": "bl-kernel/admin/views/plugins-position.php",
    "chars": 1528,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-co"
  },
  {
    "path": "bl-kernel/admin/views/plugins.php",
    "chars": 3474,
    "preview": "<?php\n\necho Bootstrap::pageTitle(array('title' => $L->g('Plugins'), 'icon' => 'puzzle-piece'));\n\necho Bootstrap::link(ar"
  },
  {
    "path": "bl-kernel/admin/views/settings.php",
    "chars": 18816,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id' => 'jsform', 'class' => 'ta"
  },
  {
    "path": "bl-kernel/admin/views/themes.php",
    "chars": 1715,
    "preview": "<?php\n\necho Bootstrap::pageTitle(array('title' => $L->g('Themes'), 'icon' => 'desktop'));\n\necho '\n<table class=\"table  m"
  },
  {
    "path": "bl-kernel/admin/views/user-password.php",
    "chars": 1484,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-co"
  },
  {
    "path": "bl-kernel/admin/views/users.php",
    "chars": 1932,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.'); ?>\n\n<?php\n\necho Bootstrap::pageTitle(array('title'=>$L->g('Users'), 'icon"
  },
  {
    "path": "bl-kernel/ajax/change-type.php",
    "chars": 2032,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Change a page's type. All"
  },
  {
    "path": "bl-kernel/ajax/clippy.php",
    "chars": 2197,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n// $_GET\n// ------------------"
  },
  {
    "path": "bl-kernel/ajax/content-get-list.php",
    "chars": 1576,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Search for pages that hav"
  },
  {
    "path": "bl-kernel/ajax/delete-image.php",
    "chars": 2055,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Delete an image from a pa"
  },
  {
    "path": "bl-kernel/ajax/generate-slug.php",
    "chars": 828,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Generate a slug text for "
  },
  {
    "path": "bl-kernel/ajax/get-published.php",
    "chars": 1441,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Returns a list of pages a"
  },
  {
    "path": "bl-kernel/ajax/list-images.php",
    "chars": 2036,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Returns a list of images "
  },
  {
    "path": "bl-kernel/ajax/logo-remove.php",
    "chars": 443,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Delete the site logo\n| Th"
  },
  {
    "path": "bl-kernel/ajax/logo-upload.php",
    "chars": 2540,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Upload site logo\n| The fi"
  },
  {
    "path": "bl-kernel/ajax/profile-picture-upload.php",
    "chars": 3583,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n// $_POST\n// -----------------"
  },
  {
    "path": "bl-kernel/ajax/save-as-draft.php",
    "chars": 1267,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Create/edit a page and sa"
  },
  {
    "path": "bl-kernel/ajax/upload-images.php",
    "chars": 4242,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\nheader('Content-Type: application/json');\n\n/*\n| Upload an image to a part"
  },
  {
    "path": "bl-kernel/boot/admin.php",
    "chars": 3167,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Start the session\n// If the session is not possible to start the admi"
  },
  {
    "path": "bl-kernel/boot/init.php",
    "chars": 10767,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Bludit version\ndefine('BLUDIT_VERSION',        '3.21.0');\ndefine('BLU"
  },
  {
    "path": "bl-kernel/boot/rules/60.plugins.php",
    "chars": 3769,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/boot/rules/60.router.php",
    "chars": 710,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Redirect admin, from /admin to /admin/\nif ($url->uri()==HTML_PATH_ROO"
  },
  {
    "path": "bl-kernel/boot/rules/69.pages.php",
    "chars": 2040,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/boot/rules/99.header.php",
    "chars": 142,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nheader('HTTP/1.0 '.$url->httpCode().' '.$url->httpMessage());\nheader('X-"
  },
  {
    "path": "bl-kernel/boot/rules/99.paginator.php",
    "chars": 1630,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Current page number\n$currentPage = $url->pageNumber();\nPaginator::set"
  },
  {
    "path": "bl-kernel/boot/rules/99.security.php",
    "chars": 1388,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/boot/rules/99.themes.php",
    "chars": 2712,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// ====================================================================="
  },
  {
    "path": "bl-kernel/boot/site.php",
    "chars": 927,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Load plugins rules\ninclude(PATH_RULES.'60.plugins.php');\n\n// Plugins "
  },
  {
    "path": "bl-kernel/boot/variables.php",
    "chars": 3542,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n/*\n\tEnvironment variables\n\tIf you are going to do some changes is recomm"
  },
  {
    "path": "bl-kernel/categories.class.php",
    "chars": 869,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Categories extends dbList {\n\n\tfunction __construct()\n\t{\n\t\tparent::"
  },
  {
    "path": "bl-kernel/category.class.php",
    "chars": 1689,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Category {\n\n\tprotected $vars;\n\n\tfunction __construct($key)\n\t{\n\t\tgl"
  },
  {
    "path": "bl-kernel/css/bootstrap-icons/bootstrap-icons.css",
    "chars": 63666,
    "preview": "@font-face {\n  font-family: \"bootstrap-icons\";\n  src: url(\"./fonts/bootstrap-icons.woff2?8bd4575acf83c7696dc7a14a966660a"
  },
  {
    "path": "bl-kernel/css/bootstrap-icons/bootstrap-icons.json",
    "chars": 33942,
    "preview": "{\n  \"alarm-fill\": 61697,\n  \"alarm\": 61698,\n  \"align-bottom\": 61699,\n  \"align-center\": 61700,\n  \"align-end\": 61701,\n  \"al"
  },
  {
    "path": "bl-kernel/functions.php",
    "chars": 28553,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\n// Re-index database of categories\n// If you create/edit/remove a page i"
  },
  {
    "path": "bl-kernel/helpers/alert.class.php",
    "chars": 615,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Alert {\n\n\t// Status, 0 = OK, 1 = Fail\n\tpublic static function set("
  },
  {
    "path": "bl-kernel/helpers/cookie.class.php",
    "chars": 793,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Cookie {\n\n\tpublic static function get($key)\n\t{\n\t\tif (isset($_COOKI"
  },
  {
    "path": "bl-kernel/helpers/date.class.php",
    "chars": 3314,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Date {\n\n\t// Returns string with the date translated\n\t// Example: $"
  },
  {
    "path": "bl-kernel/helpers/dom.class.php",
    "chars": 604,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass DOM {\n\n\tpublic static function getFirstImage($content)\n\t{\n\t\t// Dis"
  },
  {
    "path": "bl-kernel/helpers/email.class.php",
    "chars": 1072,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Email {\n\n\t// Returns TRUE if the mail was successfully accepted fo"
  },
  {
    "path": "bl-kernel/helpers/filesystem.class.php",
    "chars": 8842,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Filesystem\n{\n\n\t// Returns an array with the absolutes directories."
  },
  {
    "path": "bl-kernel/helpers/image.class.php",
    "chars": 9401,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Image {\n\n    private $image;\n    private $width;\n    private $heig"
  },
  {
    "path": "bl-kernel/helpers/log.class.php",
    "chars": 690,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Log {\n\n\tpublic static function set($text, $type=LOG_TYPE_INFO)\n\t{\n"
  },
  {
    "path": "bl-kernel/helpers/paginator.class.php",
    "chars": 4829,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Paginator {\n\n\tpublic static $pager = array(\n\t\t'itemsPerPage'=>0,\n\t"
  },
  {
    "path": "bl-kernel/helpers/redirect.class.php",
    "chars": 502,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Redirect {\n\n\tpublic static function url($url, $httpCode=301)\n\t{\n\t\t"
  },
  {
    "path": "bl-kernel/helpers/sanitize.class.php",
    "chars": 1849,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Sanitize {\n\n\tpublic static function removeTags($text) {\n\t\treturn s"
  },
  {
    "path": "bl-kernel/helpers/session.class.php",
    "chars": 2113,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Session {\n\n\tprivate static $started = false;\n\tprivate static $sess"
  },
  {
    "path": "bl-kernel/helpers/tcp.class.php",
    "chars": 1443,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass TCP {\n\n\tpublic static function http($url, $method='GET', $verifySS"
  },
  {
    "path": "bl-kernel/helpers/text.class.php",
    "chars": 9881,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Text {\n\n\tprivate static $unicodeChars = array(\n\t\t// Latin\n\t\t'À'=>'"
  },
  {
    "path": "bl-kernel/helpers/theme.class.php",
    "chars": 7211,
    "preview": "<?php\n\nclass Theme\n{\n\n\tpublic static function socialNetworks()\n\t{\n\t\tglobal $site;\n\t\t$socialNetworks = array(\n\t\t\t'github'"
  },
  {
    "path": "bl-kernel/helpers/valid.class.php",
    "chars": 720,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Valid {\n\n\tpublic static function ip($ip)\n\t{\n\t\treturn filter_var($i"
  },
  {
    "path": "bl-kernel/js/bludit-ajax.php",
    "chars": 2723,
    "preview": "class bluditAjax {\n\n\tstatic async saveAsDraft(uuid, title, content) {\n\t\tlet url = HTML_PATH_ADMIN_ROOT+\"ajax/save-as-dra"
  },
  {
    "path": "bl-kernel/js/functions.js",
    "chars": 843,
    "preview": "function sanitizeHTML(text) {\n\tvar map = {\n\t\t'&': '&amp;',\n\t\t'<': '&lt;',\n\t\t'>': '&gt;',\n\t\t'\"': '&quot;',\n\t\t\"'\": '&#039;"
  },
  {
    "path": "bl-kernel/js/variables.php",
    "chars": 1246,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\necho 'var HTML_PATH_ROOT = \"'.HTML_PATH_ROOT.'\";'.PHP_EOL;\necho 'var HTM"
  },
  {
    "path": "bl-kernel/language.class.php",
    "chars": 3358,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Language extends dbJSON {\n\tpublic $data;\n\tpublic $db;\n\tpublic $cur"
  },
  {
    "path": "bl-kernel/login.class.php",
    "chars": 4997,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Login\n{\n\tprotected $users;\n\tprotected $site;\n\n\tfunction __construc"
  },
  {
    "path": "bl-kernel/pages.class.php",
    "chars": 22561,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Pages extends dbJSON\n{\n\n\tprotected $parentKeyList = array();\n\tprot"
  },
  {
    "path": "bl-kernel/pagex.class.php",
    "chars": 14927,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Page\n{\n\n\tprotected $vars;\n\n\tfunction __construct($key)\n\t{\n\t\tglobal"
  },
  {
    "path": "bl-kernel/parsedown.class.php",
    "chars": 52070,
    "preview": "<?php\n\n#\n#\n# Parsedown\n# http://parsedown.org\n#\n# (c) Emanuil Rusev\n# http://erusev.com\n#\n# For the full license informa"
  },
  {
    "path": "bl-kernel/security.class.php",
    "chars": 3492,
    "preview": "<?php defined('BLUDIT') or die('Bludit Badass CMS.');\n\nclass Security extends dbJSON\n{\n\tprotected $dbFields = array(\n\t\t'"
  },
  {
    "path": "bl-kernel/site.class.php",
    "chars": 9694,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Site extends dbJSON\n{\n\tpublic $dbFields = array(\n\t\t'title' =>\t\t'I "
  },
  {
    "path": "bl-kernel/syslog.class.php",
    "chars": 1621,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Syslog extends dbJSON {\n\n\tprotected $dbFields = array(\n\t\t'date'=>\t"
  },
  {
    "path": "bl-kernel/tag.class.php",
    "chars": 1306,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Tag {\n\n\tprotected $vars;\n\n\tfunction __construct($key)\n\t{\n\t\tglobal "
  },
  {
    "path": "bl-kernel/tags.class.php",
    "chars": 824,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Tags extends dbList {\n\n\tfunction __construct()\n\t{\n\t\tparent::__cons"
  },
  {
    "path": "bl-kernel/url.class.php",
    "chars": 4360,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Url\n{\n\tprotected $uri;\n\tprotected $uriStrlen;\n\tprotected $whereAmI"
  },
  {
    "path": "bl-kernel/user.class.php",
    "chars": 4146,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass User\n{\n\tprotected $vars;\n\n\tfunction __construct($username)\n\t{\n\t\tgl"
  },
  {
    "path": "bl-kernel/users.class.php",
    "chars": 5218,
    "preview": "<?php defined('BLUDIT') or die('Bludit CMS.');\n\nclass Users extends dbJSON {\n\n\tprotected $dbFields = array(\n\t\t'firstName"
  },
  {
    "path": "bl-kernel/vendors/bootstrap-icons/bootstrap-icons.css",
    "chars": 63666,
    "preview": "@font-face {\n  font-family: \"bootstrap-icons\";\n  src: url(\"./fonts/bootstrap-icons.woff2?8bd4575acf83c7696dc7a14a966660a"
  },
  {
    "path": "bl-kernel/vendors/bootstrap-icons/bootstrap-icons.json",
    "chars": 33942,
    "preview": "{\n  \"alarm-fill\": 61697,\n  \"alarm\": 61698,\n  \"align-bottom\": 61699,\n  \"align-center\": 61700,\n  \"align-end\": 61701,\n  \"al"
  },
  {
    "path": "bl-languages/ar_MA.json",
    "chars": 21194,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"اللغة العربية\",\n        \"english-name\": \"Arabic\",\n        \"last-update\": \"20"
  },
  {
    "path": "bl-languages/bg_BG.json",
    "chars": 22655,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Български (България)\",\n        \"english-name\": \"Bulgarian\",\n        \"last-up"
  },
  {
    "path": "bl-languages/ckb.json",
    "chars": 22222,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"کوردی\",\n        \"english-name\": \"Kurdish (Sorani)\",\n        \"locale\": \"ku,ck"
  },
  {
    "path": "bl-languages/cs_CZ.json",
    "chars": 22698,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Čeština\",\n        \"english-name\": \"Czech\",\n        \"locale\": \"cs, cs_CZ\",\n  "
  },
  {
    "path": "bl-languages/da.json",
    "chars": 22567,
    "preview": "{\n    \"about\": \"Om\",\n    \"about-your-site-or-yourself\": \"Om dit websted eller dig selv\",\n    \"access-denied\": \"Adgang næ"
  },
  {
    "path": "bl-languages/de_AT.json",
    "chars": 23929,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Deutsch (Österreich)\",\n        \"english-name\": \"German (Austria)\",\n        \""
  },
  {
    "path": "bl-languages/de_CH.json",
    "chars": 23890,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Deutsch (Schweiz)\",\n        \"english-name\": \"German\",\n        \"locale\": \"de,"
  },
  {
    "path": "bl-languages/de_DE.json",
    "chars": 23889,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Deutsch (Deutschland)\",\n        \"english-name\": \"German\",\n        \"locale\": "
  },
  {
    "path": "bl-languages/en.json",
    "chars": 21898,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"English\",\n        \"english-name\": \"English\",\n        \"locale\": \"en, en_US, e"
  },
  {
    "path": "bl-languages/es.json",
    "chars": 23430,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Español\",\n        \"english-name\": \"Spanish\",\n        \"locale\": \"es, es_ES, e"
  },
  {
    "path": "bl-languages/fa_IR.json",
    "chars": 22042,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"فارسی\",\n        \"english-name\": \"Persian\",\n        \"locale\": \"fa,fa_IR\",\n   "
  },
  {
    "path": "bl-languages/fi_FI.json",
    "chars": 22158,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Suomi (Suomi)\",\n        \"english-name\": \"Finnish\",\n        \"last-update\": \"2"
  },
  {
    "path": "bl-languages/fr_FR.json",
    "chars": 24392,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Français (France)\",\n        \"english-name\": \"French\",\n        \"locale\": \"fr,"
  },
  {
    "path": "bl-languages/gr.json",
    "chars": 24105,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Ελληνικά\",\n        \"english-name\": \"Greek\",\n        \"locale\": \"el, el_CY, el"
  },
  {
    "path": "bl-languages/he_IL.json",
    "chars": 21175,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"עברית\",\n        \"english-name\": \"Hebrew\",\n        \"locale\": \"iw, iw_IL, he_I"
  },
  {
    "path": "bl-languages/hu_HU.json",
    "chars": 23000,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Magyar\",\n        \"english-name\": \"Hungarian\",\n        \"last-update\": \"2020-0"
  },
  {
    "path": "bl-languages/id_ID.json",
    "chars": 22638,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Bahasa Indonesia\",\n        \"english-name\": \"Indonesian\",\n        \"last-updat"
  },
  {
    "path": "bl-languages/it_IT.json",
    "chars": 23540,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Italiano (Italia)\",\n        \"english-name\": \"Italian\",\n        \"last-update\""
  },
  {
    "path": "bl-languages/ja_JP.json",
    "chars": 17701,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"日本語 (Japanese)\",\n        \"english-name\": \"日本語\",\n        \"locale\": \"ja, ja_JP"
  },
  {
    "path": "bl-languages/lt.json",
    "chars": 23392,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Lietuvių\",\n        \"english-name\": \"Lithuanian\",\n        \"locale\": \"lt, lt_L"
  },
  {
    "path": "bl-languages/ms_MY.json",
    "chars": 22150,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Bahasa Melayu (Malaysia)\",\n        \"english-name\": \"Malay\",\n        \"last-up"
  },
  {
    "path": "bl-languages/nl_NL.json",
    "chars": 22932,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Nederlands\",\n        \"english-name\": \"Dutch\",\n        \"last-update\": \"2026-0"
  },
  {
    "path": "bl-languages/pl_PL.json",
    "chars": 23069,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Polski (Polska)\",\n        \"english-name\": \"Polish\",\n        \"locale\": \"pl, p"
  },
  {
    "path": "bl-languages/pt_BR.json",
    "chars": 23568,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Português (Brasil)\",\n        \"english-name\": \"Portuguese (Brazil)\",\n        "
  },
  {
    "path": "bl-languages/pt_PT.json",
    "chars": 23627,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Português (Portugal)\",\n        \"english-name\": \"Portuguese (Portugal)\",\n    "
  },
  {
    "path": "bl-languages/ro_RO.json",
    "chars": 22399,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Română\",\n        \"english-name\": \"Romanian\",\n        \"locale\": \"ro, ro_RO\",\n"
  },
  {
    "path": "bl-languages/ru.json",
    "chars": 23003,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Русский (Россия)\",\n        \"english-name\": \"Russian\",\n        \"locale\": \"ru,"
  },
  {
    "path": "bl-languages/sv_SE.json",
    "chars": 22813,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Svenska (Sverige)\",\n        \"english-name\": \"Swedish\",\n        \"locale\": \"sv"
  },
  {
    "path": "bl-languages/tr_TR.json",
    "chars": 22185,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Türkçe\",\n        \"english-name\": \"Turkish\",\n        \"locale\": \"tr, tr_TR\",\n "
  },
  {
    "path": "bl-languages/uk_UA.json",
    "chars": 23152,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Українська (Україна)\",\n        \"english-name\": \"Ukrainian\",\n        \"locale\""
  },
  {
    "path": "bl-languages/vi_VN.json",
    "chars": 22095,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"Tiếng Việt\",\n        \"english-name\": \"Vietnamese\",\n        \"last-update\": \"2"
  },
  {
    "path": "bl-languages/zh_CN.json",
    "chars": 18091,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"中文(简体,中华人民共和国)\",\n        \"english-name\": \"Chinese (Simplified, PRC)\",\n      "
  },
  {
    "path": "bl-languages/zh_TW.json",
    "chars": 16216,
    "preview": "{\n    \"language-data\": {\n        \"native\": \"繁體中文 (台灣Taiwan)\",\n        \"english-name\": \"Traditional Chinese\",\n        \"la"
  },
  {
    "path": "bl-plugins/about/languages/bg_BG.json",
    "chars": 110,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"За мен\",\n\t\t\"description\": \"Кратко описание за вашия сайт или за себе си.\"\n\t}\n}"
  },
  {
    "path": "bl-plugins/about/languages/da.json",
    "chars": 122,
    "preview": "{\n\t\"plugin-data\": {\n\t\t\"description\": \"Vis en lille beskrivelse af dit websted eller om dig selv.\",\n\t\t\"name\": \"About\"\n\t}\n"
  },
  {
    "path": "bl-plugins/about/languages/de_CH.json",
    "chars": 139,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Über\",\n\t\t\"description\": \"Kurzer Text über die Website oder zum Betreiber des Blogs oder "
  },
  {
    "path": "bl-plugins/about/languages/de_DE.json",
    "chars": 139,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Über\",\n\t\t\"description\": \"Kurzer Text über die Website oder zum Betreiber des Blogs oder "
  },
  {
    "path": "bl-plugins/about/languages/en.json",
    "chars": 120,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"About\",\n\t\t\"description\": \"Show a small description of your site or about yourself.\"\n\t}\n}"
  },
  {
    "path": "bl-plugins/about/languages/es.json",
    "chars": 115,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Acerca de\",\n\t\t\"description\": \"Breve descripción de ti mismo o sobre tu sitio.\"\n\t}\n}"
  },
  {
    "path": "bl-plugins/about/languages/fa_IR.json",
    "chars": 107,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"درباره\",\n\t\t\"description\": \"نمایش توضیح کوتاهی از شما و یا وبسایتتان.\"\n\t}\n}\n"
  },
  {
    "path": "bl-plugins/about/languages/fr_FR.json",
    "chars": 131,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"À Propos\",\n\t\t\"description\": \"Afficher une courte description sur votre site ou sur vous-"
  },
  {
    "path": "bl-plugins/about/languages/it.json",
    "chars": 132,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Informazioni\",\n\t\t\"description\": \"Visualizza una breve descrizione sul tuo sito o su te s"
  },
  {
    "path": "bl-plugins/about/languages/ja_JP.json",
    "chars": 88,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"About\",\n\t\t\"description\": \"サイトやあなたについての簡単な説明を表示します。\"\n\t}\n}"
  },
  {
    "path": "bl-plugins/about/languages/nl_NL.json",
    "chars": 114,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Over\",\n\t\t\"description\": \"Een korte beschrijving over de site of over uzelf.\"\n\t}\n}\n"
  },
  {
    "path": "bl-plugins/about/languages/ru_RU.json",
    "chars": 111,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"О блоге\",\n\t\t\"description\": \"Небольшое описание о вашем сайте или о себе.\"\n\t}\n}\n"
  },
  {
    "path": "bl-plugins/about/languages/tr_TR.json",
    "chars": 107,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Hakkında\",\n\t\t\"description\": \"Senin veya siten hakkında kısa bilgiler\"\n\t}\n}\n"
  },
  {
    "path": "bl-plugins/about/languages/uk_UA.json",
    "chars": 107,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Про блог\",\n\t\t\"description\": \"Невеликий опис вашого сайту або про Вас.\"\n\t}\n}"
  },
  {
    "path": "bl-plugins/about/metadata.json",
    "chars": 188,
    "preview": "{\n\t\"author\": \"Bludit\",\n\t\"email\": \"\",\n\t\"website\": \"https://plugins.bludit.com\",\n\t\"version\": \"3.21.0\",\n\t\"releaseDate\": \"20"
  },
  {
    "path": "bl-plugins/about/plugin.php",
    "chars": 1151,
    "preview": "<?php\n\nclass pluginAbout extends Plugin\n{\n\n\tpublic function init()\n\t{\n\t\t$this->dbFields = array(\n\t\t\t'label' => 'About',\n"
  },
  {
    "path": "bl-plugins/alternative/languages/de_AT.json",
    "chars": 611,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Theme Popeye\",\n\t\t\"description\": \"Das Plugin erlaubt verschiedene Einstellungen für das T"
  },
  {
    "path": "bl-plugins/alternative/languages/de_CH.json",
    "chars": 611,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Theme Popeye\",\n\t\t\"description\": \"Das Plugin erlaubt verschiedene Einstellungen für das T"
  },
  {
    "path": "bl-plugins/alternative/languages/de_DE.json",
    "chars": 611,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Theme Popeye\",\n\t\t\"description\": \"Das Plugin erlaubt verschiedene Einstellungen für das T"
  },
  {
    "path": "bl-plugins/alternative/languages/en.json",
    "chars": 547,
    "preview": "{\n  \"plugin-data\": {\n    \"name\": \"Alternative Theme\",\n    \"description\": \"This plugin provides configuration for the Alt"
  },
  {
    "path": "bl-plugins/alternative/languages/ja_JP.json",
    "chars": 421,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Popeye Theme\",\n\t\t\"description\": \"Popeyeテーマの設定を行うプラグインです。\"\n\t},\n\t\"enable-or-disable-dark-m"
  },
  {
    "path": "bl-plugins/alternative/languages/nl_NL.json",
    "chars": 554,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"Popeye Thema\",\n\t\t\"description\": \"Met deze plugin kan het thema Popeye geconfigureerd wor"
  },
  {
    "path": "bl-plugins/alternative/languages/ru.json",
    "chars": 603,
    "preview": "{\n  \"plugin-data\": {\n    \"name\": \"Настройки темы Alternative\",\n    \"description\": \"Этот плагин содержит настройки для те"
  },
  {
    "path": "bl-plugins/alternative/metadata.json",
    "chars": 206,
    "preview": "{\n\t\"author\": \"Bludit\",\n\t\"email\": \"\",\n\t\"website\": \"https://plugins.bludit.com\",\n\t\"version\": \"3.21.0\",\n\t\"releaseDate\": \"20"
  },
  {
    "path": "bl-plugins/alternative/plugin.php",
    "chars": 2538,
    "preview": "<?php\n\nclass alternative extends Plugin\n{\n\n\tpublic function init()\n\t{\n\t\t$this->dbFields = array(\n\t\t\t'googleFonts' => fal"
  },
  {
    "path": "bl-plugins/api/languages/da.json",
    "chars": 631,
    "preview": "{\n\t\"amount-of-pages\": \"Antal af sider\",\n\t\"api-token\": \"API-token\",\n\t\"plugin-data\": {\n\t\t\"description\": \"Grænseflade til i"
  },
  {
    "path": "bl-plugins/api/languages/de_CH.json",
    "chars": 632,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"API\",\n\t\t\"description\": \"Schnittstelle, für den Datenaustausch mit Bludit über das HTTP-P"
  },
  {
    "path": "bl-plugins/api/languages/de_DE.json",
    "chars": 632,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"API\",\n\t\t\"description\": \"Schnittstelle, für den Datenaustausch mit Bludit über das HTTP-P"
  },
  {
    "path": "bl-plugins/api/languages/en.json",
    "chars": 595,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"API\",\n\t\t\"description\": \"Interface to interact with Bludit using HTTP protocol. <br> Read"
  },
  {
    "path": "bl-plugins/api/languages/es.json",
    "chars": 607,
    "preview": "{\n\t\"plugin-data\":\n\t{\n\t\t\"name\": \"API\",\n\t\t\"description\": \"Interfaz para interactuar con Bludit mediante el protocolo HTTP."
  }
]

// ... and 472 more files (download for full content)

About this extraction

This page contains the full source code of the dignajar/bludit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 672 files (3.4 MB), approximately 934.6k tokens, and a symbol index with 1508 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!