Compare commits

...

175 commits

Author SHA1 Message Date
Marcel Kapfer 36bef95804
Updated README 2018-01-04 00:50:36 +01:00
Marcel Kapfer 49cc36a5c8
Added feature graphic. 2018-01-04 00:36:51 +01:00
Marcel Kapfer 776789da6c Merge branch 'stable' of gitlab.com:mmk2410/rangitaki 2017-05-20 21:03:30 +02:00
Marcel Kapfer 9665f098db README: add Gitter chatroom badge 2017-05-20 21:01:42 +02:00
Marcel Kapfer (mmk2410) b775ab99eb Added tests for BlogListGenerator 2016-12-30 00:05:40 +01:00
Marcel Kapfer (mmk2410) 00d3149360 Hide url blogs from selection field in the rcc 2016-12-30 00:05:01 +01:00
Marcel Kapfer (mmk2410) 623395064f composer update 2016-12-30 00:04:12 +01:00
Marcel Kapfer (mmk2410) 9ac51e0523 Improved testability of BlogListGenerator 2016-12-29 21:59:55 +01:00
Marcel Kapfer (mmk2410) 89e756819d Made BlogListGenerator PSR-2 conform 2016-12-29 21:54:37 +01:00
Marcel Kapfer (mmk2410) 0bb2dede4d Nav item with link to external page 2016-12-29 09:40:35 +01:00
Marcel Kapfer (mmk2410) 65263d4ca0 Added emacs files to gitignore 2016-12-29 09:39:59 +01:00
Marcel Kapfer (mmk2410) 161cfc3187 Merge branch 'release-1.5.0' into stable 2016-08-03 18:34:51 +02:00
Marcel Kapfer (mmk2410) 72bbd8d046 Version bump to 1.5.0 2016-08-03 18:32:40 +02:00
Marcel Kapfer (mmk2410) 92451f15ea Update Script for 1.5.0 2016-08-03 18:29:16 +02:00
Marcel Kapfer (mmk2410) c1a7ede3bc Better code style 2016-08-03 17:19:59 +02:00
Marcel Kapfer (mmk2410) 1aa4b42c0c Prevented a few error logs 2016-08-03 17:16:58 +02:00
Marcel Kapfer (mmk2410) 54132c7218 added excerpt feature to config script 2016-08-03 16:38:50 +02:00
Marcel Kapfer (mmk2410) b439cf27d7 removed nearly useless debug script 2016-08-03 16:33:01 +02:00
Marcel Kapfer (mmk2410) bbdacffc7d Excerpt feature. https://phab.mmk2410.org/T121
Res T121
2016-08-02 19:53:08 +02:00
Marcel Kapfer (mmk2410) 72e11c425e theme recompile 2016-08-02 19:50:54 +02:00
Marcel Kapfer 34e9dd31e4 Merge branch 'correct-meta-tags' into 'master'
correct meta tags

Correct https://gitlab.com/mmk2410/rangitaki/merge_requests/2 

See merge request !3
2016-07-17 09:58:13 +00:00
Stefan 4aeb468fe1 correct meta tags 2016-07-17 08:42:46 +02:00
Marcel Kapfer (mmk2410) e6245524a4 better code style for ArticleGenerator::getArray 2016-06-06 22:22:16 +02:00
Marcel Kapfer (mmk2410) 17e4e5570e "temporary" fix for ArticleGenerator::getSummary 2016-06-06 22:21:38 +02:00
Marcel Kapfer (mmk2410) ad2ff5236b unit test for ArticleGenerator 2016-06-06 22:19:49 +02:00
Marcel Kapfer (mmk2410) 67186f6910 Unit test for Config.php 2016-06-05 22:37:05 +02:00
Marcel Kapfer (mmk2410) 25f1ff3188 still trying to make gitlab ci work 2016-06-04 16:46:36 +02:00
Marcel Kapfer (mmk2410) 6b7bf70ec1 Fixed .gitlab-ci.yml 2016-06-04 10:13:01 +02:00
Marcel Kapfer (mmk2410) 8dc9b50d38 Fixed .gitlab-ci.yml 2016-06-04 10:10:50 +02:00
Marcel Kapfer (mmk2410) cc053c88a1 Fixed .gitlab-ci.yml 2016-06-04 10:07:35 +02:00
Marcel Kapfer (mmk2410) d01570a451 Fixed .gitlab-ci.yml 2016-06-04 10:06:15 +02:00
Marcel Kapfer (mmk2410) 92166b921e Add .gitlab-ci.yml 2016-06-04 10:00:38 +02:00
Marcel Kapfer (mmk2410) 03a24c883b tests 2016-06-04 09:59:11 +02:00
Marcel Kapfer (mmk2410) f938e60c2e Merge branch 'master' of gitlab.com:mmk2410/rangitaki 2016-06-04 09:46:34 +02:00
Marcel Kapfer (mmk2410) 7532af8a80 init script for debugging 2016-06-04 09:45:59 +02:00
Marcel Kapfer (mmk2410) c20c0b4ff9 Merge branch 'stable' of gitlab.com:mmk2410/rangitaki into stable 2016-06-03 16:46:31 +02:00
Marcel Kapfer (mmk2410) 1d79aa4c21 Merge branch 'release-1.4.4' into stable 2016-06-03 16:45:54 +02:00
Marcel Kapfer (mmk2410) 39f022d2dd Version bump to 1.4.4 2016-06-03 16:41:53 +02:00
Marcel Kapfer (mmk2410) e994eb074a Update Script for 1.4.4 2016-06-03 16:39:47 +02:00
Marcel Kapfer (mmk2410) f1cfc0c08c feed: Switched to new PicoFeed implementation 2016-06-03 15:31:37 +02:00
Marcel Kapfer (mmk2410) 6d1a7c7e09 feed: New dependencies, YAML config 2016-06-03 15:30:41 +02:00
Marcel Kapfer (mmk2410) 9fa47ecfd5 Updated copyright text 2016-06-03 15:28:02 +02:00
Marcel Kapfer (mmk2410) 0baffcc5cf Check first if value exists 2016-06-03 15:25:59 +02:00
Marcel Kapfer (mmk2410) 352095a6d2 Fixed .gitignore to prevent hiding the rcc/feed directory.
Ref T118
2016-06-03 15:20:09 +02:00
Marcel Kapfer (mmk2410) 6c9aa05cbb Merge branch 'release-1.4.3' into stable 2016-05-21 21:22:49 +02:00
Marcel Kapfer (mmk2410) 7210e8e1e1 Version bump to 1.4.3 2016-05-21 21:20:47 +02:00
Marcel Kapfer (mmk2410) 8eab76ed20 Update script for version 1.4.3: fixes 2016-05-21 21:20:00 +02:00
Marcel Kapfer (mmk2410) 780db2ae07 Update script for version 1.4.3 2016-05-21 21:06:13 +02:00
Marcel Kapfer (mmk2410) 0c080a2237 Updated texts 2016-05-21 19:57:36 +02:00
Marcel Kapfer (mmk2410) fcb64f23eb nextDESIGN added to delivered themes 2016-05-21 19:51:56 +02:00
Marcel Kapfer (mmk2410) f497b7b87b [FIX] Background layer not removed if drawer closes 2016-05-21 19:49:33 +02:00
Marcel Kapfer (mmk2410) bdc617ffef [FIX] Missing space in drawer between "Blogs on" and blogname. 2016-05-21 19:46:33 +02:00
Marcel Kapfer (mmk2410) e05dc0b173 Merge branch 'release-1.4.2' into stable 2016-05-18 14:52:30 +02:00
Marcel Kapfer (mmk2410) a6019319a2 Version bump 1.4.2 2016-05-18 14:51:13 +02:00
Marcel Kapfer (mmk2410) 71f67d506e Update Script for 1.4.2 2016-05-18 14:47:51 +02:00
Marcel Kapfer (mmk2410) b67c9b3415 FIX: Password verification not implemented in RCC login page 2016-05-18 14:46:10 +02:00
Marcel Kapfer (mmk2410) e059544e90 Merge branch 'release-1.4.1' into stable 2016-05-18 13:37:42 +02:00
Marcel Kapfer (mmk2410) 3a8494417e Version bump to 1.4.1 2016-05-18 13:33:28 +02:00
Marcel Kapfer (mmk2410) d33ff8f984 Update script for 1.4.1 2016-05-18 13:32:44 +02:00
Marcel Kapfer (mmk2410) 007aea9b10 FIX: Missing nodejs dependencies 2016-05-18 07:39:41 +02:00
Marcel Kapfer (mmk2410) 52835db8db FIX: Go Back didn't work 2016-05-18 07:38:40 +02:00
Marcel Kapfer (mmk2410) fb937319db Store password as hash
Resolves T117
2016-05-17 22:37:36 +02:00
Marcel Kapfer (mmk2410) 5e45579ef1 Switch to HTTP Basic Auth
Resolves T115
2016-05-17 22:36:26 +02:00
Marcel Kapfer (mmk2410) 42f1992c97 Require SSL for the RCC.
Resolves T116
2016-05-17 22:34:33 +02:00
Marcel Kapfer (mmk2410) 655b982f9d FIX: Missing nodejs dependencies 2016-05-17 20:59:54 +02:00
Marcel Kapfer (mmk2410) 1b0c92bb31 FIX: Disqus not migrated to new config 2016-05-17 20:58:50 +02:00
Marcel Kapfer (mmk2410) e2d8082c1f Merge branch 'release-1.4.0' into stable 2016-05-07 17:43:03 +02:00
Marcel Kapfer (mmk2410) 23617b21bc Version bump to 1.4.0 2016-05-07 17:41:31 +02:00
Marcel Kapfer (mmk2410) 41c273b962 update script for 1.4.0 2016-05-07 17:32:30 +02:00
Marcel Kapfer (mmk2410) 60b094d5fa add composer's vendor directory 2016-05-07 12:59:40 +02:00
Marcel Kapfer (mmk2410) 01a3860d73 Merged CHANGELOG.txt and CHANGELOG.md 2016-05-03 17:35:42 +02:00
Marcel Kapfer (mmk2410) 999998b60b Version Bump to 1.4.0-beta 2016-04-27 12:54:04 +02:00
Marcel Kapfer (mmk2410) 474efd25f3 npm, Gulp, Minimize
Resolves T30, T29
2016-04-26 20:24:17 +02:00
Marcel Kapfer (mmk2410) bc694dc6a0 CSS themes converted in SASS
Ref T30
2016-04-26 19:35:46 +02:00
Marcel Kapfer (mmk2410) 8330a1ce98 CSS rewritten in SASS
Ref T30
2016-04-26 19:09:39 +02:00
Marcel Kapfer (mmk2410) e10db31a00 Example JavaScript extension rewritten in CoffeeScript
Ref T30
2016-04-26 17:57:39 +02:00
Marcel Kapfer (mmk2410) d50341259d Rewritten app.js in CoffeeScript
Ref T30
2016-04-25 20:33:00 +02:00
Marcel Kapfer (mmk2410) 432b8d307a Open article link in a new tab
Fixes T34
2016-04-25 18:47:02 +02:00
Marcel Kapfer (mmk2410) 5d051c1b0e init script 2016-04-23 15:27:11 +02:00
Marcel Kapfer (mmk2410) 319d3d6138 Pagination fix 2016-04-23 15:26:35 +02:00
Marcel Kapfer (mmk2410) 297cf418c0 Better code style 2016-04-22 19:46:46 +02:00
Marcel Kapfer (mmk2410) ac65f5ee70 Config switch to YAML 2016-04-22 19:28:27 +02:00
Marcel Kapfer (mmk2410) edca0cc8cc removed obsolete config.php 2016-04-22 18:50:07 +02:00
Marcel Kapfer (mmk2410) 9773669684 Config switch script 2016-04-22 18:49:14 +02:00
Marcel Kapfer (mmk2410) f632bf2de5 Remove Debug Outputs 2016-04-22 18:20:40 +02:00
Marcel Kapfer (mmk2410) e0dc2622c2 API auth 2016-04-22 18:18:21 +02:00
Marcel Kapfer (mmk2410) 39da838ebd RCC init script 2016-04-21 09:56:53 +02:00
Marcel Kapfer (mmk2410) d82f8e8011 Config class: write yaml file 2016-04-21 09:46:45 +02:00
Marcel Kapfer (mmk2410) 4e91eeb3ab API: Auth implementation 2016-04-18 17:30:12 +02:00
Marcel Kapfer (mmk2410) 01a6fb914f API: Media files 2016-04-18 11:04:41 +02:00
Marcel Kapfer (mmk2410) 339e2eee36 Composer: codeguy/Upload 2016-04-18 11:04:26 +02:00
Marcel Kapfer (mmk2410) 2c4ce6cb50 API: List 2016-04-18 09:57:11 +02:00
Marcel Kapfer (mmk2410) 9947a5f033 Cleanup 2016-04-18 09:56:52 +02:00
Marcel Kapfer (mmk2410) cb491341df Better code with isset() 2016-04-18 09:53:47 +02:00
Marcel Kapfer (mmk2410) 6d1928da70 YAML Config Implement and post api 2016-04-17 17:00:18 +02:00
Marcel Kapfer (mmk2410) 331465857c README.md update 2016-04-17 10:45:57 +02:00
mmk2410 e9c09311fe Fix: Feeds didn't show article content 2016-03-12 10:28:46 +01:00
mmk2410 681f4c3c83 Fix; Problem inserting password after instering wrong password 2016-03-11 18:58:26 +01:00
mmk2410 75b705ee2c Code Improvements 2016-03-11 18:54:58 +01:00
mmk2410 08ee5eaf39 Update script fix 2016-02-16 17:21:41 +01:00
Marcel Kapfer (mmk2410) 078237c7ec Update Readme
Update readme for Rangitaki version 1.3.
2016-02-16 15:11:25 +01:00
mmk2410 05d583f17f Changelog 2016-02-16 14:54:07 +01:00
mmk2410 fda6e3d811 Switch to Composer 2016-02-16 14:19:57 +01:00
mmk2410 ce709fec80 Atom feed 2016-02-16 14:19:17 +01:00
mmk2410 5d041ff6f8 Do-not-track 2016-02-16 14:16:20 +01:00
mmk2410 bd28332252 Update Script for 1.3.0 2016-02-16 14:15:56 +01:00
mmk2410 c9279b8f1d File imporvements 2016-02-16 14:15:21 +01:00
mmk2410 da3916bb99 README update 2016-01-11 19:41:54 +01:00
mmk2410 ee86c8cdd5 Update Script 1.2.0 to 1.2.1 2016-01-11 19:39:58 +01:00
mmk2410 c68179d83e Updated Parsedown -> Support for PHP 7.0 2016-01-11 19:24:51 +01:00
Marcel Kapfer (mmk2410) 1a08ae769b Updated README.md 2015-12-24 17:29:56 +01:00
Marcel Kapfer (mmk2410) 95a28acb6a Update scripts 2015-12-24 17:27:24 +01:00
Marcel Kapfer (mmk2410) b2d723cb62 No error if no extensions dir 2015-12-24 12:13:33 +01:00
mmk2410 dc515eab7a Update script 1.1.2 to 1.1.90 2015-12-21 19:48:27 +01:00
mmk2410 0a9f5a9f30 Merge branch 'master' of github.com:mmk2410/rangitaki 2015-12-21 15:57:22 +01:00
mmk2410 2586db7a6f Localization of Pagination 2015-12-21 15:56:18 +01:00
mmk2410 23f9765b3a BUGFIX: Error when no tags set 2015-12-21 15:53:10 +01:00
mmk2410 a1d9e971e3 BUGFIX: Update Script 2015-12-21 15:52:16 +01:00
Marcel Kapfer (mmk2410) bc626fa918 Update README 2015-12-20 21:37:12 +01:00
mmk2410 a9a9886450 Update script improvements 2015-12-20 21:22:01 +01:00
mmk2410 6271448248 Update script for 1.1.2 2015-12-20 21:11:50 +01:00
mmk2410 2fdfa5e232 Default settings restored 2015-12-20 19:19:41 +01:00
mmk2410 7eb917f115 Pagination and Code Style improovements 2015-12-20 17:50:22 +01:00
mmk2410 a880398ee3 Better Code Style 2015-12-18 21:59:34 +01:00
mmk2410 b3802a8994 rangitaki in lowercase 2015-12-07 15:56:55 +01:00
mmk2410 d8461432be Update Script for 1.1.1 2015-12-07 15:02:26 +01:00
mmk2410 6e6e26ad26 Delete Posts
Edit Posts
Back to blog
2015-12-06 15:19:16 +01:00
mmk2410 fbca74ccec Back to blog from RCC 2015-12-05 18:30:51 +01:00
mmk2410 fe2e50b3b6 JavaScript extension support 2015-12-05 18:21:22 +01:00
mmk2410 ac67c0fae1 Code CSS before Theme style sheet 2015-12-05 18:08:24 +01:00
mmk2410 7ebcd0aca1 BUGFIX: RCC: New Post: Filename without time 2015-11-23 15:51:24 +01:00
mmk2410 4be3b056c3 BUGFIX: RCC: new post: title is blog name 2015-11-22 19:37:18 +01:00
mmk2410 9343b9a115 update script 2015-11-22 18:31:14 +01:00
mmk2410 fe81cb784e Update script 2015-11-22 18:19:22 +01:00
mmk2410 c242062cd9 Various Improvements:
- Metatags based on subblog and/or article
 - Drawer close button
 - RCC: media upload
 - RCC subpages: back button
2015-11-22 00:59:07 +01:00
mmk2410 c910225e7d Navigation drawer key handling
Drawer opens on 'm' and closes on 'Esc'
2015-11-18 15:48:44 +01:00
mmk2410 352182ae10 Nav: Blogs highlighted when hovering 2015-11-18 15:18:18 +01:00
mmk2410 c3c863b446 BUGFIX: Drawer not completly closed 2015-11-18 15:01:39 +01:00
mmk2410 e8a2557c4a RCC: Write blog posts online 2015-11-17 22:46:20 +01:00
Marcel Kapfer 5568943994 Update README.md 2015-08-22 10:48:39 +02:00
mmk2410 30f64e386d Updated README.md 2015-08-22 10:29:05 +02:00
mmk2410 f40a680877 Updated README.md 2015-08-22 10:27:51 +02:00
mmk2410 c703df1deb Switch to files named "example.*" 2015-08-22 09:14:55 +02:00
mmk2410 f58b17f585 UXFIX: Headline now colored on mouseover 2015-08-22 09:11:50 +02:00
mmk2410 1922a1a697 BUGFIX: Intro shown, when there's no content 2015-08-22 08:59:50 +02:00
Marcel Kapfer 4b52d81282 Update README.md 2015-08-13 23:26:47 +02:00
mmk2410 9973ea84e4 Version 0.9: Code comments, bug fixes, three new test files 2015-07-25 09:34:51 +02:00
mmk2410 42404cd9d7 Rangitaki 0.8 2015-07-14 22:16:17 +02:00
mmk2410 34a8798b95 Rangitaki 0.8 2015-07-14 22:10:16 +02:00
mmk2410 f996fbc1db Updated README 2015-07-05 19:15:58 +02:00
mmk2410 f25ccc1696 Semicolon fix... 2015-07-05 18:18:24 +02:00
mmk2410 85f2197b91 Localization; Add German 2015-07-05 18:05:56 +02:00
mmk2410 b6e719b6c6 Twitter and OpenGraph meta tags; favicon 2015-07-05 18:02:19 +02:00
mmk2410 accc37e5be Better handling of a long title; option to disable the share FAB; --> Version 0.6 2015-07-03 14:37:32 +02:00
mmk2410 aa1bc50648 Support for localization 2015-07-03 11:19:40 +02:00
mmk2410 51cd71846b Blogtitle in Header 2015-07-03 10:59:54 +02:00
mmk2410 cdfccd1754 Better HTTPS support and FAB image fixes 2015-07-03 10:31:04 +02:00
mmk2410 8fe84b6ef7 Set a specific name for the main blog 2015-07-03 10:21:20 +02:00
mmk2410 a1cf5b45be Better support for blogs without a drawer 2015-07-03 09:58:54 +02:00
mmk2410 bdfd878b58 Theme support, clean up, code formating and improvement 2015-06-18 20:45:49 +02:00
mmk2410 17b76633c0 responsiv images 2015-06-16 18:41:54 +02:00
mmk2410 4d6a7dc1e4 Rangitaki Control Center (rcc) improvments; Complete material design 2015-06-16 16:16:51 +02:00
mmk2410 9d9b9ca962 Complete material design for the blog for all screen sizes (responsive). Mobile-first 2015-06-15 17:58:15 +02:00
mmk2410 96cc249f9d Material design for blog on large screens 2015-06-15 11:27:57 +02:00
mmk2410 83b4d26752 Optional online post upload 2015-06-14 11:57:25 +02:00
mmk2410 0ae529b163 Tags 2015-06-12 10:31:28 +02:00
mmk2410 ac16378dd8 Multiple Blogs, Author 2015-06-11 17:32:58 +02:00
mmk2410 6d97a486d5 Miscellaneous improvemnts, Code highlightinn => Version 0.3 2015-06-11 11:39:54 +02:00
mmk2410 72e7f24db0 Updated README 2015-06-10 18:49:02 +02:00
mmk2410 39e843241b Disqus and Google Analytics added. Cleanup 2015-06-10 18:41:51 +02:00
mmk2410 7ba332052e The core is now rewritten and working 2015-06-10 12:45:02 +02:00
Marcel Kapfer 9054fc3598 Updated Readme
Yes, again. I hope, that I did everything right this time... :D
2015-05-11 20:34:50 +02:00
Marcel Kapfer ed98c8d9e8 Update 2015-05-10 00:07:25 +02:00
Marcel Kapfer b4673f7654 Update README.md 2015-05-10 00:06:04 +02:00
mmk2410 ee98323339 pBlog Future 2015-03-29 21:37:33 +02:00
771 changed files with 50385 additions and 1380 deletions

2
.gitignore vendored
View file

@ -1 +1 @@
nbproject/
*~

11
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,11 @@
image: php:7.0
before_script:
- bash ci/docker_install.sh > /dev/null
stages:
- test
test:
script:
- phpunit tests/

191
CHANGELOG.md Normal file
View file

@ -0,0 +1,191 @@
# Changelog
- [S] = stable release
- [B] = beta release
- [D] = development release
- [S] release are always compared to the previous [S] release.
## Version 1.5.0 (2016-08-03) [S]
- **[FEATURE]** Ability to only show post excerpts on overview pages
- **[FIX]** Fixed twitter username not specified in connfig.yaml
- **[FIX]** Fixed wrong OpenGraph meta tags
- **[CODE]** Further improved code style
- **[CODE]** Added unit tests for Config.php and ArticleGenerator.php
- **[NOTE]** If you have own language file, please update them. See also the upgrade guide
## Version 1.4.4 (2016-06-03) [S]
- **[FIX]** Error when trying to create a feed
## Version 1.4.3 (2016-05-21) [S]
- **[FIX]** Missing space in drawer between "Blogs on" and blogname
- **[FIX]** Background layer was not removed if drawer was closed
- **[FEATURE]** nextDESIGN theme added to delivered themes
- **[NOTE]** The update script to 1.4.3 works with 1.4.0, 1.4.1 and 1.4.2
## Version 1.4.2 (2016-05-18) [S]
- [FIX]: Password verification not implemented in RCC login page
## Version 1.4.1 (2016-05-18) [S]
- Switch to HTTP Basic Auth for the RCC API
- Store password as hash
- Require SSL for using the RCC and the RCC API
- [FIX] Drawer "Go back" does not work
- [FIX] Missing nodejs dependencies
- [FIX] Disqus not completly migrated to new config
## Version 1.4.0 (2016-05-07) [S]
- Fix: Feeds contain no text
- Switch to YAML as config language
- Scripts for
- Switching from config.php to config.yaml
- Initializing RCC
- Initializing Rangitaki
- Rangitaki API
- Switch from JavaScript to CoffeeScript
- Switch from CSS to SASS
- Building and minimizing with Gulp
- Open links in articles in a new tab
- Better code style: PSR-2
## Version 1.4.0-beta (2016-04-27) [B]
- Fix: Feeds contain no text
- Switch to YAML as config language
- Scripts for
- Switching from config.php to config.yaml
- Initializing RCC
- Initializing Rangitaki
- Rangitaki API
- Switch from JavaScript to CoffeeScript
- Switch from CSS to SASS
- Building and minimizing with Gulp
- Open links in articles in a new tab
- Better code style: PSR-2
## Version 1.3.0 (2016-02-16) [S]
- Respecting do-not-track
- Atom feed
- Title fix
- Switch to composer
## Version 1.2.1 (2016-01-11) [S]
- Support for PHP 7
## Version 1.2.0 (2015-12-24) [S]
- Pagination: Split your blog posts over several page
- JavaScript Extension Support
- RCC: Write Posts
- RCC: Delete Posts
- RCC: Upload Media
- RCC: Edit Posts
## Version 1.1.90 (2015-12-21) [B]
- BUGFIX: ArticleGenerator error when no tags set
- Pagination: Localized strings
## Version 1.1.2 (2015-12-20) [D]
- Pagination
- Code style imporvements
## Version 1.1.1 (2015-12-07) [D]
- BUGFIX: RCC: new post: post title was the blog title
- BUGFIX: RCC: new post filename just the date without the time.
- Code highlight css themable
- JavaScript extension support. Just put your extension into ./extensions/
- Link in RCC to go directly to the blog
- RCC: Delete posts
- RCC: Edit posts
## Version 1.1.0 (2015-11-22) [D]
- RCC: Write blog posts
- RCC: Media Upload
- Drawer: Key listener ('ESC' to close, 'm; to open)
- Drawer: Highlight Blogs when hovering
- Drawer: 'X' button
- Metatags / Title based on subblog and / or article
- Update script
## Version 1.0.0 (2015-08-22) [S]
- Post writing in Markdown with a few keywords for the title, tags, date and the author (all optional)
- Multiple blogs
- A Subpages for each article with a comment box (Disqus; can be disabled)
- Share buttons (FAB; can be disabled)
- Disqus integration (can be disabled)
- Fast and easy configuration
- Google Analytics (optional)
- Twitter and OpenGraph meta tags
- Different themes
- Easy localization (just 3 (!) strings)
- Custom footer
- Navigation drawer (can be disabled)
- Tags
- Set author and date
- Mobile-first
- Rangitaki Control Center (aka RCC; optional, Read the RCC Documentation)
- Online post upload
## Version 0.9.0 (2015-07-25) [B]
- BUGFIX: 'Blogs of {BLOG NAME}' always shown (even if there are no other blogs)
- pictures in articles not centred
- long links longer than article card (especially a problem on mobile devices)
- Localization strings are now grouped in one array
- Better code (in some parts)
## Version 0.8.0 (2015-07-14) [B]
- Bugfixes and other improvements
## Version 0.7.0 (2015-07-05) [D]
## Version 0.6.0 (2015-07-03) [D]
- Localization support. More information will follow soon
- Theme support. More information will follow (hopefully) soon
- Various improvements (Check the commits for more)
## Version 0.5.0 (2015-06-16) [D]
- Improvements to the Rangitaki Control Center (rcc)
- Material Design (Blog and rcc)
## Version 0.4 (2015-06-14) [D]
- Multiple Blogs
- Online post upload (optional)
- Tags
- Author
## Version 0.3 (2015-06-11) [D]
- Portation of all main features of Version 0.2.2
- Code highlighting
*The first release with the name Rangitaki.
The following releases are of pBlog.*
## Version 0.2.2 (2015-05-13) [S]
- Links are now underlined, when you hover over them
- Simplified it to add the disqus comments
- Added and configuration option for setting a favicon
- Added the option to use Google Analytics
## Version 0.2.1 / pBlog 2.1 (2015-03-29) [S]
- Fix problems when creating article links
TODO: previous releases

View file

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2015 Marcel Kapfer
Copyright (c) 2015 - 2016 Marcel Kapfer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

107
README.md
View file

@ -1,30 +1,91 @@
# pBlog
This is a small php blog engine with **markdown support**
# Rangitaki PHP blogging engine
At the moment it doesn't contain much features, but more will follow.
[![Join the chat at https://gitter.im/rangitaki/rangitaki](https://badges.gitter.im/canax/view.svg)](https://gitter.im/rangitaki/view?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
## Goal
The goal is to create a simple blog engine. The blog posts should be written using (a) xml file(s) and the page should be prepared with a javascript program.
Rangitaki is a simple to use and easy to configure blogging engine, written in PHP and it has absolutely no database dependencies.
## Features
- Post writing in XML and Markdown
- Markdown support
- Code support
- German umlaut's support
- Intro page (Markdown)
## Planned Features
- special url actions (blog.html?xyz , blog.html#xyz)
- publishing on a set time
Tested with PHP version 5.5 until 7.0.
![Rangitaki](https://gitlab.com/mmk2410/rangitaki/raw/master/feature-graphic.png)
[Wiki](https://gitlab.com/mmk2410/rangitaki/wikis/home)
[About](https://gitlab.com/mmk2410/rangitaki/wikis/about)
[Documentation](https://gitlab.com/mmk2410/rangitaki/wikis/docs)
[Quick Starting Guide](https://gitlab.com/mmk2410/rangitaki/wikis/docs/quickstart)
## What is it?
My goal for Rangitaki was (and still is) to create a blogging engine without database dependencies (so you don't have to create database and tables and all that stuff) which is extremely easy and fast to setup and to learn. Rangitaki doesn't require any knowledge concerning PHP, JavaScript, HTML or CSS. You just need to know, how to upload something to your web server. There is also no need to compile anything, you just have to fill out twelve setting properties and then you can start writing your articles.
## So, what can it do?
- Post writing in Markdown with a few keywords for the title, tags, date and the author (all optional)
- Multiple blogs
- A Subpages for each article with a comment box (Disqus; can be disabled)
- Share buttons (FAB; can be disabled)
- Disqus integration (can be disabled)
- Fast and easy configuration
- Google Analytics (optional)
- Twitter and OpenGraph meta tags
- Different themes
- Easy localization (just a few strings)
- Custom footer
- Navigation drawer (can be disabled)
- Tags
- Set author and date
- Mobile-first
- JavaScript Extension Support
- Pagination support
- Atom feed generation
- Rangitaki Control Center (RCC; optional, read the [RCC Documentation](https://gitlab.com/mmk2410/rangitaki/wikis/docs/rcc)
- Have a look under 'What is that RCC?' in this readme
## Example
You can find a example blog under [marcel-kapfer.de/pBlog](http://marcel-kapfer.de/pBlog)
## Did you say 'themes'?
Yes. Rangitaki has a theme support which makes it easy to customize your blog concerning design.
[Read the theme guide](https://gitlab.com/mmk2410/rangitaki/wikis/docs/themes)
## What is that RCC?
**This is disabled by default. Do not enable it without carefully reading the RCC documentation.**
It has the following features:
- Post upload
- Post deleting
- Post editing
- Media upload
- Atom feed generation
[Read the RCC documentation](https://gitlab.com/mmk2410/rangitaki/wikis/docs/rcc)
## Used Libraries
- [Parsedown](http://parsedown.org)
## More information
- [Trello Board](https://trello.com/b/7qb5I6EQ/blog-engine)
- [Google+ Profile from Marcel Michael Kapfer](plus.google.com/+MarcelMichaelKapfer)
- [Twitter Profile from Marcel Michael Kapfer](twitter.com/MarcelKapfer)
- For converting the Markdown blog articles into HTML code Rangitaki uses [Parsedown](http://parsedown.org).
- For creating the atom feeds Rangitaki uses [picoFeed](https://github.com/fguillot/picoFeed)
## Contributing
## Issues, Requests, etc.
For bug reports, feature requests and all other questions or recommendations feel free to create an issue here at [GitLab](https://gitlab.com/mmk2410/rangitaki/issues).
## Code
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new merge request
Read also the [contributing documentation](https://gitlab.com/mmk2410/rangitaki/wikis/docs/contribute)
## Social
You can follow me on Twitter or subscribe my blog to receive news about Rangitaki.
- [Twitter @mmk2410](https://twitter.com/mmk2410)
- [Blog mmk2410.org](https://mmk2410.org/), you can view the current posts about Rangitaki on [this page](https://mmk2410.org/tag/rangitaki/).

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 1
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 2
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 3
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 4
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 5
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 1
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 2
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 3
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 4
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

View file

@ -0,0 +1,9 @@
%TITLE: The Rangitaki logo 5
%DATE: 24 July 2015
%TAGS: design, artwork, logo
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.

67
bin/config.php Normal file
View file

@ -0,0 +1,67 @@
<?php
// Marcel Kapfer (mmk2410)
// Script for moving from config.php to config.yaml
// License: MIT
require 'res/php/Config.php';
require 'config.php';
use mmk2410\rbe\config\Config as Config;
if ($bloghome == "yes") {
$bloghome = "on";
}
if ($blogintro == "yes") {
$blogintro = "on";
}
if ($sharefab == "yes") {
$sharefab = "on";
}
if ($rcc == "yes") {
$rcc = "on";
}
if ($nav_drawer == "yes") {
$nav_drawer = "on";
}
$yaml = array(
"blog" => array(
"title" => $blogtitle,
"author" => $blogauthor,
"description" => $blogdescription,
"home" => $bloghome,
"homeurl" => $bloghomeurl,
"homename" => $bloghomename,
"mainname" => $blogmainname,
"intro" => $blogintro,
"disqus" => $blogdisqus,
"analytics" => $bloganalytics,
"footer" => $blogfooter,
"url" => $blogurl
),
"design" => array(
"fab" => $sharefab,
"drawer" => $nav_drawer,
"theme" => $theme,
"pagination" => $pagination,
"favicon" => $favicon,
),
"rcc" => array(
"rcc" => "off",
"api" => "off",
),
"language" => $language,
);
$config = new Config('config.yaml', 'vendor/autoload.php');
if ($config->writeConfig($yaml)) {
echo "YAML config saved.\nYou can delete the config.php file\n";
} else {
echo "Failed to save YAML config.";
}

112
bin/init.php Normal file
View file

@ -0,0 +1,112 @@
<?php
// Marcel Kapfer (mmk2410)
// PHP script for initializing Rangitaki
// MIT License
error_reporting(0);
require 'res/php/Config.php';
use mmk2410\rbe\config\Config as Config;
$config = new Config('config.yaml', 'vendor/autoload.php');
if (!file_exists('config.yaml')) {
$yaml = array();
} else {
$yaml = $config->getConfig();
}
// blog part
$yaml["blog"]["title"] = get("Title of your blog", $yaml["blog"]["title"], "Example Blog");
$yaml["blog"]["author"] = get("Your name:", $yaml["blog"]["author"], "John");
$yaml["blog"]["description"] = get("A description of your blog:", $yaml["blog"]["description"], "A short description of your blog");
$yaml["blog"]["home"] = getBool("Do you have a top site? (on/off)", $yaml["blog"]["home"], "on");
if ($yaml["blog"]["home"] == "on") {
$yaml["blog"]["homeurl"] = get("Path / Url to home page", $yaml["blog"]["homeurl"], "../");
$yaml["blog"]["homename"] = get("Name of your home page", $yaml["blog"]["homename"], "Home");
}
$yaml["blog"]["mainname"] = get("Name of the main blog (if empty, the blog title will be used)", "");
$yaml["blog"]["intro"] = getBool("Do you want a blog intro text? (on/off)", $yaml["blog"]["intro"], "on");
$yaml["blog"]["disqus"] = get("Your Disqus shortname (Leave empty to disable)", $yaml["blog"]["disqus"], "");
$yaml["blog"]["analytics"] = get("Google Analytics ID (Leave empty to disable)", $yaml["blog"]["analytics"], "");
$yaml["blog"]["footer"] = get("The footer of your blog", $yaml["blog"]["footer"], "Example Blog 2016 CC-BY-SA 4.0");
// design part
$yaml["design"]["fab"] = getBool("Would you like to use the share buttons (on/off)", $yaml["design"]["blog"], "on");
$yaml["design"]["drawer"] = getBool("Would you like the use the navigation drawer? (on/off)", $yaml["design"]["drawer"], "on");
$themes = getDir('./themes');
$yaml["design"]["theme"] = get("Which theme would you like to use? (" . $themes . ")", $yaml["design"]["theme"], "material-light");
$yaml["design"]["pagination"] =
get("Which posts should be displayed on one page (0 to disable)", $yaml["design"]["pagination"], "0");
$yaml["design"]["excerpt"] =
getBool("Should be overview pages only show a excerpt of the full posts? (on/off)", $yaml["design"]["excerpt"], "off");
$yaml["design"]["favicon"] = get("URL to your favicon", $yaml["design"]["favicon"], "https://example.com/fav.ico");
// rcc
$yaml["rcc"]["rcc"] = "off";
$yaml["rcc"]["api"] = "off";
// languages
$langs = getDir('./lang');
$yaml["language"] = get("Choose a language (" . $langs . ")", $yaml["language"], "en");
// social media
$yaml["social"]["twitter"] = get("Your Twitter username:", $yaml["social"]["twitter"], "");
$config->writeConfig($yaml);
function get($question, $value, $default)
{
if (isset($value) && $value != "") {
$input = readline($question . " (" . $value . "): ");
if ($input == "") {
return $value;
} else {
return $input;
}
} else {
$input = readline($question . " (" . $default . ")" . ": ");
if ($input == "") {
return $default;
} else {
return $input;
}
}
}
function getBool($question, $value, $default)
{
if (isset($value) && $value != "") {
$input = "someval";
while (!in_array($input, array("on", "off", ""))) {
$input = readline($question . " (" . $value . "): ");
}
if ($input == "") {
return $value;
} else {
return $input;
}
} else {
$input = "";
while (!in_array($input, array("on", "off"))) {
$input = readline($question . " (" . $default . ")" . ": ");
}
if ($input == "") {
return $default;
} else {
return $input;
}
}
}
function getDir($path)
{
$dir = scandir($path, SCANDIR_SORT_DESCENDING);
unset($dir[sizeof($dir) - 1]);
unset($dir[sizeof($dir) - 1]);
return implode(", ", $dir);
}

76
bin/init_rcc.php Normal file
View file

@ -0,0 +1,76 @@
<?php
// Marcel Kapfer (mmk2410)
// PHP script for initializing the RCC
// License: MIT
require 'res/php/Config.php';
use mmk2410\rbe\config\Config as Config;
echo 'RCC Initializion Script' . "\n";
$username = readline("Username: ");
if ($username == "") {
echo "No username given. Aborting...\n";
exit();
}
echo 'Password: ';
$password = readline("Password: ");
if ($password == "") {
echo "No password given. Aborting...\n";
exit();
}
$options = [
'cost' => 12
];
$password = password_hash($password, PASSWORD_BCRYPT, $options);
$username = '$username = "' . $username . '";';
$password = '$password = \'' . $password . '\';';
$file = '<?php' . "\n" . $username . "\n" . $password . "\n";
if (file_put_contents('./rcc/password.php', $file)) {
chmod('./rcc/password.php', 0640);
echo "\nPassword successfully saved.\n";
}
$config = new Config('config.yaml', 'vendor/autoload.php');
$yaml = $config->getConfig();
$rccOn = "";
while (!(in_array($rccOn, array("y", "Y", "n", "N")))) {
$rccOn = readline("Enable RCC: (y/n) ");
}
if (in_array($rccOn, array("y", "Y"))) {
$yaml["rcc"]["rcc"] = "on";
} else {
$yaml["rcc"]["rcc"] = "off";
}
$apiOn = "";
while (!(in_array($apiOn, array("Y", "y", "n", "N")))) {
$apiOn = readline("Enable RCC API: (y/n) ");
}
if (in_array($apiOn, array("y", "Y"))) {
$yaml["rcc"]["api"] = "on";
} else {
$yaml["rcc"]["api"] = "off";
}
$config = new Config('config.yaml', 'vendor/autoload.php');
if ($config->writeConfig($yaml)) {
echo "Changes saved.\n";
} else {
echo "Failed to save changes.\n";
}

1
blogs/example.md Normal file
View file

@ -0,0 +1 @@
%TITLE: Example

2
blogs/external.md Normal file
View file

@ -0,0 +1,2 @@
%TITLE: Docs
%URL: https://mmk2410.org/rangitaki/docs/

9
blogs/main.md Normal file
View file

@ -0,0 +1,9 @@
%TITLE: main
This is the Blog of the Blog Engine **Rangitaki**
Rangitaki is based on PHP and Markdown. It is easy to install and to configure.
The latest version of Rangitaki is 1.4.3.
You can find the source code on [GitLab](https://gitlab.com/mmk2410/rangitaki).

15
ci/docker_install.sh Normal file
View file

@ -0,0 +1,15 @@
#!/bin/bash
# Only install dependencies for Docker
[[ ! -e /.dockerenv ]] && [[ ! -e /.dockerinit ]] && exit 0
set -xe
# Install git
apt-get update -yqq
apt-get install git -yqq
# Install phpunit
curl -o /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
chmod +x /usr/local/bin/phpunit

20
composer.json Normal file
View file

@ -0,0 +1,20 @@
{
"name": "mmk2410/rangitaki",
"description": "A simple PHP blogging engine without any database requirements",
"type": "project",
"require": {
"erusev/parsedown": "^1.6",
"fguillot/picofeed": "^0.1.18",
"slim/slim": "^3.0",
"symfony/yaml": "^3.0",
"codeguy/upload": "^1.3"
},
"license": "MIT License",
"authors": [
{
"name": "Marcel Kapfer (mmk2410)",
"email": "marcelmichaelkapfer@yahoo.co.nz"
}
],
"minimum-stability": "stable"
}

496
composer.lock generated Normal file
View file

@ -0,0 +1,496 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "ccdcfdb56ed68253e2388261fbb6d1b3",
"packages": [
{
"name": "codeguy/upload",
"version": "1.3.2",
"source": {
"type": "git",
"url": "https://github.com/codeguy/Upload.git",
"reference": "6a9e5e1fb58d65346d0e557db2d46fb25efd3e37"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/codeguy/Upload/zipball/6a9e5e1fb58d65346d0e557db2d46fb25efd3e37",
"reference": "6a9e5e1fb58d65346d0e557db2d46fb25efd3e37",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "3.7.*"
},
"type": "library",
"autoload": {
"psr-0": {
"Upload": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Josh Lockhart",
"email": "info@joshlockhart.com",
"homepage": "http://www.joshlockhart.com/"
}
],
"description": "Handle file uploads with extensible validation and storage strategies",
"homepage": "http://github.com/codeguy/Upload",
"keywords": [
"file",
"upload",
"validation"
],
"time": "2013-07-07T17:01:41+00:00"
},
{
"name": "container-interop/container-interop",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/container-interop/container-interop.git",
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
"shasum": ""
},
"type": "library",
"autoload": {
"psr-4": {
"Interop\\Container\\": "src/Interop/Container/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
"time": "2014-12-30T15:22:37+00:00"
},
{
"name": "erusev/parsedown",
"version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/erusev/parsedown.git",
"reference": "20ff8bbb57205368b4b42d094642a3e52dac85fb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/erusev/parsedown/zipball/20ff8bbb57205368b4b42d094642a3e52dac85fb",
"reference": "20ff8bbb57205368b4b42d094642a3e52dac85fb",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"autoload": {
"psr-0": {
"Parsedown": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Emanuil Rusev",
"email": "hello@erusev.com",
"homepage": "http://erusev.com"
}
],
"description": "Parser for Markdown.",
"homepage": "http://parsedown.org",
"keywords": [
"markdown",
"parser"
],
"time": "2016-11-02T15:56:58+00:00"
},
{
"name": "fguillot/picofeed",
"version": "v0.1.28",
"source": {
"type": "git",
"url": "https://github.com/fguillot/picoFeed.git",
"reference": "9da506c308bcb40b6fc630f9123466028c03170b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/9da506c308bcb40b6fc630f9123466028c03170b",
"reference": "9da506c308bcb40b6fc630f9123466028c03170b",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"php": ">=5.3.0",
"zendframework/zendxml": "^1.0"
},
"require-dev": {
"phpdocumentor/reflection-docblock": "2.0.4",
"phpunit/phpunit": "4.8.26",
"symfony/yaml": "2.8.7"
},
"suggest": {
"ext-curl": "PicoFeed will use cURL if present"
},
"bin": [
"picofeed"
],
"type": "library",
"autoload": {
"psr-0": {
"PicoFeed": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Frédéric Guillot"
}
],
"description": "Modern library to handle RSS/Atom feeds",
"homepage": "https://github.com/fguillot/picoFeed",
"time": "2016-12-29T00:06:41+00:00"
},
{
"name": "nikic/fast-route",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/FastRoute.git",
"reference": "f3dcf5130e634b6123d40727d612ec6aa4f61fb3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/f3dcf5130e634b6123d40727d612ec6aa4f61fb3",
"reference": "f3dcf5130e634b6123d40727d612ec6aa4f61fb3",
"shasum": ""
},
"require": {
"php": ">=5.4.0"
},
"type": "library",
"autoload": {
"psr-4": {
"FastRoute\\": "src/"
},
"files": [
"src/functions.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov",
"email": "nikic@php.net"
}
],
"description": "Fast request router for PHP",
"keywords": [
"router",
"routing"
],
"time": "2016-10-20T17:36:47+00:00"
},
{
"name": "pimple/pimple",
"version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/silexphp/Pimple.git",
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a",
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0.x-dev"
}
},
"autoload": {
"psr-0": {
"Pimple": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
}
],
"description": "Pimple, a simple Dependency Injection Container",
"homepage": "http://pimple.sensiolabs.org",
"keywords": [
"container",
"dependency injection"
],
"time": "2015-09-11T15:10:35+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "slim/slim",
"version": "3.7.0",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
"reference": "4254e40d81559e35cdf856bcbaca5f3af468b7ef"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/4254e40d81559e35cdf856bcbaca5f3af468b7ef",
"reference": "4254e40d81559e35cdf856bcbaca5f3af468b7ef",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.1",
"nikic/fast-route": "^1.0",
"php": ">=5.5.0",
"pimple/pimple": "^3.0",
"psr/http-message": "^1.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"phpunit/phpunit": "^4.0",
"squizlabs/php_codesniffer": "^2.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Slim\\": "Slim"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Rob Allen",
"email": "rob@akrabat.com",
"homepage": "http://akrabat.com"
},
{
"name": "Josh Lockhart",
"email": "hello@joshlockhart.com",
"homepage": "https://joshlockhart.com"
},
{
"name": "Gabriel Manricks",
"email": "gmanricks@me.com",
"homepage": "http://gabrielmanricks.com"
},
{
"name": "Andrew Smith",
"email": "a.smith@silentworks.co.uk",
"homepage": "http://silentworks.co.uk"
}
],
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
"homepage": "https://slimframework.com",
"keywords": [
"api",
"framework",
"micro",
"router"
],
"time": "2016-12-20T20:30:47+00:00"
},
{
"name": "symfony/yaml",
"version": "v3.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "a7095af4b97a0955f85c8989106c249fa649011f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/a7095af4b97a0955f85c8989106c249fa649011f",
"reference": "a7095af4b97a0955f85c8989106c249fa649011f",
"shasum": ""
},
"require": {
"php": ">=5.5.9"
},
"require-dev": {
"symfony/console": "~2.8|~3.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Component\\Yaml\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
"time": "2016-12-10T10:07:06+00:00"
},
{
"name": "zendframework/zendxml",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/zendframework/ZendXml.git",
"reference": "7b64507bc35d841c9c5802d67f6f87ef8e1a58c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/zendframework/ZendXml/zipball/7b64507bc35d841c9c5802d67f6f87ef8e1a58c9",
"reference": "7b64507bc35d841c9c5802d67f6f87ef8e1a58c9",
"shasum": ""
},
"require": {
"php": "^5.3.3 || ^7.0"
},
"require-dev": {
"phpunit/phpunit": "^3.7 || ^4.0",
"squizlabs/php_codesniffer": "^1.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-0": {
"ZendXml\\": "library/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Utility library for XML usage, best practices, and security in PHP",
"homepage": "http://packages.zendframework.com/",
"keywords": [
"security",
"xml",
"zf2"
],
"time": "2016-02-04T21:02:08+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
}

View file

@ -1,25 +0,0 @@
<?php
// This is the configuration file. You can configure here all necessary (and possible) options without editing the index.php file.
// Every line has an description about what you can change here. Don't delete any strings. You can set your value after the '=' sign and between the apostrophes.
// Make sure that every line ends with an semicolon (';').
// Blog Title - Set here an individual title of your blog by replacing pBlog with it.
$blogtitle = 'pBlog';
// Blog Author - Set here your name
$blogauthor = 'Marcel Kapfer';
// Blog description
$blogdescription = 'pBlog - A php blog engine without any database dependency';
// Home - set yes if you want to link to your homepage and no if not
$bloghome = 'yes';
// Home URL - Set here the url to your main page. Either relative (e.g. '../') or absolute ('http://github.com')
$bloghomeurl = '../';
// Home name - Set here an individual name for your main page
$bloghomename = 'Home';
// Intro - set yes if you have a blog intro and no if you don't hve one
$blogintro = 'yes';
// Disqus - to enable disqus set this one to yes and provide your shortname
$blogdisqus = 'no';
// Disqus shortname - Provide here your Disqus shortname. Without one, this won't work
$blogdisqusname = '';
// Footer - set here the text for your footer (e.g. a copyright info). You can replace the whole text after the '=' with your own one.
$blogfooter = 'pBlog ' . date("Y") . ' <a href="https://github.com/mmk2410/pBlog" target="blank">github.com/mmk2410/pBlog</a>';
?>

27
config.yaml Normal file
View file

@ -0,0 +1,27 @@
blog:
title: 'Example Blog'
author: John
description: 'A short description of your blog'
home: 'on'
homeurl: ../
homename: Home
mainname: ''
intro: 'on'
disqus: rangitaki
analytics: ''
footer: "Rangitaki 2016 <a href=\"https://gitlab.com/mmk2410/rangitaki\" target=\"blank\">\n gitlab.com/mmk2410/rangitaki</a>"
url: 'https://example.com/blog/'
design:
excerpt: "off"
fab: 'on'
drawer: 'on'
theme: material-light
pagination: 0
excerpt: 'off'
favicon: 'http://example.com/res/img/favicon.png'
rcc:
rcc: 'on'
api: 'on'
language: en
social:
twitter: ''

1
extensions/example.js Normal file
View file

@ -0,0 +1 @@
(function(){var e;e=function(){return console.log("Welcome Developer! \nYou're seeing the output of a\nJavaScript extension for the Rangitaki blogging engine.")},$(document).ready(e())}).call(this);

BIN
feature-graphic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

14
feed/.atom Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<generator uri="https://github.com/fguillot/picoFeed">PicoFeed</generator>
<title>Example Blog</title>
<id>https://marcel-kapfer.de/rangitaki/blog/</id>
<updated>2016-02-16T10:52:47+00:00</updated>
<link rel="alternate" type="text/html" href="https://marcel-kapfer.de/rangitaki/blog/"/>
<link rel="self" type="application/atom+xml" href="https://marcel-kapfer.de/rangitaki/blog//feed/feed.atom"/>
<author>
<name>John</name>
<email></email>
<uri>https://marcel-kapfer.de/rangitaki/blog/</uri>
</author>
</feed>

67
gulpfile.coffee Normal file
View file

@ -0,0 +1,67 @@
###
2015 - 2016 (c) by Marcel Kapfer (mmk2410)
Licensed under MIT License
Rangitaki Gulp File
###
gulp = require 'gulp'
sass = require 'gulp-sass'
sourcemaps = require 'gulp-sourcemaps'
minifyCss = require 'gulp-csso'
coffee = require 'gulp-coffee'
coffeelint = require 'gulp-coffeelint'
uglify = require 'gulp-uglify'
merge = require 'merge-stream'
del = require 'del'
size = require 'gulp-size'
gulp.task 'coffee', ->
main = gulp.src './src/coffee/*.coffee'
.pipe coffeelint()
.pipe coffeelint.reporter()
.pipe coffee()
.pipe uglify()
.pipe gulp.dest './res/js/'
extensions = gulp.src './src/coffee-extensions/*.coffee'
.pipe coffeelint()
.pipe coffeelint.reporter()
.pipe coffee()
.pipe uglify()
.pipe gulp.dest './extensions/'
merge(main, extensions)
.pipe size {title: 'Coffee'}
gulp.task 'sass', ->
main = gulp.src './src/sass/*.sass'
.pipe sourcemaps.init()
.pipe sass {
outputStyle: 'compressed'
}
.pipe sourcemaps.write './'
.pipe gulp.dest './res/css/'
theme = gulp.src './src/sass-themes/*.sass'
.pipe sourcemaps.init()
.pipe sass {
outputStyle: 'compressed'
}
.pipe sourcemaps.write './'
.pipe gulp.dest './themes/'
merge(theme, main)
.pipe size {title: 'SASS'}
gulp.task 'clean', del.bind null, ['res/css/no-nav.css', 'res/css/rangitaki.css', 'themes/', 'res/js/app.js']
gulp.task 'init', ['coffee', 'sass']
gulp.task 'default', ->
gulp.watch './src/**/*.sass', ['sass']
gulp.watch './src/**/*.coffee', ['coffee']

689
index.php
View file

@ -1,262 +1,455 @@
<!DOCTYPE HTML>
<!-- pBlog https://github.com/mmk2410/pblog -->
<!--
The MIT License
Copyright 2015 mmk2410.
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.
Rangitaki Blogging Engine
Code: https://gitlab.com/mmk2410/rangitaki
Issus and Project Management: https://phab.mmk2410.org
Web: https://marcel-kapfer.de/rangitaki
2015 - 2016 Marcel Kapfer (mmk2410)
License: MIT
-->
<html>
<?php
/**
* PHP Version 5.6
*
* Rangitaki PHP Blogging engine
*
* @category Blogging
* @package Rbe
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT https://opensource.org/licenses/MIT
* @link https://marcel-kapfer.de/rangitaki
*/
// Getting necessary php files
date_default_timezone_set('UTC');
require __DIR__ . '/vendor/autoload.php'; // loading composer libs
<?php include 'config.php'; ?>
require './res/php/Config.php';
require_once './res/php/BlogListGenerator.php';
use mmk2410\rbe\config\Config as Config;
use mmk2410\rbe\BlogListGenerator\BlogListGenerator as BlogListGenerator;
$configParser = new Config('config.yaml', 'vendor/autoload.php');
$config = $configParser->getConfig();
require './lang/' . $config["language"] . ".php"; // Language file
require_once 'res/php/ArticleGenerator.php'; // The article generator
// Getting some variables ($_GET and $_SERVER)
$getblog = filter_input(INPUT_GET, "blog"); // get the blog variable
$getarticle = filter_input(INPUT_GET, "article"); // get the article variable
$gettag = filter_input(INPUT_GET, "tag"); // getting the tag variable
$url = "http://" . filter_input(INPUT_SERVER, "HTTP_HOST") .
filter_input(INPUT_SERVER, "REQUEST_URI"); // get the url (used for sharing)
$pagenumber = filter_input(INPUT_GET, "page"); // get the pagenumber
// Pagination algorithm
if ($config["design"]["pagination"] == 0) {
$config["design"]["pagination"] = false;
} else {
// pag_max: the newest post to show on a page
$pag_max = $config["design"]["pagination"] * ( $pagenumber + 1 );
// pag_min: the oldest post to show on a page
$pag_min = $pag_max - $config["design"]["pagination"];
if ($pagenumber > 0) {
// Disable the blog intro if not on first page
$config["blog"]["intro"] = "off";
}
}
// Fetching necessary information about the current article
// Set blog to "main" if on main blog, else to $getblog.
// This variable is needed later
if ($getblog == "") {
$blog = "main";
} else {
$blog = $getblog;
}
// generate a variable with the articles directory
$articlesdir = "./articles/$blog/";
// Fetching the articles title
if (isset($getarticle)) {
$articletitle
= ArticleGenerator::getTitle($articlesdir, $getarticle . '.md');
}
// Make sure that the entry has a title, because main.md hasn't one
if (empty($config["blog"]["mainname"])) {
$blogmaintitle = $config["blog"]["title"];
} else {
$blogmaintitle = $config["blog"]["mainname"];
}
if (isset($getblog)) {
$subblogtitle = BlogListGenerator::getName('./blogs/' . $getblog . '.md');
} else {
$subblogtitle = $blogmaintitle;
}
// Generate title for the html head
if (isset($getarticle)) {
$hd_subblog_title = $articletitle . ' - ' . $subblogtitle;
} else {
$hd_subblog_title = $subblogtitle;
}
// url of the feed
$feedurl = $config["blog"]["url"] . "/feed/" . $blog . ".atom";
?>
<head>
<title><?php echo $blogtitle; ?></title>
<meta charset="utf-8">
<title><?php echo $config["blog"]["title"] . " » " .$hd_subblog_title; ?></title>
<!--Metatags-->
<meta name="author" content="<?php echo $blogauthor; ?>" />
<meta name="description" content="<?php echo $blogdescription; ?>" />
<meta name="theme-color" content="#ac2900"/>
<meta http-equiv="CACHE-CONTROL" content="no-cache" />
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
<!--CSS no change needed-->
<link rel="stylesheet" type="text/css" href="res/blog.css" />
<link href='http://fonts.googleapis.com/css?family=Roboto:400,500,700,300,400italic,100,100italic,900' rel='stylesheet' type='text/css'>
<link rel="shortcut icon" href="res/favicon.png">
<meta name="author"
content="<?php echo $config["blog"]["author"]; // Set the blog author ?>"/>
<meta name="description"
content="<?php echo $config["blog"]["description"]; // the blog description ?>"/>
<!-- Meta tag for responsive ui-->
<meta name='viewport'
content='width=device-width, initial-scale=1.0,
maximum-scale=1.0, user-scalable=0'/>
<!-- OpenGraph meta tags -->
<meta property="og:title" content="<?php echo $hd_subblog_title; ?>"/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="<?php echo $url; ?>"/>
<meta property="og:image" content="<?php echo $config['design']['favicon']; ?>"/>
<meta property="og:description" content="<?php echo $config['blog']['description']; ?>"/>
<!-- Twitter meta tags -->
<meta name="twitter:card" content="summary"/>
<meta name="twitter:site" content="<?php echo $config['social']['twitter']; ?>"/>
<meta name="twitter:title" content="<?php echo $hd_subblog_title; ?>"/>
<meta name="twitter:description" content="<?php echo $config['blog']['description']; ?>"/>
<meta name="twitter:image" content="<?php echo $config['design']['favicon']; ?>"/>
<meta name="twitter:url" content="<?php echo $url; ?>"/>
<!-- atom feed -->
<?php
if (file_exists("feed/" . $blog . ".atom")) {
?>
<link rel='alternate' type='application/atom+xml' title='Atom 0.3' href=
'<?php
echo $feedurl;
?>'>
<?php
}
?>
<!--CSS files-->
<link rel="stylesheet" type="text/css" href="res/css/rangitaki.css"/>
<!-- stylesheet for code highlighting-->
<link rel="stylesheet" href="./res/css/github-gist.css">
<link rel="stylesheet" type="text/css"
href="themes/<?php echo $config['design']['theme']; // getting the theme stylesheet?>.css"/>
<?php
// Checking if the drawer is enabled
if ($config["design"]["drawer"] != 'on') {
// Loading additional stylesheet for disabling the drawer?>
<link rel="stylesheet" type="text/css" href="res/css/no-nav.css"/>
<?php
}
?>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
<!--Favicons-->
<link rel="shortcut icon" type="image/x-icon"
href="<?php echo $config['design']['favicon']; ?>"/>
<link rel="apple-touch-icon-precomposed" href="<?php echo $config['design']['favicon']; ?>">
<!-- JavaScript Pt. 1: HightlightJS (get and load): Code highlighting-->
<script src="./res/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body>
<div class="header">
<nobr><a href="index.php" class="title"><?php echo $blogtitle; ?></a></nobr>
<?php if($_GET['article'] == '' && $bloghome == 'yes'){ ?>
<a href="<?php echo $bloghomeurl; ?>" class="home"><?php echo $bloghomename; ?></a>
<?php } ?>
</div>
<section>
<span class="text">
<?php
require_once 'res/Parsedown.php';
require_once 'res/umlautconverter.php';
require_once 'res/hrefgenerator.php';
if(file_exists('md/intro.md') && $_GET['article'] == "" && $blogintro == "yes"){
$file = file_get_contents('md/intro.md');
$intro = Parsedown::instance()
->setBreaksEnabled(true)
->text($file);
$UmlautConverter = new UmlautConverter;
$intro = $UmlautConverter->convert($intro);
echo $intro;
}
?>
</span>
</section>
<!--DON'T CHANGE ANYTHING HERE!-->
<?php
$xml = simplexml_load_file('xml/posts.xml');
$titleArray;
$i = 0;
foreach ($xml->post as $post){
$href = $post->title;
$HrefGenerator = new HrefGenerator;
$href = $HrefGenerator->createHref($href);
$titleArray[$i] = $href;
$i = $i + 1;
}
if($_GET['article'] != ""){
$an = array_search($_GET['article'], $titleArray, true);
$post = $xml->post[$an];
<?php
// Checking if the navigation drawer is enabled. If not -> skip it
if ($config["design"]["drawer"] == "on") {
?>
<section>
<span class="texttitlemono">
<?php
$title = $post->title;
$UmlautConverter = new UmlautConverter;
$title = $UmlautConverter->convert($title);
echo $title;
?>
<br>
</span>
<small>
<?php
$pubdate = $post->pubdate;
$UmlautConverter = new UmlautConverter;
$pubdate = $UmlautConverter->convert($pubdate);
echo $pubdate;
?>
</small>
<p class="text">
<?php
$content = Parsedown::instance()
->setBreaksEnabled(true)
->text($post->content);
$UmlautConverter = new UmlautConverter;
$content = $UmlautConverter->convert($content);
echo $content;
?>
</p>
<p align="right">
<?php
foreach ($post->otherlinks->otherlb as $olb){
?>
<a class="button_white" target="_blank" href="
<?php
$otherurl = $olb->otherurl;
$UmlautConverter = new UmlautConverter;
$otherurl = $UmlautConverter->convert($otherurl);
echo $otherurl;
?>
">
<?php
$otherlink = $olb->otherlink;
$UmlautConverter = new UmlautConverter;
$otherlink = $UmlautConverter->convert($otherlink);
echo $otherlink;
?>
</a>
<?php
}
foreach($post->mainlink as $mainlink){
?>
<a class="button_color" target="_blank" href="
<?php
$mainurl = $post->mainurl;
$UmlautConverter = new UmlautConverter;
$mainurl = $UmlautConverter->convert($mainurl);
echo $mainurl;
?>
">
<?php
$mainlink = $post->mainlink;
$UmlautConverter = new UmlautConverter;
$mainlink = $UmlautConverter->convert($mainlink);
echo $mainlink;
?>
</a>
<?php } ?>
</p>
<?php include 'res/SocialBar.php'; ?>
<?php if($blogdisqus == 'yes' && $blogdisqusname != ''){ ?>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = '<?php echo $blogdisqusname; ?>';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<?php } ?>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
</section>
<?php
} else {
?>
<?php
foreach ($xml->post as $post){
?>
<section>
<a class="texttitle" href="
<?php
$href = $post->title;
$HrefGenerator = new HrefGenerator;
$href = $HrefGenerator->createHref($href);
echo 'index.php?article=' . $href;
?>
">
<?php
$title = $post->title;
$UmlautConverter = new UmlautConverter;
$title = $UmlautConverter->convert($title);
echo $title;
?>
<br>
</a>
<small>
<?php
$pubdate = $post->pubdate;
$UmlautConverter = new UmlautConverter;
$pubdate = $UmlautConverter->convert($pubdate);
echo $pubdate;
?>
</small>
<p class="text">
<?php
$content = Parsedown::instance()
->setBreaksEnabled(true)
->text($post->content);
$UmlautConverter = new UmlautConverter;
$content = $UmlautConverter->convert($content);
echo $content;
?>
</p>
<p align="right">
<?php
foreach ($post->otherlinks->otherlb as $olb){
?>
<a class="button_white" target="_blank" href="
<?php
$otherurl = $olb->otherurl;
$UmlautConverter = new UmlautConverter;
$otherurl = $UmlautConverter->convert($otherurl);
echo $otherurl;
?>
">
<?php
$otherlink = $olb->otherlink;
$UmlautConverter = new UmlautConverter;
$otherlink = $UmlautConverter->convert($otherlink);
echo $otherlink;
?>
</a>
<?php
}
foreach($post->mainlink as $mainlink){
?>
<a class="button_color" target="_blank" href="
<?php
$mainurl = $post->mainurl;
$UmlautConverter = new UmlautConverter;
$mainurl = $UmlautConverter->convert($mainurl);
echo $mainurl;
?>
">
<?php
$mainlink = $post->mainlink;
$UmlautConverter = new UmlautConverter;
$mainlink = $UmlautConverter->convert($mainlink);
echo $mainlink;
?>
</a>
<?php } ?>
</p>
</section>
<?php
}
}
?>
<div class="box_container">
<p class="cc">
<?php echo $blogfooter ?>
</p>
<!--
Darken the background when fading the drawer in. See also the JS file
-->
<div class="overlay"></div>
<div class="nav">
<div class="nav-close">
<img src="./res/img/close-dark.svg" class="nav-close-img"
alt="Close"/>
</div>
</body>
<div class="divider"></div>
<?php
// Getting everything from the blog directory
$blogs = scandir("./blogs/");
// Checking if not in article or tag view and if there are more the one
// blog. The 3 is for these three array entries: 'main.md', '.', '..'
if (!isset($getarticle) && !isset($gettag) && sizeof($blogs) > 3) {
echo "<section>";
// 1. Set localized string 2. Set blogtitle
echo "<div class='nav-item-static'>" .
$BLOGLANG['Blogs on'] . " " . $config["blog"]["title"] .
":</div>";
// iterating through the blogs/ directory
foreach ($blogs as $navblog) {
// check if filename is larger than three chars and if the
// file ends with ".md"
if (strlen($navblog) >= 3 && substr($navblog, -3) == ".md") {
if ($getblog == "") { // Run when on main blog
if ($navblog != "main.md") { // excluding main blog
// creating navigation item
echo BlogListGenerator::listBlog(
"./blogs/",
$navblog,
$config["blog"]["title"]
);
}
} else {
// Check if $blog is current blog
// -> this blog will be excluded
if ($getblog . ".md" != $navblog) {
// creating navigation item
echo BlogListGenerator::listBlog(
"./blogs/",
$navblog,
$blogmaintitle
);
}
}
}
}
echo "</section>";
} elseif (isset($getarticle) || isset($gettag)) {
// If viewing a blog or a tag
?>
<!-- Set a back item instead of the blogs. -->
<a class="nav-item" onclick="history.go(-1);">Go back</a>
<?php
}
if ($config["blog"]["home"] == "on") { // If a blog home is existend
?>
<div class="divider"></div>
<a class="nav-item" href="<?php echo $config['blog']['homeurl']; ?>">
<?php echo $config['blog']['homename']; ?>
</a>
<?php
}
if (file_exists("feed/" . $blog . ".atom")) { ?>
<div class="divider"></div>
<a class="nav-item" href=
'<?php
echo $feedurl;
?>'>Feed</a><?php
}
?>
</div> <!-- End of the navigation drawer-->
<?php
} // Endif from line 97; Yes, I really should think about alternative syntax...
?>
<div class="main"> <!-- Main page with content -->
<div class="header">
<!--
Action Bar, but since there isn't much action I call it header.
One day a search feature would be nice...
-->
<!-- Ham,ham,hamburger-->
<img src="./res/img/menu.svg" class="nav-img"/>
<!-- Blog title with subblog title and links to each one-->
<!-- link to main blog-->
<nobr><span class="title"><a href="./"><?php echo $config["blog"]["title"]; ?>
<?php
if (empty($getblog)) { // if not on a subblog
if (!empty($config['blog']['mainname'])) {
// If you see a (square) here : This is not a bug,
// but a missing sign in your font
echo "" . $config['blog']['mainname'];
}
} else { // On subblog: set also a link to the subblog
?>
</a>
<a href="<?php echo "./?blog=$getblog" ?>">
<?php
// get the blog name
echo BlogListGenerator::getName("./blogs/$getblog.md");
}
?>
</a>
</span>
</nobr>
<div class="fadeout"></div>
<!--
if the blog name is to long (especially on mobile devices), a fadeout
fades the text out at the end of the header
-->
</div>
<?php
// Blog Intro text
if (file_exists("blogs/$blog.md")
&& $getarticle == ""
&& $config["blog"]["intro"] == "on"
&& $gettag == ""
) {
// only shown if not in article or tag view
// and if the blogintro is enabled
// get content of the blog file
$file = file_get_contents("blogs/$blog.md");
// add a line break. necessary if the editor didn't make
// one while saving
$file = $file . "\n";
// basically removing the first line, which contains the blog title
$file = substr($file, strpos($file, "\n"));
if (strlen($file) > 3) { // if there is no content, don't show the intro
?>
<section class="card" id="intro">
<div class="articletext">
<?php // generate the html text from the markdown file
$intro = Parsedown::instance()
->setBreaksEnabled(true)// with linebreaks
->text($file);
echo $intro; // PRINTS THE SH****
?>
</div>
</section>
<?php
}
}
// TAG VIEW
if (isset($gettag)) { // if there's a tag -> tag view
// save the content of the directory in the articles variable
$articles = scandir($articlesdir, 1);
// iterate through all articles
foreach ($articles as $article) {
// get the article tags
$tags = ArticleGenerator::getTags($articlesdir, $article);
// if the article has the requested tag
if (in_array($gettag, $tags)) {
// check if the file is a article file
if (strlen($article) >= 3 && substr($article, -3) == ".md") {
// generate the article
ArticleGenerator::newArticle(
$articlesdir,
$article,
$getblog,
$config["design"]["excerpt"],
$BLOGLANG["Read More"]
);
}
}
}
} elseif ($getarticle == "") {
// NORMAL VIEW if there's no article request -> normal view
// save the content of the directory in the articles variable
$articles = scandir($articlesdir, 1);
// iterate through this variable
$posts_amount = 0;
foreach ($articles as $article) {
// check if the file is a article file
if (strlen($article) >= 3 && substr($article, -3) == ".md") {
// generate the article
if ($config["design"]["pagination"]) {
if ($posts_amount < $pag_max && $posts_amount >= $pag_min) {
ArticleGenerator::newArticle(
$articlesdir,
$article,
$getblog,
$config["design"]["excerpt"],
$BLOGLANG["Read More"]
);
}
} else {
ArticleGenerator::newArticle(
$articlesdir,
$article,
$getblog,
$config["design"]["excerpt"],
$BLOGLANG["Read More"]
);
}
}
$posts_amount++;
}
if ($config["design"]["pagination"]) {
include './res/php/Pagination.php';
}
} elseif (isset($getarticle)) { // ARTICLE VIEW
// generate the requested article
ArticleGenerator::newArticle(
$articlesdir,
$getarticle . ".md",
$getblog,
'off',
$BLOGLANG["Read More"]
);
include './res/php/Disqus.php'; // include disques
} else { // SOMETHING STRANGE: THIS SHOULDN'T HAPPEN
echo "Some error occured, please go back.";
}
?>
<div class="footer">
<?php echo $config["blog"]["footer"]; //print the blog footer?>
</div>
<?php
// show the fab if it's enabled
if ($config["design"]["fab"] == "on") {
?>
<div class="fabmenu">
<div class="subfab"><!--Email subfab-->
<a href='mailto:?subject=<?php
echo $config["blog"]["title"];
?>&body=<?php
echo $BLOGLANG['Check out this blog'];
?>: <?php
echo $url;
?>' target="blank">
<img src="./res/img/email.svg" class="subfab-img"/>
</a>
</div>
<div class="subfab"><!--twitter subfav-->
<a href='https://twitter.com/intent/tweet?text=<?php
echo $BLOGLANG['Check out'];
?>: <?php
echo $url;
?>&original_referer=' target="blank">
<img src="./res/img/twitter.svg" class="subfab-img"/>
</a>
</div>
<div class="subfab"><!--gplus subfab-->
<a href='https://plus.google.com/share?url=<?php
echo $url;
?>&hl=en-US' target="blank">
<img src="./res/img/gplus.svg" class="subfab-img"/>
</a>
</div>
<div class="subfab"><!--facebook subfab-->
<a href='https://www.facebook.com/sharer/sharer.php?u=<?php
echo $url;
?>&t=<?php
echo "echo " . $config["blog"]["title"];
?>' target="blank">
<img src="./res/img/facebook.svg" class="subfab-img"/>
</a>
</div>
<div class="fab"><!-- share fab-->
<img src="./res/img/share.svg" class="fab-img" alt="Share"/>
</div>
</div>
<?php
}
?>
</div>
<script src="./res/js/jquery-2.1.4.min.js"></script> <!-- include jquery-->
<script src="./res/js/app.js"></script> <!--include main javascript-->
<!-- JS extension support -->
<?php
if (file_exists("./extensions")) {
$extensions = scandir('./extensions');
foreach ($extensions as $extension) {
if (substr($extension, -3) == ".js") {
echo "<script src='./extensions/$extension'></script>";
}
}
}
?>
<?php
require './res/php/GoogleAnalytics.php'; // include google analytics
?>
</body>
</html>

12
lang/de.php Normal file
View file

@ -0,0 +1,12 @@
<?php
// Rangitaki Project
// LANGUAGE: GERMAN
$BLOGLANG = [
"Blogs on" => "Blogs auf",
"Check out this blog" => "Schau dir diesen Blog an:",
"Check out" => "Schau dir das an:",
"Next Page" => "Nächste Seite",
"Previous Page" => "Vorherige Seite",
"Read More" => "Weiterlesen",
];

12
lang/en.php Normal file
View file

@ -0,0 +1,12 @@
<?php
// Rangitaki Project
// LANGUAGE: ENGLISH
$BLOGLANG = [
"Blogs on" => "Blogs on",
"Check out this blog" => "Check out this blog:",
"Check out" => "Check out:",
"Next Page" => "Next Page",
"Previous Page" => "Previous Page",
"Read More" => "Read More",
];

View file

@ -1,7 +0,0 @@
This is the Blog of the Blog Engine **pBlog**
pBlog is based on PHP, XML and Markdown. It is easy to install and to configure.
The latest Version is **2.0**
You can find the source code on [GitHub](https://github.com/mmk2410/pBlog).

BIN
media/example.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

37
package.json Normal file
View file

@ -0,0 +1,37 @@
{
"name": "rangitaki",
"version": "1.5.0",
"description": "A simple PHP blogging engine without any database dependencies",
"main": "index.php",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+ssh://git@gitlab.com/mmk2410/rangitaki.git"
},
"keywords": [
"blogging",
"php"
],
"author": "Marcel Kapfer (mmk2410)",
"license": "MIT",
"bugs": {
"url": "https://gitlab.com/mmk2410/rangitaki/issues"
},
"homepage": "https://gitlab.com/mmk2410/rangitaki#README",
"devDependencies": {
"coffee-script": "^1.10.0",
"del": "^2.2.0",
"gulp": "^3.9.1",
"gulp-coffee": "^2.3.2",
"gulp-coffeelint": "^0.6.0",
"gulp-csso": "^2.0.0",
"gulp-sass": "^2.3.1",
"gulp-size": "^2.1.0",
"gulp-sourcemaps": "^2.0.0-alpha",
"gulp-uglify": "^1.5.3",
"merge-stream": "^1.0.0",
"node-sass": "^3.7.0"
}
}

22
rcc/api/auth/auth.php Normal file
View file

@ -0,0 +1,22 @@
<?php
// Marcel Kapfer (mmk2410)
// License: MIT License
// HTTP Basic Auth for the API
$basedir = "../../../";
require '../../ssl.php';
require '../../password.php';
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="RCC API"');
header('HTTP/1.1 401 Unauthorized');
echo "Access denied to the RCC API!";
exit;
} elseif ($_SERVER['PHP_AUTH_USER'] != $username ||
!password_verify($_SERVER['PHP_AUTH_PW'], $password)) {
header('HTTP/1.1 401 Unauthorized');
echo "Wrong credentials: Access denied!";
exit;
}

59
rcc/api/list/index.php Normal file
View file

@ -0,0 +1,59 @@
<?php
// Marcel Kapfer (mmk2410)
// License: MIT License
// api for fetching various lists
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
require '../../../vendor/autoload.php';
require '../../../res/php/Config.php';
use \mmk2410\rbe\config\Config as Config;
$config = new Config("../../../config.yaml", '../../../vendor/autoload.php');
$settings = $config->getConfig();
include '../auth/auth.php';
if ($settings["rcc"]["api"] == "on" && $settings["rcc"]["rcc"] == "on") {
$app = new \Slim\App();
/**
* api for get the list of blogs and if $_GET["blog"] is set the list of
* blogs posts in that blog
*
* @param string $_GET["blog"] optional name of the blog
*
* @return JSON json string containing the blogs / blog posts
*/
$app->get('/', function (Request $request, Response $response) {
$blog = $_GET["blog"];
if (!isset($blog)) {
$files = scandir('../../../blogs/', SCANDIR_SORT_DESCENDING);
unset($files[sizeof($files) - 1]);
unset($files[sizeof($files) - 1]);
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($files, 201);
return $response;
}
$path = "../../../articles/" . $blog . "/";
$files = scandir($path, SCANDIR_SORT_DESCENDING);
unset($files[sizeof($files) - 1]);
unset($files[sizeof($files) - 1]);
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($files, 201);
return $response;
});
$app->run();
}

48
rcc/api/media/index.php Normal file
View file

@ -0,0 +1,48 @@
<?php
// Marcel Kapfer (mmk2410)
// License: MIT License
// api for uploading files
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
require '../../../vendor/autoload.php';
require '../../../res/php/Config.php';
require '../../../res/php/ArticleGenerator.php';
use \mmk2410\rbe\config\Config as Config;
$config = new Config("../../../config.yaml", '../../../vendor/autoload.php');
$settings = $config->getConfig();
include '../auth/auth.php';
if ($settings["rcc"]["api"] == "on" && $settings["rcc"]["rcc"] == "on") {
$app = new \Slim\App();
/**
* api for uploading files
*
* @return JSON json string with status
*/
$app->post('/', function (Request $request, Response $response) {
$storage = new \Upload\Storage\FileSystem('../../../media/');
$file = new \Upload\File('file', $storage);
try {
$file->upload();
$data = array("code" => 201);
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 201);
} catch (\Exception $e) {
$errors = $file->getErrors();
$data = array("code" => 500, "error" => $Errors);
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 500);
}
return $response;
});
$app->run();
}

141
rcc/api/post/index.php Normal file
View file

@ -0,0 +1,141 @@
<?php
// Marcel Kapfer (mmk2410)
// License: MIT License
// api for accessing blog posts
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
require '../../../vendor/autoload.php';
require '../../../res/php/Config.php';
require '../../../res/php/ArticleGenerator.php';
use \mmk2410\rbe\config\Config as Config;
$config = new Config("../../../config.yaml", '../../../vendor/autoload.php');
$settings = $config->getConfig();
include '../auth/auth.php';
if ($settings["rcc"]["api"] == "on" && $settings["rcc"]["rcc"] == "on") {
$app = new \Slim\App();
/**
* api for fetching a blog post
*
* @param string $_GET["blog"] name of the blog
* @param string $_GET["post"] filename of the blog post
*
* @return JSON json string containing the blog post
*/
$app->get('/', function (Request $request, Response $response) {
$blog = $_GET["blog"];
$post = $_GET["post"];
if (!isset($blog) || !isset($post)) {
$data = array('code' => 400, 'status' => 'Bad Request', 'error' => 'Not enough arguments');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 400);
return $response;
}
$path = "../../../articles/" . $blog . "/";
$data =
ArticleGenerator::getArray($path, $post);
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 201);
return $response;
});
/**
* api for changing/creating a blog post
*
* @param string $_POST["data"] all data
*/
$app->post('/', function (Request $request, Response $response) {
$blog = $_POST["blog"];
$post = $_POST["post"];
$title = $_POST["title"];
$author = $_POST["author"];
$date = $_POST["date"];
$tags = $_POST["tags"];
$text = $_POST["text"];
if (!isset($blog) || !isset($post) || (!isset($title) && !isset($text))) {
$data = array('code' => 400, 'status' => 'Bad Request', 'error' => 'Not enough arguments');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 400);
return $response;
}
$text = str_replace('\n', '<br>', $text);
$md = <<<EOD
%TITLE: $title
%DATE: $date
%AUTHOR: $author
%TAGS: $tags
$text
EOD;
$path = "../../../articles/$blog/$post";
if (file_put_contents($path, $md)) {
$data = array('code' => 201, 'status' => 'Post created successfully');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 201);
} else {
$data = array('code' => 500, 'status' => 'Internal server error');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 500);
}
return $response;
});
/**
* api for deleting a blog post
*
* @param string $_GET["blog"] name of the blog
* @param string $_GET["post"] filename of the blog post
*
* @return JSON json string containing the blog post
*/
$app->delete('/', function (Request $request, Response $response) {
$blog = $_GET["blog"];
$post = $_GET["post"];
if (!isset($blog) || !isset($post)) {
$data = array('code' => 400, 'status' => 'Bad Request', 'error' => 'Not enough arguments');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 400);
return $response;
}
$path = "../../../articles/$blog/$post";
if (!file_exists($path)) {
$data = array('code' => 400, 'status' => 'Bad Request', 'error' => 'No such file');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 400);
return $response;
}
if (!unlink($path)) {
$data = array('code' => 500, 'status' => 'Bad Request', 'error' => 'Internal server error');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 500);
return $response;
}
$data = array('code' => 201, 'status' => 'File successfully deleted');
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withJson($data, 201);
return $response;
});
$app->run();
}

172
rcc/edit/index.php Normal file
View file

@ -0,0 +1,172 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* Edit page of RCC (Rangitaki Control Center)
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
date_default_timezone_set('UTC');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rangitaki Control Center</title>
<meta name="robots" content="nofollow, noindex, noarchive, nosnippet">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
user-scalable=0" name="viewport"/>
<meta name="theme-color" content="#383838">
<meta name="description" content="Rangitaki Control Center (RCC)">
<link rel="stylesheet" href="../res/rcc.css"/>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
</head>
<body>
<div class="header">
<a href="../" class="title">Rangitaki Control Center</a>
</div>
<div class="main">
<?php
session_start();
if ($_SESSION['login']) {
include_once "../../res/php/ArticleGenerator.php";
$directory = "./../../articles/" . $_GET['blog'] . "/";
$article = $_GET['post'] . ".md";
?>
<!-- Edit Post -->
<section class="card">
<div class="headline">Edit Post</div>
<p>Title:
<br><br>
<input type="text" class="itextfield"
value="<?php
echo ArticleGenerator::getTitle($directory, $article);
?>" name="title" id="title"/>
</p>
<p>Date:
<br><br>
<input type="text" class="itextfield"
value="<?php
echo ArticleGenerator::getDate($directory, $article);
?>" name="date" id="date"/>
</p>
<p>Author:
<br><br>
<input type="text" class="itextfield"
value="<?php
echo ArticleGenerator::getAuthor($directory, $article);
?>" name="author" id="author"/>
</p>
<p>Tags:
<br><br>
<input type="text" class="itextfield"
value="<?php
$tags = "";
foreach (
ArticleGenerator::getTags($directory, $article)
as $tag) {
$tags = $tags . ', ' . $tag;
}
$tags = substr($tags, 2);
echo $tags;
?>" name="tags" id="tags"/>
</p>
<p>Text:</p>
<textarea class="itextarea" name="text" id="text">
<?php
echo ArticleGenerator::getText($directory, $article);
?>
</textarea>
<br><br>
<a class="button" id="save_changes">SAVE CHANGES</a>
</section>
<!-- Go Back -->
<section class="card">
<div class="headline">Back</div>
<p>
Go back to the RCC home. All changes will be lost.
</p>
<a class="button" href="../">BACK</a>
</section>
<?php
} else {
?>
<!-- Access denied -->
<section class="card">
<div class="headline">Access denied</div>
<p>
The access to this area is not granted. Make sure you're logged
in.
</p>
<a class="button" href="../">BACK</a>
</section>
<?php
}
?>
</div>
<script>
var getVariables = <?php echo json_encode($_GET); ?>;
</script>
<script src="../../res/js/jquery-2.1.4.min.js"></script>
<script src="../res/rcc.js"></script>
<script src="../res/edit.js"></script>
</body>
</html>

148
rcc/feed/index.php Normal file
View file

@ -0,0 +1,148 @@
<?php
/**
* PHP Version 7
*
* @category Atom_Feed
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://gitlab.com/mmk2410/rangitaki
*
* Feed Generator
*
* The MIT License
*
* Copyright 2015 - 2016 (c) mmk2410.
*
* 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.
*/
date_default_timezone_set('UTC');
require "../../vendor/autoload.php";
require "../../res/php/Config.php";
require_once "../../res/php/ArticleGenerator.php";
use PicoFeed\Syndication\AtomFeedBuilder;
use PicoFeed\Syndication\AtomItemBuilder;
use \mmk2410\rbe\config\Config as Config;
$config = new Config('../../config.yaml', '../../vendor/autoload.php');
$settings = $config->getConfig();
include '../ssl.php';
session_start();
if ($_SESSION['login']) {
$art_dir = "./../../articles/" . $_GET['blog'] . "/";
$feed_path = "./../../feed/" . $_GET['blog'] . ".atom";
if ($_GET['blog'] == "main") {
$blogtitle = $settings['blog']['title'];
} else {
$blogtitl = $settings['blog']['title'] . " - " . ucwords($_GET['blog']);
}
$feedBuilder = AtomFeedBuilder::create()
->withTitle($blogtitle)
->withAuthor($settings['blog']['author'])
->withFeedUrl($settings['blog']['url'] . "/feed/" . $_GET['blog'] . ".atom")
->withSiteUrl($settings['blog']['url'])
->withDate(new DateTime(date(DATE_ATOM)));
$articles = scandir($art_dir, 1);
$amount = 0;
foreach ($articles as $article) {
if (strlen($article) >= 3 && substr($article, -3) == ".md") {
if ($amount == 10) {
break;
} else {
$file = ArticleGenerator::getText($art_dir, $article);
$text = Parsedown::instance()
->setBreaksEnabled(true)// with linebreaks
->text($file);
if (new DateTime(date(DATE_ATOM, strtotime($datestring))) != null) {
$date = new DateTime(
date(
DATE_ATOM,
strtotime($datestring)
)
);
} else {
$date = new DateTime(date(DATE_ATOM));
}
$date = new DateTime(date(DATE_ATOM));
$feedBuilder
->withItem(AtomItemBuilder::create($feedBuilder)
->withTitle(
ArticleGenerator::getTitle($art_dir, $article)
)
->withUrl(
$settings['blog']['url'] . "./?article=" . substr($article, 0, strlen($article) - 3)
)
->withAuthor(
ArticleGenerator::getAuthor($art_dir, $article)
)
->withPublishedDate(
parseDate(ArticleGenerator::getDate($art_dir, $article))
)
->withUpdatedDate(
parseDate(ArticleGenerator::getDate($art_dir, $article))
)
->withSummary(
ArticleGenerator::getSummary($art_dir, $article)
)
->withContent($text));
$amount += 1;
}
}
}
$feed = $feedBuilder->build();
$file = fopen($feed_path, "w");
if (fwrite($file, $feed) === false) {
echo "-1";
exit;
}
fclose($file);
echo "0";
}
function parseDate($datestring)
{
$datetime = new DateTime(date(DATE_ATOM));
try {
$datetime = new DateTime(
date(
DATE_ATOM,
strtotime($datestring)
)
);
} catch (Exception $e) {
$datetime = new DateTime(date(DATE_ATOM));
}
return $datetime;
}

326
rcc/index.php Normal file
View file

@ -0,0 +1,326 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* Main page of RCC (Rangitaki Control Center)
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
require '../vendor/autoload.php';
require '../res/php/Config.php';
require "./../res/php/BlogListGenerator.php";
use \mmk2410\rbe\config\Config as Config;
use mmk2410\rbe\BlogListGenerator\BlogListGenerator as BlogListGenerator;
$config = new Config("../config.yaml", '../vendor/autoload.php');
$settings = $config->getConfig();
include './ssl.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rangitaki Control Center</title>
<meta name="robots" content="nofollow, noindex, noarchive, nosnippet">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
user-scalable=0" name="viewport"/>
<meta name="theme-color" content="#383838">
<meta name="description" content="Rangitaki Control Center (RCC)">
<link rel="stylesheet" href="./res/rcc.css"/>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
</head>
<body>
<div class="header">
<a href="./" class="title">Rangitaki Control Center</a>
<a href="../" class="back">Back to the blog</a>
</div>
<div class="main">
<?php
$config = $settings;
if ($config["rcc"]["rcc"] == "on") {
include 'password.php';
session_start();
if (isset($_POST['passwd'])) {
$passwd = $_POST['passwd'];
$_SESSION['passwd'] = $_POST['passwd'];
} elseif (isset($_SESSION['passwd'])) {
$passwd = $_SESSION['passwd'];
}
if ($passwd == "") {
?>
<!-- Login Card -->
<section class="card">
<div class="headline">Log In</div>
<form action="./" method="post">
<p>Password:
<br><br>
<input type="password" class="itextfield" name="passwd"/>
</p>
<input type="Submit" class="button" value="Log in"/>
</form>
</section>
<?php
} else {
if (password_verify($passwd, $password)) {
$_SESSION['login'] = true;
?>
<!-- Post Upload -->
<section class="card">
<div class="headline">Post Upload</div>
<form enctype="multipart/form-data" action="uploaded/"
method="POST">
<select name="blog">
<?php
$blogs = scandir("../blogs/");
foreach ($blogs as $blog) {
if (strlen($blog) >= 3 && substr($blog, -3) == ".md") {
if (BlogListGenerator::getExternalLink($blog, '../') == null) {
$blog = substr($blog, 0, -3);
echo "<option value='$blog'>$blog</option>";
}
}
}
?>
</select>
<input type="hidden" name="MAX_FILE_SIZE" value="100000"/>
<input id="" name="userfile" type="file" value="Choose a file"/>
<br><br>
<input id="button" type="submit" value="Upload" class="button"/>
</form>
</section>
<!-- New Post -->
<section class="card">
<div class="headline">New Post</div>
<form action="newpost/" method="POST">
<p>Blog:</p>
<select name="blog">
<?php
$blogs = scandir("../blogs/");
foreach ($blogs as $blog) {
if (strlen($blog) >= 3 && substr($blog, -3) == ".md") {
if (BlogListGenerator::getExternalLink($blog, '../') == null) {
$blog = substr($blog, 0, -3);
echo "<option value='$blog'>$blog</option>";
}
}
}
?>
</select>
<p>Title:
<br><br>
<input type="text" class="itextfield" name="title"/>
</p>
<p>Date:
<br><br>
<input type="text" class="itextfield" name="date"/>
</p>
<p>Author:
<br><br>
<input type="text" class="itextfield" name="author"/>
</p>
<p>Tags:
<br><br>
<input type="text" class="itextfield" name="tags"/>
</p>
<p>Text:</p>
<textarea class="itextarea" name="text"></textarea>
<br><br>
<input id="button" type="submit" value="Post"
class="button"/>
</form>
</section>
<!-- Edit post -->
<section class="card">
<div class="headline">Edit post</div>
<p>
First select the blog of the post you wan't to edit.
</p>
<p id="edit_select_blog">
<select name="blog" id="edit_selected_blog">
<?php
$blogs = scandir("../blogs/");
foreach ($blogs as $blog) {
if (strlen($blog) >= 3 && substr($blog, -3) == ".md") {
if (BlogListGenerator::getExternalLink($blog, '../') == null) {
$blog = substr($blog, 0, -3);
echo "<option value='$blog'>$blog</option>";
}
}
}
?>
</select>
</p>
<a class="button" id="edit_get_posts">GET POSTS</a>
</section>
<!-- Delete Post -->
<section class="card">
<div class="headline">Delete Post</div>
<p>
First select the subblog of the post you want to delete.
</p>
<p id="delete_select_blog">
<select name="blog" id="delete_selected_blog">
<?php
$blogs = scandir("../blogs/");
foreach ($blogs as $blog) {
if (strlen($blog) >= 3 && substr($blog, -3) == ".md") {
if (BlogListGenerator::getExternalLink($blog, '../') == null) {
$blog = substr($blog, 0, -3);
echo "<option value='$blog'>$blog</option>";
}
}
}
?>
</select>
</p>
<a class="button" id="delete_get_posts">GET POSTS</a>
</section>
<!-- Media Upload -->
<section class="card">
<div class="headline">Media Upload</div>
<form enctype="multipart/form-data" action="media/" method="POST">
<input type="hidden" name="MAX_FILE_SIZE"
value="100000000000"/>
<input id="" name="userfile" type="file" value="Choose a file"/>
<br><br>
<input id="button" type="submit" value="Upload" class="button"/>
</form>
</section>
<!-- Atom Feed Generator -->
<section class="card">
<div class="headline">Atom Feed Generator</div>
<p>
<select name="blog" id="generate_atom_blog">
<?php
$blogs = scandir("../blogs/");
foreach ($blogs as $blog) {
if (strlen($blog) >= 3 && substr($blog, -3) == ".md") {
if (BlogListGenerator::getExternalLink($blog, '../') == null) {
$blog = substr($blog, 0, -3);
echo "<option value='$blog'>$blog</option>";
}
}
}
?>
</select>
</p>
<a class="button" id="generate_atom">GENERATE</a>
</section>
<?php
} else {
?>
<!-- Wrong Password -->
<section class="card">
<div class="headline">Wrong Password</div>
<p>
The entered password was wrong, please try again.
</p>
<form action="./" method="post">
<p>Password:
<br><br>
<input type="password" class="itextfield" name="passwd"/>
</p>
<input type="Submit" class="button" value="Log in"/>
</form>
</section>
<?php
}
}
} else {
?>
<!-- Not enabled -->
<section class="card">
<div class="headline">Rangitaki Control Center</div>
<p>
The Rangitaki Control Center is disabled. You can enable
it in your config file. But please read first the
documentation.
</p>
</section>
<?php
}
?>
<!-- Back -->
<section class="card" id="back-card">
<div class="headline">Back</div>
<p>Go back to your blog.</p>
<a href="../" class="button">GO BACK</a>
</section>
</div>
<script src="./res/rcc.js"></script>
<script src="../res/js/jquery-2.1.4.min.js"></script>
<script src="./res/delete.js"></script>
<script src="./res/edit.js"></script>
<script src="./res/atom.js"></script>
</body>
</html>

100
rcc/media/index.php Normal file
View file

@ -0,0 +1,100 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* Media page of RCC (Rangitaki Control Center)
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rangitaki Control Center</title>
<meta name="robots" content="nofollow, noindex, noarchive, nosnippet">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
user-scalable=0" name="viewport"/>
<meta name="theme-color" content="#383838">
<meta name="description" content="Rangitaki Control Center (RCC)">
<link rel="stylesheet" href="../res/rcc.css"/>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
</head>
<body>
<div class="header">
<a href="../" class="title">Rangitaki Control Center</a>
</div>
<div class="main">
<section class="card">
<div class="headline">File Upload</div>
<?php
session_start();
if ($_SESSION['login']) {
if ($_FILES['userfile']['name'] == "") {
echo "<p>You have to choose a file!</p>";
} else {
$uploaddir = "../../media/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo
"<p>
The post was successfully uploaded and is now published.
</p>";
} else {
echo
"<p>During the uploading process an error occured! <br>
Error Code:"
. ($_FILES['userfile']['error'] . "</p>");
}
}
?>
<a href="../" class="button">GO BACK</a>
<?php
}
?>
</section>
</div>
</body>
</html>

106
rcc/newpost/index.php Normal file
View file

@ -0,0 +1,106 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* Newpost page of RCC (Rangitaki Control Center)
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
date_default_timezone_set('UTC');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rangitaki Control Center</title>
<meta name="robots" content="nofollow, noindex, noarchive, nosnippet">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
user-scalable=0" name="viewport"/>
<meta name="theme-color" content="#383838">
<meta name="description" content="Rangitaki Control Center (RCC)">
<link rel="stylesheet" href="../res/rcc.css"/>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
</head>
<body>
<div class="header">
<a href="../" class="title">Rangitaki Control Center</a>
</div>
<div class="main">
<section class="card">
<div class="headline">New Post</div>
<?php
session_start();
if ($_SESSION['login']) {
$title = $_POST["title"];
$date = $_POST["date"];
$author = $_POST["author"];
$tags = $_POST["tags"];
$text = $_POST["text"];
$blog = $_POST["blog"];
$md = <<<EOD
%TITLE: $title
%DATE: $date
%AUTHOR: $author
%TAGS: $tags
$text
EOD;
$filename = date("Y-m-d-H-i-s") . ".md";
$handle = fopen("../../articles/$blog/$filename", "c");
fwrite($handle, $md);
if (fclose($handle)) {
echo "Post successfully published.";
} else {
echo "Some error happend, while publishing.";
}
?>
<a href="../" class="button">GO BACK</a>
<?php
}
?>
</section>
</div>
</body>
</html>

3
rcc/password.php Normal file
View file

@ -0,0 +1,3 @@
<?php
$username = "test";
$password = '$2y$12$nHitKTwHqU4GmI3ADVE05eH/723fCNgdQ65kQ53FyZUVVB03BjfCO';

25
rcc/res/atom.js Normal file
View file

@ -0,0 +1,25 @@
/**
* JavaScript for the ajax request to generate a atom feed
*
* Copyright (c) 2016 by mmk2410
* License: MIT License
*/
function main() {
// listener and function for calling the ajax request to create the
// requested atom feed
$("#generate_atom").click(function () {
var selectedBlog = $("#generate_atom_blog").val();
$.get("feed/index.php", {
blog: selectedBlog
}, function (data) {
if (data == "0") {
alert("Atom feed sucessfully created.");
} else {
alert("Failed to create atom feed.");
}
});
});
}
$(document).ready(main());

82
rcc/res/delete.js Normal file
View file

@ -0,0 +1,82 @@
/**
* JavaScript for the ajax request to delete blog post
*
* Copyright (c) 2016 by mmk2410
* License: MIT License
*/
function main() {
// listener and function for recieving the posts of the selected blogs
$("#delete_get_posts").click(function () {
var selectedBlog = $("#delete_selected_blog").val();
$.get("res/get_posts.php", {
blog: selectedBlog
}, function (data) {
$("#delete_select_post").remove();
$("#delete_select_post_info").remove();
$("#delete_post_button").remove();
$("#delete_get_posts").after("<p id='delete_select_post'></p>");
$("#delete_get_posts").after(
"<p id='delete_select_post_info'>" +
"Now select the post you want to delete. " +
"Remember that once a post is deleted it can't be restored.</p>"
);
$("#delete_select_post").append(
"<select id='delete_selected_post'></select>"
);
$.each($.parseJSON(data), function (index, value) {
var post = value.substring(0, value.length - 3);
$("#delete_selected_post").append(
"<option value='" + post + "'>" + post + "</option>"
);
});
$("#delete_select_post").after(
"<a class='button' id='delete_post_button' " +
"onclick='deletePostButton()'>DELETE POST</a>"
);
});
});
}
/**
* Delete the selected posts
*/
function deletePostButton() {
var selectedBlog = $("#delete_selected_blog").val();
var selectedPost = $("#delete_selected_post").val();
$.get("res/delete_post.php", {
blog: selectedBlog,
post: selectedPost
}, function (data) {
$("#delete_select_post").remove();
$("#delete_select_post_info").remove();
$("#delete_post_button").remove();
if (data == "901") {
alert("ERROR 901: No post as get argument given.");
} else if (data == "921") {
alert("ERROR 921: No post with given argument available.");
} else if (data == "941") {
alert("ERROR 941: No blog as get argument given");
} else if (data == "961") {
alert(
"ERROR 961: Error while deleting the file. Check if the" +
"web server has the permission to do so."
);
} else if (data == "0") {
alert("Post successfully deleted.");
}
});
}
$(document).ready(main());

View file

@ -1,54 +1,61 @@
<?php
/*
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* delete post script
*
* The MIT License
*
*
* Copyright 2015 mmk2410.
*
*
* 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,
* FINESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* 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.
*
*
* Error Codes:
* 901 No post given as get argument
* 921 No post with the given name available
* 941 No blog given as get argument
* 961 Error while deleting the post
*/
/**
* This is a small tool for converting the title of a post into someting usable
* as an url. This is used for the article urls.
*
* @author Marcel Kapfer <marcelmichaelkapfer@yahoo.co.nz>
*/
$post = $_GET["post"];
$blog = $_GET["blog"];
class HrefGenerator {
function createHref($text)
{
$output = str_replace(" ", "-", $text);
$output = str_replace("ä","ae",$output);
$output = str_replace("Ä","Ae",$output);
$output = str_replace("ö","oe",$output);
$output = str_replace("Ö","Oe",$output);
$output = str_replace("ü","ue",$output);
$output = str_replace("Ü","Ue",$output);
$output = str_replace("ß","ss",$output);
$output = str_replace('"', "", $output);
$output = str_replace("'", "", $output);
$output = str_replace("?", "", $output);
$output = str_replace("#", "", $output);
return $output;
session_start();
if ($_SESSION['login']) {
if (!isset($post)) {
echo "901";
} else if (!isset($blog)) {
echo "941";
} else if (!file_exists("./../../articles/$blog/$post.md")) {
echo "921";
} else {
if (unlink("./../../articles/$blog/$post.md")) {
echo "0";
}
echo "961";
}
}
?>

85
rcc/res/edit.js Normal file
View file

@ -0,0 +1,85 @@
/**
* JavaScript for the ajax request to edit a article
*
* Copyright (c) 2016 by mmk2410
* License: MIT License
*/
function main() {
// listener and function for recieving the posts of the selected blogs
$("#edit_get_posts").click(function () {
var selectedBlog = $("#edit_selected_blog").val();
$.get("res/get_posts.php", {
blog: selectedBlog
}, function (data) {
$("#edit_select_post").remove();
$("#edit_select_post_info").remove();
$("#edit_post_button").remove();
$("#edit_get_posts").after("<p id='edit_select_post'></p>");
$("#edit_get_posts").after(
"<p id='edit_select_post_info'>" +
"Now select the post you want to edit.</p>"
);
$("#edit_select_post").append(
"<select id='edit_selected_post'></select>"
);
$.each($.parseJSON(data), function (index, value) {
var post = value.substring(0, value.length - 3);
$("#edit_selected_post").append(
"<option value='" + post + "'>" + post + "</option>"
);
});
$("#edit_select_post").after(
"<a class='button' id='edit_post_button' " +
"onclick='editPostButton()'>EDIT POST</a>"
);
});
});
$("#save_changes").click(function () {
var postTitle = $("#title").val();
var postDate = $("#date").val();
var postAuthor = $("#author").val();
var postTags = $("#tags").val();
var postText = $("#text").val();
var file = "../../articles/" + getVariables.blog +
"/" + getVariables.post + ".md";
$.post("../res/save.php", {
title: postTitle,
date: postDate,
author: postAuthor,
tags: postTags,
text: postText,
file: file
}, function (data) {
if (data == "0") {
alert("File successfully changed.");
window.open("../");
} else if (data == "1") {
alert("Error while saving the changes.");
} else if (data == "-1") {
alert("file");
}
});
});
}
/**
* Delete the selected posts
*/
function editPostButton() {
var selectedBlog = $("#edit_selected_blog").val();
var selectedPost = $("#edit_selected_post").val();
var href = "./edit/?blog=" + selectedBlog + "&post=" + selectedPost;
window.open(href);
}
$(document).ready(main());

58
rcc/res/get_posts.php Normal file
View file

@ -0,0 +1,58 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* get post script
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
* Error Codes:
* 901 No blog given as get argument
* 921 No blog with the given name available
*/
session_start();
if ($_SESSION['login']) {
$blog = $_GET["blog"];
if (!isset($blog)) {
echo "901";
} else if (!file_exists("./../../blogs/$blog.md")) {
echo "921";
} else {
$posts = array();
$i = 0;
foreach (scandir("./../../articles/$blog/") as $article) {
if (substr($article, -3) == ".md") {
$posts[$i] = $article;
$i++;
}
}
print json_encode($posts);
}
}

288
rcc/res/rcc.css Normal file
View file

@ -0,0 +1,288 @@
/*
* RCC cascade style sheet
*
* Copyright (C) 2015-2016 Marcel Kapfer (mmk2410)
* MIT License
*
* The MIT License
*
* 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.
*/
/* BODY */
body{
font-family: "Roboto", sans-serif;
background: #f6f6f6;
color: #383838;
margin-top: 94px;
}
.main{
height: 100%;
width: 100%;
margin-left: 0;
}
/* HEADER */
.header{
background-color: #ff4415;
position: fixed;
top: 0;
right: 0;
left: 0;
width: 100%;
height: 64px;
box-shadow: 2px 0 2px 2px rgba(62, 62, 62, 0.45);
}
.title{
color: #fff;
font-size: 23px;
text-decoration: none;
line-height: 64px;
vertical-align: middle;
left: 75px;
position: absolute;
}
.back {
color: #fff;
font-size: 18px;
text-decoration: none;
line-height: 64px;
vertical-align: middle;
right: 75px;
position: absolute;
}
/* MAIN */
.card{
margin-right: auto;
margin-left: auto;
width: 75%;
background: #fff;
border-radius: 2px;
padding: 24px;
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3);
margin-bottom: 40px;
max-width: 1160px;
}
.headline{
font-size: 24px;
color: #383838!important;
text-decoration: none;
display: block;
padding-bottom: 8px;
border-bottom: none!important;
}
.subheadline {
font-size: 20px;
color: #383838 !important;
text-decoration: none;
display: block;
padding-bottom: 6px;
border-bottom: none !important;
}
.card > p{
font-size: 14px;
line-height: 24px;
}
/* FOOTER */
.footer{
font-size: 12px;
text-align: center;
}
.footer a{
color: #383838;
text-decoration: none;
border-bottom: 1px solid transparent;
border-bottom-color: transparent;
transition: border-bottom-color 150ms ease-in-out 100ms;
}
.footer a:hover{
border-bottom-color: #383838;
}
/* BUTTON */
.button {
text-decoration: none;
color: #fff;
background-color: #ff4415;
line-height: 36px;
min-width: 64px;
text-align: center;
height: 36px;
padding: 8px;
border-width: 1px;
border-style: solid;
border-color: #ff4415;
-webkit-box-shadow: 0.4px 1px 1.5px 1px #aaa;
-moz-box-shadow: 0.4px 1px 1.5px 1px #aaa;
box-shadow: 0.4px 1px 1.5px 1px #aaa;
border-radius: 2px;
margin-top: 4px;
margin-bottom: 5px;
letter-spacing: 0.4px;
font-weight: 700;
font-size: 14px;
transition-property: box-shadow;
transition-delay: 50ms;
transition-duration: 125ms;
transition-timing-function: ease;
-o-transition-property: box-shadow;
-o-transition-delay: 50ms;
-o-transition-duration: 125ms;
-o-transition-timing-function: ease;
-moz-transition-property: box-shadow;
-moz-transition-delay: 50ms;
-moz-transition-duration: 125ms;
-moz-transition-timing-function: ease;
-webkit-transition-property: box-shadow;
-webkit-transition-delay: 50ms;
-webkit-transition-duration: 125ms;
-webkit-transition-timing-function: ease;
cursor: pointer;
}
.button:hover, .button:hover {
-webkit-box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa;
-moz-box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa;
box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa;
}
input.button{
padding: 0 8px;
}
/* INPUT FIELD */
.itextfield{
border-color: transparent;
border-width: 1px;
font-size: 16px;
line-height: 22px;
width: 400px;
max-width: 100%;
border-bottom-color: #aaa;
transition-property: border-bottom-color;
transition-delay: 50ms;
transition-duration: 125ms;
transition-timing-function: ease;
-o-transition-property: border-bottom-color;
-o-transition-delay: 50ms;
-o-transition-duration: 125ms;
-o-transition-timing-function: ease;
-moz-transition-property: border-bottom-color;
-moz-transition-delay: 50ms;
-moz-transition-duration: 125ms;
-moz-transition-timing-function: ease;
-webkit-transition-property: border-bottom-color;
-webkit-transition-delay: 50ms;
-webkit-transition-duration: 125ms;
-webkit-transition-timing-function: ease;
}
.itextfield:focus{
border-bottom-color: #ff4415;
border-width: 2px;
outline: none;
}
/* TEXTAREA */
.itextarea {
border-color: transparent;
border-width: 1px;
font-size: 16px;
line-height: 22px;
height: auto;
resize: none;
min-height: 100px;
width: calc(100% - 10px);
border-bottom-color: #aaa;
transition-property: border-bottom-color;
transition-delay: 50ms;
transition-duration: 125ms;
transition-timing-function: ease;
-o-transition-property: border-bottom-color;
-o-transition-delay: 50ms;
-o-transition-duration: 125ms;
-o-transition-timing-function: ease;
-moz-transition-property: border-bottom-color;
-moz-transition-delay: 50ms;
-moz-transition-duration: 125ms;
-moz-transition-timing-function: ease;
-webkit-transition-property: border-bottom-color;
-webkit-transition-delay: 50ms;
-webkit-transition-duration: 125ms;
-webkit-transition-timing-function: ease;
}
.itextarea:focus {
border-bottom-color: #ff4415;
border-width: 2px;
outline: none;
}
/* FORM */
form{
margin-top: 20px;
}
@media screen and (min-width: 1440px) {
.card{
width: 1160px;
}
}
@media screen and (max-width: 720px){
.card{
width: 82%;
}
.title{
left: 25px;
}
.back {
display: none;
}
}
@media screen and (min-width: 721px) {
#back-card {
display: none;
}
}

32
rcc/res/rcc.js Normal file
View file

@ -0,0 +1,32 @@
/**
* JavaScript for RCC
*
* Copyright (c) 2016 by mmk2410
* License: MIT License
*/
window.onload = function () {
var t = document.getElementsByTagName('textarea')[0];
var offset = !window.opera ? (t.offsetHeight - t.clientHeight) : (
t.offsetHeight + parseInt(
window.getComputedStyle(t, null).getPropertyValue('border-top-width')
)
);
/**
* The following three code clocks are for proper resizing of the input
* textarea
*/
var resize = function (t) {
t.style.height = 'auto';
t.style.height = (t.scrollHeight + offset ) + 'px';
};
t.addEventListener && t.addEventListener('input', function (event) {
resize(t);
});
t.attachEvent && t.attachEvent('onkeyup', function () {
resize(t);
});
};

View file

@ -1,48 +1,58 @@
<?php
/*
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
*
* The MIT License
*
*
* Copyright 2015 mmk2410.
*
*
* 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,
* FINESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* 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.
*
*/
/**
* This is a small tool for converting german umlauts into HTML codes.
* This fixes the error that one some servers weird sings are displayed.
*
* @author Marcel Kapfer <marcelmichaelkapfer@yahoo.co.nz>
*/
session_start();
if ($_SESSION['login']) {
$title = $_POST["title"];
$date = $_POST["date"];
$author = $_POST["author"];
$tags = $_POST["tags"];
$text = $_POST["text"];
$filename = $_POST["file"];
$md = <<<EOD
%TITLE: $title
%DATE: $date
%AUTHOR: $author
%TAGS: $tags
class UmlautConverter
{
function convert($text)
{
$output = str_replace("ä","&auml;",$text);
$output = str_replace("Ä","&Auml;",$output);
$output = str_replace("ö","&ouml;",$output);
$output = str_replace("Ö","&Ouml;",$output);
$output = str_replace("ü","&uuml;",$output);
$output = str_replace("Ü","&Uuml;",$output);
$output = str_replace("ß","&szlig;",$output);
return $output;
$text
EOD;
if (file_put_contents($filename, $md)) {
echo 0;
} else if (file_exists(($filename))) {
echo 1;
} else {
echo -1;
}
}
}

11
rcc/ssl.php Normal file
View file

@ -0,0 +1,11 @@
<?php
// Marcel Kapfer (mmk2410) / Wilson O'Sullivan
// License: MIT License
// SSL Verification
if (isset($settings["rcc"]["debug"]) && $settings["rcc"]["debug"] != "on") {
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
header('HTTP/1.1 400 Bad Request');
exit();
}
}

102
rcc/uploaded/index.php Normal file
View file

@ -0,0 +1,102 @@
<?php
/**
* PHP Version 7
*
* @category Blogging
* @package Rcc
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link https://mmk2410.org/rangitaki
*
* Main page of RCC (Rangitaki Control Center)
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rangitaki Control Center</title>
<meta name="robots" content="nofollow, noindex, noarchive, nosnippet">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
user-scalable=0" name="viewport"/>
<meta name="theme-color" content="#383838">
<meta name="description" content="Rangitaki Control Center (RCC)">
<link rel="stylesheet" href="./res/rcc.css"/>
<link href='//fonts.googleapis.com/css?family=Roboto:400,500,700,300,
400italic,100,100italic,900' rel='stylesheet'
type='text/css'> <!--Font-->
</head>
<body>
<div class="header">
<a href="../" class="title">Rangitaki Control Center</a>
</div>
<div class="main">
<section class="card">
<div class="headline">File Upload</div>
<?php
session_start();
if ($_SESSION['login']) {
if ($_FILES['userfile']['name'] == "") {
echo "<p>You have to choose a file!</p>";
} else {
$blog = filter_input(INPUT_POST, "blog");
$uploaddir = "../..//articles/$blog/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo
"<p>The post was successfully uploaded and is now
published.</p>";
} else {
echo
"<p>During the uploading process an error occured! <br>
Error Code:"
. ($_FILES['userfile']['error'] . "</p>");
}
}
?>
<a href="../" class="button">GO BACK</a>
<?php
}
?>
</section>
</div>
</body>
</html>

View file

@ -1,14 +0,0 @@
<!-- The following code displays the social buttons -->
<?php
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
?>
<div class="socialbar">
<!--Twitter-->
<a href="https://twitter.com/intent/tweet?text=Check out: <?php echo $post->title; ?> &url=<?php echo $url; ?>&original_referer=" target="blank"><img src="res/twttr.svg" class="socialimg"/></a>
<!--Google+-->
<a href="https://plus.google.com/share?url=<?php echo $url; ?>&hl=en-US" target="blank"><img src="res/gplus.svg" class="socialimg" /></a>
<!--Facebook-->
<a href="https://www.facebook.com/sharer/sharer.php?u=<?php echo $url; ?>&t=<?php echo $post->title; ?>" target="blank"><img src="res/fb.png" class="socialimg" /></a>
</div>

View file

@ -1,246 +0,0 @@
/* pBlog 2.0 */
/*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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,
* FINESS 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.
*
*/
body{
margin-right: 15%;
margin-left: 15%;
margin-bottom: 0px;
margin-top: 100px;
font-family: 'Roboto', sans-serif;
font-size: 14px;
line-height: 20px;
letter-spacing: 0.01px;
background-color: #ffffff;
color: rgba(0, 0, 0, 0.87);
}
img{
max-width: 100%;
max-height: 400px;
display: block;
margin-left: auto;
margin-right: auto;
}
.header{
position: absolute;
top: 0;
left: 0;
right: 0;
float: center;
z-index: 40;
background: #de3e0b;
width: 100%;
box-shadow: 0px 0px 4px 4px rgba(189, 189, 189, 0.5);
-moz-box-shadow: 0px 0px 4px 4px rgba(189, 189, 189, 0.5);
-webkit-box-shadow: 0px 0px 4px 4px rgba(189, 189, 189, 0.5);
height: 60px;
padding-right: 0px;
padding-top: 0px;
white-space: nowrap;
}
.text{
font-family: 'Roboto', sans-serif;
font-size: 14px;
line-height: 20px;
letter-spacing: 0.01px;
background-color: #ffffff;
z-index: 10;
color: rgba(0, 0, 0, 0.87);
}
.text a{
font-family: 'Roboto', sans-serif;
font-size: 14px;
line-height: 20px;
letter-spacing: 0.01px;
color: #de3e0b;
text-decoration: none;
}
section{
margin-bottom: 50px;
}
/*
Material design flat button
Usage: <a class=".text_button_flat">YOUR TEXT</a>
9th November 2014
*/
.button_white {
text-decoration: none;
color: #000000;
line-height: 40px;
min-width: 70px;
text-align: center;
height: 40px;
padding: 8px;
border-width: 1px;
border-style: solid;
border-color: #a2a2a2;
border-radius: 3px;
margin: 4px;
margin-bottom: 5px;
margin-left: 5px;
letter-spacing: 0.4px;
font-weight: 700;
font-size: 14px;
text-align: center;
}
/*
Material design flat button
Usage: <a class=".text_button_flat_colored">YOUR TEXT</a>
9th November 2014
*/
.button_color {
text-decoration: none;
line-height: 40px;
min-width: 70px;
text-align: center;
height: 40px;
padding: 8px;
color: #FFFFFF;
background-color: #de3e0b;
border-width: 1px;
border-style: solid;
border-color: #de3e0b;
border-radius: 3px;
margin: 4px;
margin-bottom: 5px;
margin-left: 5px;
letter-spacing: 0.4px;
font-weight: 700;
font-size: 14px;
}
.title{
padding-left:15%;
height: 60px;
line-height: 60px;
display:inline-block;
text-decoration: none;
color: #FFFFFF;
vertical-align: middle;
font-size: 24px;
overflow-x: hidden;
max-width: 35%;
}
.home{
float: right;
padding-right: 15%;
height: 60px;
line-height: 60px;
vertical-align: middle;
color: #fff;
overflow-x: hidden;
font-size: 20px;
display: inline-block;
text-decoration: none;
max-width: 35%;
}
code{
background-color: #e8e6e6;
padding: 5px;
}
.texttitle{
font-family: 'Roboto', sans-serif;
font-weight: 500;
font-size: 20px;
color: rgb(33, 33, 33);
line-height: 24px;
letter-spacing: 0.05px;
text-decoration: none;
}
.texttitle:hover{
color: #de3e0b;
}
.texttitlemono{
font-family: 'Roboto', sans-serif;
font-weight: 500;
font-size: 20px;
color: rgb(33, 33, 33);
line-height: 24px;
letter-spacing: 0.05px;
text-decoration: none;
}
.cc{
font-family: 'Roboto', sans-serif;
font-size: 12px;
line-height: 14px;
letter-spacing: 0.01px;
text-align: center;
}
.cc a{
font-family: 'Roboto', sans-serif;
font-size: 12px;
line-height: 14px;
letter-spacing: 0.01px;
color: rgba(0, 0, 0, 0.87);
text-decoration: none;
}
.cc a:hover{
text-decoration: underline;
}
.socialbar{
display: inline-block;
height: 68px;
margin-top: 10px;
}
.socialimg{
height: 40px;
display: inline-block;
padding-right: 5px;
}
@media screen and (max-width: 700px){
body {
margin-right: 40px;
margin-left: 20px;
}
.title{
padding-left: 10px;
max-width: 45%;
}
.home{
padding-right: 10px;
max-width: 45%;
}
}

219
res/css/github-gist.css Normal file
View file

@ -0,0 +1,219 @@
/**
* GitHub Gist Theme
* Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro
*/
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
-webkit-text-size-adjust: none;
-ms-text-size-adjust: none;
}
.hljs-comment,
.bash .hljs-shebang,
.java .hljs-javadoc,
.javascript .hljs-javadoc,
.rust .hljs-preprocessor {
color: #969896;
}
.hljs-string,
.apache .hljs-sqbracket,
.coffeescript .hljs-subst,
.coffeescript .hljs-regexp,
.cpp .hljs-preprocessor,
.c .hljs-preprocessor,
.javascript .hljs-regexp,
.json .hljs-attribute,
.makefile .hljs-variable,
.markdown .hljs-value,
.markdown .hljs-link_label,
.markdown .hljs-strong,
.markdown .hljs-emphasis,
.markdown .hljs-blockquote,
.nginx .hljs-regexp,
.nginx .hljs-number,
.objectivec .hljs-preprocessor .hljs-title,
.perl .hljs-regexp,
.php .hljs-regexp,
.xml .hljs-value,
.less .hljs-built_in,
.scss .hljs-built_in {
color: #df5000;
}
.hljs-keyword,
.css .hljs-at_rule,
.css .hljs-important,
.http .hljs-request,
.ini .hljs-setting,
.haskell .hljs-type,
.java .hljs-javadoctag,
.javascript .hljs-tag,
.javascript .hljs-javadoctag,
.nginx .hljs-title,
.objectivec .hljs-preprocessor,
.php .hljs-phpdoc,
.sql .hljs-built_in,
.less .hljs-tag,
.less .hljs-at_rule,
.scss .hljs-tag,
.scss .hljs-at_rule,
.scss .hljs-important,
.stylus .hljs-at_rule,
.go .hljs-typename,
.swift .hljs-preprocessor {
color: #a71d5d;
}
.apache .hljs-common,
.apache .hljs-cbracket,
.apache .hljs-keyword,
.bash .hljs-literal,
.bash .hljs-built_in,
.coffeescript .hljs-literal,
.coffeescript .hljs-built_in,
.coffeescript .hljs-number,
.cpp .hljs-number,
.cpp .hljs-built_in,
.c .hljs-number,
.c .hljs-built_in,
.cs .hljs-number,
.cs .hljs-built_in,
.css .hljs-attribute,
.css .hljs-hexcolor,
.css .hljs-number,
.css .hljs-function,
.haskell .hljs-number,
.http .hljs-literal,
.http .hljs-attribute,
.java .hljs-number,
.javascript .hljs-built_in,
.javascript .hljs-literal,
.javascript .hljs-number,
.json .hljs-number,
.makefile .hljs-keyword,
.markdown .hljs-link_reference,
.nginx .hljs-built_in,
.objectivec .hljs-literal,
.objectivec .hljs-number,
.objectivec .hljs-built_in,
.php .hljs-literal,
.php .hljs-number,
.python .hljs-number,
.ruby .hljs-prompt,
.ruby .hljs-constant,
.ruby .hljs-number,
.ruby .hljs-subst .hljs-keyword,
.ruby .hljs-symbol,
.rust .hljs-number,
.sql .hljs-number,
.puppet .hljs-function,
.less .hljs-number,
.less .hljs-hexcolor,
.less .hljs-function,
.less .hljs-attribute,
.scss .hljs-preprocessor,
.scss .hljs-number,
.scss .hljs-hexcolor,
.scss .hljs-function,
.scss .hljs-attribute,
.stylus .hljs-number,
.stylus .hljs-hexcolor,
.stylus .hljs-attribute,
.stylus .hljs-params,
.go .hljs-built_in,
.go .hljs-constant,
.swift .hljs-built_in,
.swift .hljs-number {
color: #0086b3;
}
.apache .hljs-tag,
.cs .hljs-xmlDocTag,
.css .hljs-tag,
.xml .hljs-title,
.stylus .hljs-tag {
color: #63a35c;
}
.bash .hljs-variable,
.cs .hljs-preprocessor,
.cs .hljs-preprocessor .hljs-keyword,
.css .hljs-attr_selector,
.css .hljs-value,
.ini .hljs-value,
.ini .hljs-keyword,
.javascript .hljs-tag .hljs-title,
.makefile .hljs-constant,
.nginx .hljs-variable,
.xml .hljs-tag,
.scss .hljs-variable {
color: #333333;
}
.bash .hljs-title,
.coffeescript .hljs-title,
.cpp .hljs-title,
.c .hljs-title,
.cs .hljs-title,
.css .hljs-id,
.css .hljs-class,
.css .hljs-pseudo,
.ini .hljs-title,
.haskell .hljs-title,
.haskell .hljs-pragma,
.java .hljs-title,
.javascript .hljs-title,
.makefile .hljs-title,
.objectivec .hljs-title,
.perl .hljs-sub,
.php .hljs-title,
.python .hljs-decorator,
.python .hljs-title,
.ruby .hljs-parent,
.ruby .hljs-title,
.rust .hljs-title,
.xml .hljs-attribute,
.puppet .hljs-title,
.less .hljs-id,
.less .hljs-pseudo,
.less .hljs-class,
.scss .hljs-id,
.scss .hljs-pseudo,
.scss .hljs-class,
.stylus .hljs-class,
.stylus .hljs-id,
.stylus .hljs-pseudo,
.stylus .hljs-title,
.swift .hljs-title,
.diff .hljs-chunk {
color: #795da3;
}
.coffeescript .hljs-reserved,
.coffeescript .hljs-attribute {
color: #1d3e81;
}
.diff .hljs-chunk {
font-weight: bold;
}
.diff .hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.diff .hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.markdown .hljs-link_url {
text-decoration: underline;
}

3
res/css/no-nav.css Normal file
View file

@ -0,0 +1,3 @@
.nav{display:none}.nav-img{display:none}@media screen and (min-width: 1440px){.header{left:0}.main{margin-left:0;width:100%}}@media screen and (max-width: 720px){.title{left:25px}}
/*# sourceMappingURL=no-nav.css.map */

1
res/css/no-nav.css.map Normal file
View file

@ -0,0 +1 @@
{"version":3,"file":"no-nav.css","sources":["no-nav.sass"],"sourcesContent":["/*\n * Rangitaki Project\n *\n * The MIT License\n *\n * Copyright 2015 mmk2410.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * A stylesheet for overriding the default styles if the navigation drawer is disabled\n */\n\n.nav {\n display: none; }\n\n.nav-img {\n display: none; }\n\n@media screen and (min-width: 1440px) {\n .header {\n left: 0; }\n\n .main {\n margin-left: 0;\n width: 100%; } }\n\n@media screen and (max-width: 720px) {\n\n .title {\n left: 25px; } }\n"],"mappings":"AA4BA,AAAA,IAAI,AAAC,CACD,OAAO,CAAE,IAAK,CAAG,AAErB,AAAA,QAAQ,AAAC,CACL,OAAO,CAAE,IAAK,CAAG,AAErB,MAAM,CAAN,MAAM,MAAM,SAAS,EAAE,MAAM,EACzB,AAAA,OAAO,AAAC,CACJ,IAAI,CAAE,CAAE,CAAG,AAEf,AAAA,KAAK,AAAC,CACF,WAAW,CAAE,CAAE,CACf,KAAK,CAAE,IAAK,CAAG,CAEvB,MAAM,CAAN,MAAM,MAAM,SAAS,EAAE,KAAK,EAExB,AAAA,MAAM,AAAC,CACH,IAAI,CAAE,IAAK,CAAG","names":[]}

3
res/css/rangitaki.css Normal file
View file

@ -0,0 +1,3 @@
body{margin-top:94px}.main{height:100%;margin-left:0}.overlay{opacity:0;position:fixed;top:0;left:0;background-color:black;width:100%;z-index:30;height:100%;display:none}.header{top:0;right:0;left:0;width:100%;height:64px;position:absolute}.title{color:#fff;font-size:23px;text-decoration:none;line-height:64px;vertical-align:middle;left:75px}.title>a{text-decoration:none;color:#fff}.fadeout{position:absolute;height:64px;top:0;right:0;width:40px}.nav-img{height:26px;padding:19px;cursor:pointer}.nav{width:300px;position:fixed;height:100%;top:0;left:-301px;z-index:40}.nav-item,.nav-item-static{text-decoration:none;text-indent:0;display:inline-block;height:48px;vertical-align:middle;width:284px;line-height:48px;padding-left:16px;transition:background-color 125ms ease-in-out 0ms}.nav-close{cursor:pointer}.nav-close-img{height:35px;padding:12px}.nav-item{cursor:pointer}.divider{width:100%}.card{margin-right:auto;margin-left:auto;width:75%;padding:24px;margin-bottom:40px;max-width:1160px}.card a{-moz-hyphens:auto;-epub-hyphens:auto;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;word-wrap:break-word}.headline{display:block;padding-bottom:8px}.card img{max-width:100%;max-height:400px;display:block;margin-left:auto;margin-right:auto}.author{display:block}.readmore{padding:12px 0 25px 0}.fabmenu{position:fixed;bottom:20px;right:20px}.fab{height:60px;width:60px;border-radius:30px;cursor:pointer}.fab-img{width:28px;padding:15px}.subfab{height:45px;width:45px;border-radius:30px;margin-right:auto;margin-left:auto;margin-bottom:25px;display:none}.subfab-img{width:22px;padding:12px}.pag_buttons{margin-right:auto;margin-left:auto;width:calc(75% + 48px);margin-bottom:80px;max-width:1160px;text-align:right}.button{text-decoration:none;color:#fff;line-height:36px;min-width:64px;text-align:center;height:36px;padding:8px;margin-top:4px;margin-bottom:5px;cursor:pointer}.pag_next{margin-left:8px}.footer a{transition:border-bottom-color 150ms ease-in-out 100ms}.footer a:hover{border-bottom-color:#383838}@media screen and (min-width: 1440px){.nav{left:0;padding-top:64px}.nav-close-img{display:none}.nav-close{display:none}.nav-img{display:none}.header{left:300px}.main{margin-left:300px;width:calc(100% - 300px)}}@media screen and (max-width: 720px){.card{width:82%}.pag_buttons{width:calc(82% + 48px)}}
/*# sourceMappingURL=rangitaki.css.map */

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1,147 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64"
height="64"
viewBox="0 0 64 64"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="icon.svg"
inkscape:export-filename="/home/mmk/design/pBlog/googleplus/icon.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective4296" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="-185.63049"
inkscape:cy="-23.86682"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
fit-margin-bottom="-0.4"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="1"
showborder="false" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-988.36216)">
<rect
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0"
id="rect3401"
width="64"
height="64"
x="0"
y="988.36218" />
<rect
style="fill:#000080;fill-opacity:0;stroke:none"
id="rect4292"
width="27.526657"
height="12.374369"
x="-4.1668792"
y="991.62671" />
<rect
style="fill:#000080;fill-opacity:0;stroke:none"
id="rect4294"
width="36.49176"
height="30.052038"
x="16.541248"
y="1010.9459" />
<rect
style="fill:#d74132;fill-opacity:1;stroke:none"
id="rect4312"
width="64"
height="64"
x="0"
y="988.36218"
ry="5.1516638" />
<image
y="988.36218"
x="0"
id="image4400"
xlink:href="data:image/png;base64,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
AAAAAElFTkSuQmCC
"
preserveAspectRatio="none"
height="64"
width="64" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.8 KiB

60
res/img/close-dark.svg Normal file
View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
fill="#000000"
height="48"
viewBox="0 0 24 24"
width="48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="close-dark.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3830"
inkscape:window-height="2074"
id="namedview8"
showgrid="false"
inkscape:zoom="13.906433"
inkscape:cx="-29.993443"
inkscape:cy="32.765779"
inkscape:window-x="0"
inkscape:window-y="81"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
id="path4"
style="fill:#565656;fill-opacity:1" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path6" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

60
res/img/close.svg Normal file
View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
fill="#000000"
height="48"
viewBox="0 0 24 24"
width="48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="close.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
id="namedview8"
showgrid="false"
inkscape:zoom="13.906433"
inkscape:cx="0.24436123"
inkscape:cy="32.909597"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
id="path4"
style="fill:#ffffff;fill-opacity:1" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path6" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

60
res/img/email.svg Normal file
View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
fill="#000000"
height="48"
viewBox="0 0 24 24"
width="48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="email.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
id="namedview8"
showgrid="false"
inkscape:zoom="19.666667"
inkscape:cx="20.487457"
inkscape:cy="18.74108"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"
id="path4"
style="fill:#7a7a7a;fill-opacity:1" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path6" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

188
res/img/facebook.svg Normal file
View file

@ -0,0 +1,188 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800"
height="800"
viewBox="0 0 800.00001 800.00001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="/home/mmk/design/icons/web/facebook.png"
inkscape:export-xdpi="48.037498"
inkscape:export-ydpi="48.037498"
sodipodi:docname="facebook.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="308.50464"
inkscape:cy="496.10493"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-252.36216)">
<image
y="255.88876"
x="161.10423"
id="image4179"
xlink:href="data:image/png;base64,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
w7D46hMn71wwA4LIap0Qr7ECw6Bt229YAUFk1ZRSrrMCw2BxcdHDpQgiqxpEV5kyDI4/fmLbU2ZA
EFm9O0bOa63AEHjUBAgiq+0nTMBqa9t2rxUQRFbbtSZgCIL4mBUQRFZVKWWNFVj1v6By9pApgsjq
SikJIqvt+J5jm727BYLIquuagFV2wAQIIsPAE/NZVaUUT7dAEBkKHROwyp42AYKIEyJEzJkAQWQY
NCZgNbVt+20rIIhA9T1cXFw8YgYEEahaKeUFb/mEIALVSykdtQKCyLDwxHxW03MmQBAZFhMmYLWU
UuatgCACRAgigghQSjllBQQRIOIFEyCIQPVSSk6ICCJA27bnrYAgAk6IKZ21AoIIVK+UIogIIkBK
6bQVEEQAEESAiIg4YwIEEQAEESDi/Pnz56yAIALV2//dnd4LEUEEAEEEAEEEAEEEAEEEAEEEAEEE
AEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEE
AEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEEAEEE
AEEEAEEEAEEEAEE0AQAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAI
IgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAI
IgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAM
t87u6YPFDMAw8fcSK6mU8tlvPnv7g06IANQexCN/3a8LIgBVSSnNCSIA1ev3+4IIQPXapmkOCyIA
tTu297mtLwkiAFV7tQtqBBGA2ggiAETE04IIQPVKKYcFEQAi5gQRACIOCSIAtVuYn58/LogAVH86
nOu/ayCIANTu8MX+pyACUIW2bY8IIgA4IQJARFzkKReCCEA12rY9JIgAVG9xcdEJEYDqnXlyfvu8
IAJQu8Ov9QmCCEANviOIAFSvlPKMIAIgiKUcEUQAqpdzfloQAXBCvMgbAwsiANVIKR0SRABqd+KR
o7edE0QAanf4Uj5JEAEYa6/1tk+CCEAVUkpzgghA9S7lOYiCCMDYa9vWCREABBEAIhb7/b6HTAGo
3rH93925IIgA1O7IpX6iIAIwtkopc5f6uYIIwDgTRAC41CflCyIAY+1Sn5QviACMtUt9yoUgAjDO
fvDEyTuPCiIAtTt8OZ8siACMpVKKIALA5VxQI4gAjDNBBICI+LYgAoATIgBERMTTgghA7b6759jm
04IIQO0OX+4XCCIA42jucr9AEAEYO5f7HERBBMAJURABGFcppUOCCED1BoPBdwQRgOq1bfv05X6N
IAIwbo4/9vwdLwoiAFV7PVeYCiIAgiiIAIyjlNLc6/k6QQRg3E6IgggAHjIFgIhYXFx0QgSgegud
TscJEYDqPfvo8S0DQQSgds+83i8URADGxuu9oEYQARg3c6/3CwURACdEQQRgnLRtK4gA0Ol0/lIQ
Aajd+UeO3jYviADUbu5KvlgQARgXR67kiwURgLFQSjksiAAI4ut82ydBBGDcHBJEAKrXtu1hQQSg
eimlpwURgNqdevT4lrOCCEDVrvSCGkEEYCyklA5d6W0IIgDjcEI8LIgACOIVvO2TIAIwNlJKfoYI
AP1+XxABqF7bNM1hQQSgdsf2Prf1JUEEoGrLcUGNIAIwDgQRACLi6eW4EUEEYKQtx5PyBRGAcQii
h0wB4Erf9kkQARgHC/Pz88cFEYDaHZrrv2sgiADU7vBy3ZAgAjCy2rY9sly3JYgAOCEKIgAjbm65
bkgQARhZbdseEkQAqre4uOiECED1vvfk/PZ5QQSgdoeW88YEEYBR9R1BBKB6pZRnBBEAQVymd7kQ
RABG3dxy3pggAjCSUkqCCAApJVeZAlC9E48cve2cIAJQu8PLfYOCCMAoOrTcNyiIAIycUooTIgAs
93MQBRGAkdS27dxy36YgAiCIggjACFr0kCkARBx74uSdC4IIQO2OrMSNCiIAI6WUMrcStyuIAIwa
QQSAlbigRhABGDnL/bZPggjASOr3+06IAFTvB0+cvPOoIAJQu8MrdcOCCIAgCiIAo6Rt2yMrdduC
CMAoEUQAiIhvCyIAOCECQEREPC2IANTuu3uObT4tiADU7vBK3rggAjAq5lbyxgURgJGwUu9yIYgA
jFoQDwsiANXLOT8jiABUbzAYfEcQAahe27ZPr+TtCyIAo+D4Y8/f8aIgAlC7Iyv9GwgiAENvJd/2
SRABGBkppbmV/j0EEYChV0oRRABY6VepEUQARsLi4qITIgDVW+h0Ok6IAFTv2UePbxkIIgC1e+Zq
/CadR47elmzNj9o9fbBYgdXi7yVWgxMiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgi
AAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgi
AAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgi
AAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgi
AAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiAAgiACCIACCI
ACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCI
ACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCI
ACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCI
ACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCIACCI
ACCIACCIACCIACCIACCIACCIACCIACCIAIAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAg
AoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAg
AoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAg
AoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAg
AoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAoAgAgCC
CACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACC
CACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACC
CACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACC
CACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACCCACC
CACCCACCCACCCACCCACCCACCCACCCACCCACCCAAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAI
IgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAI
IgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAIIgAI
IgAIIgAIIgAIIgAIIgAMs/8PO8YfZOsRrGAAAAAASUVORK5CYII=
"
preserveAspectRatio="none"
height="800"
width="416.11047" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

98
res/img/gplus.svg Normal file
View file

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
viewBox="0 0 60.000001 60.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="gplus.svg"
inkscape:export-filename="/home/mmk/design/icons/web/gplus.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-43.022177"
inkscape:cy="42.666945"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-992.36216)">
<image
y="993.36218"
x="0"
id="image4198"
xlink:href="data:image/png;base64,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
Lxkg33SYS0djAAAAAElFTkSuQmCC
"
preserveAspectRatio="none"
height="58"
width="60" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

59
res/img/menu.svg Normal file
View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
fill="#FFFFFF"
height="48"
viewBox="0 0 24 24"
width="48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="menu.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-0.91525424"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path4" />
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
id="path6" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

63
res/img/share.svg Normal file
View file

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
fill="#000000"
height="48"
viewBox="0 0 24 24"
width="48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="share.svg"
inkscape:export-filename="/home/mmk/design/icons/web/share.png"
inkscape:export-xdpi="273.75"
inkscape:export-ydpi="273.75">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-0.91525424"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path4" />
<path
d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"
id="path6"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

457
res/img/twitter.svg Normal file
View file

@ -0,0 +1,457 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800"
height="800"
viewBox="0 0 800.00001 800.00001"
id="svg4220"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="twitter.svg"
inkscape:export-filename="/home/mmk/design/icons/web/twitter.png"
inkscape:export-xdpi="48"
inkscape:export-ydpi="48">
<defs
id="defs4222" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="-135.6234"
inkscape:cy="497.40538"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata4225">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-252.36216)">
<image
y="327.099"
x="0"
id="image4776"
xlink:href="data:image/png;base64,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
"
preserveAspectRatio="none"
height="650.52631"
width="800" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

1
res/js/app.js Normal file
View file

@ -0,0 +1 @@
(function(){var n,t,a,e,r;e=function(){var e,i;return e=!1,$(".fabmenu").click(function(){return e?(a(),e=!1):(t(),e=!0)}),i=!1,$(".nav-img, .overlay, .nav-close").click(function(){return i?(n(),i=!1):(r(),i=!0)}),$(document).keyup(function(t){return i&&27===t.which?(n(),i=!1):i||77!==t.which?void 0:(r(),i=!0)}),$(".articletext a").attr("target","_blank")},$(document).ready(e),t=function(){return $(".subfab").fadeIn(125),$(".fab-img").fadeOut(60,function(){return $(".fab-img").attr("src","./res/img/close.svg"),$(".fab-img").fadeIn(60)})},a=function(){return $(".subfab").fadeOut(125),$(".fab-img").fadeOut(60,function(){return $(".fab-img").attr("src","./res/img/share.svg"),$(".fab-img").fadeIn(60)})},r=function(){return $(".nav").animate({left:"0px"},125),$(".overlay").show(),$(".overlay").animate({opacity:"0.4"},125)},n=function(){return $(".nav").animate({left:"-301px"},125),$(".overlay").animate({opacity:"0.0"},125,function(){return $(".overlay").css({display:"none"})})}}).call(this);

1
res/js/highlight.pack.js Normal file

File diff suppressed because one or more lines are too long

4
res/js/jquery-2.1.4.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,341 @@
<?php
/**
* PHP Version 7
*
* Since there is no initialize function, I recommend to use the short access syntay
*
* @category Articles
* @package RangitakiPHP
* @author mmk2410 <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
/**
* The article generator class is a collection of functions for generating the
* article of markdown
*
* Since there is no initialize function, I recommend to use the short access syntay
*
* @category Articles
* @package RangitakiPHP
* @author mmk2410 <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
class ArticleGenerator
{
/**
* A function to create one new article
*
* @param string $directory The directory where the article files are stored
* @param string $articlefile The name of the article file
* @param string $blog The name of the current blog
*
* @return Null
*/
function newArticle($directory, $articlefile, $blog, $excerpt, $readmore)
{
$article = file_get_contents($directory . $articlefile); // get the file
echo "<section class='card'>";
if (substr($article, 0, 6) == "%TITLE") { // if a title is in the first line
$title = substr($article, 8, strpos($article, "\n") - 8); // get this title
if ($blog == "") { // if one main blog
$link = "./?article=" . substr($articlefile, 0, -3); // create link to article
} else { // if not on main blog
$link = "./?blog=$blog&article=" . substr($articlefile, 0, -3); // create link to article at specific blog
}
echo "<a href='$link' class='headline'>$title</a>"; // print link (as a headline)
$article = substr($article, strpos($article, "\n") + 1); // remove title tag from $article (the variable, not the document)
}
if (substr($article, 0, 5) == "%DATE") { // if now a date is in the first line
$date = substr($article, 7, strpos($article, "\n") - 7); // get this date
echo "<span class='date'>$date</span>"; // print the date
$article = substr($article, strpos($article, "\n") + 1); // remove this line
}
if (substr($article, 0, 7) == "%AUTHOR") { // if a author is now in the first line
$author = substr($article, 9, strpos($article, "\n") - 9); // get the author
$article = substr($article, strpos($article, "\n") + 1); // remove the line
}
if (substr($article, 0, 5) == "%TAGS") { // if tags are now at the beginning
$tags = substr($article, 7, strpos($article, "\n") - 7); // get tags
$tags = explode(", ", $tags); // split them into an array
$article = substr($article, strpos($article, "\n") + 1); // remove this line
}
echo "<div class='articletext'>";
// print only a excerpt of the post
// with at least 200 characters if possible.
if ( $excerpt == 'on' ) {
$emptyline = strpos($article, "\n\n");
if ( $emptyline !== false ) {
if ( $emptyline < 200) {
$emptyline2 = strpos($article, "\n\n", $emptyline);
if ( $emptyline2 !== false ) {
$article = substr($article, 0, $emptyline2);
} else {
$article = substr($article, 0, $emptyline);
}
} else {
$article = substr($article, 0, $emptyline);
}
} else {
// correct $excerpt for use in line 127.
$excerpt = 'off';
}
}
echo Parsedown::instance()
->setBreaksEnabled(true)
->text($article); // print now the article text as html
echo "</div>";
if ( $excerpt == 'on' ) {
echo "<div class='readmore'><a href='$link'>$readmore</a></div>";
}
if (isset($author)) {
echo "<span class='author'>$author</span>"; // print the author
}
if (isset($tags)) {
foreach ($tags as $tag) {
$blogurl = filter_input(INPUT_GET, "blog");
if ($blogurl == "") { // on main blog. no ?blog=
echo "<a class='tag' href='./?tag=$tag'>$tag</a> ";
} else { // not on main blog
echo "<a class='tag' href='./?blog=$blog&tag=$tag'>$tag</a> ";
}
}
}
echo "</section>" . "\n";
}
/**
* A function to get an articles tags as an array
*
* @param string $directory The directory where the article files are stored
* @param string $articlefile The name of the article file
* @return array
*/
static function getTags($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile); // get the article
if (substr($article, 0, 6) == "%TITLE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%DATE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 7) == "%AUTHOR") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%TAGS") { // detect the tags
$tags = substr($article, 7, strpos($article, "\n") - 7); // get the tags
$tags = explode(", ", $tags); // split them into an array
}
return $tags; // remove that array
}
/**
* A function to get an article title as a string
*
* @param string $directory The directory where the article files are stored
* @param string $articlefile The name of the article file
* @return string
*/
static function getTitle($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile); // get the article
if (substr($article, 0, 6) == "%TITLE") { // detect and remove the title
$title = substr($article, 8, strpos($article, "\n") - 8); // get this title
return $title; // remove that array
}
}
/**
* A function to get the date of an article
*
* @param $directory The directory where the article is stored
* @param $articlefile The name of the article file
* @return string
*/
static function getDate($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile);
if (substr($article, 0, 6) == "%TITLE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%DATE") { // detect and remove the title
$date = substr($article, 7, strpos($article, "\n") - 7);
return $date;
}
}
/**
* A function to get a short summary of a text
*
* @param $directory The directory where the article is stored
* @param $articlefile The name of the article file
*
* @return string
*/
static function getSummary($directory, $articlefile)
{
$text = ArticleGenerator::getText($directory, $articlefile);
$pos = stripos($text, "\n\n");
if ($pos !== false) {
$offset = $pos;
$pos = stripos($text, ".", $offset);
$summary = substr($text, 0, $pos) . ".";
return trim($summary);
} else {
return $text;
}
}
/**
* A function to get the author of an article
*
* @param $directory The directory where the article is stored
* @param $articlefile The name of the article file
* @return string
*/
static function getAuthor($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile);
if (substr($article, 0, 6) == "%TITLE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%DATE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 7) == "%AUTHOR") { // detect and remove the title
$author = substr($article, 9, strpos($article, "\n") - 9);
return $author;
}
}
/**
* A function to get the text of an article
*
* @param $directory The directory where the article is stored
* @param $articlefile The name of the article file
* @return string
*/
static function getText($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile);
if (substr($article, 0, 6) == "%TITLE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%DATE") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 7) == "%AUTHOR") { // detect and remove the title
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%TAGS") { // detect the tags
$article = substr($article, strpos($article, "\n") + 1); // remove the tags
}
return $article;
}
/**
* A function to get a array of the article
*
* @param $directory The directory where the article is stored
* @param $articlefile The name of the article file
* @return string
*/
public function getArray($directory, $articlefile)
{
$article = file_get_contents($directory . $articlefile);
$title = "";
$date = "";
$author = "";
$tags = array();
if (substr($article, 0, 6) == "%TITLE") { // get and remove the title
$title = substr($article, 8, strpos($article, "\n") - 8);
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%DATE") { // get and remove the title
$date = substr($article, 7, strpos($article, "\n") - 7);
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 7) == "%AUTHOR") { // get and remove the title
$author = substr($article, 9, strpos($article, "\n") - 9);
$article = substr($article, strpos($article, "\n") + 1);
}
if (substr($article, 0, 5) == "%TAGS") { // get and remove the tags
$tags = substr($article, 7, strpos($article, "\n") - 7); // get the tags
$tags = explode(", ", $tags); // split them into an array
$article = substr($article, strpos($article, "\n") + 1);
}
$data = array(
"title" => $title,
"date" => $date,
"author" => $author,
"tags" => $tags,
"text" => $article
);
return $data;
}
}

View file

@ -0,0 +1,137 @@
<?php
/**
* PHP Version 7
*
* Rangitaki Project
*
* @category Blogs
* @package RangitakiPHP
* @author mmk2410 <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
namespace mmk2410\rbe\BlogListGenerator;
/**
* The blog list generator class is a collection of functions for generating
* blog list
* or getting informations about them
*
* Since there is no initialize function, I recommend to use the short
* access syntay
*
* @category Generator
* @package Rbe
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
class BlogListGenerator
{
/**
* A function to generate a blog nav item
*
* @param string $directory The directory of the blog file
* @param string $blogname The name of the blog file
* @param string $blogmaintitle The name of the main blog
*
* @return None
*/
public function listBlog($directory, $blogname, $blogmaintitle)
{
// get content of the blog file;
$blog = file_get_contents($directory . $blogname);
// add a line break as a security measurement
$blog = $blog . "\n";
// check if the first line includes a title
if (substr($blog, 0, 6) == "%TITLE") {
// grab the title
$itemname = substr($blog, 8, strpos($blog, "\n") - 8);
// if on main blog
if ($itemname == "main") {
// create a nav item to the main blog
$atag = "<a class='nav-item' href='./'>$blogmaintitle</a>";
} else {
// create a link to the blog
$link = "./?blog=" . substr($blogname, 0, -3);
// create a nav item to the blog
$atag = "<a class='nav-item' href='$link'>$itemname</a>";
}
$blog = substr($blog, strpos($blog, "\n") + 1);
}
// nav item as link to external page
if (substr($blog, 0, 4) == "%URL") {
$itemurl = substr($blog, 6, strpos($blog, "\n") - 6);
$atag = "<a class='nav-item' href='$itemurl'>$itemname</a>";
}
return $atag;
}
/**
* A function to get the name of a blog
*
* @param string $file The path of the blog file
*
* @return string
*/
public function getName($file)
{
// get the content of the blog file
$blog = file_get_contents($file);
// add a line break as a securit measure
$blog = $blog . "\n";
// check if first line includes a title
if (substr($blog, 0, 6) == "%TITLE") {
// grab the title
$blog = substr($blog, 8, strpos($blog, "\n") - 8);
return $blog;
}
}
/**
* A function to recieve the amount of articles
* of a blog
*
* @param string $blog the blog name
*
* @return int Amount of files
*/
public static function getArticleAmount($blog)
{
$directory = "./articles/" . $blog . "/";
if (!file_exists($directory)) {
return 0;
} else {
$i = 0;
$handle = opendir($directory);
while (($file = readdir($handle)) !== false) {
if (!in_array($file, array('.','..'))) {
$i++;
}
}
return $i;
}
}
/**
* A function returning the external linkn of
* a blog.
*
* @param string $blog the blog name
* @param string $dir root directory of installation
*
* @return string link to external page else null
*/
public function getExternalLink($blog, $dir)
{
$path = $dir . "/blogs/" . $blog;
$blog = file_get_contents($path) . "\n";
if (substr($blog, 0, 6) == "%TITLE") {
$blog = substr($blog, strpos($blog, "\n") + 1);
}
if (substr($blog, 0, 4) == "%URL") {
return substr($blog, 6, strpos($blog, "\n") - 6);
}
return null;
}
}

74
res/php/Config.php Normal file
View file

@ -0,0 +1,74 @@
<?php
/**
* PHP Version 7
*
* Configuration parser for yaml configuration files
*
* @category Configuration
* @package Rbe
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
namespace mmk2410\rbe\config;
/**
* PHP Version 7
*
* Configuration parser for yaml configuration files
*
* @category Configuration
* @package Rbe
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
class Config
{
/**
* Path to yaml file
* @var string
*/
private $file;
/**
* Constructor for the Config class
*
* @param $config path to the yaml file
* @param $composer path to the composer autoload
*/
public function __construct($config, $composer)
{
$this->file = $config;
require $composer;
}
/**
* Return yaml config as PHP array
*
* @return config array
*/
public function getConfig()
{
$yaml = new \Symfony\Component\Yaml\Parser();
return $yaml->parse(file_get_contents($this->file));
}
/*
* Write array into confi*
* Write array into config file
*
* @param array config new config
*
* @return FALSE if failed to write
*/
public function writeConfig($config)
{
$dumper = new \Symfony\Component\Yaml\Dumper();
$yaml = $dumper->dump($config, 2);
return file_put_contents($this->file, $yaml);
}
}

44
res/php/Disqus.php Normal file
View file

@ -0,0 +1,44 @@
<!--
The MIT License
Copyright 2015 mmk2410.
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.
-->
<?php if ($config['blog']['disqus']) { // check if disqus is enabled ?>
<section class="card">
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = '<?php echo $config['blog']['disqus']; ?>';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function () {
var dsq = document.createElement('script');
dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
</section>
<?php
} ?>

View file

@ -0,0 +1,54 @@
<?php
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*/
if ($config["blog"]["analytics"]) { // check if google analytics is enabled
if (!($_SERVER['HTTP_DNT'] == 1)) {
?>
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments);
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', '<?php echo $bloganalytics; ?>', 'auto');
ga('send', 'pageview');
</script>
<?php
}
}
?>

67
res/php/Pagination.php Normal file
View file

@ -0,0 +1,67 @@
<?php
/**
* PHP Version 7
*
* PHP script for creating the next / prev page links
*
* @category Pagination
* @package Rbe
* @author Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
* @license MIT License
* @link http://marcel-kapfer.de/rangitaki
*/
require_once "BlogListGenerator.php";
use mmk2410\rbe\BlogListGenerator\BlogListGenerator as BlogListGenerator;
require_once './res/php/Config.php';
$configParser = new mmk2410\rbe\config\Config('./config.yaml', './vendor/autoload.php');
$conf = $configParser->getConfig();
require_once "lang/" . $config["language"] . ".php";
if ($blog["design"]["pagination"]) {
?>
<div class="pag_buttons">
<?php
if ($pag_min > 0) {
if (isset($getblog)) {
?>
<a href="<?php
echo "?blog=" . $getblog . "&page=" . ($pagenumber - 1);
?>" class="pag_prev button"><?php echo $BLOGLANG["Previous Page"]; ?></a>
<?php
} else {
?>
<a href="<?php
echo "?page=" . ($pagenumber - 1);
?>" class="pag_prev button"><?php echo $BLOGLANG['Previous Page']; ?></a>
<?php
}
}
if (isset($getblog)) {
$pag_blog = $getblog;
} else {
$pag_blog = "main";
}
if ($pag_max < BlogListGenerator::getArticleAmount($pag_blog)) {
if (isset($getblog)) {
?>
<a href="<?php
echo "?blog=" . $getblog . "&page=" . ($pagenumber + 1);
?>" class="pag_next button"><?php echo $BLOGLANG["Next Page"]; ?></a>
<?php
} else {
?>
<a href="<?php
echo "?page=" . ($pagenumber + 1);
?>" class="pag_next button"><?php echo $BLOGLANG["Next Page"];?></a>
<?php
}
}
?>
</div>
<?php
}
?>

View file

@ -1,458 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="icon.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="28.215794"
inkscape:cy="34.339152"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-988.36218)">
<rect
style="fill:#5ea9dd;fill-opacity:1;stroke:none"
id="rect4136"
width="64"
height="64"
x="0"
y="988.36218"
ry="4.9107141" />
<image
y="998.45483"
x="5.0535717"
id="image4148"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHMAAAOeCAYAAACAqFylAAAACXBIWXMAAC4jAAAuIwF4pT92AAAA
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAU+9JREFUeNrs3e1128a2BuAdrfvf
SgViKrBSgZkKrFOBmQqsVBClgsgVmK4gdgWmK7BVgakKjlSBLiYAD2lbH/wACWDmedaa5SQ350bc
ICni5Z49P93d3QUAAJC942qd3vPXyfief/f5Hn6G22p9+e6fpb+/af76ZuX/Pm8WAN/5SZgDAACD
twhnVkOacfNn+vtnA398n5o/5w8sgKIIcwAAYDjG1Ro1axHevFCWuIq6q2cWy+6e1Y4fgKwIcwAA
oH9OmzWKZYBzoiwbW2zrSmve/DlTFmDohDkAANCt0++WTpv9u45lyDMLAQ8wMMIcAAA4nLQtahx1
aJP+FNz0R9qqtQh3FkEPQC8JcwAAYH9GUYc2i2Wr1HCkLVqzlSXcAXpDmAMAAO1ZdN6chfAmN8Id
oDeEOQAAsJtxLMOb58pRjDR3Z9as9+HkLOCAhDkAALCZ1H1zFssA55mSEPXMnWno2gEOQJgDAABP
G0Ud3kxC9w1PS10775s1Uw6gbcIcAAC43ygEOOwuzdp5v7IAdibMAQCApVEIcNgfwQ7QCmEOAACl
SzNwJiHA4bAWW7GmYcYOsCFhDgAApVp04LxUCjqWgp3LqMOduXIATxHmAABQklG1zqMOcZxCRR99
iLpbxzYs4EHCHAAAcrc4SjyFOLZRMRRpvs406o6duXIAq4Q5AADkahS6cMjDp1huwwK6l363nDa/
Xzpx5BoAAJCZ1IUzq9bXar0OQQ7D96Ja/0TdoXMRdbcZcHjjqAeW/938numMzhwAAHKwOJEqfVt6
ohwU4F3Uwc5cKWDvRlF3x60OzP+5Wjdd/UDCHAAAhv4BexJ1iKMDhxKlLVgX0XGXAGTquPn98ud3
/zwNKj/r8gezzQoAgCEaRT0c9mvzIVuQQ6nSFqyPUW/9mCgHtCa9nubxY5CTdD6/SmcOAABDMo76
W9KXSgH3uo66U2eqFLD175m0peqx0w873WKV6MwBAGAoH65nUXcgCHLgYWlm1NswLBk2NYq64yb9
nnksyElbrG66/mF15gAA0Gfj5ob0hVLAVm6j7jK47MMNKPTQcfP6eLXmv/+fsM0KAADuNQ4hDrRp
EepcKAX8azHceJMB+rfRk24326wAAOiT01hupxLkQHvSzWoa5DoPg5JhEsvhxpsM0H/flwcgzAEA
oA9GUQ9s/RxCHNin1Zk6E+WgMJPmuZ9eA9ucgnjZlwdimxUAAF1K7eoX1XqtFNCJT81rcKYUZGwc
u2/dTSfFjfrygHTmAADQlfTBeh6CHOhSurlN2xpnfbpRhZaMo72tu5d9emA6cwAAOLSz5kPxiVJA
77yJOmh18hVDNo72h+j/EvUXEL2gMwcAgENZDDf+JwQ50FevmxvWc6VggEaxnyH6H6JHQU4izAEA
YN/SXJzUiWO4MQxDGgz7d7W+RN3hAH03inqI/tc9/Z6Z9u0B22YFAMA+TaIOcp4pBQzWu6g7dWy9
om9GUW+nerXH/0avBh8v6MwBAGAfFluqtj3+FeiPdKM8D1uv6NfvmGnUnTiv9vzfmvaxADpzAABo
03Fzw/enUkCWrqLuuPuiFHRgHO0PNn7Kz9HDrjSdOQAAtPkhO93gCXIgX8+jnn+VbqiPlYMD/n6Z
RfuDjZ+Sthj2cnuhMAcAgF0tBhynD9lOqYIypNDWgGT27Sy6CXEWpn0tjG1WAADs+kE7fdg1FwfK
9SbqTh0DkmnLpHlOdfkFQdpSeNrXAunMAQBgG6kb5321/glBDpTudejSoZ3fK2nm2jzq4fldd3pe
9rlYOnMAANhUumFLQY4QB/ieLh02tQhxznv0e6WXx5Gv0pkDAMAmH7gXs3EEOcB9Fl06p0rBE0ZR
b9P9b9QzmPr0e2Xa9+LpzNn9yTdXBgCgAOnGLHXjGHAMrOuvqLt0YNU4Dn+8+CZum3v9XneX6czZ
Xhr2J3EGAEqQPnSno4gFOcAmFidejZSieKmzcxJ1M0RXJ1OtaxoD2CaoM2d78+YDTdpLdxr2hAIA
eX74ft/zD91A/902N/LvlaI4o6hn4aTrP5Ttub/EAHbg6MzZzkUsv5k68aYEAGTorPkwK8gBdpVu
4tPJd9OoQ2LyN27uk79GPUdpKEHOuxjIKBWdOZs7bi7us3su+kR5AIAMXDYfvgHadtXcN31Riizv
ldMXARcx3G25g+jKSXTmbC49Me9LFV+FMAcAGP4H8XSDJcgB9uV5tWbunbKSxo5Mow5B3sZwg5zB
dOUkOnM2M4q6TewxvzVvTgAAQzKOuiXekePAIW+eJ8owWOnapXk4zzN5PIO6l9eZs5mLNf6d9CHI
CVcAwNA+46TTRQQ5wCGl3Q1OuxqWdK+btuKmA4BSF04uQc6nGFhThs6c9Y2bDznruGr+fSdcAQB9
lrZVTav1UimADqXTrs7CDoc+/65I1yenLpzvDW6HjTBnfenCbnKaQ0r2xsoGAPTUYsbBc6UAeuKP
qLs+6Id0PzuJOsjJuXNzkPfuwpz1n8Qft/jf2QMKAPT1s435OEAfpXuo1AFil0M3RrHswjkp5DH/
GgM8XU2Ys55ZbNaVs0q6DAD0SfqA/rcyAD1mbMVhLbZRpVXattvBNmAIc56W3kQ+7vj/4/eo25gB
ALqUPo+8UgZgAG6be7EvSrE3Zyur1E7NX2JAx5GvEuY8bRbbd+V4IwIA+iB96/q+hc80AIeU7qNS
N+FUKVqT5qVNog5wTgqvxaDHoghzHjeO3btyVt+I0gtnrqwAwIE/uKcbIYOOgaEyumI3o6hDi7RO
lON/BtuVkwhzHjeLdr/BsvcTADik0+bzjEHHwNA5XGYzo6i7b1LNhPk/+qtaF0N+AMKch42jva6c
VY4sBwAOIX2AT99kC3KAXHxo3tt8OX6/UQhw1nHb1GrQzyNhzsNmsb995VJlAGCf0ueMt8oAZMhu
h2+NQoCzqSy27Qlz7pfeHD7u+b8x+LYuAKCX0ueLP5UByFgKdFKAMS/08Z/G8hQqAc5mrqMOwAZP
mHO/dNrDywP8dxxZDgC0KX2ucPQ4UILSTgxOj3UR4BhivL3/NPf7gyfM+dGoWl8P+N/7LeotXQAA
u5iGIAcoS86BznF8G+CYf7a7rObXCnO6/yBUWqIMALT/gT99fnmpFECBcrqfGsUyvHnh0rZu0EeR
f0+Y8+OHof929AZ0GuXu+QQAtv/sMgszEwCGOsIiBTfjsH1q395U6zynB/R/ruk3urq4qWXufZjK
DgCsT5ADsLQ4wW/a85/ztLnvS0tH5WGk5omL3B6UzpxvpSCly72IjtkDANYhyAG4X986dEaxDG/S
0n3jOdEKYc7SJJZpbpc+RN1iBwBwH0EOQH9v3heDixfLe3W3shp6vEqYs/SlRy+0d1GHSwAA398k
zNwcADzpUIGO8Kbffo1MDxsyM6fWtxddOk0rbbU6d2kAgJUbhpkbBYC17GuGjvBmOP6KjE+N1pmz
fIG/6uHPleXePgBgq5uHmZsGgIPfU53Gt0OLzbwZhuvmumU7j1aY091x5Id68wEAhv9ZZRaCHIB9
31MdxzK4Wfz5TPkG6bfmd2e2bLPq/2ya1B6Y0sT3LhUAFEeQA7C/e6pxLDtvTr3XZuNNZB7kJDpz
IubR/1a52+aN5ovXJQAUJd14vFQGgFbuqS6iPio8BTcvlCTb65yu8U3uD7T0MGdcrY8DelKmn1eg
AwBlmEY/Z/oBQF/9JwrZ1XJU+IWeDOhnTXs1Z1GnyABA3qYhyAGATXyIgsaTlNyZ0/fBxw+5irpD
58ZrFQCydFGtP5UBANZWzPaqhZI7cyYD/bnTUK5Z1GEUAJDf5xNBDgBs/vuzqIYHYc4wCXQAIM/P
Jm+VAQA2kk6vKu7051K3WaW5M58zeBy2XAFAPp9NZlHPyAMA1nPd/A4t7p641M6cSSaPI3XoTL1+
AWDQBDkAsJ2zKLS54ajgC56LlyHQAYChOm5+jwtyAGAzf1XrS6kPvsRtVuNqfczwcb2LfDqOAKAU
6UPoc2UAgI18au7ti1ViZ84k08f1KnToAMCQpN/bghwA2MxtaGQoMsw5y/ixCXQAYBjOm9/bAMBm
JtWal16E0sKcFOTkviddoAMA/f888rcyAMDGijyG/D4lhjklSIHOhac3APROOrlqqgwAsLGrqDtb
ifIGIKcjy0o6LeJ3HxgBoDfSyVWzMCcHADaV5uSkL0TmSlErqTOnhC1W33sbBkMBQF9MQ5ADANtI
97VzZVgqLcwpkUAHALp3Ua2XygAAG/srzMn5QUnbrObVOin4WttyBQDdGFfrozIAwMY+Nb9H+U4p
YU7aW/fZ5RboAMCBjar1Jcrb6g0Au7pu7uVvlOJHpWyzmrjU/7LlCgAOK7WFC3IAYDNp4HEalSLI
eUApYc7Ypf4fgQ4AHMZlGHgMANtIR5B/UYaHlbDNalStry71D2y5AoD9Sd8m/qMMALCxNPD4Qhke
V0JnzthlvpcOHQDYj1H4wgQAtvEuBDlrKSHMOXOZHyTQAYD2TcOcHADY1FXU26tYg84cBDoA0J6L
ar1QBgDYyHVz727g8Zpyn5mTngwfXea1mKEDALtJx6d+VgYA2Mhtc+9u4PEGcu/MGbvEa0sdOhfK
AABbOY76GHIAYDNpNIogZ0NHBTwpWN+foTsHALZxUa0TZQCAjaQdIjNl2FzO26zSN2T/dYm3kiaI
T5QBANbiGHIA2Nwf1bpUhu3k3Jkzdnm39ip06ADAOo79zgSAjaUGAkHODoQ5PESgAwBPS78rHUMO
AOuzE6QFwhweI9ABgIel7VUvlQEA1vYpBDmtyHVmjnk57frQvOBulAIA/vdZYx66cgBgXVdRN124
r2xBrp05py5tq9K3jrPmgysAYHsVAGxCkNOyXMOcsUvbuuch0AGAxecM26sAYD2CnD0Q5rAJgQ4A
pXN6FQCsT5CzJ7mGOS9c2r1ZBDq2sgFQootqnSgDADxJkLM/ZzkOQE4hw2fXdu9umxfmF6UAoBA+
YwDA+veLoxDktCl1B0+qdV6teY6dOTpGDiMNfZypNwAFuVQCAHiSjpx2jaLe4j2v1t/RhDo5hjlj
1/pgFoHOmVIAkLn0LZht3ADwuEWQYwfH7s6a++2v1XoVy1M0J9Wa57jNKj1pnrvuB/d7GAgJQJ7S
N2DzcBQ5ADxGR047nzkmUX+JdN+Mvg/RNFPkGObcuf6dEegAkKP0u+2VMgDAgwQ5u0njS86f+Lzx
zRyi/8usAGPPgU69XXkSAkAuH64EOQDwMEHOdlIXzllz/7zO7qLJao1zC3NGng+dex3L1jAAGDpD
jwHgYYKczS0aIFKQs+4W7nfVer/6D44yLArde9U80Y6VAoABm4ShxwDwkDS/ZRyCnHUsGh7SjN/P
8e1A46dcxz27X3KbmTPzoatXpLQADPlDV/rAdaIUAPCD1CkyUYYnjZs67bJl+7eos45v5LbNSpDT
L8+bJ90kHE0HwLA8dIoEAJROkPO4UVOfSQufJf6Ke4KcJKfOnFSwr543vZSmbo9DoAPAMDiKHADu
5wTjhz87pBk4k2ivySTtdHlwlExOnTkjz5/eSh+GZ80T+71yANBzlyHIAYBV6Qv61LU6VYpvnK2s
Zy3X++yxfyGnMGfsedRr6Yn9T0hyAei3UTiKHABW2WnxrdQtM2nWvr78ScHZ/LF/QWcOh/Y2lkex
AUDfOIocAJbSVp9JCHJGsTxOfN8z9dIpYdOn/iVhDl14Hcuj2QCgL8bVeqkMAPCvT1GHF6WeTjyK
5Ryc5wf6b16ve5+c0wDk9ASzv31YHF0OQJ/MwsmYAJCUemLVKA4f4Ky69xjy++QU5tx5vQ3SVfNi
mSsFAB0aV+ujMgBAcXNOR9FtgLOQjiG/WPdfziXM8QFs2AzUAqBrs9CVA4D7srNYszNk4BZDjNN9
6PMe/DyfYsNDnXKZmXPsdTdoi6PLHXUHQBfShydBDgAlK2HHxDiWx4if9OjnevIY8vvkEuaceu0N
Xgp00klXKZhzkggAh3ShBAAULM3HSV+s5zbLNN1bppBk3PzZ1xm7Ww2Z1plD3/wdy5Y3ANi39AFP
Vw4Apfoj8voyfRTL7psh/H5Pc3Jm2/wPc5mZM/NBLDtOugLAZwgA2I90BHYKPHKYW7rafXMyoJ97
4zk5q3IJc9IT8LnXozcYANhA+gDlAAUASvMpttza0xOnsQxvhvqFTJqTM9rlGuQS5jiWPF8lTVQH
4LBmoSsHgLJsdPx1T4yiDm8W6ySD6/Dbrve4whyGIre9nAB0K32r91kZACjEkHY9pJm445WV2y6c
VgK1HAYgj70ui2AwMgBtOlcCAArxobmP6uu2qtzDm1Vpi9tFG/+PcujMSRfbfvdyGIwMwK5G1fqq
DABkLo2sSF9eTHv2c5UU3qxK3VGnbd3L5tCZM/IaLUp6oafWQIORAdjWhRIAkLmr5p5p3oOf5TSW
Q4vTOin0mrQ6dFqYwxClF/8s+pkyA9Bvx82HKQDIVZdDjtPv2dXgJv31M5ckfo+WmxH+T00ZqPSG
8DbqMO9COQBY07kPlQBkKnXjTOKwOxjGsey8Seu5y/CDd7GHJoQcZua8r9ZLz4+i9X2gFwD9MY9y
27sByNchunHGUX+ZvghuXij7k66aWrUuh86cY8+P4qUwbxaHT6EBGJb0e0KQA0BO9tGNs9gqpeNm
N2kA9d62dttmRS7Sm8useSN7rxwA3GOiBABkpI1unEVYM4pl540vPtqx1wHUOWyzmnuysYc3NQDy
kj6oflYGADLwKeovKOYb/G/GUQc1o1iGN7pt9uePal3u8z+QQ5hz53nCPczRAWDVtFqvlAGAAUvb
dh470TeFNGmL1DiWW6VGofnh0N7FAbqBhTnkrItp7gD0T/pAOw+nWAEwXCkgSEHOIrBZ/XMUAps+
3YOeHuI/JMwhd0+l1wDkb1Ktt8oAwIDvaXwhMYzrNIoD7Q45GnixRp4vPOFZ8wH+UikAinWuBAAM
/J6GfktBzjgOOOZDmEMpXke93cpR9gBlcZwqALBv53Hg8R5Hak5B0of5edSJKQDlfLgCANiXN9HB
WA9hDqVJLYoffbgHKMaZEgAAe/Khq3tLYQ6l+rta78O2K4CcTcKcAQBgPxanJ3dCmEPJXka9r/FU
KQCypCsHANiHgw88/p4ByJTupFqfw7YrgNykzwgvlQEAaFnnQU4izIGabVcAedGVAwDsw8FPrrqP
bVawZNsVQD4mSgAAtOyP6ODkqvsIc+Bbtl0BDN+oWs+VAQBo0btqXfblhxHmwP1suwIYLoE8ANCm
dAT5pE8/kDAHHmbbFcAwmZcDALSl0yPIHyLMgcfZdgUwLKfNezcAwK6uowcnV91HmAPrSduuZmHb
FUDfTZQAAGhBOoI8dfve9PGHE+bA+l5Uax51MgtAP9liBQDs6ra57/vS1x9QmAObeVatj9GjKeYA
/I8tVgBAG9KYjS99/gGFObCd12E4MkDfjJUAANjR79Wa9v2HFObA9p5HPUfHcGSAfpgoAQCwg79i
AEFOIsyB3aRtV2k48vswHBmgS6OoQ3YAgG28q9bFUH5YYQ6042UYjgzQJe+/AMC2UpAzGdIPPPQw
Z+Y5R4+sDkfWpQNwWE6xAgC2cRUD3KqtMwfal4Yjz8JwZIBDeqkEAMCGUpAzHuIPLsyB/UhzGz7H
gPZcAgyYrhwAYFOLIOdmiD+8MAf268+ojzAfKQXA3oyVAADYwHUMOMhJhDmwf6lLJwU6jjAH2I+x
EgAAa7qNuqv3ZsgPQpgDh7E4wnwWunQA2pTeUx1JDgCsIwU546i/bB80p1nBYb1o3jjMdwBox1gJ
AIA1ZBPkJDpz4PBSl84/1XofjjAH2NVYCQCAJ2QV5CQ/3d3dDf0x3HleMvA3lUnUwQ4Am5tX60QZ
AIBH/BoZBTmJzhzoli4dgO2NQpADADzu98gsyElyCHOuPDfJwMuov102SwdgfWMlAAAekYKcaY4P
LIcw58bzk0zo0gHYzFgJAIAHZBvkJLZZQf8sunQmSgHwqLESAAD3yDrISXIIc754npKh1KXztlqz
qGdCAPCt9N5oXg4A8L3sg5zENivotxdRB5bnSgHwjbESAADfKSLISWyzgv5LXTp/R92lc6ocAP/y
fggArComyElyCHNmnrMUInXpfK7WhVIA6MwBAP6nqCAn0ZkDw/Nn1Fuv3MgAJXuuBABAFBjkJDmE
OXPPXQq9iflYrctwjDlQnrESAABRaJCTCHNg2F43r4EzpQAKYl4OAFBskJPkss3q1vOYgqUByf+E
Y8yBcghzAKBc6f7/P1FwkJPkEuZ88XyG/x1jfqEUQOaEOQBQphTkjKv1vvRCGIAMeUldOgYkA7kz
/BgAyrMIcjRzRD5hzsylhB9udNKA5GkYkAzkZawEAFAcQc53cglzblxKuNerqAcknysFkImREgBA
UQQ59zAzB/KXtl79HXUHmzkTwNB5HwOAclw1v/vd838nlzBn7lLCk9KA5M/Vugxbr4DhEuYAQBlS
kDN2v3+/n+7u7nJ5LHcuJ6wttSqmrVdTpQAGJm2tfqYMAJC1RZBjpMoDjjK72MB60o3Q23DqFTAs
xyHIAYDcfQhBzpNyCnNcaNicU6+AIbHFCgDy9q5aZ+7vn5ZTmDNzOWFri1OvLpQC6DFhDgDkKwU5
E2VYT05hztzlhJ2krQt/Nq+lsXIAPaSDEADy9EcIcjYizAG+dxL11qtZtUbKAfTIWAkAIDu/R33i
LhuwzQp4SDrK/Gs4yhzoD+9FAJCPdMLub+GE3a3kdDR5Mo+6qwBo/432IiTmQLfulAAAsrm/GEd9
ui5bOMrs8XgiwH6keTp/h3k6QHdGSgAAWbiK+lAD9+87EOYAm1idp+NUGeCQRkoAAIOXgpxxmHm7
M2EOsI00T+dz1Ptb3WABh+C9BgCGLR09nr4QvlGK3QlzgF28al53F2EwKbBfIyUAgMF6E44eb1Vu
Yc486kFKwOGkeTp/Nq8/b9DAvoyUAAAGKR09fq4M7TrK8DHpzoFupFDnbdShzplyAC0bKQEADIqj
x/coxzBn5rJCp9KQ5H+a1+JYOYCW2MoJAMOxGHTs/nxPdOYA+5KGJC9OvhopB7Cj50oAAIOwCHLc
m++Rzhxg31Ko8zWcfAUAALlzYtWB5BjmpCfNtUsLvZNOvlqEOrZLAJs4VQIA6L0/woEoB3OU6eOa
ubTQWynUmYfjzIH1ea8AgP5aDDq+VIrDyTXMsTcP+m31OPMLN2oAADBIBh13RGcO0CWhDrCOsRIA
QO98CIOOO5NzZ86tywuDsRrqnCsHAAD02ptqnYVBx505yvixzVxeGJwU6vwddagzUQ4AAOiV1DTx
e/gCtnPCHKCPTqr1NoQ6QG2kBADQuXRq9Djq02npmDAH6DOhDpCMlAAAOpXm45yG+Ti9kXOYY24O
5EOoAwAA3fgrzMfpnaPMH9/MJYasrIY6F+H0KwAA2JfUHPGf5nM3PZN7mPPeJYYspVDHkeZQDq9x
ADisq6i3Vbmn7qmf7u7ucn58o2p9dZkhe+lbg8tmaf+E/NwpAQAczLuoT6vyubrHcg9zknnU3+ID
+VuEOtPmtQ/kQZgDAIf5LH0eTqsahKMCHqO2MCjHs6i3X31tfgmNlAQAAJ6UtlWNQ5AzGCWEOTOX
GYr0KpahzqlyAADAvdK2qnE4dnxQSthmlWjPBj5FPSx5phTg9zgAYFvVkB0V8jg/uNRQvBfV+hj1
Nw4T5QAAoGC2VQ1cKWGOuTnAwvNqvY16QHL6JsKRx9BvXqMA0C7bqjJQyjarUTiiHLifE7Cg39KH
zY/KAACtfO6dhGaHLJTSmZNu0K5cbuAe35+AZVgyAAC5uW4+5wpyMnFU0GOdutzAE9IJWJ+jHpJ8
phwAAGRiHrrQs1JSmCOBBNaVhiX/E+bqAAAAPVRSmJNuymy1AjZxUq2/m/ePNFdnpCQAAEDXjgp7
vFOXHNhCmqvzOuq5OqnLb6wkAABAV0oLc2y1Anb1MuqTdeZhCxYAANCB0sKcdPNlqxXQhtUtWNOw
BQsAgP7yWTUzRwU+5qnLDrQobcFKp2ClLVizak2UBACAnjlRgrz8dHd3V9pjHjU3XQD7chv1wORp
OAISdnVarc/KAAC73/8rQUYXs8AwJ5lFffQwwL59iDrUMbMLtnenBACw+/2/EuTjqNDHPXXpgQNJ
A5P/ibpD5yLsVwYAAHZUamdOOn3mvy4/0BHdOrAZnTkA0ML9vxLko9TOnJtqvXP5gY6sduuk2Toj
JQEAANZ1VPBj94040LV0qsDrcBIWAACwgVK3WS3MwxFtQL+kk7BS2Jw6dr4oB/zLNisA2N3PUe9S
IQNHhT/+qacA0DPPqvUq6qOY59U6D9uw4FYJAGBnp0qQD2EOQH+lzsG/o96Glbp1JkpCoXSpAQCs
KD3MmUd9qgxA36WhyW+jbo2dVmusJAAAUKYjJdCdAwzKYhvWx3AaFgAAFEmYU29duFYGYIBWT8NK
21DM1wEAgAIIc2pTJQAG7nks5+vMop6vc6wsZGKmBAAAS8Kc2qUSABl5EfV8nf/GcnCyYAcAADIh
zKmlgaLvlAHI0GJw8iLYOVMSAAAYNmHOku4cIHcp2PknlidiCXYYirkSAAAsCXOW0vDQT8oAFGBx
IpZgh6GYKwEAwJIw51tTJQAKsxrs3IUZOwAA0Hs/3d3dqcK35lEf9wtQug9Rhztp3SgHHUrh4n+V
AQB28ls4ITIbOnN+dKEEAP9aHZ6ctqKeV2ukLHRAmAgAsEJnzo/St3/zqLceAPCjq6i/1ZlGHfLA
Idz43QwAO9GZkxGdOfd/WHSyFcDDnlfrdbU+Rx1+T8MAZfZPcAgA0BDm3C+FObfKAPCkNGPsvgHK
I6UBAID9EObcT3cOwHYWc3a+Rt1Jkd5Lx8pCC2ZKAABQE+Y8bKoEADtZbMf6GHVIrmsHAABaIMx5
2Lxa75QBoBVpcK2uHXZhZg4AQMNpVo8bNTcdAOzXh6i30czctPOAcdRdXgDAdpxmlRFhztOmUQ/3
BOAwrmMZ7KQ1VxIaPrQAwPaEORkR5jxtFLpzALqUwp33sQx3bpSkWD60AMD2hDkZMTPnafNqvVEG
gM6k48/TIOV0/Pl/Yzlv56xax8pTlE9KAACgM2dd6WZhHvUATwD65Sq+3ZalcydfqUPrpTIAwFZ0
5mREZ8560o3BpTIA9NLiCPTVzp1pOAY9R4ZjAwCEzpxN6M4BGKbFQOUv4bSsoUtb6/5RBgDYis6c
jOjMWZ/uHIBhSjN30qmEf1frc/N+nj7IXER93LW5O8P6XQwAUDydOZubNzcGAOQjzd35Erp3hsAH
FwDYjs6cjAhzNjep1ltlAMheOjlpNdyZK0kvpOvgSxUA2JwwJyPCnO2kD/XPlQGgKLfxbbgj4OmG
E60AYDvCnIz8nxJs5bxaH5UBoChpAP6LZi0IeA4v1ViYAwAUTWfO9nwzCMBDFlu0FuHOTEla40Qr
ANjy/l8JMrqYwpytjar1VRkAWFMasjyPZciji8fvXwA46P2/EmR0MYU5O7mo1p/KAMAOUhfPPJYd
PIu/5mE+vADAFvf/SpDRxRTm7OQ46m9WnaoBQNtWQ54vK39Sh14vlAEANrv/V4KMLqYwZ2f27gNw
SNex7OK5iWXQMy+oBpfVeu2pAACb3f8rQUYXU5jTivSB2jeEAHQtzeW5iW+DnsWfOZlU663LDQCb
3f8rQUYXU5jTilEYxghAvy2OUZ9/t4YY9vi9CwBb3P8rQUYXU5jTmoswDBmA4VqEPcms+XPR2TOP
/m3jSj/XM5cNANa//1eCjC6mMKdV6YOuYcgA5Go18FkEPaudPfM4XOgzC1ucAWBd6WCFsTLk4/+U
oFWTan1UBgAylTphFgHKU0HKYn5P8uWBv57H9uHPLIQ5AEChhDntSh8s34QTNgDg+cpfrxu6rAZA
i9+rq1aDoBslBgBKZZtV+46j/pbRPn4AAAD6wDarzBwpQevSN4UTZQAAAAD2QZizH++r9UEZAAAA
gLYJc/ZnEvWpHwAAANClmRLkRZizP7ZbAQAAAK0T5uxX2m71ThkAAACAtghz9u+8WtfKAAAAALRB
mLN/tlsBAADQ9X0pGRHmHMasWm+UAQAAgA58UYK8CHMOJ223ulIGAAAAYBfCnMOahOPKAQAAgB0I
cw4rtbadKwMAAACwrZ/u7u5U4fCm1XqlDAAAABzAz2EIclaEOd04jnoo8nOlAAAAYN/3/kqQF9us
urE4rtz8HAAAAGAjwpzumJ8DAAAAbEyY061ptd4pAwAAAHvySQnyI8zpXurOuVIGAAAAYB3CnO6l
+TlnYX4OAAAAsAZhTj/Mow50AAAAoO37TTIjzOmPWbX+UAYAAABaNFeC/Ahz+uUyDEQGAAAAHiHM
6Z9JGIgMAABAO26UID/CnH4aV+taGQAAANjRFyXIjzCnn5xwBQAAANxLmNNfKT2dKAMAAACw6qe7
uztV6LdJtd4qAwAAANvc9ytBfnTm9N80nHAFAAAANIQ5wzAJgQ4AAACbMYc1U8Kc4ZiEI8sBAABY
n5OsMiXMGZZxCHQAAACgaMKcYUlHlo9DoAMAAMB695BkSJgzzBfjJOx9BAAA4HG2WWVKmDPcF+Q4
BDoAAABQHGHOcAl0AAAAeOq+kQwJc4b/whyHQAcAAIAfmZmTKWHO8Al0AAAAuI8wJ1M/3d3dqUIe
JtV6qwwAAAAs7vmVIE9D7cwZRd2NwtK0Wr8rAwAAAORtyGHOx2q9b/6a2jQEOgAAAERcKUG+hj4z
52W1vkYdYoxczn+lWvwnzNABAAAomXk5GctlAPKrqEOdi2odu6z/diyNQ6ADAABQKmFOxnI7zerP
as1DqJM45QoAAKDse0IylePR5M9CqLP64h2HQAcAAACycZTxYxPq1AQ6AAAA5ZkpQb6OCniMq6HO
NMoclJwCndMwzRwAAAAG76igx5pCncWg5GnU4UZJ5lF36Ah0AAAA8jdTgnwdFfq4U6jzuXlyjwt6
3DfN4/3kqQ8AAADDdFT4439RrY9Rd61Mooy5OotA552nPwAAQJbsyMjckRL866Rab6MOdS6jjLk6
k2q9cekBAACyc6MEeRPmfCvN1Xkd9Vyd99U6y/zxnlfrd5cdAAAgK1+UIG/CnIe9rNY/sTzafJTp
45xW67dwdDkAAEAudOZkbqhhzvyA/620BSsdbb7o1plk+DyYRT1H59pLAgAAYPB05mTup7u7u6H+
7F3+4KmLJQU7l5m9SNIA6Fm1nntpAAAADNZv4WjyrAlzdpe6WRbBzjyT58U06uPbAQAAGJ6fw1ar
rAlz2pWOf5tGHe7MB/7cmER9whcAAAADu9dXgswvsDBnb3IIdk6jbs175qUCAAAwCFfNvRwZG/Jp
Vp96/vOluTN/Rz04eR71NqyhvaDSPKBR82YAAABA/9leVQBHkx9GOhHrdbU+Ny+sadTbmI4H8kaQ
Qqg3LiMAAEDvOcmqAMKcw0tbltJw4TSP5r/NC+0i6qPB++y8Wv+J+iQvAAAA+klnTgGGPDNnGvmd
uJSCktnK6mOietrU3vHlAAAA/eNY8gIMuTNnnuH1SF07L6OetbPYkpUGKKeumHFPfsYvzc9i2xUA
AED/6MwpwJA7cy6q9WeB1ywNfk6Byqz5c97hz3IWdZeO064AAAB6cp+vBAVc5AGHOSlI+Mcl/Hdr
1mq4c+iAZxR1oPPCpQAAAOjUdXOPRuaGHOaMq/XRJXzQooNnHsuQZ5/tdhdRZqcUAABAn+4Dx8qQ
v/9Tgmy9iPu7ZdKLO4U6i6BnHu0EPRdRz/eZhuHIAAAAXXAseSGG3JmT3LmErbqKOtSZN+tm5c1g
8c+echx1sPNaOQEAAA7qr+Z+jMwJc9hG2oc5X/n7+zp7RpHf0fEAAAB95ljyQgw9zEkhgi09AAAA
EPFr2GpVhKOB//w3LiEAAAD8S5BTiCNPVAAAABi8ayUoh84cAAAAGL65EpRDZw4AAAAM30wJyqEz
BwAAAIZvrgTl0JkDAAAAwzdXgnIM/Wjy5M5lBAAAoHA/h90rxTjK4DF8chkBAAAo2G0IcoqSQ5gz
dxkBAAAomBEkhRHmAAAAwLAJcwpz5EkLAAAAgzZXgrLozAEAAIBh0+RQmBxOs0qcaAUAAECpnGRV
mKNMHseVSwkAAECBnGRVoFzCHC1lAAAAlMj9cIFyCXPmLiUAAAAFEuYUKJcwZ+ZSAgAAUCBhToFs
swIAAIDhmitBeXI5zWrxBD5xSQEAACjpvl4JynOU0WPRnQMAAEBJrpWgTMIcAAAAcB/MgOQU5sxc
TgAAAAoizCmUMAcAAACGSZhTqKPMHs+VSwoAAEAhhDmFyi3MmbmkAAAAFOA2HEterNzCHKkkAAAA
JXD/WzCdOQAAADA8wpyC5RbmzKt17bICAACQOWFOwY4yfEwzlxUAAIDMCXMKJswBAACA4RHmFEyY
AwAAAMPySQnKlmOYMw9zcwAAAMiXrpzCHWX6uGYuLQAAAJkS5hROmAMAAADDIswp3E93d3c5Pq5R
tb66vAAAAOR4L68EZcu1M2derSuXFwAAgMwYfky2YU4yc3kBAADIjC1WZB3mvHd5AQAAyIwwh2xn
5izcVOuZywwAAEAmfol6tAgFO8r88c1cYgAAADJxG4IcIv8wx1YrAAAAcmGLFf8S5gAAAMAwzJSA
JPcwJ83McWwbAAAAOZgpAclRAY9Rdw4AAAA5sM2KfwlzAAAAoP+uo959AkWEOfNqXbnUAAAADNhM
CVg4KuRxTl1qAAAABswWK/6nlDDHVisAAACGbKYELPx0d3dXymNNKeZzlxwAAICBua3WsTKwcFTQ
Y5263AAAAAyQLVZ8o6Qwx1YrAAAAhmimBKwqKcyZV+uDSw4AAMDAzJSAVUeFPV7dOQAAAAyNbVZ8
o8Qw59ZlBwAAYCCuqnWjDKwqLcxJLwDdOQAAAAzFTAn43lGBj3nqsgMAADAQMyXgez/d3d2V+Ljn
1Tpx+QEAAOi5X5p7WPifo0If99SlBwAAoOeuQ5DDPYQ5AAAA0E8zJeA+pYY582p9cPkBAADosZkS
cJ+jgh/71OUHAACgx2ZKwH1KHYC8MA+DkAEAAOifNC9npAzc56jwx3/pKQAAAEAPzZSAh5Qe5kw9
BQAAAOihmRLwkNLDnJtqvfM0AAAAoGdmSsBDSp+Zk5xW67OnAgAAAD1hXg6POlKC+FKtT8oAAABA
T8yUgMcIc2oGIQMAANAXMyXgMbZZLc3DMeUAAAB075fmHhXupTNn6UIJAAAA6FialzNXBh4jzFma
VutWGQAAAOjQTAl4ijDnW2bnAAAA0KX3SsBTzMz51nHU7WzPlAIAAIAO/FytG2XgMTpzvpVeMLpz
AAAA6MJVCHJYgzDnRynMMTsHAACAQ5spAesQ5vwopaD2KAIAAHBoMyVgHWbm3G9Ura/KAAAAwCHv
0ZWAdejMud+8Wu+UAQAAgAP5pASsS5jzsAslAAAA4ECM+2BtwpyHzav1lzIAAABwADMlYF1m5jzu
OOpQ55lSAAAAsCe3zf0nrEVnzuPSyVaXygAAAMAe2WLFRoQ5T0thzq0yAAAAsCczJWATwpyn6c4B
AABgn3TmsBEzc9Y3r9aJMgAAANCiq2qdKgOb0JmzvgslAAAAoGW6ctiYzpzNzKr1QhkAAABoya/V
+qIMbEKYs5lxtT4qAwAAAC1wJDlbsc1qM7NqfVAGAAAAWmCLFVsR5mzuPBxVDgAAwO5mSsA2hDmb
m4ejygEAANidzhy2YmbOdtKexjSgylHlAAAAbMOR5GxNZ852bqLebgUAAADbmCoB2xLmbC+1w31S
BgAAALYwUwK2ZZvVbkbV+qoMAAAAbOC6uZ+ErejM2c28Wn8pAwAAABsw+JidCHN2dxF1qgoAAADr
mCkBu7DNqh3jan1UBgAAAJ5wG/UJybA1nTntmFXrjTIAAACwxv0j7ESY056LqBNWAAAAeIh5OexM
mNOem2pNlAEAAIBHCHPYmTCn/RflB2UAAADgHul+8UYZ2JUwp32TsN0KAACAH82UgDYIc9pnuxUA
AAD3scWKVghz9vcCtd0KAACAhatqzZWBNghz9mdSrWtlAAAAoDJVAtoizNkf260AAABYmCkBbRHm
7P/F+kYZAAAAipZ2bXxRBtoizNm/86j3RgIAAFAmg49plTDnMCbhuHIAAIBSTZWANglzDiO1050r
AwAAQHFssaJ1wpzDmVbrnTIAAAAUxRYrWvfT3d2dKhzOcdSJ7IlSAAAAFOHX0JlDy3TmHFY6rvws
zM8BAAAogS1W7IUw5/DMzwEAACiDLVbshTCnG9MwPwcAAKCEez9onZk53Unzc2bVeq4UAAAA2Ulb
rEbKwD7ozOmO+TkAAAD5ssWKvRHmdGsedaADAABAXqZKwL4Ic7o3q9YfygAAAJANp1ixV8KcfrgM
A5EBAAByYYsVe2UAcn8YiAwAAJCHX0NnDnskzOmXFOjMq/VMKQAAAAbJKVbsnW1W/ZJOuBqHE64A
AACGaqoE7JvOnH5KJ1z9owwAAACD80vUOy5gb3Tm9FMalvW7MgAAAAzKVQhyOABhTn9NwwlXAAAA
Q7uPg72zzWoYbwavlAEAAKD3bLHiIHTm9N951K16AAAA9NeHEORwIMKc/luccCXQAQAA6K/3SsCh
2GY1HMfV+lKtE6UAAADonZ+j/jIe9k5nznCkN4V0ZPmtUgAAAPTKuxDkcEDCnGFJnTnjEOgAAAD0
iS1WHJRtVsN0Wq1ZtZ4pBQAAQKfSl+3HysAh6cwZpkWHDgAAAN2aKgGHJswZrhTo/K4MAAAAnZoq
AYdmm9XwTar1VhkAAAAO7rpaI2Xg0HTmDN80dOgAAAB04VIJ6ILOnHxMQocOAADAIf1SrbkycGg6
c/IxDR06AAAAh/IhBDl0RJiTl2kIdAAAAA7hvRLQFdus8nRarVm1nikFAABA626rdawMdEVnTp7S
seXj5g0GAACAdunKoVM6c/KmQwcAAKB9v0b9JTp0QmdO3hYdOtdKAQAA0IqrEOTQMWFO/tKbzGnz
hgMAAMBupkpA12yzKkcazjWr1nOlAAAA2NrP1bpRBrqkM6cc6c1mXK13SgEAALCVdyHIoQeEOWVJ
bzqTEOgAAABswylW9IJtVuWaVOutMgAAAKwlHSwzUgb6QGdOuabV+k+1bpUCAABgrXso6AWdOaST
rmbVeqYUAAAAD/qlWnNloA905pCOLh+Fo8sBAAAe8iEEOfSIMIfESVcAAAAPmyoBfWKbFd87r9bf
ygAAAPAvg4/pHZ05fO+yWr+FwcgAAADJVAnoG505PGRUrffVeq4UAABAwQw+pnd05vCQ9GY1DnN0
AACAchl8TC8Jc3hMGow8qdbvYdsVAABQnksloI9ss2Jdp1FvuzpRCgAAoAAGH9NbOnNY15eoAx3b
rgAAgBLoyqG3dOawjUnzxvZMKQAAgEz9HPXoCegdnTlsYxr1cOQrpQAAADKUdiQIcugtYQ7bWmy7
eqMUAABAZmyxotdss6IN46i7dQxHBgAAhi7tQDhVBvpMZw5tmDVvdh+UAgAAGDhdOfSezhzadhZ1
l47hyAAAwNDcVutYGeg7nTm07X21RqFLBwAAGB5dOQyCzhz2SZcOAAAwJL9Ua64M9J3OHPZp0aXj
xCsAAKDv0nHkc2VgCIQ57NtNtc6r9Vu1rpUDAADoqakSMBTCHA5lFnWXzl9KAQAA9MxVc88CgyDM
4dAuot6H+kkpAACAnjD4mEExAJkunTVvmidKAQAAdMRx5AyOzhy6lAYkn0a99epWOQAAgA7oymFw
dObQF6PmTfSlUgAAAAfkOHIGR2cOfZHePNO2q3TqlXk6AADAITiOnEHSmUNfTaIelmyeDgAAsC+/
VuuLMjA0OnPoq2ksjzI3TwcAAGhb2hEgyGGQhDn03UUIdQAAgPYZfMxg2WbFkKTjAs+r9adSAAAA
O7iO+ktjGCSdOQzJTdSdOmna/DvlAAAAtnShBAyZzhyGbNS8CadTsJ4pBwAAsIY0vuFYGRgynTkM
2TzqU69GYaYOAACwHrNyGDydOeRkMVMnLZ06AADA99IXwKOoRzjAYOnMISeLmTop1Pk96qFmAAAA
C+9DkEMGdOaQuzRPJ3XqvFAKAAAoXjpMZa4MDJ3OHHKXkvdxtX4NJ2ABAEDJ0v3AXBnIgc4cSpO2
YE2i7tY5UQ4AACjGb9WaKQM5EOZQsrQFa1Ktl0oBAABZ+xR1xz5kQZgD9TT7xWwd3ToAAJAfXTlk
RZgD3xpH3a2Twh3HmwMAwPBdVetUGciJMAful2brnDXLNiwAABiu36s1VQZyIsyBpy2GJqf1XDkA
AGAwrqMeqwBZEebAZtIvgsXgZMEOAAD0m64csiTMge2Nog52xmErFgAA9I2uHLIlzIF2LGbsjMPw
ZAAA6ANdOWRLmAP7MY5luGM7FgAAHNZt1F05N0pBjv5PCWAvZs1KVrt20jpRHgAA2KvLEOSQMZ05
cHijWAY7aQl3AACgPbpyyJ4wB7qXftGMq3UatmUBAMCu/qrWhTKQM2EO9NM4lkegG6YMAADr0ZVD
EczMgX4Zr6wXygEAABsxK4ci6MyB7qTByONYbq8S3gAAwPZ05VAMnTlwOIvQ5rRZZuMAAEB7dOVQ
DJ05ZRtH3R3ypVpz5Wi9timwGTV/6roBAID90ZVDUXTmlC290X1c+ftPUYc6ac1W/pqHrQY2i7/W
cQMAAIelK4ei6MxhXq2TJ/6dT80b46KDZ3WVYLzyZ+pkWoQ2J54+AADQOV05FEdnDu+r9fqJf2ex
RejlPf+366hDnUXYE82fizfSWY8f+yKYiebNf/TdP7M1CgAA+k9XDsXRmUMKLj4f6L/16bu/n93z
76yGQpsYNeupf57+WkcNAADkQVcORRLmkMxDwAEAAAzPX9W6UAZKc6QERL3VCgAAYEhSV86lMlAi
YQ7JVAkAAICBMSuHYtlmxUKaU+NIbQAAYAjMyqFoOnNYmCoBAAAwELpyKJrOHBZG1fqqDAAAQM/p
yqF4OnNYmFfrgzIAAAA9pyuH4glzWOVUKwAAoM+uwwlWYJsVP0gJ9zNlAAAAeuj3MO8TdObwA2+M
AABAH127X4GaMIfveXMEAAD66EIJoGabFff5Uq3nygAAAPRE6soZKQPUdOZwHwPFAACAPpkoASzp
zOEhBiEDAAB98KlaY2WAJZ05PGSqBAAAQA9cKAF8S2cODxlV66syAAAAHdKVA/fQmcND5tX6oAwA
AECHJkoAPxLm8BiDkAEAgK68i/pLZuA7tlnxlPTmeaIMAADAAd1W6zSEOXAvnTk85UIJAACAA0u7
BObKAPfTmcM6HFMOAAAcSurKGTX3IcA9dOawDrNzAACAQ7kIQQ48SmcO6ziOusVRdw4AALBP11F3
5QCP0JnDOlIqPlUGAABgz86VAJ6mM4d1jar1VRkAAIA9+VStsTLA03TmsK55td4pAwAAsCcXSgDr
0ZnDJkahOwcAAGhf+uJ4ogywHp05bGIeunMAAID2XSgBrE+YgzdZAACgS39F/cUxsCZhDptKb7K6
cwAAgDbcVutSGWAzwhy2caEEAABAC9JR5DfKAJsR5rCNeejOAQAAdnNVrakywOacZsW2RuFkKwAA
YHu/VWumDLA5nTlsa16tN8oAAABs4UMIcmBrOnPYxXHUoc4zpQAAADbwSzjBCramM4ddpEFlJs8D
AACbcBQ57EhnDrvSnQMAAKzrulqn4QQr2InOHHaV3oTPlQEAAFjDRQhyYGc6c2jLvFonygAAADzg
U7XGygC705lDWyZKAAAAPEJHP7REmENbZlEn7QAAAN97U60vygDtsM2KNo2q9VUZAACAFbfNvYJZ
OdASnTm0aR514g4AALCQtlcJcqBFOnNom6PKAQCABUOPYQ905tA2R5UDAAAL7g1gD4Q57MM0DEMG
AIDSGXoMe2KbFftyWq3PygAAAEUy9Bj2SGcO+5IS+L+UAQAAimToMeyRzhz2KQ1DTqHOiVIAAEAx
DD2GPdOZwz6lJH6iDAAAUBRDj2HPhDns26xaH5QBAACKkEYtGHoMe2abFYeQtlvNq/VMKQAAIFvX
UR+EYlYO7JnOHA7BdisAAMifocdwIMIcDuV92G4FAAC5+tB85gcOwDYrDsl2KwAAyM9t1Nur5koB
h6Ezh0Oy3QoAAPJzEYIcOCidOXQhtV++VAYAABi8q6i7coADEubQBdutAAAgD7+Go8jh4Gyzogtp
u9WZMgAAwKC9CUEOdEJnDl26rNZrZQAAgMG5jnp7laPIoQPCHLqWkvznygAAAIPyW7VmygDdsM2K
rk2iPsoQAAAYhnchyIFO6cyhDybVeqsMAADQe+mL2FHYXgWd0plDH0yr9UEZAACg9yYhyIHO6cyh
L9Jx5Wl+zolSAABAL6UvYJ1KCz0gzKFP0jT8WbWeKQUAAPTKbfN5fa4U0D3brOiT1JlzrgwAANA7
FyHIgd7QmUMfTav1ShkAAKAXPlVrrAzQH8Ic+ijNz5lV67lSAABAp2yvgh6yzYo+StPxz5pfHAAA
QHcuQpADvaMzhz4bV+ujMgAAQCdsr4Ke0plDn82q9YcyAADAwaUu+YkyQD8Jc+i7y2q9UwYAADio
i7C9CnrLNiuGIh1bbiAyAADsn+1V0HPCHIYinXCVAp0TpQAAgL1xehUMgG1WDIUTrgAAYP8uQpAD
vaczh6FJgc4/ygAAAK2zvQoGQmcOQ/O+Wr8rAwAAtMrpVTAgwhyGaFqtN8oAAACtmYTtVTAYtlkx
ZNNqvVIGAADYyYeoxxkAAyHMYehm1XqhDAAAsJW0vWoU9YEjwEDYZsXQpW8QrpQBAAC2Mvl/9u73
uont6gPwjle+QwdXqQCnAiYVQCq4ooJABTEdQAURFcRUEFFB7Ape04FdAe/szMyVbGxsyfoz58zz
rHWWMAFyvf1Bs37ae58Q5EBxhDmULt94mhDoAADApnIP5bkyQHmMWVGLWXsu2vNCKQAA4FHf23Ma
unKgSDpzqMVVdB06N0oBAACPynUFghwolDCHmmRnThMCHQAA+JWP/bMzUChjVtQo20WXYeQKAADu
uuyfl4GC6cyhRjp0AADgZ/l8/FYZoHzCHGol0AEAgNveR7drEiicMStqZ+QKAAAivoauHKiGMIcp
EOgAADBlriGHyhizYgqMXAEAMGXzEORAVYQ5TIVABwCAKcpryJfKAHUxZsXUGLkCAGAqXEMOldKZ
w9To0AEAYApcQw4VE+YwRUOg810pAACo1DxcQw7VEuYwVRnoZMvppVIAAFCZL+05Vwaol505TN3L
6HbovFIKAAAqkB9WNuH2Kqiazhym7rp/s/uqFAAAFC735MxDkAPVE+ZA92aXy+G+KAUAAAV7H906
AaBywhxYmbfngzIAAFCg7DRfKANMg5058LN5e/6lDAAAFCJvac3LPYxXwUQIc+B++Wa4bM8LpQAA
YOT+GsarYFKMWcH9XF0OAEAJPoQgByZHmAMPuwo3XQEAMF55gccnZYDpMWYFT5Nvkv9QBgAARiI7
yJuwJwcmSWcOPE1e8/iuPTdKAQDAkeUz6TwEOTBZwhx4ukV0n358VwoAAI4oP2i0JwcmTJgDmxkW
I39TCgAAjiD35CyUAaZNmAOby3bWpj0flQIAgAPKPTnvlQGwABmep2nPeXteKAUAAHuUe3KyQ/xK
KQCdOfA8y/5N9VIpAADYo3kIcoCeMAeeL99UM9AxdgUAwD7kc+a5MgADY1awW00YuwIAYHe+9c+Y
AH/QmQO7tWzPrD1flQIAgGf63p63ygDcJcyB3bvu33Q/RLeoDgAANnXTP1NeKwVwlzAH9udTdC2x
liMDALCpvIL8QhmA+whzYL/yDdhyZAAANvG5PQtlAB5iATIczmn/pvxKKQAAeICFx8CjdObA4ejS
AQDgVyw8Bp5EZw4chy4dAADW5cLjJuzJAZ5AZw4cx3qXjhuvAACw8Bh4Mp05cHyz6Lp0XisFAMAk
5cLj98oAPJUwB8Yj56MX7XmhFAAAk2HhMbAxY1YwHufRdel8VgoAgEm4DAuPgS3ozIFxyn06n8Lo
FQBArSw8BramMwfG6aJ/c38X3RWVAADUZR6CHGBLwhwYt0W49QoAoDYfohuxB9iKMSsox6w9Z+35
XSkAAIr1JbquHICtCXOgPE10oY59OgAAZcmFx6fKADyXMAfK1US3JPmVUgAAjF7uQcwg51opgOey
MwfKtewfCCxJBgAYt9x9mFeQC3KAnRDmQPkW0e3TEeoAAIzTPNxcBeyQMAfqsQihDgDA2OSzmZur
gJ0S5kB9FiHUAQAYgy/9sxnATlmADPWbR3f71W9KAQBwMF+j25MDsHPCHJiOfJh4H640BwDYt7yC
vAkLj4E9EebA9OSDRYY6b5QCAGDn8uaqWQhygD2yMwemZxldl85fopvjvlESAICdyOeqJgQ5wJ7p
zAFeRrdXJ7t17NUBANje38PNVcABCHOAdU0YwQIA2EbeJLpQBuAQhDnAfWbRdevk0a0DAPBrn6P7
QAzgIIQ5wGNyv848dOsAANznS/+sBHAwwhzgqYbdOnleKQcAwP+uID9VBuDQhDnANvKhZR5d144x
LABgijLIacLNVcARCHOA58pgJ2fEM9h5oRwAwATkFeSzEOQARyLMAXbpbX+a0LEDANTppn/WuVAK
4FiEOcC+GMUCAGr01xDkAEcmzAEOYRarrp3XygEAFOpdexbKABybMAc4tLwVqwnjWABAWQQ5wGgI
c4Bjm8Uq2MljiTIAMDafo7vwAWAUhDnA2OSunSaEOwDAOHyJbg8gwGgIc4Cxm8Uq2Mmg55WSAAAH
IsgBRkmYA5SoiVW4k8feHQBg1y775wyA0RHmALVo+geuWaxCHiNaAMA2Lvtni2ulAMZImAPULG/O
GoKd4RatfDWqBQA8RJADjJ4wB5iq2QNH2AMA03XTPw8IcoBRE+YAPGzWnzR090SsOn7WGesCgLJl
kNO050IpgLET5gDsTwY8i9DpAwBjJ8gBinKiBAB78bY9yxDkAMDYCXKA4ghzAHbvU3v+HcauAKAE
+QGMIAcoyp+VAGBncpfOeXteKwUAFOFddJ20AEXRmQOwG017rkKQAwClyCBnoQxAiYQ5AM931p7/
hLEqACiFIAcomjErgO0ZqwKA8ghygOLpzAHYThPGqgCgNIIcoArCHIDNnYWxKgAozYcQ5ACV+NOP
Hz9UAeBpZtGNVb1SCgAoypf2zJUBqIXOHICnedueixDkAEBpBDlAdYQ5AL+WS44X7fl3GKsCgNII
coAquc0K4GGn0QU5unEAoDyCHKBaOnMA7nfWnv+GIAcASiTIAaqmMwfgtll03TiuHAeAMglygOrp
zAFYGZYcC3IAoEyCHGASdOYArJYcv1EKACiWIAeYDGEOMHVNe87DTVUAUDJBDjApxqyAqcpunE/t
+U8IcgCgZIIcYHJ05gBT1EQ3VvWbUgBA0QQ5wCTpzAGmZL0bR5ADAGUT5ACTJcwBpqKJ7qaqfygF
ABTvYwhygAkzZgXULrtxzkKIAwC1eBfduDTAZAlzgJo1YTcOANREkAMQxqyAOr3sH/TsxgGAeghy
AHo6c4DavO0f9Fw3DgD1EOQArNGZA9Ri1p7z9vw7BDkAUBNBDsAdwhygBu+ju6nqjVIAQDVu2vP3
EOQA/MSYFVCy0/Z8as9rpQCAqmSQ00T3YQ0AdwhzgBLlguPsxvmnUgBAdQQ5AI8Q5gClyQXH2Y3j
lioAqI8gB+AJ7MwBSjGL1YJjQQ4A1OcyuhFqQQ7AI3TmACU4i26syi1VAFCnDHKa9lwrBcDjhDnA
mOVD3SJ04gBAzQQ5ABsyZgWM0Sy6kar/hCAHAGr2JQQ5ABvTmQOMiVuqAGA6MsiZKwPA5oQ5wFjk
w9xZ6MQBgCkQ5AA8gzAHOLa8tSKvGn+tFAAwCe+i24kHwJbszAGOZdY/yP03BDkAMBWCHIAd0JkD
HNqwF8dV4wAwHTfteduepVIAPJ8wBzikediLAwBTk0FO054LpQDYDWEOcAj5AJd7cV4pBQBMymV0
HTlXSgGwO8IcYJ9m0c3F24kDANOTQU7TnmulANgtC5CBfZhFF+L8XwhyAGCK8urxJgQ5AHuhMwfY
pWG58T+VAgAmK4OcuTIA7I8wB9gFN1QBAMnV4wAHIMwBnisDnLMQ4gDAlN30zwQLpQDYP2EOsK15
uGYcAHD1OMDBWYAMbGoe3fWi/wpBDgBMXd5YdRqCHICD0pkDPNU8dOIAACvf2vM23FgFcHA6c4DH
zEMnDgBwm6vHAY5IZw7wkHnoxAEAfubGKoAjE+YAd81DiAMA/Oymf044VwqA4xLmAIN8ODsLIQ4A
8LPv0e3HsegYYASEOTBtL9vzProgR4gDANwnb6xqwn4cgNEQ5sA0DSFOnhfKAQA8IBcdz5UBYFyE
OTAts+hGqbJNWogDAPzKh/Z8UgaA8RHmwDScRteF87tSAACPsOgYYOSEOVC3JrpOnNdKAQA8Qe7H
mYdFxwCjJsyBOuVD2FlYagwAPN3X/hnComOAkRPmQD1m/QOYpcYAwKY+988QABRAmAPla6ILcezD
AQA2lftxMsRZKAVAOYQ5UK55//D1SikAgC18j+6GS/txAAojzIGyzMIoFQDwfN+iC3LsxwEokDAH
ytBEF+C8UQoA4JnsxwEonDAHxutlrLpw3EoFADzXTf9sca4UAGUT5sD4NGGhMQCwW5f984X9OAAV
EObAOOjCAQD25Uv/jGE/DkAlhDlwXLl4cB524QAA+/GhPZ+UAaAuwhw4vFl0n45lkKMLBwDYh9yP
04SxKoAqCXPgMHKMKsObDHFeKQcAsEeuHQeonDAH9ssYFQBwSB/bc6YMAHUT5sDuncZqjOqFcgAA
B3DTP3sslQKgfsIc2I0McOZhDw4AcHiX/TPIlVIATIMwB7Y3i9UYlT04AMAxfI6uIxiACRHmwGZm
IcABAI7vpn8eOVcKgOkR5sDjZiHAAQDG41v/XHKlFADTJMyB++UOnLf9EeAAAGPhtioAhDmwxhJj
AGCs3FYFwB+EOUzd27XjGnEAYIy+RveB07VSAJCEOUzNLLrgpmnPG+UAAEbuQ3s+KQMA64Q5TEET
qwDH/hsAoASX0XXjXCgFAHcJc6jRLG4HOManAICSfI5uybGxKgDuJcyhBi+jC23yWF4MAJQqlxzP
23OuFAD8ijCHUjVr57VyAACF+xbdh1K6cQB4lDCHUjQhvAEA6mTJMQAbEeYwVk0IbwCAullyDMBW
hDmMwbDz5jSENwDANOSS4/fKAMA2hDkcw2msgpt8dV04ADAV36PrxlkqBQDbEuawb3e7bvLVVeEA
wBS5chyAnRDmsEsZ3KyHNnlcEw4ATJ0rxwHYKWEO25r1pwnBDQDAQ75GF+ToxgFgZ4Q5PEUTXXBz
unaMSgEAPEw3DgB7I8xhXRO3O27yVbcNAMBmdOMAsFfCnOmZxarLZlhOnF8LbQAAnkc3DgAHIcyp
0xDUrAc2+eoKcACA/dCNA8DBZJjztn/TufDmU4y7Yc1s7eiwAQA4HN04ABxchjkZ4CzWQoDv7bnq
f73sX6/u+T12b9af1Nzze6+VCABgNHTjAHAUf/rx40e+ZnfH+/b8c4O/m59CXKx9vVz79XqXz/Wd
PzcVQ+fMYOiiSbNYBTT5qpsGAKAcunEAOKohzBlk4LCI/e9W+Xbn618FPsst/v37/s4sVgHKUz30
d+4GNcOfFcoAANTtc3vOQjcOAEd0N8wZvO/fpF4oEQAA/G8VwTysHABgBE4e+P1P0XWefFUiAAAm
7mP/bLxUCgDG4KHOnHV521WGO0aIAACYksvounEulAKAMTl5wp/JxW75ScRH5QIAYAJywfGH/hlY
kAPA6DylM2ddvqFll44rsgEAqFGuGcj9kVdKAcBYnWz45/OTiaY976L7xAIAAGqQC47/Ht2KgSvl
AGDMTrb8e4voruL+rIQAABRuWHB8rhQAlGDTMav7GL0CAKBE36IbqbIXB4CinOzg3zB6BQBASW76
Z9cmBDkAFOhkh//WIoxeAQAwbp/7Z9aFUgBQql2MWd3H6BUAAGNipAqAapzs6d8dRq/yRoDvygwA
wJEYqQKgOid7/vfzRoDs0vkY9ukAAHBYRqoAqNK+xqzuk2+kZ+35XdkBANgjI1UAVO3kgP9fV+2Z
t+dv/RssAADsUo7355h/E4IcACp2yM6cu+bRder85scAAMAz5Dj/p/5cKwcAtTtmmJNeRtcCm+eF
HwcAABv6Et0HhFdKAcBUHDvMGczCPh0AAJ7uW//8uFQKAKZmLGHOIG++yvbY1340AADcI/finIUb
qgCYsLGFOYOmf4O2TwcAgGQvDgD0xhrmDOZhSTIAwNTlXpzcsSjEAYAYf5iTLEkGAJim3IszD8uN
AeCWEsKcQYY6Z+35hx8bAEDVLqP7IG+pFADws5OC/luv+zf1v0TXagsAQF1yufG76C7FWCoHANyv
pM6cu2bRLUl28xUAQNlyufFZdMuNAYBHnBT8334V3a1Xf4tunhoAgLJkiPMxug/pBDkA8EQld+bc
1fQPAa/8WAEARs8NVQCwpZOKvpdldPPVOWf93Y8WAGCUMsTJHYjzEOQAwFZOKvyeFtG16gp1AADG
Yz3EuVIOANjeScXf2yKEOgAAx5a7DXPH4TyEOACwEycT+B4XIdQBADi0IcRpwjXjALBTJxP6Xhch
1AEA2DchDgDs2ckEv+dFCHUAAHZNiAMAB3Iy4e99EUIdAIDnEuIAwIGdKIFQBwBgC0IcADgSYc7K
IoQ6AACPEeIAwJEJc362CKEOAMBdQhwAGIk//fjxQxV+LR9YztrzWikAgAn6Et2HXUulAIBxEOY8
XRNCHQBgOr70zz5XSgEA4yLM2dxpe96353elAAAqJMQBgJET5mxv1j/oCHUAgNLdtOdTf66VAwDG
TZjzfC+j69TJ80I5AICC5GUPixDiAEBRhDm7k6HO2+i6dX5TDgBgxL73zywLpQCA8ghz9mPeH8uS
AYAxyevFz8LNVABQNGHOfjXRjV+9UQoA4IhyqXGOUl0oBQCUT5hzGLPoQp152KsDABzGsNR4EW6m
AoCqCHMOK/fqzKMLduzVAQD2YdiHcx6WGgNAlYQ5x5PLkjPUsVcHANiF3IeTnTjnSgEAdRPmHN9p
dKHO70oBAGwoR6kyvDkLo1QAMBnCnPEwggUAPFWOUg37cIxSAcDECHPGyQgWAHCfr9EFOEapAGDC
hDnjNgu3YAHA1OUo1SK6Tpwr5QAAhDllyBGsoVvnlXIAwCRcxmqUCgDgD8Kc8gwLkzPc0a0DAHUZ
FhpniHOhHADAfYQ55dKtAwD1GLpwMsix0BgA+CVhTh106wBAeXThAABbEebURbcOAIyfLhwA4FmE
OfWahZuwAGAs3EgFAOyMMGca5tF17LxRCgA4qK/RhTjnSgEA7IowZ1pmsRrD+k05AGAvcoxq0R9j
VADAzglzpsvSZADYnWGMKo9lxgDAXglzSBnozMMYFgBsyhgVAHBwwhzW5W1Y8/64DQsA7vctVgGO
MSoA4OCEOTxkFqtgx34dAKZu2IOTAc6VcgAAxyTM4Slyv848unEswQ4AU/E9uvBmEfbgAAAjIsxh
U2/XjsXJANRGgAMAjJ4wh+cQ7ABQg7yJKgOcTyHAAQAKIMxhVwQ7AJRkCHCGAwBQDGEO+yDYAWCM
hhGqPEvlAABKJcxh3wQ7AByTHTgAQHWEORzSEOo04VYsAPYnrxFfhgAHAKiUMIdjcd05ALv0LVYj
VFfKAQDUTJjDGGSw00QX7rxSDgCeIBcYL2MV4FwrCQAwFcIcxmYWXbCTHTtvlAOANcP+m2W4gQoA
mDBhDmNnzw7AtA3jU8uw/wYA4H+EOZTEOBZA/XJ8av36cONTAAB3CHMo1ctYdey49hygbLpvAAA2
IMyhFkPXTgY7r5UDYNTWd9/k0X0DALABYQ41yq6dJlbhjl07AMe1fvNUvl4pCQDA9oQ5TMEsboc7
RrIA9s/oFADAnghzmKJhJGs4wh2A58vwZrl2AADYE2EO3A527NsBeBrhDQDAkQhz4GdNCHcA7hLe
AACMhDAHHmcsC5iaYWHxcOy8AQAYEWEObG4Id4ZXt2UBpbuMLrBZhtumAABGT5gDzzeL2wGP0Sxg
zLLrZj24yV9fKwsAQDmEObAfTdwOeHTvAMeSu24uYhXgXCkJAEDZhDlwGLPoQp31gMfuHWDXhnGp
9fAGAIDKCHPgeE7vHONZwCYENwAAEyXMgXER8AD3GUalrkJwAwAwecIcGL9Z3B7Ryq/t4IE6fY8u
sFnG7fAGAAD+IMyBMr2M2x08s9DFAyUZbpTSbQMAwMaEOVCXWfwc8rxSFjia+0IbV4EDAPAswhyY
hiHYGV7z6OSB3cllxBnQLKMLbfIIbQAA2AthDkzbLFYhT45uNWEnDzxk2GczhDTLWAU3AABwMMIc
4CHrAU/0r/m1sS1q9q1/XUYX2AzjUVdKAwDAWAhzgG3MfnF09TBm62HNfa8AADB6whxgH2b9GW7d
Gl6TXT3syxDUDGNQV/0ZOmwAAKAKwhzgWIaQZz3oWf8941yk4TaoiNsLhZf961UYgQIAYGKEOcDY
zfqThrDn7q/zfzfeVYZhiXBa75h56NcAAMAdwhygNuudPhG3Q5/7vp6FIGgTwxXc65Ybfg0AADyD
MAfgZ7NYdQOtuxsE3dWM8Ht5SpfL8oHfXx9rAgAARuL/BRgAyKFPpLWCtCsAAAAASUVORK5CYII=
"
preserveAspectRatio="none"
height="43.814697"
width="53.892857" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

View file

@ -0,0 +1,38 @@
###
Rangitaki Project
The MIT License
Copyright 2015 mmk2410.
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.
###
###
This is a example JavaScript extension for Rangitaki
###
main = () ->
console.log """
Welcome Developer! \nYou're seeing the output of a
JavaScript extension for the Rangitaki blogging engine.
"""
$(document).ready main()

87
src/coffee/app.coffee Normal file
View file

@ -0,0 +1,87 @@
###
Rangitaki Project
The MIT License
Copyright 2015 mmk2410.
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.
###
main = () ->
# FAB
fabActive = false
$('.fabmenu').click ->
if !fabActive
fabFadeIn()
fabActive = true
else
fabFadeOut()
fabActive = false
# Navigation Drawer
navOpen = false
$('.nav-img, .overlay, .nav-close').click ->
if !navOpen
openNav()
navOpen = true
else
closeNav()
navOpen = false
###
Keyhandling for the navigation drawer.
opens the drawer on 'm' (key code: 77)
closes the drawer on 'Esc' (key code: 27)
###
$(document).keyup (e) ->
if navOpen and e.which is 27
closeNav()
navOpen = false
else if !navOpen and e.which == 77
openNav()
navOpen = true
# Make every link in articles target="_blank"
$('.articletext a').attr 'target', '_blank'
$(document).ready main
fabFadeIn = () ->
$('.subfab').fadeIn 125
$('.fab-img').fadeOut 60, ->
$('.fab-img').attr "src", "./res/img/close.svg"
$('.fab-img').fadeIn 60
fabFadeOut = () ->
$('.subfab').fadeOut 125
$('.fab-img').fadeOut 60, ->
$('.fab-img').attr "src", "./res/img/share.svg"
$('.fab-img').fadeIn 60
openNav = () ->
$('.nav').animate {"left": "0px"}, 125
$('.overlay').show()
$('.overlay').animate {"opacity": "0.4"}, 125
closeNav = () ->
$('.nav').animate {"left": "-301px"}, 125
$('.overlay').animate {"opacity": "0.0"}, 125, ->
$('.overlay').css {"display": "none"}

View file

@ -0,0 +1,179 @@
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
*/
body
font-family: "Roboto", sans-serif
background: #f6f6f6
color: #383838
background-image: url(//example.com/res/img/intro.svg)
background-size: cover
background-attachment: fixed
background-position: top center
background-repeat: no-repeat
.header
background-color: rgba(0, 0, 0, 0.45)
position: fixed
.title
color: #fff
position: absolute
.title > a
color: #fff
.fadeout
background: -moz-linear-gradient(left, rgba(30,87,153,0) 0%, rgba(0, 0, 0, 0.45) 100%)
background: -webkit-linear-gradient(left, rgba(30,87,153,0) 0%,rgba(0, 0, 0, 0.45) 100%)
background: -o-linear-gradient(left, rgba(30,87,153,0) 0%,rgba(0, 0, 0, 0.45) 100%)
background: -ms-linear-gradient(left, rgba(30,87,153,0) 0%,rgba(0, 0, 0, 0.45) 100%)
background: linear-gradient(to right, rgba(30,87,153,0) 0%,rgba(0, 0, 0, 0.45) 100%)
.nav
background-color: #fff
border-right: 1px solid #e0e0e0
.nav-item, .nav-item-static
color: #383838
.nav-item
font-weight: 600
.nav-item:active
background-color: #e2e2e2
.divider
border-bottom: 1px solid #e0e0e0
.card
background: #fff
border-radius: 2px
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
.card a
color: #ff4415
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
transition: border-bottom-color 150ms ease-in-out 100ms
.card a:hover
border-bottom-color: #ff4415
.headline
font-size: 24px
color: #383838!important
text-decoration: none
border-bottom: none!important
.headline:hover
color: #ff4415!important
.date
font-size: 13px
.articletext
font-size: 14px
line-height: 24px
.author
font-size: 13px
.tag
font-size: 13px
.fab
background-color: #ff4415
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
.subfab
background-color: #fff
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
.button
border-width: 1px
border-style: solid
text-transform: uppercase
-webkit-box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
-moz-box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
border-radius: 2px
letter-spacing: 0.4px
font-weight: 700
font-size: 14px
transition-property: box-shadow
transition-delay: 50ms
transition-duration: 125ms
transition-timing-function: ease
-o-transition-property: box-shadow
-o-transition-delay: 50ms
-o-transition-duration: 125ms
-o-transition-timing-function: ease
-moz-transition-property: box-shadow
-moz-transition-delay: 50ms
-moz-transition-duration: 125ms
-moz-transition-timing-function: ease
-webkit-transition-property: box-shadow
-webkit-transition-delay: 50ms
-webkit-transition-duration: 125ms
-webkit-transition-timing-function: ease
.button:hover, .button:hover
-webkit-box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
-moz-box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
.pag_next
background-color: #ff4415
border-color: #ff4415
.pag_prev
background-color: #fff
border-color: #fff
color: #383838
.footer
font-size: 12px
text-align: center
color: #fff
text-shadow: 1px 1px rgba(55, 55, 55, 0.3)
.footer a
color: #fff
text-shadow: 1px 1px rgba(175, 175, 175, 0.3)
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
.footer a:hover
border-bottom-color: #fff
@media screen and (min-width: 1440px)
.nav
background-color: rgba(255, 255, 255, 0.8)

View file

@ -0,0 +1,161 @@
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
*/
body
font-family: "Roboto", sans-serif
background: #303030
color: #fff
.header
background-color: #212121
position: fixed
box-shadow: 2px 0 2px 2px rgba(32, 32, 32, 0.85)
.title
color: #fff
position: absolute
> a
color: #fff
.fadeout
background: -moz-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #212121 100%)
/* FF3.6+
background: -webkit-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #212121 100%)
/* Chrome10+,Safari5.1+
background: -o-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #212121 100%)
/* Opera 11.10+
background: -ms-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #212121 100%)
/* IE10+
background: linear-gradient(to right, rgba(30, 87, 153, 0) 0%, #212121 100%)
/* W3C
.nav
background-color: #424242
border-right: 1px solid #1f1f1f
.nav-item, .nav-item-static
color: #fff
.nav-item
font-weight: 600
&:active
background-color: #383838
.divider
border-bottom: 1px solid #1f1f1f
.card
background: #424242
border-radius: 2px
box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
a
color: #ff4415
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
transition: border-bottom-color 150ms ease-in-out 100ms
&:hover
border-bottom-color: #ff4415
.headline
font-size: 24px
color: #fff !important
text-decoration: none
border-bottom: none !important
&:hover
color: #ff4415 !important
.date
font-size: 13px
.articletext
font-size: 14px
line-height: 24px
.author, .tag
font-size: 13px
.fab
background-color: #ff4415
box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
.subfab
background-color: #424242
box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
.button
text-transform: uppercase
border-width: 1px
border-style: solid
-webkit-box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
-moz-box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
box-shadow: 0 1px 1.5px 1.5px rgba(42, 42, 42, 0.65)
border-radius: 2px
letter-spacing: 0.4px
font-weight: 700
font-size: 14px
transition-property: box-shadow
transition-delay: 50ms
transition-duration: 125ms
transition-timing-function: ease
-o-transition-property: box-shadow
-o-transition-delay: 50ms
-o-transition-duration: 125ms
-o-transition-timing-function: ease
-moz-transition-property: box-shadow
-moz-transition-delay: 50ms
-moz-transition-duration: 125ms
-moz-transition-timing-function: ease
-webkit-transition-property: box-shadow
-webkit-transition-delay: 50ms
-webkit-transition-duration: 125ms
-webkit-transition-timing-function: ease
&:hover
-webkit-box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
-moz-box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
box-shadow: 0.5px 1.8px 2.1px 1.4px rgba(32, 32, 32, 0.85)
.pag_next
background-color: #ff4415
border-color: #ff4415
.pag_prev
background-color: #424242
border-color: #424242
color: #CCCCCC
.footer
font-size: 12px
text-align: center
color: #fff
a
color: #fff
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
&:hover
border-bottom-color: #fff

View file

@ -0,0 +1,156 @@
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
*/
body
font-family: "Roboto", sans-serif
background: #f6f6f6
color: #383838
.header
background-color: #ff4415
position: fixed
box-shadow: 2px 0 2px 2px rgba(62, 62, 62, 0.45)
.title
color: #fff
position: absolute
> a
color: #fff
.fadeout
background: -moz-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #ff4415 100%)
background: -webkit-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #ff4415 100%)
background: -o-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #ff4415 100%)
background: -ms-linear-gradient(left, rgba(30, 87, 153, 0) 0%, #ff4415 100%)
background: linear-gradient(to right, rgba(30, 87, 153, 0) 0%, #ff4415 100%)
/* W3C
.nav
background-color: #fff
border-right: 1px solid #e0e0e0
.nav-item, .nav-item-static
color: #383838
.nav-item
font-weight: 600
&:hover, &:active
background-color: #e2e2e2
.divider
border-bottom: 1px solid #e0e0e0
.card
background: #fff
border-radius: 2px
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
a
color: #ff4415
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
transition: border-bottom-color 150ms ease-in-out 100ms
&:hover
border-bottom-color: #ff4415
.headline
font-size: 24px
color: #383838 !important
text-decoration: none
border-bottom: none !important
&:hover
color: #ff4415 !important
.date
font-size: 13px
.articletext
font-size: 14px
line-height: 24px
.author, .tag
font-size: 13px
.fab
background-color: #ff4415
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
.subfab
background-color: #fff
box-shadow: 0 1px 1.5px 1.5px rgba(62, 62, 62, 0.3)
.button
text-transform: uppercase
border-width: 1px
border-style: solid
-webkit-box-shadow: 0.4px 1px 1.5px 1px #aaa
-moz-box-shadow: 0.4px 1px 1.5px 1px #aaa
box-shadow: 0.4px 1px 1.5px 1px #aaa
border-radius: 2px
letter-spacing: 0.4px
font-weight: 700
font-size: 14px
transition-property: box-shadow
transition-delay: 50ms
transition-duration: 125ms
transition-timing-function: ease
-o-transition-property: box-shadow
-o-transition-delay: 50ms
-o-transition-duration: 125ms
-o-transition-timing-function: ease
-moz-transition-property: box-shadow
-moz-transition-delay: 50ms
-moz-transition-duration: 125ms
-moz-transition-timing-function: ease
-webkit-transition-property: box-shadow
-webkit-transition-delay: 50ms
-webkit-transition-duration: 125ms
-webkit-transition-timing-function: ease
&:hover
-webkit-box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa
-moz-box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa
box-shadow: 0.5px 1.8px 2.1px 1.4px #aaa
.pag_next
background-color: #ff4415
border-color: #ff4415
.pag_prev
background-color: #fff
border-color: #fff
color: #383838
.footer
font-size: 12px
text-align: center
a
color: #383838
text-decoration: none
border-bottom: 1px solid transparent
border-bottom-color: transparent
&:hover
border-bottom-color: #383838

View file

@ -0,0 +1,194 @@
/*
*The MIT License
*
*Copyright 2015 mmk2410.
*
*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.
/*
* Created on : Jun 18, 2015, 6:39:37 PM
* Author : mmk2410
$font: "Fira Sans", sans-serif
$background: #f0f0f0
$text-color: #383838
$primary-color: #4CAF50
$header-shadow: rgba(62, 62, 62, 0.45)
$white: #FFFFFF
$fadeout-color: rgba(30, 87, 153, 0)
$border: #e0e0e0
$active-color: #e2e2e2
$fab-shadow: rgba(62, 62, 62, 0.3)
$footer-background: #2D2D2D
body
font-family: $font
background: $background
color: $text-color
margin: 130px 0 0
::selection, ::-moz-selection
color: $background
background-color: $primary-color
.header
height: 55px
background-color: $primary-color
position: fixed
box-shadow: 2px 0 2px 2px $header-shadow
.title
line-height: 55px
color: $white
position: absolute
left: 0
margin-left: calc(20% + 24px)
> a
color: $white
text-decoration: none
.fadeout
height: 55px
background: -moz-linear-gradient(left, $fadeout-color 0%, $primary-color 100%)
background: -webkit-linear-gradient(left, $fadeout-color 0%, $primary-color 100%)
background: -o-linear-gradient(left, $fadeout-color 0%, $primary-color 100%)
background: -ms-linear-gradient(left, $fadeout-color 0%, $primary-color 100%)
background: linear-gradient(to right, $fadeout-color 0%, $primary-color 100%)
.nav-img
padding: 14px 19px
.nav
background-color: $white
border-right: 1px solid $border
.nav-item, .nav-item-static
color: $text-color
.nav-item
font-weight: 600
&:hover
color: $primary-color
&:active
background-color: $active-color
.divider
border-bottom: 1px solid $border
.card
background: none
border-radius: 0
box-shadow: none
margin: 0 20% 100px
width: auto
a
color: $primary-color
text-decoration: none
border-bottom: 1px solid transparent
transition: border-bottom-color 150ms ease-in-out 100ms
&:hover
border-bottom-color: #4CAF50
.headline
font-size: 30px
line-height: 50px
color: #383838 !important
text-decoration: none
border-bottom: none !important
&:hover
color: #4CAF50 !important
.date
font-size: 13px
.articletext
margin-top: 30px
font-size: 16px
line-height: 30px
.author, .tag
font-size: 13px
.fab
background-color: $primary-color
box-shadow: 0 1px 1.5px 1.5px $fab-shadow
.subfab
background-color: $white
box-shadow: 0 1px 1.5px 1.5px $fab-shadow
.button
color: $primary-color
border-bottom: 1px solid transparent
margin: 0
min-width: 0
padding: 0
line-height: 16px
height: 16px
transition-property: border-bottom-color
transition-delay: 50ms
transition-duration: 125ms
transition-timing-function: ease
-moz-transition-property: border-bottom-color
-moz-transition-delay: 50ms
-moz-transition-duration: 125ms
-moz-transition-timing-function: ease
-webkit-transition-property: border-bottom-color
-webkit-transition-delay: 50ms
-webkit-transition-duration: 125ms
-webkit-transition-timing-function: ease
&:hover
border-bottom-color: $primary-color
.pag_prev
float: left
.button:last-child
float: none
.footer
text-align: center
height: 60px
background-color: $footer-background
line-height: 60px
width: 100%
color: $white
a
color: $white
text-decoration: none
border-bottom: 1px solid transparent
&:hover
border-bottom-color: $white
.hljs
background: none
@media screen and (min-width: 1440px)
.title
margin-left: calc(20% - 40px)
.nav
padding-top: 55px
@media screen and (max-width: 800px)
body
margin-top: 80px
.title
margin-left: 20%
.card
margin: 0 5% 100px

46
src/sass/no-nav.sass Normal file
View file

@ -0,0 +1,46 @@
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
* A stylesheet for overriding the default styles if the navigation drawer is disabled
*/
.nav
display: none
.nav-img
display: none
@media screen and (min-width: 1440px)
.header
left: 0
.main
margin-left: 0
width: 100%
@media screen and (max-width: 720px)
.title
left: 25px

252
src/sass/rangitaki.sass Normal file
View file

@ -0,0 +1,252 @@
/*
* Rangitaki Project
*
* The MIT License
*
* Copyright 2015 mmk2410.
*
* 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.
*
* A stylesheet for overriding the default styles if the navigation drawer is disabled
*/
/* BODY */
body
margin-top: 94px
.main
height: 100%
margin-left: 0
.overlay
opacity: 0
position: fixed
top: 0
left: 0
background-color: black
width: 100%
z-index: 30
height: 100%
display: none
/* HEADER */
.header
top: 0
right: 0
left: 0
width: 100%
height: 64px
position: absolute
.title
color: #fff
font-size: 23px
text-decoration: none
line-height: 64px
vertical-align: middle
left: 75px
.title > a
text-decoration: none
color: #fff
.fadeout
position: absolute
height: 64px
top: 0
right: 0
width: 40px
.nav-img
height: 26px
padding: 19px
cursor: pointer
/* NAV DRAWER */
.nav
width: 300px
position: fixed
height: 100%
top: 0
left: -301px
z-index: 40
.nav-item, .nav-item-static
text-decoration: none
text-indent: 0
display: inline-block
height: 48px
vertical-align: middle
width: 284px
line-height: 48px
padding-left: 16px
transition: background-color 125ms ease-in-out 0ms
.nav-close
cursor: pointer
.nav-close-img
height: 35px
padding: 12px
.nav-item
cursor: pointer
.divider
width: 100%
/* MAIN */
.card
margin-right: auto
margin-left: auto
width: 75%
padding: 24px
margin-bottom: 40px
max-width: 1160px
.card a
-moz-hyphens: auto
-epub-hyphens: auto
-ms-hyphens: auto
-webkit-hyphens: auto
hyphens: auto
word-wrap: break-word
.card a:hover
.headline
display: block
padding-bottom: 8px
.card img
max-width: 100%
max-height: 400px
display: block
margin-left: auto
margin-right: auto
.date
.articletext
.author
display: block
.tag
.readmore
padding: 12px 0 25px 0
/* FAB */
.fabmenu
position: fixed
bottom: 20px
right: 20px
.fab
height: 60px
width: 60px
border-radius: 30px
cursor: pointer
.fab-img
width: 28px
padding: 15px
.subfab
height: 45px
width: 45px
border-radius: 30px
margin-right: auto
margin-left: auto
margin-bottom: 25px
display: none
.subfab-img
width: 22px
padding: 12px
/* BUTTON */
.pag_buttons
margin-right: auto
margin-left: auto
width: calc(75% + 48px)
margin-bottom: 80px
max-width: 1160px
text-align: right
.button
text-decoration: none
color: #fff
line-height: 36px
min-width: 64px
text-align: center
height: 36px
padding: 8px
margin-top: 4px
margin-bottom: 5px
cursor: pointer
.pag_next
margin-left: 8px
/* FOOTER */
.footer
.footer a
transition: border-bottom-color 150ms ease-in-out 100ms
.footer a:hover
border-bottom-color: #383838
@media screen and (min-width: 1440px)
.nav
left: 0
padding-top: 64px
.nav-close-img
display: none
.nav-close
display: none
.nav-img
display: none
.header
left: 300px
.main
margin-left: 300px
width: calc(100% - 300px)
@media screen and (max-width: 720px)
.card
width: 82%
.pag_buttons
width: calc(82% + 48px)

View file

@ -0,0 +1,91 @@
<?php
require_once 'PHPUnit/Autoload.php';
include 'res/php/ArticleGenerator.php';
class ArticleGeneratorTest extends \PHPUnit_Framework_TestCase
{
public function testGetArray()
{
$result = [
"title" => "The Rangitaki logo 2",
"date" => "24 July 2015",
"tags" => array(
"design", "artwork", "logo",
),
"author" => "",
"text" => "
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.
",
];
$this->assertEquals(
$result,
ArticleGenerator::getArray("articles/example/", "2015-07-25-example.md")
);
}
public function testGetText()
{
$result = "
This is the official Rangitaki logo.
![The Rangitaki logo](media/example.png)
It is saved in the example blog directory.
";
$this->assertEquals(
$result,
ArticleGenerator::getText("articles/example/", "2015-07-25-example.md")
);
}
public function testGetAuthor()
{
$result = "";
$this->assertEquals(
$result,
ArticleGenerator::getAuthor("articles/example/", "2015-07-25-example.md")
);
}
public function testGetSummary()
{
$result = "This is the official Rangitaki logo.";
$this->assertEquals(
$result,
ArticleGenerator::getSummary("articles/example/", "2015-07-25-example.md")
);
}
public function testGetTags()
{
$result = [ "design", "artwork", "logo" ];
$this->assertEquals(
$result,
ArticleGenerator::getTags("articles/example/", "2015-07-25-example.md")
);
}
public function testGetDate()
{
$result = "24 July 2015";
$this->assertEquals(
$result,
ArticleGenerator::getDate("articles/example/", "2015-07-25-example.md")
);
}
public function testGetTitle()
{
$result = "The Rangitaki logo 2";
$this->assertEquals(
$result,
ArticleGenerator::getTitle("articles/example/", "2015-07-25-example.md")
);
}
}

View file

@ -0,0 +1,39 @@
<?php
use PHPUnit\Framework\TestCase;
require 'res/php/BlogListGenerator.php';
use mmk2410\rbe\BlogListGenerator\BlogListGenerator as BlogListGenerator;
class BlogListGeneratorTest extends TestCase
{
public function testListBlog()
{
$this->assertEquals("<a class='nav-item' href='./?blog=example'>Example</a>",
BlogListGenerator::listBlog("./blogs/", "example.md", "Example Blog")
);
$this->assertEquals("<a class='nav-item' href='https://mmk2410.org/rangitaki/docs/'>Docs</a>",
BlogListGenerator::listBlog("./blogs/", "external.md", "Example Blog")
);
}
public function testGetName()
{
$this->assertEquals("Example", BlogListGenerator::getName("blogs/example.md"));
}
public function testGetArticleAmount()
{
$this->assertEquals(5, BlogListGenerator::getArticleAmount("example"));
}
public function testGetExternaleLink()
{
$this->assertEquals(null,
BlogListGenerator::getExternalLink("example.md", '.')
);
$this->assertEquals("https://mmk2410.org/rangitaki/docs/",
BlogListGenerator::getExternalLink("external.md", '.')
);
}
}

83
tests/ConfigTest.php Normal file
View file

@ -0,0 +1,83 @@
<?php
namespace mmk2410\rbe\tests\config;
require_once 'PHPUnit/Autoload.php';
require 'res/php/Config.php';
use \mmk2410\rbe\config\Config as Config;
class ConfigTest extends \PHPUnit_Framework_TestCase
{
public function testGetConfig()
{
$config = [
"blog" => array(
"title" => "Example Blog",
"author" => "John",
"description" => "A short description of your blog",
"home" => "on",
"homeurl" => "../",
"homename" => "Home",
"mainname" => "",
"intro" => "on",
"disqus" => "rangitaki",
"analytics" => "",
"footer" =>
"Rangitaki 2016 <a href=\"https://gitlab.com/mmk2410/rangitaki\" target=\"blank\">\n gitlab.com/mmk2410/rangitaki</a>", "url" => "https://example.com/blog/",
),
"design" => array(
"fab" => "on",
"drawer" => "on",
"theme" => "material-light",
"pagination" => 0,
"favicon" => "http://example.com/res/img/favicon.png",
),
"rcc" => array(
"rcc" => "on",
"api" => "on",
),
"language" => "en",
];
$configParser = new Config("./config.yaml", "./vendor/autoload.php");
$this->assertEquals($config, $configParser->getConfig());
}
public function testWriteReadConfig()
{
$changedConfig = [
"blog" => array(
"title" => "Examples Blog",
"author" => "Wilson O'Sullivan",
"description" => "A long description of your blog",
"home" => "on",
"homeurl" => "../",
"homename" => "Exit",
"mainname" => "",
"intro" => "on",
"disqus" => "",
"analytics" => "",
"footer" =>
"pBlog 1102 <a href=\"https://gitlab.com/mmk2410/rangitaki\" target=\"blank\">
\n gitlab.com/mmk2410/rangitaki</a>", "url" => "https://example.com/blog/",
),
"design" => array(
"fab" => "off",
"drawer" => "off",
"theme" => "material-dark",
"pagination" => "-1",
"favicon" => "http://sample.com/res/img/favicon.png",
),
"rcc" => array(
"rcc" => "on",
"api" => "off",
),
"language" => "en",
];
$configParser = new Config("/tmp/config-test.yaml", "./vendor/autoload.php");
$configParser->writeConfig($changedConfig);
$this->assertEquals($changedConfig, $configParser->getConfig());
}
}

View file

@ -0,0 +1,3 @@
body{font-family:"Roboto", sans-serif;background:#f6f6f6;color:#383838;background-image:url(//example.com/res/img/intro.svg);background-size:cover;background-attachment:fixed;background-position:top center;background-repeat:no-repeat}.header{background-color:rgba(0,0,0,0.45);position:fixed}.title{color:#fff;position:absolute}.title>a{color:#fff}.fadeout{background:-moz-linear-gradient(left, rgba(30,87,153,0) 0%, rgba(0,0,0,0.45) 100%);background:-webkit-linear-gradient(left, rgba(30,87,153,0) 0%, rgba(0,0,0,0.45) 100%);background:-o-linear-gradient(left, rgba(30,87,153,0) 0%, rgba(0,0,0,0.45) 100%);background:-ms-linear-gradient(left, rgba(30,87,153,0) 0%, rgba(0,0,0,0.45) 100%);background:linear-gradient(to right, rgba(30,87,153,0) 0%, rgba(0,0,0,0.45) 100%)}.nav{background-color:#fff;border-right:1px solid #e0e0e0}.nav-item,.nav-item-static{color:#383838}.nav-item{font-weight:600}.nav-item:active{background-color:#e2e2e2}.divider{border-bottom:1px solid #e0e0e0}.card{background:#fff;border-radius:2px;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.card a{color:#ff4415;text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent;transition:border-bottom-color 150ms ease-in-out 100ms}.card a:hover{border-bottom-color:#ff4415}.headline{font-size:24px;color:#383838 !important;text-decoration:none;border-bottom:none !important}.headline:hover{color:#ff4415 !important}.date{font-size:13px}.articletext{font-size:14px;line-height:24px}.author{font-size:13px}.tag{font-size:13px}.fab{background-color:#ff4415;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.subfab{background-color:#fff;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.button{border-width:1px;border-style:solid;text-transform:uppercase;-webkit-box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);-moz-box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);border-radius:2px;letter-spacing:0.4px;font-weight:700;font-size:14px;transition-property:box-shadow;transition-delay:50ms;transition-duration:125ms;transition-timing-function:ease;-o-transition-property:box-shadow;-o-transition-delay:50ms;-o-transition-duration:125ms;-o-transition-timing-function:ease;-moz-transition-property:box-shadow;-moz-transition-delay:50ms;-moz-transition-duration:125ms;-moz-transition-timing-function:ease;-webkit-transition-property:box-shadow;-webkit-transition-delay:50ms;-webkit-transition-duration:125ms;-webkit-transition-timing-function:ease}.button:hover,.button:hover{-webkit-box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85);-moz-box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85);box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85)}.pag_next{background-color:#ff4415;border-color:#ff4415}.pag_prev{background-color:#fff;border-color:#fff;color:#383838}.footer{font-size:12px;text-align:center;color:#fff;text-shadow:1px 1px rgba(55,55,55,0.3)}.footer a{color:#fff;text-shadow:1px 1px rgba(175,175,175,0.3);text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent}.footer a:hover{border-bottom-color:#fff}@media screen and (min-width: 1440px){.nav{background-color:rgba(255,255,255,0.8)}}
/*# sourceMappingURL=background-img.css.map */

File diff suppressed because one or more lines are too long

3
themes/material-dark.css Normal file
View file

@ -0,0 +1,3 @@
body{font-family:"Roboto", sans-serif;background:#303030;color:#fff}.header{background-color:#212121;position:fixed;box-shadow:2px 0 2px 2px rgba(32,32,32,0.85)}.title{color:#fff;position:absolute}.title>a{color:#fff}.fadeout{background:-moz-linear-gradient(left, rgba(30,87,153,0) 0%, #212121 100%);background:-webkit-linear-gradient(left, rgba(30,87,153,0) 0%, #212121 100%);background:-o-linear-gradient(left, rgba(30,87,153,0) 0%, #212121 100%);background:-ms-linear-gradient(left, rgba(30,87,153,0) 0%, #212121 100%);background:linear-gradient(to right, rgba(30,87,153,0) 0%, #212121 100%)}.nav{background-color:#424242;border-right:1px solid #1f1f1f}.nav-item,.nav-item-static{color:#fff}.nav-item{font-weight:600}.nav-item:active{background-color:#383838}.divider{border-bottom:1px solid #1f1f1f}.card{background:#424242;border-radius:2px;box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65)}.card a{color:#ff4415;text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent;transition:border-bottom-color 150ms ease-in-out 100ms}.card a:hover{border-bottom-color:#ff4415}.headline{font-size:24px;color:#fff !important;text-decoration:none;border-bottom:none !important}.headline:hover{color:#ff4415 !important}.date{font-size:13px}.articletext{font-size:14px;line-height:24px}.author,.tag{font-size:13px}.fab{background-color:#ff4415;box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65)}.subfab{background-color:#424242;box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65)}.button{text-transform:uppercase;border-width:1px;border-style:solid;-webkit-box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);-moz-box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);box-shadow:0 1px 1.5px 1.5px rgba(42,42,42,0.65);border-radius:2px;letter-spacing:0.4px;font-weight:700;font-size:14px;transition-property:box-shadow;transition-delay:50ms;transition-duration:125ms;transition-timing-function:ease;-o-transition-property:box-shadow;-o-transition-delay:50ms;-o-transition-duration:125ms;-o-transition-timing-function:ease;-moz-transition-property:box-shadow;-moz-transition-delay:50ms;-moz-transition-duration:125ms;-moz-transition-timing-function:ease;-webkit-transition-property:box-shadow;-webkit-transition-delay:50ms;-webkit-transition-duration:125ms;-webkit-transition-timing-function:ease}.button:hover{-webkit-box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85);-moz-box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85);box-shadow:0.5px 1.8px 2.1px 1.4px rgba(32,32,32,0.85)}.pag_next{background-color:#ff4415;border-color:#ff4415}.pag_prev{background-color:#424242;border-color:#424242;color:#CCCCCC}.footer{font-size:12px;text-align:center;color:#fff}.footer a{color:#fff;text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent}.footer a:hover{border-bottom-color:#fff}
/*# sourceMappingURL=material-dark.css.map */

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,3 @@
body{font-family:"Roboto", sans-serif;background:#f6f6f6;color:#383838}.header{background-color:#ff4415;position:fixed;box-shadow:2px 0 2px 2px rgba(62,62,62,0.45)}.title{color:#fff;position:absolute}.title>a{color:#fff}.fadeout{background:-moz-linear-gradient(left, rgba(30,87,153,0) 0%, #ff4415 100%);background:-webkit-linear-gradient(left, rgba(30,87,153,0) 0%, #ff4415 100%);background:-o-linear-gradient(left, rgba(30,87,153,0) 0%, #ff4415 100%);background:-ms-linear-gradient(left, rgba(30,87,153,0) 0%, #ff4415 100%);background:linear-gradient(to right, rgba(30,87,153,0) 0%, #ff4415 100%)}.nav{background-color:#fff;border-right:1px solid #e0e0e0}.nav-item,.nav-item-static{color:#383838}.nav-item{font-weight:600}.nav-item:hover,.nav-item:active{background-color:#e2e2e2}.divider{border-bottom:1px solid #e0e0e0}.card{background:#fff;border-radius:2px;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.card a{color:#ff4415;text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent;transition:border-bottom-color 150ms ease-in-out 100ms}.card a:hover{border-bottom-color:#ff4415}.headline{font-size:24px;color:#383838 !important;text-decoration:none;border-bottom:none !important}.headline:hover{color:#ff4415 !important}.date{font-size:13px}.articletext{font-size:14px;line-height:24px}.author,.tag{font-size:13px}.fab{background-color:#ff4415;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.subfab{background-color:#fff;box-shadow:0 1px 1.5px 1.5px rgba(62,62,62,0.3)}.button{text-transform:uppercase;border-width:1px;border-style:solid;-webkit-box-shadow:0.4px 1px 1.5px 1px #aaa;-moz-box-shadow:0.4px 1px 1.5px 1px #aaa;box-shadow:0.4px 1px 1.5px 1px #aaa;border-radius:2px;letter-spacing:0.4px;font-weight:700;font-size:14px;transition-property:box-shadow;transition-delay:50ms;transition-duration:125ms;transition-timing-function:ease;-o-transition-property:box-shadow;-o-transition-delay:50ms;-o-transition-duration:125ms;-o-transition-timing-function:ease;-moz-transition-property:box-shadow;-moz-transition-delay:50ms;-moz-transition-duration:125ms;-moz-transition-timing-function:ease;-webkit-transition-property:box-shadow;-webkit-transition-delay:50ms;-webkit-transition-duration:125ms;-webkit-transition-timing-function:ease}.button:hover{-webkit-box-shadow:0.5px 1.8px 2.1px 1.4px #aaa;-moz-box-shadow:0.5px 1.8px 2.1px 1.4px #aaa;box-shadow:0.5px 1.8px 2.1px 1.4px #aaa}.pag_next{background-color:#ff4415;border-color:#ff4415}.pag_prev{background-color:#fff;border-color:#fff;color:#383838}.footer{font-size:12px;text-align:center}.footer a{color:#383838;text-decoration:none;border-bottom:1px solid transparent;border-bottom-color:transparent}.footer a:hover{border-bottom-color:#383838}
/*# sourceMappingURL=material-light.css.map */

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more