From c85cace48b03b8e94e527bd2f1c70d854f28109e Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 25 Mar 2018 18:12:49 +0100 Subject: [PATCH 01/31] Updated readme, license and added code of conduct --- .github/CODE_OF_CONDUCT.md | 82 ++++++++++++++++++++++++++++++++++++++ LICENSE | 3 +- readme.md | 28 ++++++++----- 3 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..0c45ff61c --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,82 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Project Maintainer Standards + +Project maintainers should generally follow these additional standards: + +* Avoid using a negative or harsh tone in communication, Even if the other party +is being negative themselves. +* Keep the [project definition](https://github.com/BookStackApp/BookStack#project-definition) +in mind when deciding what's in scope of the Project. + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. In addition, Project +maintainers are responsible for following the standards themselves. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at the email address shown on [the profile here](https://github.com/ssddanbrown). All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org diff --git a/LICENSE b/LICENSE index 281814bb8..080c54b3e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License (MIT) -Copyright (c) 2016 Dan Brown +Copyright (c) 2018 Dan Brown and the BookStack Project contributors +https://github.com/BookStackApp/BookStack/graphs/contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/readme.md b/readme.md index a003bcdec..acf1cf3d7 100644 --- a/readme.md +++ b/readme.md @@ -17,7 +17,9 @@ A platform for storing and organising information and documentation. General inf BookStack is an opinionated wiki system that provides a pleasant and simple out of the box experience. New users to an instance should find the experience intuitive and only basic word-processing skills should be required to get involved in creating content on BookStack. The platform should provide advanced power features to those that desire it but they should not interfere with the core simple user experience. -BookStack is not designed as an extensible platform to be used for purposes that differ to the statement above. +BookStack is not designed as an extensible platform to be used for purposes that differ to the statement above. + +In regards to development philosophy, BookStack has a relaxed, open & positive approach. Put simply, At the end of the day this is free software developed and maintained by people donating their own free time. ## Development & Testing @@ -25,17 +27,17 @@ All development on BookStack is currently done on the master branch. When it's t * [Node.js](https://nodejs.org/en/) v6.9+ -SASS is used to help the CSS development and the JavaScript is run through browserify/babel to allow for writing ES6 code. Both of these are done using gulp. To run the build task you can use the following commands: +SASS is used to help the CSS development and the JavaScript is run through babel to allow for writing ES6 code. This is done using webpack. To run the build task you can use the following commands: ``` bash # Build assets for development -npm run-script build +npm run build # Build and minify assets for production -npm run-script production +npm run production # Build for dev (With sourcemaps) and watch for changes -npm run-script dev +npm run dev ``` BookStack has many integration tests that use Laravel's built-in testing capabilities which makes use of PHPUnit. To use you will need PHPUnit installed and accessible via command line. There is a `mysql_testing` database defined within the app config which is what is used by PHPUnit. This database is set with the following database name, user name and password defined as `bookstack-test`. You will have to create that database and credentials before testing. @@ -65,14 +67,16 @@ php resources/lang/check.php php resources/lang/check.php fr php resources/lang/check.php pt_BR ``` - + Some strings have colon-prefixed variables in such as `:userName`. Leave these values as they are as they will be replaced at run-time. - -## Contributing + +## Contributing & Maintenence Feel free to create issues to request new features or to report bugs and problems. Just please follow the template given when creating the issue. -### Standards +The project's code of conduct [can be found here](https://github.com/BookStackApp/BookStack/blob/master/.github/CODE_OF_CONDUCT.md). + +### Code Standards PHP code within BookStack is generally to [PSR-2](http://www.php-fig.org/psr/psr-2/) standards. From the BookStack root folder you can run `./vendor/bin/phpcs` to check code is formatted correctly and `./vendor/bin/phpcbf` to auto-fix non-PSR-2 code. @@ -82,9 +86,9 @@ Pull requests are very welcome. If the scope of your pull request is large it ma Pull requests should be created from the `master` branch and should be merged back into `master` once done. Please do not build from or request a merge into the `release` branch as this is only for publishing releases. -If you are looking to alter CSS or JavaScript content please edit the source files found in `resources/assets`. Any CSS or JS files within `public` are built from these source files and therefore should not be edited directly. +If you are looking to alter CSS or JavaScript content please edit the source files found in `resources/assets`. Any CSS or JS files within `public` are built from these source files and therefore should not be edited directly. -## Website, Docs & Blog +## Website, Docs & Blog The website project docs & Blog can be found in the [BookStackApp/website](https://github.com/BookStackApp/website) repo. @@ -94,6 +98,8 @@ The BookStack source is provided under the MIT License. ## Attribution +The great people that have worked to build and improve BookStack can [be seen here](https://github.com/BookStackApp/BookStack/graphs/contributors). + These are the great open-source projects used to help build BookStack: * [Laravel](http://laravel.com/) From a8f18c0102e396320f87ef78afc2a0a12f383191 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 25 Mar 2018 18:16:53 +0100 Subject: [PATCH 02/31] Updated COC with criticism point --- .github/CODE_OF_CONDUCT.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 0c45ff61c..2c6317af6 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -36,6 +36,8 @@ Project maintainers should generally follow these additional standards: * Avoid using a negative or harsh tone in communication, Even if the other party is being negative themselves. +* When providing criticism, try to make it constructive to lead the other person +down the correct path. * Keep the [project definition](https://github.com/BookStackApp/BookStack#project-definition) in mind when deciding what's in scope of the Project. From 34499658d5a98f9b9c11c9ca7e7db7cc07a34f94 Mon Sep 17 00:00:00 2001 From: Soseki Masao Date: Tue, 27 Mar 2018 16:18:38 +0900 Subject: [PATCH 03/31] update japanese translation --- resources/lang/ja/common.php | 5 +++++ resources/lang/ja/entities.php | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/resources/lang/ja/common.php b/resources/lang/ja/common.php index 185e6116c..e7b7b4a57 100644 --- a/resources/lang/ja/common.php +++ b/resources/lang/ja/common.php @@ -10,6 +10,7 @@ return [ 'save' => '保存', 'continue' => '続ける', 'select' => '選択', + 'more' => 'その他', /** * Form Labels @@ -23,6 +24,7 @@ return [ */ 'actions' => '実行', 'view' => '表示', + 'reply' => '返信', 'create' => '作成', 'update' => '更新', 'edit' => '編集', @@ -44,6 +46,9 @@ return [ 'no_items' => 'アイテムはありません', 'back_to_top' => '上に戻る', 'toggle_details' => '概要の表示切替', + 'details' => '詳細', + 'grid_view' => 'グリッド形式', + 'list_view' => 'リスト形式', /** * Header diff --git a/resources/lang/ja/entities.php b/resources/lang/ja/entities.php index 8d215516d..d3699a4c4 100644 --- a/resources/lang/ja/entities.php +++ b/resources/lang/ja/entities.php @@ -19,7 +19,7 @@ return [ 'meta_created_name' => '作成: :timeLength (:user)', 'meta_updated' => '更新: :timeLength', 'meta_updated_name' => '更新: :timeLength (:user)', - 'x_pages' => ':countページ', + 'x_pages' => ':count ページ', 'entity_select' => 'エンティティ選択', 'images' => '画像', 'my_recent_drafts' => '最近の下書き', @@ -72,7 +72,9 @@ return [ 'books' => 'ブック', 'books_empty' => 'まだブックは作成されていません', 'books_popular' => '人気のブック', + 'x_books' => ':count ブック', 'books_recent' => '最近のブック', + 'books_new' => '新しいブック', 'books_popular_empty' => 'ここに人気のブックが表示されます。', 'books_create' => '新しいブックを作成', 'books_delete' => 'ブックを削除', @@ -104,6 +106,7 @@ return [ 'chapter' => 'チャプター', 'chapters' => 'チャプター', 'chapters_popular' => '人気のチャプター', + 'x_chapters' => ':count チャプター', 'chapters_new' => 'チャプターを作成', 'chapters_create' => 'チャプターを作成', 'chapters_delete' => 'チャプターを削除', @@ -233,4 +236,24 @@ return [ 'profile_not_created_pages' => ':userNameはページを作成していません', 'profile_not_created_chapters' => ':userNameはチャプターを作成していません', 'profile_not_created_books' => ':userNameはブックを作成していません', + + /** + * Comments + */ + 'comment' => 'コメント', + 'comments' => 'コメント', + 'comment_add' => 'コメント追加', + 'comment_placeholder' => 'コメントを記入してく下さい', + 'comment_count' => '{0} コメントはありません|[1,*] コメント:count件', + 'comment_save' => 'コメントを保存', + 'comment_saving' => 'コメントを保存中...', + 'comment_deleting' => 'コメントを削除中...', + 'comment_new' => '新規コメント作成', + 'comment_created' => 'コメントを作成しました :createDiff', + 'comment_updated' => ':username により更新しました :updateDiff', + 'comment_deleted_success' => 'コメントを削除しました', + 'comment_created_success' => 'コメントを追加しました', + 'comment_updated_success' => 'コメントを更新しました', + 'comment_delete_confirm' => '本当にこのコメントを削除しますか?', + 'comment_in_reply_to' => ':commentIdへ返信', ]; From 2fc513984da49cac157ce46d33d0defa16afa165 Mon Sep 17 00:00:00 2001 From: Abijeet Date: Wed, 28 Mar 2018 01:07:01 +0530 Subject: [PATCH 04/31] PSR2 fixes after running `./vendor/bin/phpcbf` Signed-off-by: Abijeet --- app/Entity.php | 1 - app/Repos/EntityRepo.php | 4 +++- app/Services/ImageService.php | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Entity.php b/app/Entity.php index aeeab4960..67edec4e0 100644 --- a/app/Entity.php +++ b/app/Entity.php @@ -201,5 +201,4 @@ class Entity extends Ownable { return '/'; } - } diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index ece9aa305..acdda3c8d 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -774,7 +774,9 @@ class EntityRepo $scriptSearchRegex = '/.*?<\/script>/ms'; $matches = []; preg_match_all($scriptSearchRegex, $html, $matches); - if (count($matches) === 0) return $html; + if (count($matches) === 0) { + return $html; + } foreach ($matches[0] as $match) { $html = str_replace($match, htmlentities($match), $html); diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index ebbcd9351..c2e915e2d 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -192,7 +192,8 @@ class ImageService extends UploadService * @param Image $image * @return boolean */ - protected function isGif(Image $image) { + protected function isGif(Image $image) + { return strtolower(pathinfo($this->getPath($image), PATHINFO_EXTENSION)) === 'gif'; } From 582158f70e6c63980cce17d408a0cc435a0d985f Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Fri, 30 Mar 2018 14:09:51 +0100 Subject: [PATCH 05/31] Added tags to chapters and books Closes #121 --- app/Http/Controllers/ChapterController.php | 9 ++-- app/Repos/EntityRepo.php | 26 ++++++---- resources/assets/js/vues/tag-manager.js | 8 ++-- resources/assets/sass/_blocks.scss | 3 ++ resources/assets/sass/_components.scss | 4 ++ resources/assets/sass/_forms.scss | 3 ++ resources/lang/en/entities.php | 4 +- resources/views/books/form.blade.php | 41 +++++++++------- resources/views/books/show.blade.php | 23 ++++++--- resources/views/chapters/form.blade.php | 9 ++++ resources/views/chapters/show.blade.php | 9 ++++ resources/views/components/tag-list.blade.php | 10 ++++ .../views/components/tag-manager.blade.php | 23 +++++++++ resources/views/pages/form-toolbox.blade.php | 25 ++-------- resources/views/pages/show.blade.php | 11 +---- tests/Entity/TagTest.php | 47 +++++++++++++++---- 16 files changed, 173 insertions(+), 82 deletions(-) create mode 100644 resources/views/components/tag-list.blade.php create mode 100644 resources/views/components/tag-manager.blade.php diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index a4e0b6409..b737afc6d 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -107,17 +107,14 @@ class ChapterController extends Controller * @param $bookSlug * @param $chapterSlug * @return Response + * @throws \BookStack\Exceptions\NotFoundException */ public function update(Request $request, $bookSlug, $chapterSlug) { $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug); $this->checkOwnablePermission('chapter-update', $chapter); - if ($chapter->name !== $request->get('name')) { - $chapter->slug = $this->entityRepo->findSuitableSlug('chapter', $request->get('name'), $chapter->id, $chapter->book->id); - } - $chapter->fill($request->all()); - $chapter->updated_by = user()->id; - $chapter->save(); + + $this->entityRepo->updateFromInput('chapter', $chapter, $request->all()); Activity::add($chapter, 'chapter_update', $chapter->book->id); return redirect($chapter->getUrl()); } diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index ece9aa305..e94d34369 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -492,14 +492,19 @@ class EntityRepo public function createFromInput($type, $input = [], $book = false) { $isChapter = strtolower($type) === 'chapter'; - $entity = $this->getEntity($type)->newInstance($input); - $entity->slug = $this->findSuitableSlug($type, $entity->name, false, $isChapter ? $book->id : false); - $entity->created_by = user()->id; - $entity->updated_by = user()->id; - $isChapter ? $book->chapters()->save($entity) : $entity->save(); - $this->permissionService->buildJointPermissionsForEntity($entity); - $this->searchService->indexEntity($entity); - return $entity; + $entityModel = $this->getEntity($type)->newInstance($input); + $entityModel->slug = $this->findSuitableSlug($type, $entityModel->name, false, $isChapter ? $book->id : false); + $entityModel->created_by = user()->id; + $entityModel->updated_by = user()->id; + $isChapter ? $book->chapters()->save($entityModel) : $entityModel->save(); + + if (isset($input['tags'])) { + $this->tagRepo->saveTagsToEntity($entityModel, $input['tags']); + } + + $this->permissionService->buildJointPermissionsForEntity($entityModel); + $this->searchService->indexEntity($entityModel); + return $entityModel; } /** @@ -518,6 +523,11 @@ class EntityRepo $entityModel->fill($input); $entityModel->updated_by = user()->id; $entityModel->save(); + + if (isset($input['tags'])) { + $this->tagRepo->saveTagsToEntity($entityModel, $input['tags']); + } + $this->permissionService->buildJointPermissionsForEntity($entityModel); $this->searchService->indexEntity($entityModel); return $entityModel; diff --git a/resources/assets/js/vues/tag-manager.js b/resources/assets/js/vues/tag-manager.js index 97c00487e..177af681f 100644 --- a/resources/assets/js/vues/tag-manager.js +++ b/resources/assets/js/vues/tag-manager.js @@ -2,7 +2,8 @@ const draggable = require('vuedraggable'); const autosuggest = require('./components/autosuggest'); let data = { - pageId: false, + entityId: false, + entityType: null, tags: [], }; @@ -48,9 +49,10 @@ let methods = { }; function mounted() { - this.pageId = Number(this.$el.getAttribute('page-id')); + this.entityId = Number(this.$el.getAttribute('entity-id')); + this.entityType = this.$el.getAttribute('entity-type'); - let url = window.baseUrl(`/ajax/tags/get/page/${this.pageId}`); + let url = window.baseUrl(`/ajax/tags/get/${this.entityType}/${this.entityId}`); this.$http.get(url).then(response => { let tags = response.data; for (let i = 0, len = tags.length; i < len; i++) { diff --git a/resources/assets/sass/_blocks.scss b/resources/assets/sass/_blocks.scss index 4cf2397bc..f876ff281 100644 --- a/resources/assets/sass/_blocks.scss +++ b/resources/assets/sass/_blocks.scss @@ -226,6 +226,7 @@ text-align: center; justify-content: center; width: 28px; + flex-grow: 0; padding-left: $-xs; padding-right: $-xs; &:hover { @@ -237,6 +238,7 @@ } > div .outline input { margin: $-s 0; + width: 100%; } > div.padded { padding: $-s 0 !important; @@ -251,6 +253,7 @@ > div { padding: 0 $-s; max-width: 80%; + flex: 1; } } diff --git a/resources/assets/sass/_components.scss b/resources/assets/sass/_components.scss index 84eebc89b..31e006e27 100644 --- a/resources/assets/sass/_components.scss +++ b/resources/assets/sass/_components.scss @@ -604,3 +604,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { color: #999; } } + +#tag-manager .drag-card { + max-width: 500px; +} \ No newline at end of file diff --git a/resources/assets/sass/_forms.scss b/resources/assets/sass/_forms.scss index 11adc7951..3ab2de522 100644 --- a/resources/assets/sass/_forms.scss +++ b/resources/assets/sass/_forms.scss @@ -237,6 +237,9 @@ input:checked + .toggle-switch { &.open .collapse-title label:before { transform: rotate(90deg); } + &+.form-group[collapsible] { + margin-top: -($-s + 1); + } } .inline-input-style { diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 8a47ae011..c25dbb623 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -200,8 +200,10 @@ return [ * Editor sidebar */ 'page_tags' => 'Page Tags', + 'chapter_tags' => 'Chapter Tags', + 'book_tags' => 'Book Tags', 'tag' => 'Tag', - 'tags' => '', + 'tags' => 'Tags', 'tag_value' => 'Tag Value (Optional)', 'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.", 'tags_add' => 'Add another tag', diff --git a/resources/views/books/form.blade.php b/resources/views/books/form.blade.php index 0620ae976..880149777 100644 --- a/resources/views/books/form.blade.php +++ b/resources/views/books/form.blade.php @@ -11,23 +11,32 @@
-
- -
-
-

{{ trans('common.cover_image_description') }}

+
+ +
+
+

{{ trans('common.cover_image_description') }}

- @include('components.image-picker', [ - 'resizeHeight' => '512', - 'resizeWidth' => '512', - 'showRemove' => false, - 'defaultImage' => baseUrl('/book_default_cover.png'), - 'currentImage' => @isset($model) ? $model->getBookCover() : baseUrl('/book_default_cover.png') , - 'currentId' => @isset($model) ? $model->image_id : 0, - 'name' => 'image_id', - 'imageClass' => 'cover' - ]) -
+ @include('components.image-picker', [ + 'resizeHeight' => '512', + 'resizeWidth' => '512', + 'showRemove' => false, + 'defaultImage' => baseUrl('/book_default_cover.png'), + 'currentImage' => @isset($model) ? $model->getBookCover() : baseUrl('/book_default_cover.png') , + 'currentId' => @isset($model) ? $model->image_id : 0, + 'name' => 'image_id', + 'imageClass' => 'cover' + ]) +
+
+ +
+
+ +
+
+ @include('components.tag-manager', ['entity' => isset($book)?$book:null, 'entityType' => 'chapter']) +
diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php index d3a51cb3a..9f021b2b0 100644 --- a/resources/views/books/show.blade.php +++ b/resources/views/books/show.blade.php @@ -68,19 +68,28 @@
@endif - @if(count($activity) > 0) -
-

@icon('time') {{ trans('entities.recent_activity') }}

- @include('partials/activity-list', ['activity' => $activity]) -
- @endif -

@icon('info') {{ trans('common.details') }}

@include('partials.entity-meta', ['entity' => $book])
+ + @if($book->tags->count() > 0) +
+

@icon('tag') {{ trans('entities.book_tags') }}

+
+ @include('components.tag-list', ['entity' => $book]) +
+
+ @endif + + @if(count($activity) > 0) +
+

@icon('time') {{ trans('entities.recent_activity') }}

+ @include('partials/activity-list', ['activity' => $activity]) +
+ @endif @stop @section('container-attrs') diff --git a/resources/views/chapters/form.blade.php b/resources/views/chapters/form.blade.php index 19cf65a61..fde460844 100644 --- a/resources/views/chapters/form.blade.php +++ b/resources/views/chapters/form.blade.php @@ -11,6 +11,15 @@ @include('form/textarea', ['name' => 'description']) +
+
+ +
+
+ @include('components.tag-manager', ['entity' => isset($chapter)?$chapter:null, 'entityType' => 'chapter']) +
+
+
{{ trans('common.cancel') }} diff --git a/resources/views/chapters/show.blade.php b/resources/views/chapters/show.blade.php index 62bff243b..ea9820022 100644 --- a/resources/views/chapters/show.blade.php +++ b/resources/views/chapters/show.blade.php @@ -91,6 +91,15 @@
+ @if($chapter->tags->count() > 0) +
+

@icon('tag') {{ trans('entities.chapter_tags') }}

+
+ @include('components.tag-list', ['entity' => $chapter]) +
+
+ @endif + @include('partials/book-tree', ['book' => $book, 'sidebarTree' => $sidebarTree]) @stop diff --git a/resources/views/components/tag-list.blade.php b/resources/views/components/tag-list.blade.php new file mode 100644 index 000000000..9f4273c5a --- /dev/null +++ b/resources/views/components/tag-list.blade.php @@ -0,0 +1,10 @@ + + + @foreach($entity->tags as $tag) + + + @if($tag->value) @endif + + @endforeach + +
value) colspan="2" @endif>{{ $tag->name }}{{$tag->value}}
\ No newline at end of file diff --git a/resources/views/components/tag-manager.blade.php b/resources/views/components/tag-manager.blade.php new file mode 100644 index 000000000..801919a14 --- /dev/null +++ b/resources/views/components/tag-manager.blade.php @@ -0,0 +1,23 @@ +
+
+

{!! nl2br(e(trans('entities.tags_explain'))) !!}

+ + + +
+
@icon('grip')
+
+ +
+
+ +
+
@icon('close')
+
+
+ + +
+
\ No newline at end of file diff --git a/resources/views/pages/form-toolbox.blade.php b/resources/views/pages/form-toolbox.blade.php index dd847f297..f6ee2510d 100644 --- a/resources/views/pages/form-toolbox.blade.php +++ b/resources/views/pages/form-toolbox.blade.php @@ -9,29 +9,10 @@ @endif -
+

{{ trans('entities.page_tags') }}

-
-

{!! nl2br(e(trans('entities.tags_explain'))) !!}

- - - -
-
@icon('grip')
-
- -
-
- -
-
@icon('close')
-
-
- - - +
+ @include('components.tag-manager', ['entity' => $page, 'entityType' => 'page'])
diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php index f11da0f4f..a6c4f329d 100644 --- a/resources/views/pages/show.blade.php +++ b/resources/views/pages/show.blade.php @@ -81,16 +81,7 @@

@icon('tag') {{ trans('entities.page_tags') }}

- - - @foreach($page->tags as $tag) - - - @if($tag->value) @endif - - @endforeach - -
value) colspan="2" @endif>{{ $tag->name }}{{$tag->value}}
+ @include('components.tag-list', ['entity' => $page])
@endif diff --git a/tests/Entity/TagTest.php b/tests/Entity/TagTest.php index 1ef7b7bde..7e1166388 100644 --- a/tests/Entity/TagTest.php +++ b/tests/Entity/TagTest.php @@ -1,6 +1,7 @@ defaultTagCount)->make(); } - $page->tags()->saveMany($tags); - return $page; + $entity->tags()->saveMany($tags); + return $entity; } public function test_get_page_tags() { - $page = $this->getPageWithTags(); + $page = $this->getEntityWithTags(Page::class); // Add some other tags to check they don't interfere factory(Tag::class, $this->defaultTagCount)->create(); @@ -41,6 +42,34 @@ class TagTest extends BrowserKitTest $this->assertTrue(count($json) === $this->defaultTagCount, "Returned JSON item count is not as expected"); } + public function test_get_chapter_tags() + { + $chapter = $this->getEntityWithTags(Chapter::class); + + // Add some other tags to check they don't interfere + factory(Tag::class, $this->defaultTagCount)->create(); + + $this->asAdmin()->get("/ajax/tags/get/chapter/" . $chapter->id) + ->shouldReturnJson(); + + $json = json_decode($this->response->getContent()); + $this->assertTrue(count($json) === $this->defaultTagCount, "Returned JSON item count is not as expected"); + } + + public function test_get_book_tags() + { + $book = $this->getEntityWithTags(Book::class); + + // Add some other tags to check they don't interfere + factory(Tag::class, $this->defaultTagCount)->create(); + + $this->asAdmin()->get("/ajax/tags/get/book/" . $book->id) + ->shouldReturnJson(); + + $json = json_decode($this->response->getContent()); + $this->assertTrue(count($json) === $this->defaultTagCount, "Returned JSON item count is not as expected"); + } + public function test_tag_name_suggestions() { // Create some tags with similar names to test with @@ -51,7 +80,7 @@ class TagTest extends BrowserKitTest $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'county'])); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'planet'])); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'plans'])); - $page = $this->getPageWithTags($attrs); + $page = $this->getEntityWithTags(Page::class, $attrs); $this->asAdmin()->get('/ajax/tags/suggest/names?search=dog')->seeJsonEquals([]); $this->get('/ajax/tags/suggest/names?search=co')->seeJsonEquals(['color', 'country', 'county']); @@ -69,7 +98,7 @@ class TagTest extends BrowserKitTest $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'county', 'value' => 'dog'])); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'planet', 'value' => 'catapult'])); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'plans', 'value' => 'dodgy'])); - $page = $this->getPageWithTags($attrs); + $page = $this->getEntityWithTags(Page::class, $attrs); $this->asAdmin()->get('/ajax/tags/suggest/values?search=ora')->seeJsonEquals([]); $this->get('/ajax/tags/suggest/values?search=cat')->seeJsonEquals(['cats', 'cattery', 'catapult']); @@ -85,7 +114,7 @@ class TagTest extends BrowserKitTest $attrs = collect(); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'country'])); $attrs = $attrs->merge(factory(Tag::class, 5)->make(['name' => 'color'])); - $page = $this->getPageWithTags($attrs); + $page = $this->getEntityWithTags(Page::class, $attrs); $this->asAdmin()->get('/ajax/tags/suggest/names?search=co')->seeJsonEquals(['color', 'country']); $this->asEditor()->get('/ajax/tags/suggest/names?search=co')->seeJsonEquals(['color', 'country']); From 7f437c2e3cf111aebee4454a3c6fea79f7fbded7 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sat, 31 Mar 2018 11:21:22 +0100 Subject: [PATCH 06/31] Fixed issue where cover images don't save on older books Ensured an existing ID is always provided to image-picker.js. Fixes #773 --- resources/views/books/form.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/books/form.blade.php b/resources/views/books/form.blade.php index 880149777..a47c26e26 100644 --- a/resources/views/books/form.blade.php +++ b/resources/views/books/form.blade.php @@ -22,8 +22,8 @@ 'resizeWidth' => '512', 'showRemove' => false, 'defaultImage' => baseUrl('/book_default_cover.png'), - 'currentImage' => @isset($model) ? $model->getBookCover() : baseUrl('/book_default_cover.png') , - 'currentId' => @isset($model) ? $model->image_id : 0, + 'currentImage' => isset($model) ? $model->getBookCover() : baseUrl('/book_default_cover.png') , + 'currentId' => isset($model) && $model->image_id ? $model->image_id : 0, 'name' => 'image_id', 'imageClass' => 'cover' ]) From 1a72208d27e1b27034fd9eb5f657d6f3cd0c5ad7 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sat, 31 Mar 2018 12:41:40 +0100 Subject: [PATCH 07/31] Added configurable robots.txt file. Deleted old static file. Default output depends on app-public setting. Otherwise can be overidden in `.env` file via `ALLOW_ROBOTS` Otherwise view file can be customized. Fixes #779 --- app/Http/Controllers/HomeController.php | 16 +++++++++++++ config/app.php | 16 +++++++++++++ public/robots.txt | 2 -- resources/views/robots.blade.php | 6 +++++ routes/web.php | 1 + tests/PublicActionTest.php | 31 +++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 2 deletions(-) delete mode 100644 public/robots.txt create mode 100644 resources/views/robots.blade.php diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 3a5fd2cb5..bbe1a8679 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -118,4 +118,20 @@ class HomeController extends Controller { return view('partials/custom-head-content'); } + + /** + * Show the view for /robots.txt + * @return $this + */ + public function getRobots() + { + $sitePublic = setting('app-public', false); + $allowRobots = config('app.allow_robots'); + if ($allowRobots === null) { + $allowRobots = $sitePublic; + } + return response() + ->view('robots', ['allowRobots' => $allowRobots]) + ->header('Content-Type', 'text/plain'); + } } diff --git a/config/app.php b/config/app.php index fad0c20f2..ca30ee2a0 100755 --- a/config/app.php +++ b/config/app.php @@ -4,12 +4,28 @@ return [ 'env' => env('APP_ENV', 'production'), + /** + * Set the default view type for various lists. Can be overridden by user preferences. + * This will be used for public viewers and users that have not set a preference. + */ 'views' => [ 'books' => env('APP_VIEWS_BOOKS', 'list') ], + /** + * Allow -@stop From 736d7118b08ef7f03d35a237bf5a909ada90d9cd Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 1 Apr 2018 13:21:11 +0100 Subject: [PATCH 09/31] Refactored js file structure to be standard throughout app Still work to be done but a good start in standardisation. --- .../assets/js/components/markdown-editor.js | 4 +- .../assets/js/components/page-display.js | 2 +- .../assets/js/components/wysiwyg-editor.js | 528 +++++++++++++++++- resources/assets/js/index.js | 127 +---- resources/assets/js/pages/page-form.js | 514 ----------------- .../assets/js/{libs => services}/code.js | 0 .../assets/js/{ => services}/dom-polyfills.js | 2 + .../assets/js/{libs => services}/drawio.js | 0 resources/assets/js/services/events.js | 28 + resources/assets/js/services/global-ui.js | 58 ++ resources/assets/js/services/http.js | 21 + .../assets/js/{ => services}/translations.js | 0 resources/assets/js/vues/code-editor.js | 2 +- 13 files changed, 656 insertions(+), 630 deletions(-) delete mode 100644 resources/assets/js/pages/page-form.js rename resources/assets/js/{libs => services}/code.js (100%) rename resources/assets/js/{ => services}/dom-polyfills.js (77%) rename resources/assets/js/{libs => services}/drawio.js (100%) create mode 100644 resources/assets/js/services/events.js create mode 100644 resources/assets/js/services/global-ui.js create mode 100644 resources/assets/js/services/http.js rename resources/assets/js/{ => services}/translations.js (100%) diff --git a/resources/assets/js/components/markdown-editor.js b/resources/assets/js/components/markdown-editor.js index c98bac3cb..46c54408b 100644 --- a/resources/assets/js/components/markdown-editor.js +++ b/resources/assets/js/components/markdown-editor.js @@ -1,8 +1,8 @@ const MarkdownIt = require("markdown-it"); const mdTasksLists = require('markdown-it-task-lists'); -const code = require('../libs/code'); +const code = require('../services/code'); -const DrawIO = require('../libs/drawio'); +const DrawIO = require('../services/drawio'); class MarkdownEditor { diff --git a/resources/assets/js/components/page-display.js b/resources/assets/js/components/page-display.js index 5d9f9edee..fc360ff69 100644 --- a/resources/assets/js/components/page-display.js +++ b/resources/assets/js/components/page-display.js @@ -1,5 +1,5 @@ import Clipboard from "clipboard"; -import Code from "../libs/code"; +import Code from "../services/code"; class PageDisplay { diff --git a/resources/assets/js/components/wysiwyg-editor.js b/resources/assets/js/components/wysiwyg-editor.js index ae369ff42..539233204 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -1,9 +1,533 @@ +const Code = require('../services/code'); +const DrawIO = require('../services/drawio'); + +/** + * Handle pasting images from clipboard. + * @param {ClipboardEvent} event + * @param editor + */ +function editorPaste(event, editor) { + if (!event.clipboardData || !event.clipboardData.items) return; + let items = event.clipboardData.items; + + for (let i = 0; i < items.length; i++) { + if (items[i].type.indexOf("image") === -1) continue; + event.preventDefault(); + + let id = "image-" + Math.random().toString(16).slice(2); + let loadingImage = window.baseUrl('/loading.gif'); + let file = items[i].getAsFile(); + setTimeout(() => { + editor.insertContent(`

`); + uploadImageFile(file).then(resp => { + editor.dom.setAttrib(id, 'src', resp.thumbs.display); + }).catch(err => { + editor.dom.remove(id); + window.$events.emit('error', trans('errors.image_upload_error')); + console.log(err); + }); + }, 10); + } +} + +/** + * Upload an image file to the server + * @param {File} file + */ +function uploadImageFile(file) { + if (file === null || file.type.indexOf('image') !== 0) return Promise.reject(`Not an image file`); + + let ext = 'png'; + if (file.name) { + let fileNameMatches = file.name.match(/\.(.+)$/); + if (fileNameMatches.length > 1) ext = fileNameMatches[1]; + } + + let remoteFilename = "image-" + Date.now() + "." + ext; + let formData = new FormData(); + formData.append('file', file, remoteFilename); + + return window.$http.post(window.baseUrl('/images/gallery/upload'), formData).then(resp => (resp.data)); +} + +function registerEditorShortcuts(editor) { + // Headers + for (let i = 1; i < 5; i++) { + editor.shortcuts.add('meta+' + i, '', ['FormatBlock', false, 'h' + (i+1)]); + } + + // Other block shortcuts + editor.shortcuts.add('meta+5', '', ['FormatBlock', false, 'p']); + editor.shortcuts.add('meta+d', '', ['FormatBlock', false, 'p']); + editor.shortcuts.add('meta+6', '', ['FormatBlock', false, 'blockquote']); + editor.shortcuts.add('meta+q', '', ['FormatBlock', false, 'blockquote']); + editor.shortcuts.add('meta+7', '', ['codeeditor', false, 'pre']); + editor.shortcuts.add('meta+e', '', ['codeeditor', false, 'pre']); + editor.shortcuts.add('meta+8', '', ['FormatBlock', false, 'code']); + editor.shortcuts.add('meta+shift+E', '', ['FormatBlock', false, 'code']); + + // Save draft shortcut + editor.shortcuts.add('meta+S', '', () => { + window.$events.emit('editor-save-draft'); + }); + + // Save page shortcut + editor.shortcuts.add('meta+13', '', () => { + window.$events.emit('editor-save-page'); + }); + + // Loop through callout styles + editor.shortcuts.add('meta+9', '', function() { + let selectedNode = editor.selection.getNode(); + let formats = ['info', 'success', 'warning', 'danger']; + + if (!selectedNode || selectedNode.className.indexOf('callout') === -1) { + editor.formatter.apply('calloutinfo'); + return; + } + + for (let i = 0; i < formats.length; i++) { + if (selectedNode.className.indexOf(formats[i]) === -1) continue; + let newFormat = (i === formats.length -1) ? formats[0] : formats[i+1]; + editor.formatter.apply('callout' + newFormat); + return; + } + editor.formatter.apply('p'); + }); + +} + +/** + * Load custom HTML head content from the settings into the editor. + * @param editor + */ +function loadCustomHeadContent(editor) { + window.$http.get(window.baseUrl('/custom-head-content')).then(resp => { + if (!resp.data) return; + let head = editor.getDoc().querySelector('head'); + head.innerHTML += resp.data; + }); +} + +/** + * Create and enable our custom code plugin + */ +function codePlugin() { + + function elemIsCodeBlock(elem) { + return elem.className === 'CodeMirrorContainer'; + } + + function showPopup(editor) { + let selectedNode = editor.selection.getNode(); + + if (!elemIsCodeBlock(selectedNode)) { + let providedCode = editor.selection.getNode().textContent; + window.vues['code-editor'].open(providedCode, '', (code, lang) => { + let wrap = document.createElement('div'); + wrap.innerHTML = `
`; + wrap.querySelector('code').innerText = code; + + editor.formatter.toggle('pre'); + let node = editor.selection.getNode(); + editor.dom.setHTML(node, wrap.querySelector('pre').innerHTML); + editor.fire('SetContent'); + }); + return; + } + + let lang = selectedNode.hasAttribute('data-lang') ? selectedNode.getAttribute('data-lang') : ''; + let currentCode = selectedNode.querySelector('textarea').textContent; + + window.vues['code-editor'].open(currentCode, lang, (code, lang) => { + let editorElem = selectedNode.querySelector('.CodeMirror'); + let cmInstance = editorElem.CodeMirror; + if (cmInstance) { + Code.setContent(cmInstance, code); + Code.setMode(cmInstance, lang); + } + let textArea = selectedNode.querySelector('textarea'); + if (textArea) textArea.textContent = code; + selectedNode.setAttribute('data-lang', lang); + }); + } + + function codeMirrorContainerToPre($codeMirrorContainer) { + let textArea = $codeMirrorContainer[0].querySelector('textarea'); + let code = textArea.textContent; + let lang = $codeMirrorContainer[0].getAttribute('data-lang'); + + $codeMirrorContainer.removeAttr('contentEditable'); + let $pre = $('
');
+        $pre.append($('').each((index, elem) => {
+            // Needs to be textContent since innerText produces BR:s
+            elem.textContent = code;
+        }).attr('class', `language-${lang}`));
+        $codeMirrorContainer.replaceWith($pre);
+    }
+
+    window.tinymce.PluginManager.add('codeeditor', function(editor, url) {
+
+        let $ = editor.$;
+
+        editor.addButton('codeeditor', {
+            text: 'Code block',
+            icon: false,
+            cmd: 'codeeditor'
+        });
+
+        editor.addCommand('codeeditor', () => {
+            showPopup(editor);
+        });
+
+        // Convert
+        editor.on('PreProcess', function (e) {
+            $('div.CodeMirrorContainer', e.node).
+            each((index, elem) => {
+                let $elem = $(elem);
+                codeMirrorContainerToPre($elem);
+            });
+        });
+
+        editor.on('dblclick', event => {
+            let selectedNode = editor.selection.getNode();
+            if (!elemIsCodeBlock(selectedNode)) return;
+            showPopup(editor);
+        });
+
+        editor.on('SetContent', function () {
+
+            // Recover broken codemirror instances
+            $('.CodeMirrorContainer').filter((index ,elem) => {
+                return typeof elem.querySelector('.CodeMirror').CodeMirror === 'undefined';
+            }).each((index, elem) => {
+                codeMirrorContainerToPre($(elem));
+            });
+
+            let codeSamples = $('body > pre').filter((index, elem) => {
+                return elem.contentEditable !== "false";
+            });
+
+            if (!codeSamples.length) return;
+            editor.undoManager.transact(function () {
+                codeSamples.each((index, elem) => {
+                    Code.wysiwygView(elem);
+                });
+            });
+        });
+
+    });
+}
+
+function drawIoPlugin() {
+
+    const drawIoUrl = 'https://www.draw.io/?embed=1&ui=atlas&spin=1&proto=json';
+    let iframe = null;
+    let pageEditor = null;
+    let currentNode = null;
+
+    function isDrawing(node) {
+        return node.hasAttribute('drawio-diagram');
+    }
+
+    function showDrawingEditor(mceEditor, selectedNode = null) {
+        pageEditor = mceEditor;
+        currentNode = selectedNode;
+        DrawIO.show(drawingInit, updateContent);
+    }
+
+    function updateContent(pngData) {
+        let id = "image-" + Math.random().toString(16).slice(2);
+        let loadingImage = window.baseUrl('/loading.gif');
+        let data = {
+            image: pngData,
+            uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id'))
+        };
+
+        // Handle updating an existing image
+        if (currentNode) {
+            DrawIO.close();
+            let imgElem = currentNode.querySelector('img');
+            let drawingId = currentNode.getAttribute('drawio-diagram');
+            window.$http.put(window.baseUrl(`/images/drawing/upload/${drawingId}`), data).then(resp => {
+                pageEditor.dom.setAttrib(imgElem, 'src', `${resp.data.url}?updated=${Date.now()}`);
+            }).catch(err => {
+                window.$events.emit('error', trans('errors.image_upload_error'));
+                console.log(err);
+            });
+            return;
+        }
+
+        setTimeout(() => {
+            pageEditor.insertContent(`
`); + DrawIO.close(); + window.$http.post(window.baseUrl('/images/drawing/upload'), data).then(resp => { + pageEditor.dom.setAttrib(id, 'src', resp.data.url); + pageEditor.dom.get(id).parentNode.setAttribute('drawio-diagram', resp.data.id); + }).catch(err => { + pageEditor.dom.remove(id); + window.$events.emit('error', trans('errors.image_upload_error')); + console.log(err); + }); + }, 5); + } + + + function drawingInit() { + if (!currentNode) { + return Promise.resolve(''); + } + + let drawingId = currentNode.getAttribute('drawio-diagram'); + return window.$http.get(window.baseUrl(`/images/base64/${drawingId}`)).then(resp => { + return `data:image/png;base64,${resp.data.content}`; + }); + } + + window.tinymce.PluginManager.add('drawio', function(editor, url) { + + editor.addCommand('drawio', () => { + showDrawingEditor(editor); + }); + + editor.addButton('drawio', { + tooltip: 'Drawing', + image: window.baseUrl('/icon/drawing.svg?color=000000'), + cmd: 'drawio' + }); + + editor.on('dblclick', event => { + let selectedNode = editor.selection.getNode(); + if (!isDrawing(selectedNode)) return; + showDrawingEditor(editor, selectedNode); + }); + + editor.on('SetContent', function () { + let drawings = editor.$('body > div[drawio-diagram]'); + if (!drawings.length) return; + + editor.undoManager.transact(function () { + drawings.each((index, elem) => { + elem.setAttribute('contenteditable', 'false'); + }); + }); + }); + + }); +} + +function customHrPlugin() { + window.tinymce.PluginManager.add('customhr', function (editor) { + editor.addCommand('InsertHorizontalRule', function () { + let hrElem = document.createElement('hr'); + let cNode = editor.selection.getNode(); + let parentNode = cNode.parentNode; + parentNode.insertBefore(hrElem, cNode); + }); + + editor.addButton('hr', { + icon: 'hr', + tooltip: 'Horizontal line', + cmd: 'InsertHorizontalRule' + }); + + editor.addMenuItem('hr', { + icon: 'hr', + text: 'Horizontal line', + cmd: 'InsertHorizontalRule', + context: 'insert' + }); + }); +} + + class WysiwygEditor { constructor(elem) { this.elem = elem; - this.options = require("../pages/page-form"); - tinymce.init(this.options); + + this.plugins = "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor"; + this.loadPlugins(); + + this.tinyMceConfig = this.getTinyMceConfig(); + window.tinymce.init(this.tinyMceConfig); + } + + loadPlugins() { + codePlugin(); + customHrPlugin(); + if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') === 'true') { + drawIoPlugin(); + this.plugins += ' drawio'; + } + } + + getTinyMceConfig() { + return { + selector: '#html-editor', + content_css: [ + window.baseUrl('/dist/styles.css'), + ], + branding: false, + body_class: 'page-content', + browser_spellcheck: true, + relative_urls: false, + remove_script_host: false, + document_base_url: window.baseUrl('/'), + statusbar: false, + menubar: false, + paste_data_images: false, + extended_valid_elements: 'pre[*],svg[*],div[drawio-diagram]', + automatic_uploads: false, + valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre],+div[img]", + plugins: this.plugins, + imagetools_toolbar: 'imageoptions', + toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr drawio | removeformat code fullscreen", + content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}", + style_formats: [ + {title: "Header Large", format: "h2"}, + {title: "Header Medium", format: "h3"}, + {title: "Header Small", format: "h4"}, + {title: "Header Tiny", format: "h5"}, + {title: "Paragraph", format: "p", exact: true, classes: ''}, + {title: "Blockquote", format: "blockquote"}, + {title: "Code Block", icon: "code", cmd: 'codeeditor', format: 'codeeditor'}, + {title: "Inline Code", icon: "code", inline: "code"}, + {title: "Callouts", items: [ + {title: "Info", format: 'calloutinfo'}, + {title: "Success", format: 'calloutsuccess'}, + {title: "Warning", format: 'calloutwarning'}, + {title: "Danger", format: 'calloutdanger'} + ]}, + ], + style_formats_merge: false, + formats: { + codeeditor: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div'}, + alignleft: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left'}, + aligncenter: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center'}, + alignright: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right'}, + calloutsuccess: {block: 'p', exact: true, attributes: {class: 'callout success'}}, + calloutinfo: {block: 'p', exact: true, attributes: {class: 'callout info'}}, + calloutwarning: {block: 'p', exact: true, attributes: {class: 'callout warning'}}, + calloutdanger: {block: 'p', exact: true, attributes: {class: 'callout danger'}} + }, + file_browser_callback: function (field_name, url, type, win) { + + if (type === 'file') { + window.EntitySelectorPopup.show(function(entity) { + let originalField = win.document.getElementById(field_name); + originalField.value = entity.link; + $(originalField).closest('.mce-form').find('input').eq(2).val(entity.name); + }); + } + + if (type === 'image') { + // Show image manager + window.ImageManager.show(function (image) { + + // Set popover link input to image url then fire change event + // to ensure the new value sticks + win.document.getElementById(field_name).value = image.url; + if ("createEvent" in document) { + let evt = document.createEvent("HTMLEvents"); + evt.initEvent("change", false, true); + win.document.getElementById(field_name).dispatchEvent(evt); + } else { + win.document.getElementById(field_name).fireEvent("onchange"); + } + + // Replace the actively selected content with the linked image + let html = ``; + html += `${image.name}`; + html += ''; + win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html); + }); + } + + }, + paste_preprocess: function (plugin, args) { + let content = args.content; + if (content.indexOf('`; + html += `${image.name}`; + html += ''; + editor.execCommand('mceInsertContent', false, html); + }); + } + }); + + // Paste image-uploads + editor.on('paste', event => editorPaste(event, editor)); + } + }; } } diff --git a/resources/assets/js/index.js b/resources/assets/js/index.js index d72ee3fdc..bb323a08b 100644 --- a/resources/assets/js/index.js +++ b/resources/assets/js/index.js @@ -1,15 +1,6 @@ +// Global Polyfills import "babel-polyfill" -import "./dom-polyfills" - -import jQuery from "jquery" -window.jQuery = window.$ = jQuery; - -import Translations from "./translations" -import vues from "./vues/vues" -import components from "./components" - -import Vue from "vue" -import axios from "axios" +import "./services/dom-polyfills" // Url retrieval function window.baseUrl = function(path) { @@ -19,114 +10,30 @@ window.baseUrl = function(path) { return basePath + '/' + path; }; -// Global Event System -class EventManager { - constructor() { - this.listeners = {}; - this.stack = []; - } - - emit(eventName, eventData) { - this.stack.push({name: eventName, data: eventData}); - if (typeof this.listeners[eventName] === 'undefined') return this; - let eventsToStart = this.listeners[eventName]; - for (let i = 0; i < eventsToStart.length; i++) { - let event = eventsToStart[i]; - event(eventData); - } - return this; - } - - listen(eventName, callback) { - if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; - this.listeners[eventName].push(callback); - return this; - } -} - -window.$events = new EventManager(); - -let axiosInstance = axios.create({ - headers: { - 'X-CSRF-TOKEN': document.querySelector('meta[name=token]').getAttribute('content'), - 'baseURL': window.baseUrl('') - } -}); -axiosInstance.interceptors.request.use(resp => { - return resp; -}, err => { - if (typeof err.response === "undefined" || typeof err.response.data === "undefined") return Promise.reject(err); - if (typeof err.response.data.error !== "undefined") window.$events.emit('error', err.response.data.error); - if (typeof err.response.data.message !== "undefined") window.$events.emit('error', err.response.data.message); -}); -window.$http = axiosInstance; - -Vue.prototype.$http = axiosInstance; -Vue.prototype.$events = window.$events; +// Set events and http services on window +import Events from "./services/events" +import Http from "./services/http" +let httpInstance = Http(); +window.$http = httpInstance; +window.$events = new Events(); // Translation setup // Creates a global function with name 'trans' to be used in the same way as Laravel's translation system +import Translations from "./services/translations" let translator = new Translations(window.translations); window.trans = translator.get.bind(translator); window.trans_choice = translator.getPlural.bind(translator); +// Load in global UI helpers and libraries including jQuery +import "./services/global-ui" -//Global jQuery Config & Extensions - -/** - * Scroll the view to a specific element. - * @param {HTMLElement} element - */ -window.scrollToElement = function(element) { - if (!element) return; - let offset = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; - let top = element.getBoundingClientRect().top + offset; - $('html, body').animate({ - scrollTop: top - 60 // Adjust to change final scroll position top margin - }, 300); -}; - -/** - * Scroll and highlight an element. - * @param {HTMLElement} element - */ -window.scrollAndHighlight = function(element) { - if (!element) return; - window.scrollToElement(element); - let color = document.getElementById('custom-styles').getAttribute('data-color-light'); - let initColor = window.getComputedStyle(element).getPropertyValue('background-color'); - element.style.backgroundColor = color; - setTimeout(() => { - element.classList.add('selectFade'); - element.style.backgroundColor = initColor; - }, 10); - setTimeout(() => { - element.classList.remove('selectFade'); - element.style.backgroundColor = ''; - }, 3000); -}; - -// Smooth scrolling -jQuery.fn.smoothScrollTo = function () { - if (this.length === 0) return; - window.scrollToElement(this[0]); - return this; -}; - -// Making contains text expression not worry about casing -jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { - return function (elem) { - return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; - }; -}); - -// Detect IE for css -if(navigator.userAgent.indexOf('MSIE')!==-1 - || navigator.appVersion.indexOf('Trident/') > 0 - || navigator.userAgent.indexOf('Safari') !== -1){ - document.body.classList.add('flexbox-support'); -} +// Set services on Vue +import Vue from "vue" +Vue.prototype.$http = httpInstance; +Vue.prototype.$events = window.$events; // Load vues and components +import vues from "./vues/vues" +import components from "./components" vues(); components(); \ No newline at end of file diff --git a/resources/assets/js/pages/page-form.js b/resources/assets/js/pages/page-form.js deleted file mode 100644 index 6b659a92b..000000000 --- a/resources/assets/js/pages/page-form.js +++ /dev/null @@ -1,514 +0,0 @@ -"use strict"; -const Code = require('../libs/code'); -const DrawIO = require('../libs/drawio'); - -/** - * Handle pasting images from clipboard. - * @param {ClipboardEvent} event - * @param editor - */ -function editorPaste(event, editor) { - if (!event.clipboardData || !event.clipboardData.items) return; - let items = event.clipboardData.items; - - for (let i = 0; i < items.length; i++) { - if (items[i].type.indexOf("image") === -1) continue; - event.preventDefault(); - - let id = "image-" + Math.random().toString(16).slice(2); - let loadingImage = window.baseUrl('/loading.gif'); - let file = items[i].getAsFile(); - setTimeout(() => { - editor.insertContent(`

`); - uploadImageFile(file).then(resp => { - editor.dom.setAttrib(id, 'src', resp.thumbs.display); - }).catch(err => { - editor.dom.remove(id); - window.$events.emit('error', trans('errors.image_upload_error')); - console.log(err); - }); - }, 10); - } -} - -/** - * Upload an image file to the server - * @param {File} file - */ -function uploadImageFile(file) { - if (file === null || file.type.indexOf('image') !== 0) return Promise.reject(`Not an image file`); - - let ext = 'png'; - if (file.name) { - let fileNameMatches = file.name.match(/\.(.+)$/); - if (fileNameMatches.length > 1) ext = fileNameMatches[1]; - } - - let remoteFilename = "image-" + Date.now() + "." + ext; - let formData = new FormData(); - formData.append('file', file, remoteFilename); - - return window.$http.post(window.baseUrl('/images/gallery/upload'), formData).then(resp => (resp.data)); -} - -function registerEditorShortcuts(editor) { - // Headers - for (let i = 1; i < 5; i++) { - editor.shortcuts.add('meta+' + i, '', ['FormatBlock', false, 'h' + (i+1)]); - } - - // Other block shortcuts - editor.shortcuts.add('meta+5', '', ['FormatBlock', false, 'p']); - editor.shortcuts.add('meta+d', '', ['FormatBlock', false, 'p']); - editor.shortcuts.add('meta+6', '', ['FormatBlock', false, 'blockquote']); - editor.shortcuts.add('meta+q', '', ['FormatBlock', false, 'blockquote']); - editor.shortcuts.add('meta+7', '', ['codeeditor', false, 'pre']); - editor.shortcuts.add('meta+e', '', ['codeeditor', false, 'pre']); - editor.shortcuts.add('meta+8', '', ['FormatBlock', false, 'code']); - editor.shortcuts.add('meta+shift+E', '', ['FormatBlock', false, 'code']); - - // Save draft shortcut - editor.shortcuts.add('meta+S', '', () => { - window.$events.emit('editor-save-draft'); - }); - - // Save page shortcut - editor.shortcuts.add('meta+13', '', () => { - window.$events.emit('editor-save-page'); - }); - - // Loop through callout styles - editor.shortcuts.add('meta+9', '', function() { - let selectedNode = editor.selection.getNode(); - let formats = ['info', 'success', 'warning', 'danger']; - - if (!selectedNode || selectedNode.className.indexOf('callout') === -1) { - editor.formatter.apply('calloutinfo'); - return; - } - - for (let i = 0; i < formats.length; i++) { - if (selectedNode.className.indexOf(formats[i]) === -1) continue; - let newFormat = (i === formats.length -1) ? formats[0] : formats[i+1]; - editor.formatter.apply('callout' + newFormat); - return; - } - editor.formatter.apply('p'); - }); - -} - -/** - * Load custom HTML head content from the settings into the editor. - * @param editor - */ -function loadCustomHeadContent(editor) { - window.$http.get(window.baseUrl('/custom-head-content')).then(resp => { - if (!resp.data) return; - let head = editor.getDoc().querySelector('head'); - head.innerHTML += resp.data; - }); -} - -/** - * Create and enable our custom code plugin - */ -function codePlugin() { - - function elemIsCodeBlock(elem) { - return elem.className === 'CodeMirrorContainer'; - } - - function showPopup(editor) { - let selectedNode = editor.selection.getNode(); - - if (!elemIsCodeBlock(selectedNode)) { - let providedCode = editor.selection.getNode().textContent; - window.vues['code-editor'].open(providedCode, '', (code, lang) => { - let wrap = document.createElement('div'); - wrap.innerHTML = `
`; - wrap.querySelector('code').innerText = code; - - editor.formatter.toggle('pre'); - let node = editor.selection.getNode(); - editor.dom.setHTML(node, wrap.querySelector('pre').innerHTML); - editor.fire('SetContent'); - }); - return; - } - - let lang = selectedNode.hasAttribute('data-lang') ? selectedNode.getAttribute('data-lang') : ''; - let currentCode = selectedNode.querySelector('textarea').textContent; - - window.vues['code-editor'].open(currentCode, lang, (code, lang) => { - let editorElem = selectedNode.querySelector('.CodeMirror'); - let cmInstance = editorElem.CodeMirror; - if (cmInstance) { - Code.setContent(cmInstance, code); - Code.setMode(cmInstance, lang); - } - let textArea = selectedNode.querySelector('textarea'); - if (textArea) textArea.textContent = code; - selectedNode.setAttribute('data-lang', lang); - }); - } - - function codeMirrorContainerToPre($codeMirrorContainer) { - let textArea = $codeMirrorContainer[0].querySelector('textarea'); - let code = textArea.textContent; - let lang = $codeMirrorContainer[0].getAttribute('data-lang'); - - $codeMirrorContainer.removeAttr('contentEditable'); - let $pre = $('
');
-        $pre.append($('').each((index, elem) => {
-            // Needs to be textContent since innerText produces BR:s
-            elem.textContent = code;
-        }).attr('class', `language-${lang}`));
-        $codeMirrorContainer.replaceWith($pre);
-    }
-
-    window.tinymce.PluginManager.add('codeeditor', function(editor, url) {
-
-        let $ = editor.$;
-
-        editor.addButton('codeeditor', {
-            text: 'Code block',
-            icon: false,
-            cmd: 'codeeditor'
-        });
-
-        editor.addCommand('codeeditor', () => {
-            showPopup(editor);
-        });
-
-        // Convert
-        editor.on('PreProcess', function (e) {
-            $('div.CodeMirrorContainer', e.node).
-            each((index, elem) => {
-                let $elem = $(elem);
-                codeMirrorContainerToPre($elem);
-            });
-        });
-
-        editor.on('dblclick', event => {
-            let selectedNode = editor.selection.getNode();
-            if (!elemIsCodeBlock(selectedNode)) return;
-            showPopup(editor);
-        });
-
-        editor.on('SetContent', function () {
-
-            // Recover broken codemirror instances
-            $('.CodeMirrorContainer').filter((index ,elem) => {
-                return typeof elem.querySelector('.CodeMirror').CodeMirror === 'undefined';
-            }).each((index, elem) => {
-                codeMirrorContainerToPre($(elem));
-            });
-
-            let codeSamples = $('body > pre').filter((index, elem) => {
-                return elem.contentEditable !== "false";
-            });
-
-            if (!codeSamples.length) return;
-            editor.undoManager.transact(function () {
-                codeSamples.each((index, elem) => {
-                    Code.wysiwygView(elem);
-                });
-            });
-        });
-
-    });
-}
-
-function drawIoPlugin() {
-
-    const drawIoUrl = 'https://www.draw.io/?embed=1&ui=atlas&spin=1&proto=json';
-    let iframe = null;
-    let pageEditor = null;
-    let currentNode = null;
-
-    function isDrawing(node) {
-        return node.hasAttribute('drawio-diagram');
-    }
-
-    function showDrawingEditor(mceEditor, selectedNode = null) {
-        pageEditor = mceEditor;
-        currentNode = selectedNode;
-        DrawIO.show(drawingInit, updateContent);
-    }
-
-    function updateContent(pngData) {
-        let id = "image-" + Math.random().toString(16).slice(2);
-        let loadingImage = window.baseUrl('/loading.gif');
-        let data = {
-            image: pngData,
-            uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id'))
-        };
-
-        // Handle updating an existing image
-        if (currentNode) {
-            DrawIO.close();
-            let imgElem = currentNode.querySelector('img');
-            let drawingId = currentNode.getAttribute('drawio-diagram');
-            window.$http.put(window.baseUrl(`/images/drawing/upload/${drawingId}`), data).then(resp => {
-                pageEditor.dom.setAttrib(imgElem, 'src', `${resp.data.url}?updated=${Date.now()}`);
-            }).catch(err => {
-                window.$events.emit('error', trans('errors.image_upload_error'));
-                console.log(err);
-            });
-            return;
-        }
-
-        setTimeout(() => {
-            pageEditor.insertContent(`
`); - DrawIO.close(); - window.$http.post(window.baseUrl('/images/drawing/upload'), data).then(resp => { - pageEditor.dom.setAttrib(id, 'src', resp.data.url); - pageEditor.dom.get(id).parentNode.setAttribute('drawio-diagram', resp.data.id); - }).catch(err => { - pageEditor.dom.remove(id); - window.$events.emit('error', trans('errors.image_upload_error')); - console.log(err); - }); - }, 5); - } - - - function drawingInit() { - if (!currentNode) { - return Promise.resolve(''); - } - - let drawingId = currentNode.getAttribute('drawio-diagram'); - return window.$http.get(window.baseUrl(`/images/base64/${drawingId}`)).then(resp => { - return `data:image/png;base64,${resp.data.content}`; - }); - } - - window.tinymce.PluginManager.add('drawio', function(editor, url) { - - editor.addCommand('drawio', () => { - showDrawingEditor(editor); - }); - - editor.addButton('drawio', { - tooltip: 'Drawing', - image: window.baseUrl('/icon/drawing.svg?color=000000'), - cmd: 'drawio' - }); - - editor.on('dblclick', event => { - let selectedNode = editor.selection.getNode(); - if (!isDrawing(selectedNode)) return; - showDrawingEditor(editor, selectedNode); - }); - - editor.on('SetContent', function () { - let drawings = editor.$('body > div[drawio-diagram]'); - if (!drawings.length) return; - - editor.undoManager.transact(function () { - drawings.each((index, elem) => { - elem.setAttribute('contenteditable', 'false'); - }); - }); - }); - - }); -} - -window.tinymce.PluginManager.add('customhr', function (editor) { - editor.addCommand('InsertHorizontalRule', function () { - let hrElem = document.createElement('hr'); - let cNode = editor.selection.getNode(); - let parentNode = cNode.parentNode; - parentNode.insertBefore(hrElem, cNode); - }); - - editor.addButton('hr', { - icon: 'hr', - tooltip: 'Horizontal line', - cmd: 'InsertHorizontalRule' - }); - - editor.addMenuItem('hr', { - icon: 'hr', - text: 'Horizontal line', - cmd: 'InsertHorizontalRule', - context: 'insert' - }); -}); - -// Load plugins -let plugins = "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor"; -codePlugin(); -if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') === 'true') { - drawIoPlugin(); - plugins += ' drawio'; -} - -module.exports = { - selector: '#html-editor', - content_css: [ - window.baseUrl('/dist/styles.css'), - ], - branding: false, - body_class: 'page-content', - browser_spellcheck: true, - relative_urls: false, - remove_script_host: false, - document_base_url: window.baseUrl('/'), - statusbar: false, - menubar: false, - paste_data_images: false, - extended_valid_elements: 'pre[*],svg[*],div[drawio-diagram]', - automatic_uploads: false, - valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre],+div[img]", - plugins: plugins, - imagetools_toolbar: 'imageoptions', - toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr drawio | removeformat code fullscreen", - content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}", - style_formats: [ - {title: "Header Large", format: "h2"}, - {title: "Header Medium", format: "h3"}, - {title: "Header Small", format: "h4"}, - {title: "Header Tiny", format: "h5"}, - {title: "Paragraph", format: "p", exact: true, classes: ''}, - {title: "Blockquote", format: "blockquote"}, - {title: "Code Block", icon: "code", cmd: 'codeeditor', format: 'codeeditor'}, - {title: "Inline Code", icon: "code", inline: "code"}, - {title: "Callouts", items: [ - {title: "Info", format: 'calloutinfo'}, - {title: "Success", format: 'calloutsuccess'}, - {title: "Warning", format: 'calloutwarning'}, - {title: "Danger", format: 'calloutdanger'} - ]}, - ], - style_formats_merge: false, - formats: { - codeeditor: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div'}, - alignleft: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left'}, - aligncenter: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center'}, - alignright: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right'}, - calloutsuccess: {block: 'p', exact: true, attributes: {class: 'callout success'}}, - calloutinfo: {block: 'p', exact: true, attributes: {class: 'callout info'}}, - calloutwarning: {block: 'p', exact: true, attributes: {class: 'callout warning'}}, - calloutdanger: {block: 'p', exact: true, attributes: {class: 'callout danger'}} - }, - file_browser_callback: function (field_name, url, type, win) { - - if (type === 'file') { - window.EntitySelectorPopup.show(function(entity) { - let originalField = win.document.getElementById(field_name); - originalField.value = entity.link; - $(originalField).closest('.mce-form').find('input').eq(2).val(entity.name); - }); - } - - if (type === 'image') { - // Show image manager - window.ImageManager.show(function (image) { - - // Set popover link input to image url then fire change event - // to ensure the new value sticks - win.document.getElementById(field_name).value = image.url; - if ("createEvent" in document) { - let evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); - win.document.getElementById(field_name).dispatchEvent(evt); - } else { - win.document.getElementById(field_name).fireEvent("onchange"); - } - - // Replace the actively selected content with the linked image - let html = ``; - html += `${image.name}`; - html += ''; - win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html); - }); - } - - }, - paste_preprocess: function (plugin, args) { - let content = args.content; - if (content.indexOf('`; - html += `${image.name}`; - html += ''; - editor.execCommand('mceInsertContent', false, html); - }); - } - }); - - // Paste image-uploads - editor.on('paste', event => { editorPaste(event, editor) }); - } -}; \ No newline at end of file diff --git a/resources/assets/js/libs/code.js b/resources/assets/js/services/code.js similarity index 100% rename from resources/assets/js/libs/code.js rename to resources/assets/js/services/code.js diff --git a/resources/assets/js/dom-polyfills.js b/resources/assets/js/services/dom-polyfills.js similarity index 77% rename from resources/assets/js/dom-polyfills.js rename to resources/assets/js/services/dom-polyfills.js index fcd89b766..d32af9118 100644 --- a/resources/assets/js/dom-polyfills.js +++ b/resources/assets/js/services/dom-polyfills.js @@ -2,10 +2,12 @@ * Polyfills for DOM API's */ +// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches if (!Element.prototype.matches) { Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; } +// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Browser_compatibility if (!Element.prototype.closest) { Element.prototype.closest = function (s) { var el = this; diff --git a/resources/assets/js/libs/drawio.js b/resources/assets/js/services/drawio.js similarity index 100% rename from resources/assets/js/libs/drawio.js rename to resources/assets/js/services/drawio.js diff --git a/resources/assets/js/services/events.js b/resources/assets/js/services/events.js new file mode 100644 index 000000000..cd747ede2 --- /dev/null +++ b/resources/assets/js/services/events.js @@ -0,0 +1,28 @@ +/** + * Simple global events manager + */ +class Events { + constructor() { + this.listeners = {}; + this.stack = []; + } + + emit(eventName, eventData) { + this.stack.push({name: eventName, data: eventData}); + if (typeof this.listeners[eventName] === 'undefined') return this; + let eventsToStart = this.listeners[eventName]; + for (let i = 0; i < eventsToStart.length; i++) { + let event = eventsToStart[i]; + event(eventData); + } + return this; + } + + listen(eventName, callback) { + if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; + this.listeners[eventName].push(callback); + return this; + } +} + +module.exports = Events; \ No newline at end of file diff --git a/resources/assets/js/services/global-ui.js b/resources/assets/js/services/global-ui.js new file mode 100644 index 000000000..948e8e880 --- /dev/null +++ b/resources/assets/js/services/global-ui.js @@ -0,0 +1,58 @@ +// Global jQuery Config & Extensions + +import jQuery from "jquery" +window.jQuery = window.$ = jQuery; + +/** + * Scroll the view to a specific element. + * @param {HTMLElement} element + */ +window.scrollToElement = function(element) { + if (!element) return; + let offset = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; + let top = element.getBoundingClientRect().top + offset; + $('html, body').animate({ + scrollTop: top - 60 // Adjust to change final scroll position top margin + }, 300); +}; + +/** + * Scroll and highlight an element. + * @param {HTMLElement} element + */ +window.scrollAndHighlight = function(element) { + if (!element) return; + window.scrollToElement(element); + let color = document.getElementById('custom-styles').getAttribute('data-color-light'); + let initColor = window.getComputedStyle(element).getPropertyValue('background-color'); + element.style.backgroundColor = color; + setTimeout(() => { + element.classList.add('selectFade'); + element.style.backgroundColor = initColor; + }, 10); + setTimeout(() => { + element.classList.remove('selectFade'); + element.style.backgroundColor = ''; + }, 3000); +}; + +// Smooth scrolling +jQuery.fn.smoothScrollTo = function () { + if (this.length === 0) return; + window.scrollToElement(this[0]); + return this; +}; + +// Making contains text expression not worry about casing +jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { + return function (elem) { + return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; + }; +}); + +// Detect IE for css +if(navigator.userAgent.indexOf('MSIE')!==-1 + || navigator.appVersion.indexOf('Trident/') > 0 + || navigator.userAgent.indexOf('Safari') !== -1){ + document.body.classList.add('flexbox-support'); +} \ No newline at end of file diff --git a/resources/assets/js/services/http.js b/resources/assets/js/services/http.js new file mode 100644 index 000000000..1e50fe2ae --- /dev/null +++ b/resources/assets/js/services/http.js @@ -0,0 +1,21 @@ +import axios from "axios" + +function instance() { + let axiosInstance = axios.create({ + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name=token]').getAttribute('content'), + 'baseURL': window.baseUrl('') + } + }); + axiosInstance.interceptors.request.use(resp => { + return resp; + }, err => { + if (typeof err.response === "undefined" || typeof err.response.data === "undefined") return Promise.reject(err); + if (typeof err.response.data.error !== "undefined") window.$events.emit('error', err.response.data.error); + if (typeof err.response.data.message !== "undefined") window.$events.emit('error', err.response.data.message); + }); + return axiosInstance; +} + + +export default instance; \ No newline at end of file diff --git a/resources/assets/js/translations.js b/resources/assets/js/services/translations.js similarity index 100% rename from resources/assets/js/translations.js rename to resources/assets/js/services/translations.js diff --git a/resources/assets/js/vues/code-editor.js b/resources/assets/js/vues/code-editor.js index c7926cf28..6453c6966 100644 --- a/resources/assets/js/vues/code-editor.js +++ b/resources/assets/js/vues/code-editor.js @@ -1,4 +1,4 @@ -const codeLib = require('../libs/code'); +const codeLib = require('../services/code'); const methods = { show() { From 0ade9b5b9b819697fdea33e9c7698e33e1d0057f Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 1 Apr 2018 14:10:12 +0100 Subject: [PATCH 10/31] Refactored moment.js out of app Reduces bundle size by 25% --- .gitignore | 1 + app/Http/Controllers/PageController.php | 3 +-- package-lock.json | 19 ------------------- package.json | 2 +- resources/assets/js/services/dates.js | 15 +++++++++++++++ resources/assets/js/vues/page-editor.js | 7 ++----- resources/assets/js/vues/search.js | 4 ++-- 7 files changed, 22 insertions(+), 29 deletions(-) create mode 100644 resources/assets/js/services/dates.js diff --git a/.gitignore b/.gitignore index be86e5a03..1b53cbe7a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ nbproject .buildpath .project .settings/ +webpack-stats.json \ No newline at end of file diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 17bce7eba..9cc73ae15 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -275,11 +275,10 @@ class PageController extends Controller $draft = $this->entityRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown'])); $updateTime = $draft->updated_at->timestamp; - $utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset; return response()->json([ 'status' => 'success', 'message' => trans('entities.pages_edit_draft_save_at'), - 'timestamp' => $utcUpdateTimestamp + 'timestamp' => $updateTime ]); } diff --git a/package-lock.json b/package-lock.json index ddb40574e..c794a62da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3645,15 +3645,6 @@ "is-extglob": "1.0.0" } }, - "extract-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-1.0.2.tgz", - "integrity": "sha512-hwlXWGHwzBXRNQCkDnLJuNgSkRsmYOwNz7wG9pHfA2EAgQaBCuQR71az7qL3rQT1JAMujiKPc+laet0kddVXWQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0" - } - }, "extract-text-webpack-plugin": { "version": "4.0.0-beta.0", "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", @@ -3710,16 +3701,6 @@ "escape-string-regexp": "1.0.5" } }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.4.5" - } - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", diff --git a/package.json b/package.json index eebda1fd6..2c2d8e370 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "scripts": { "build": "webpack", "production": "NODE_ENV=production webpack && rm -f ./public/dist/*styles.js", + "build-profile": "NODE_ENV=production webpack --profile --json > webpack-stats.json && rm -f ./public/dist/*styles.js", "dev": "npm-run-all --parallel watch livereload", "watch": "webpack --watch", "livereload": "livereload ./public/dist/", @@ -34,7 +35,6 @@ "jquery": "^3.3.1", "markdown-it": "^8.3.1", "markdown-it-task-lists": "^2.0.0", - "moment": "^2.21.0", "vue": "^2.2.6", "vuedraggable": "^2.14.1" }, diff --git a/resources/assets/js/services/dates.js b/resources/assets/js/services/dates.js new file mode 100644 index 000000000..d0ecc207d --- /dev/null +++ b/resources/assets/js/services/dates.js @@ -0,0 +1,15 @@ + +export function getCurrentDay() { + let date = new Date(); + let month = date.getMonth() + 1; + let day = date.getDate(); + + return `${date.getFullYear()}-${(month>9?'':'0') + month}-${(day>9?'':'0') + day}`; +} + +export function utcTimeStampToLocalTime(timestamp) { + let date = new Date(timestamp * 1000); + let hours = date.getHours(); + let mins = date.getMinutes(); + return `${(hours>9?'':'0') + hours}:${(mins>9?'':'0') + mins}`; +} \ No newline at end of file diff --git a/resources/assets/js/vues/page-editor.js b/resources/assets/js/vues/page-editor.js index d33739b30..bb8e14c4c 100644 --- a/resources/assets/js/vues/page-editor.js +++ b/resources/assets/js/vues/page-editor.js @@ -1,6 +1,4 @@ -const moment = require('moment'); -require('moment/locale/en-gb'); -moment.locale('en-gb'); +import * as Dates from "../services/dates"; let autoSaveFrequency = 30; @@ -96,9 +94,8 @@ let methods = { let url = window.baseUrl(`/ajax/page/${this.pageId}/save-draft`); window.$http.put(url, data).then(response => { draftErroring = false; - let updateTime = moment.utc(moment.unix(response.data.timestamp)).toDate(); if (!this.isNewDraft) this.isUpdateDraft = true; - this.draftNotifyChange(response.data.message + moment(updateTime).format('HH:mm')); + this.draftNotifyChange(`${response.data.message } ${Dates.utcTimeStampToLocalTime(response.data.timestamp)}`); lastSave = Date.now(); }, errorRes => { if (draftErroring) return; diff --git a/resources/assets/js/vues/search.js b/resources/assets/js/vues/search.js index 8cb790d24..c04104633 100644 --- a/resources/assets/js/vues/search.js +++ b/resources/assets/js/vues/search.js @@ -1,4 +1,4 @@ -const moment = require('moment'); +import * as Dates from "../services/dates"; let data = { terms: '', @@ -153,7 +153,7 @@ let methods = { }, enableDate(optionName) { - this.search.dates[optionName.toLowerCase()] = moment().format('YYYY-MM-DD'); + this.search.dates[optionName.toLowerCase()] = Dates.getCurrentDay(); this.dateChange(optionName); }, From 106432ee4ec139736406eb90a5f62460b92d9970 Mon Sep 17 00:00:00 2001 From: Jason Cheng Date: Mon, 2 Apr 2018 15:03:07 +0800 Subject: [PATCH 11/31] Added Language zh_TW Added Language zh_TW --- resources/lang/en/settings.php | 7 +- resources/lang/zh_TW/activities.php | 42 +++++ resources/lang/zh_TW/auth.php | 76 ++++++++ resources/lang/zh_TW/common.php | 64 +++++++ resources/lang/zh_TW/components.php | 32 ++++ resources/lang/zh_TW/entities.php | 260 ++++++++++++++++++++++++++++ resources/lang/zh_TW/errors.php | 79 +++++++++ resources/lang/zh_TW/pagination.php | 19 ++ resources/lang/zh_TW/passwords.php | 22 +++ resources/lang/zh_TW/settings.php | 117 +++++++++++++ resources/lang/zh_TW/validation.php | 108 ++++++++++++ 11 files changed, 823 insertions(+), 3 deletions(-) create mode 100644 resources/lang/zh_TW/activities.php create mode 100644 resources/lang/zh_TW/auth.php create mode 100644 resources/lang/zh_TW/common.php create mode 100644 resources/lang/zh_TW/components.php create mode 100644 resources/lang/zh_TW/entities.php create mode 100644 resources/lang/zh_TW/errors.php create mode 100644 resources/lang/zh_TW/pagination.php create mode 100644 resources/lang/zh_TW/passwords.php create mode 100644 resources/lang/zh_TW/settings.php create mode 100644 resources/lang/zh_TW/validation.php diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php index ba631fb9e..de4894280 100755 --- a/resources/lang/en/settings.php +++ b/resources/lang/en/settings.php @@ -19,7 +19,7 @@ return [ 'app_settings' => 'App Settings', 'app_name' => 'Application name', 'app_name_desc' => 'This name is shown in the header and any emails.', - 'app_name_header' => 'Show application name in header?', + 'app_name_header' => 'Show Application name in header?', 'app_public_viewing' => 'Allow public viewing?', 'app_secure_images' => 'Enable higher security image uploads?', 'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.', @@ -31,7 +31,7 @@ return [ 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', 'app_primary_color' => 'Application primary color', 'app_primary_color_desc' => 'This should be a hex value.
Leave empty to reset to the default color.', - 'app_homepage' => 'Application homepage', + 'app_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a page to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_default' => 'Default homepage view chosen', 'app_disable_comments' => 'Disable comments', @@ -132,7 +132,8 @@ return [ 'pl' => 'Polski', 'it' => 'Italian', 'ru' => 'Русский', - 'zh_CN' => '简体中文' + 'zh_CN' => '简体中文', + 'zh_TW' => '繁體中文' ] /////////////////////////////////// ]; diff --git a/resources/lang/zh_TW/activities.php b/resources/lang/zh_TW/activities.php new file mode 100644 index 000000000..95db20b09 --- /dev/null +++ b/resources/lang/zh_TW/activities.php @@ -0,0 +1,42 @@ + '建立了頁面', + 'page_create_notification' => '頁面已建立成功', + 'page_update' => '更新了頁面', + 'page_update_notification' => '頁面已更新成功', + 'page_delete' => '刪除了頁面', + 'page_delete_notification' => '頁面已刪除成功', + 'page_restore' => '恢複了頁面', + 'page_restore_notification' => '頁面已恢複成功', + 'page_move' => '移動了頁面', + + // Chapters + 'chapter_create' => '建立了章節', + 'chapter_create_notification' => '章節已建立成功', + 'chapter_update' => '更新了章節', + 'chapter_update_notification' => '章節已建立成功', + 'chapter_delete' => '刪除了章節', + 'chapter_delete_notification' => '章節已刪除成功', + 'chapter_move' => '移動了章節', + + // Books + 'book_create' => '建立了圖書', + 'book_create_notification' => '圖書已建立成功', + 'book_update' => '更新了圖書', + 'book_update_notification' => '圖書已更新成功', + 'book_delete' => '刪除了圖書', + 'book_delete_notification' => '圖書已刪除成功', + 'book_sort' => '排序了圖書', + 'book_sort_notification' => '圖書已重新排序成功', + + // Other + 'commented_on' => '評論', +]; diff --git a/resources/lang/zh_TW/auth.php b/resources/lang/zh_TW/auth.php new file mode 100644 index 000000000..f44ac8af0 --- /dev/null +++ b/resources/lang/zh_TW/auth.php @@ -0,0 +1,76 @@ + '使用者名稱或密碼錯誤。', + 'throttle' => '您的登入次數過多,請在:seconds秒後重試。', + + /** + * Login & Register + */ + 'sign_up' => '註冊', + 'log_in' => '登入', + 'log_in_with' => '以:socialDriver登入', + 'sign_up_with' => '註冊:socialDriver', + 'logout' => '登出', + + 'name' => '名稱', + 'username' => '使用者名稱', + 'email' => 'Email位址', + 'password' => '密碼', + 'password_confirm' => '確認密碼', + 'password_hint' => '必須超過5個字元', + 'forgot_password' => '忘記密碼?', + 'remember_me' => '記住我', + 'ldap_email_hint' => '請輸入用於此帳號的電子郵件。', + 'create_account' => '建立帳號', + 'social_login' => 'SNS登入', + 'social_registration' => 'SNS註冊', + 'social_registration_text' => '其他服務註冊/登入.', + + 'register_thanks' => '註冊完成!', + 'register_confirm' => '請點選查收您的Email,並點選確認。', + 'registrations_disabled' => '註冊目前被禁用', + 'registration_email_domain_invalid' => '此Email域名沒有權限進入本系統', + 'register_success' => '感謝您註冊:appName,您現在已經登入。', + + + /** + * Password Reset + */ + 'reset_password' => '重置密碼', + 'reset_password_send_instructions' => '在下方輸入您的Email位址,您將收到一封帶有密碼重置連結的郵件。', + 'reset_password_send_button' => '發送重置連結', + 'reset_password_sent_success' => '密碼重置連結已發送到:email。', + 'reset_password_success' => '您的密碼已成功重置。', + + 'email_reset_subject' => '重置您的:appName密碼', + 'email_reset_text' => '您收到此電子郵件是因為我們收到了您的帳號的密碼重置請求。', + 'email_reset_not_requested' => '如果您沒有要求重置密碼,則不需要採取進一步的操作。', + + + /** + * Email Confirmation + */ + 'email_confirm_subject' => '確認您在:appName的Email位址', + 'email_confirm_greeting' => '感謝您加入:appName!', + 'email_confirm_text' => '請點選下面的按鈕確認您的Email位址:', + 'email_confirm_action' => '確認Email', + 'email_confirm_send_error' => '需要Email驗證,但系統無法發送電子郵件,請聯繫網站管理員。', + 'email_confirm_success' => '您的Email位址已成功驗證!', + 'email_confirm_resent' => '驗證郵件已重新發送,請檢查收件箱。', + + 'email_not_confirmed' => 'Email位址未驗證', + 'email_not_confirmed_text' => '您的電子郵件位址尚未確認。', + 'email_not_confirmed_click_link' => '請檢查註冊時收到的電子郵件,然後點選確認連結。', + 'email_not_confirmed_resend' => '如果找不到電子郵件,請透過下面的表單重新發送確認Email。', + 'email_not_confirmed_resend_button' => '重新發送確認Email', +]; \ No newline at end of file diff --git a/resources/lang/zh_TW/common.php b/resources/lang/zh_TW/common.php new file mode 100644 index 000000000..1691038aa --- /dev/null +++ b/resources/lang/zh_TW/common.php @@ -0,0 +1,64 @@ + '取消', + 'confirm' => '確認', + 'back' => '返回', + 'save' => '儲存', + 'continue' => '繼續', + 'select' => '選擇', + 'more' => '更多', + + /** + * Form Labels + */ + 'name' => '名稱', + 'description' => '摘要', + 'role' => '角色', + 'cover_image' => '封面圖片', + 'cover_image_description' => '所使用圖片大小必須是440x250px。', + + /** + * Actions + */ + 'actions' => '動作', + 'view' => '檢視', + 'create' => '建立', + 'update' => '更新', + 'edit' => '編輯', + 'sort' => '排序', + 'move' => '移動', + 'reply' => '回複', + 'delete' => '刪除', + 'search' => '搜尋', + 'search_clear' => '清除搜尋', + 'reset' => '重置', + 'remove' => '刪除', + 'add' => '新增', + + /** + * Misc + */ + 'deleted_user' => '刪除使用者', + 'no_activity' => '無活動', + 'no_items' => '無項目', + 'back_to_top' => '回到頂端', + 'toggle_details' => '顯示/隱藏詳細資訊', + 'toggle_thumbnails' => '顯示/隱藏縮圖', + 'details' => '詳細資訊', + + /** + * Header + */ + 'view_profile' => '檢視資料', + 'edit_profile' => '編輯資料', + + /** + * Email Content + */ + 'email_action_help' => '如果您無法點選“:actionText”按鈕,請將下面的網址複製到您的瀏覽器中打開:', + 'email_rights' => 'All rights reserved', +]; diff --git a/resources/lang/zh_TW/components.php b/resources/lang/zh_TW/components.php new file mode 100644 index 000000000..ae0a083ad --- /dev/null +++ b/resources/lang/zh_TW/components.php @@ -0,0 +1,32 @@ + '選擇圖片', + 'image_all' => '全部', + 'image_all_title' => '檢視所有圖片', + 'image_book_title' => '檢視上傳到此書本的圖片', + 'image_page_title' => '檢視上傳到此頁面的圖片', + 'image_search_hint' => '以圖片名稱搜尋', + 'image_uploaded' => '上傳於 :uploadedDate', + 'image_load_more' => '載入更多', + 'image_image_name' => '圖片名稱', + 'image_delete_confirm' => '所使用圖片目前用於以下頁面,如果你想刪除它,請再次按下按鈕。', + 'image_select_image' => '選擇圖片', + 'image_dropzone' => '拖曳圖片或點選這裡上傳', + 'images_deleted' => '圖片已刪除', + 'image_preview' => '圖片預覽', + 'image_upload_success' => '圖片上傳成功', + 'image_update_success' => '圖片詳細資訊更新成功', + 'image_delete_success' => '圖片刪除成功', + + /** + * Code editor + */ + 'code_editor' => '編輯程式碼', + 'code_language' => '程式語言', + 'code_content' => '程式碼內容', + 'code_save' => '儲存程式碼', +]; \ No newline at end of file diff --git a/resources/lang/zh_TW/entities.php b/resources/lang/zh_TW/entities.php new file mode 100644 index 000000000..c5001318d --- /dev/null +++ b/resources/lang/zh_TW/entities.php @@ -0,0 +1,260 @@ + '最近建立', + 'recently_created_pages' => '最近建立的頁面', + 'recently_updated_pages' => '最新頁面', + 'recently_created_chapters' => '最近建立的章節', + 'recently_created_books' => '最近建立的書本', + 'recently_update' => '最近更新', + 'recently_viewed' => '最近看過', + 'recent_activity' => '近期活動', + 'create_now' => '立即建立', + 'revisions' => '修訂歷史', + 'meta_revision' => '版本號 #:revisionCount', + 'meta_created' => '建立於 :timeLength', + 'meta_created_name' => '由 :user 建立於 :timeLength', + 'meta_updated' => '更新於 :timeLength', + 'meta_updated_name' => '由 :user 更新於 :timeLength', + 'entity_select' => '選擇項目', + 'images' => '圖片', + 'my_recent_drafts' => '我最近的草稿', + 'my_recently_viewed' => '我最近看過', + 'no_pages_viewed' => '您還沒有看過任何頁面', + 'no_pages_recently_created' => '最近沒有頁面被建立', + 'no_pages_recently_updated' => '最近沒有頁面被更新', + 'export' => '匯出', + 'export_html' => '網頁檔案', + 'export_pdf' => 'PDF檔案', + 'export_text' => '純文字檔案', + + /** + * Permissions and restrictions + */ + 'permissions' => '權限', + 'permissions_intro' => '本設定優先權高於每個使用者角色本身所具有的權限。', + 'permissions_enable' => '啟用自訂權限', + 'permissions_save' => '儲存權限', + + /** + * Search + */ + 'search_results' => '搜尋結果', + 'search_total_results_found' => '共找到了:count個結果', + 'search_clear' => '清除搜尋', + 'search_no_pages' => '沒有找到符合的頁面', + 'search_for_term' => '“:term”的搜尋結果', + 'search_more' => '更多結果', + 'search_filters' => '過濾搜尋結果', + 'search_content_type' => '種類', + 'search_exact_matches' => '精確符合', + 'search_tags' => '標籤搜尋', + 'search_viewed_by_me' => '我看過的', + 'search_not_viewed_by_me' => '我沒看過的', + 'search_permissions_set' => '權限設定', + 'search_created_by_me' => '我建立的', + 'search_updated_by_me' => '我更新的', + 'search_updated_before' => '在此之前更新', + 'search_updated_after' => '在此之後更新', + 'search_created_before' => '在此之前建立', + 'search_created_after' => '在此之後建立', + 'search_set_date' => '設定日期', + 'search_update' => '更新搜尋結果', + + /** + * Books + */ + 'book' => '書本', + 'books' => '書本', + 'x_books' => ':count本書', + 'books_empty' => '不存在已建立的書', + 'books_popular' => '熱門書本', + 'books_recent' => '最近的書', + 'books_new' => '新書', + 'books_popular_empty' => '最受歡迎的書本將出現在這裡。', + 'books_new_empty' => '最近建立的書本將出現在這裡。', + 'books_create' => '建立書本', + 'books_delete' => '刪除書本', + 'books_delete_named' => '刪除書本「:bookName」', + 'books_delete_explain' => '這將刪除書本「:bookName」。所有的章節和頁面都會被刪除。', + 'books_delete_confirmation' => '您確定要刪除此書本嗎?', + 'books_edit' => '編輯書本', + 'books_edit_named' => '編輯書本「:bookName」', + 'books_form_book_name' => '書名', + 'books_save' => '儲存書本', + 'books_permissions' => '書本權限', + 'books_permissions_updated' => '書本權限已更新', + 'books_empty_contents' => '本書目前沒有頁面或章節。', + 'books_empty_create_page' => '建立頁面', + 'books_empty_or' => '或', + 'books_empty_sort_current_book' => '排序目前書本', + 'books_empty_add_chapter' => '加入章節', + 'books_permissions_active' => '有效的書本權限', + 'books_search_this' => '搜尋這本書', + 'books_navigation' => '書本導覽', + 'books_sort' => '排序書本內容', + 'books_sort_named' => '排序書本「:bookName」', + 'books_sort_show_other' => '顯示其他書本', + 'books_sort_save' => '儲存新順序', + + /** + * Chapters + */ + 'chapter' => '章節', + 'chapters' => '章節', + 'x_chapters' => ':count個章節', + 'chapters_popular' => '熱門章節', + 'chapters_new' => '新章節', + 'chapters_create' => '建立章節', + 'chapters_delete' => '刪除章節', + 'chapters_delete_named' => '刪除章節「:chapterName」', + 'chapters_delete_explain' => '這將刪除章節「:chapterName」。所有的頁面將被刪除並加入到其所在的書籍。', + 'chapters_delete_confirm' => '您確定要刪除此章節嗎?', + 'chapters_edit' => '編輯章節', + 'chapters_edit_named' => '編輯章節「:chapterName」', + 'chapters_save' => '儲存章節', + 'chapters_move' => '移動章節', + 'chapters_move_named' => '移動章節「:chapterName」', + 'chapter_move_success' => '章節移動到「:bookName」', + 'chapters_permissions' => '章節權限', + 'chapters_empty' => '本章目前沒有頁面。', + 'chapters_permissions_active' => '有效的章節權限', + 'chapters_permissions_success' => '章節權限已更新', + 'chapters_search_this' => '從本章節搜尋', + + /** + * Pages + */ + 'page' => '頁面', + 'pages' => '頁面', + 'x_pages' => ':count個頁面', + 'pages_popular' => '熱門頁面', + 'pages_new' => '新頁面', + 'pages_attachments' => '附件', + 'pages_navigation' => '頁面導覽', + 'pages_delete' => '刪除頁面', + 'pages_delete_named' => '刪除頁面“:pageName”', + 'pages_delete_draft_named' => '刪除草稿頁面“:pageName”', + 'pages_delete_draft' => '刪除草稿頁面', + 'pages_delete_success' => '頁面已刪除', + 'pages_delete_draft_success' => '草稿頁面已刪除', + 'pages_delete_confirm' => '您確定要刪除此頁面嗎?', + 'pages_delete_draft_confirm' => '您確定要刪除此草稿頁面嗎?', + 'pages_editing_named' => '正在編輯頁面“:pageName”', + 'pages_edit_toggle_header' => '顯示/隱藏導覽欄', + 'pages_edit_save_draft' => '儲存草稿', + 'pages_edit_draft' => '編輯頁面草稿', + 'pages_editing_draft' => '正在編輯草稿', + 'pages_editing_page' => '正在編輯頁面', + 'pages_edit_draft_save_at' => '草稿儲存於 ', + 'pages_edit_delete_draft' => '刪除草稿', + 'pages_edit_discard_draft' => '放棄草稿', + 'pages_edit_set_changelog' => '更新說明', + 'pages_edit_enter_changelog_desc' => '輸入對您所做更改的簡易說明', + 'pages_edit_enter_changelog' => '輸入更新說明', + 'pages_save' => '儲存頁面', + 'pages_title' => '頁面標題', + 'pages_name' => '頁面名稱', + 'pages_md_editor' => '編輯者', + 'pages_md_preview' => '預覽', + 'pages_md_insert_image' => '插入圖片', + 'pages_md_insert_link' => '插入連結', + 'pages_not_in_chapter' => '本頁面不在某章節中', + 'pages_move' => '移動頁面', + 'pages_move_success' => '頁面已移動到「:parentName」', + 'pages_permissions' => '頁面權限', + 'pages_permissions_success' => '頁面權限已更新', + 'pages_revision' => '修訂', + 'pages_revisions' => '頁面修訂', + 'pages_revisions_named' => '“:pageName”頁面修訂', + 'pages_revision_named' => '“:pageName”頁面修訂', + 'pages_revisions_created_by' => '建立者', + 'pages_revisions_date' => '修訂日期', + 'pages_revisions_number' => '#', + 'pages_revisions_changelog' => '更新說明', + 'pages_revisions_changes' => '說明', + 'pages_revisions_current' => '目前版本', + 'pages_revisions_preview' => '預覽', + 'pages_revisions_restore' => '恢複', + 'pages_revisions_none' => '此頁面沒有修訂', + 'pages_copy_link' => '複製連結', + 'pages_permissions_active' => '有效的頁面權限', + 'pages_initial_revision' => '初次發布', + 'pages_initial_name' => '新頁面', + 'pages_editing_draft_notification' => '您正在編輯在 :timeDiff 內儲存的草稿.', + 'pages_draft_edited_notification' => '此頁面已經被更新過,建議您放棄此草稿。', + 'pages_draft_edit_active' => [ + 'start_a' => ':count位使用者正在編輯此頁面', + 'start_b' => '使用者“:userName”已經開始編輯此頁面', + 'time_a' => '自頁面上次更新以來', + 'time_b' => '在最近:minCount分鐘', + 'message' => ':time,:start。注意不要覆蓋到對方的更新。', + ], + 'pages_draft_discarded' => '草稿已丟棄,編輯器已更新到目前頁面內容。', + + /** + * Editor sidebar + */ + 'page_tags' => '頁面標籤', + 'tag' => '標籤', + 'tags' => '', + 'tag_value' => '標籤值 (非必要)', + 'tags_explain' => "加入一些標籤以更好地對您的內容進行分類。\n您可以為標籤分配一個值,以進行更深入的組織。", + 'tags_add' => '加入另一個標籤', + 'attachments' => '附件', + 'attachments_explain' => '上傳一些檔案或附加連結顯示在您的網頁上。將顯示在在頁面的側邊欄。', + 'attachments_explain_instant_save' => '這裡的更改將立即儲存。Changes here are saved instantly.', + 'attachments_items' => '附加項目', + 'attachments_upload' => '上傳檔案', + 'attachments_link' => '附加連結', + 'attachments_set_link' => '設定連結', + 'attachments_delete_confirm' => '確認您想要刪除此附件後,請點選刪除。', + 'attachments_dropzone' => '刪除檔案或點選此處加入檔案', + 'attachments_no_files' => '尚未上傳檔案', // No files have been uploaded + 'attachments_explain_link' => '如果您不想上傳檔案,則可以附加連結,這可以是指向其他頁面的連結,也可以是指向雲端檔案的連結。', + 'attachments_link_name' => '連結名稱', + 'attachment_link' => '附件連結', + 'attachments_link_url' => '連結到檔案', + 'attachments_link_url_hint' => '網站或檔案的網址', + 'attach' => '附加', + 'attachments_edit_file' => '編輯檔案', + 'attachments_edit_file_name' => '檔案名稱', + 'attachments_edit_drop_upload' => '刪除檔案或點選這裡上傳並覆蓋', + 'attachments_order_updated' => '附件順序已更新', + 'attachments_updated_success' => '附件資訊已更新', + 'attachments_deleted' => '附件已刪除', + 'attachments_file_uploaded' => '附件上傳成功', + 'attachments_file_updated' => '附件更新成功', + 'attachments_link_attached' => '連結成功附加到頁面', + + /** + * Profile View + */ + 'profile_user_for_x' => '來這裡:time了', + 'profile_created_content' => '已建立內容', + 'profile_not_created_pages' => ':userName尚未建立任何頁面', + 'profile_not_created_chapters' => ':userName尚未建立任何章節', + 'profile_not_created_books' => ':userName尚未建立任何書本', + + /** + * Comments + */ + 'comment' => '評論', + 'comments' => '評論', + 'comment_placeholder' => '在這裡評論', + 'comment_count' => '{0} 無評論|[1,*] :count條評論', + 'comment_save' => '儲存評論', + 'comment_saving' => '正在儲存評論...', + 'comment_deleting' => '正在刪除評論...', + 'comment_new' => '新評論', + 'comment_created' => '評論於 :createDiff', + 'comment_updated' => '更新於 :updateDiff (:username)', + 'comment_deleted_success' => '評論已刪除', + 'comment_created_success' => '評論已加入', + 'comment_updated_success' => '評論已更新', + 'comment_delete_confirm' => '你確定要刪除這條評論?', + 'comment_in_reply_to' => '回覆 :commentId', +]; diff --git a/resources/lang/zh_TW/errors.php b/resources/lang/zh_TW/errors.php new file mode 100644 index 000000000..4ac6cd400 --- /dev/null +++ b/resources/lang/zh_TW/errors.php @@ -0,0 +1,79 @@ + '您沒有權限進入所請求的頁面。', + 'permissionJson' => '您沒有權限執行所請求的操作。', + + // Auth + 'error_user_exists_different_creds' => 'Email為 :email 的使用者已經存在,但具有不同的憑據。', + 'email_already_confirmed' => 'Email已被確認,請嘗試登錄。', + 'email_confirmation_invalid' => '此確認 Session 無效或已被使用,請重新註冊。', + 'email_confirmation_expired' => '確認 Session 已過期,已發送新的確認電子郵件。', + 'ldap_fail_anonymous' => '使用匿名綁定的LDAP進入失敗。', + 'ldap_fail_authed' => '帶有標識名稱和密碼的LDAP進入失敗。', + 'ldap_extension_not_installed' => '未安裝LDAP PHP外掛程式', + 'ldap_cannot_connect' => '無法連接到ldap伺服器,第一次連接失敗', + 'social_no_action_defined' => '沒有定義行為', + 'social_login_bad_response' => "在 :socialAccount 登錄時遇到錯誤:\n:error", + 'social_account_in_use' => ':socialAccount 帳號已被使用,請嘗試透過 :socialAccount 選項登錄。', + 'social_account_email_in_use' => 'Email :email 已經被使用。如果您已有帳號,則可以在個人資料設定中綁定您的 :socialAccount。', + 'social_account_existing' => ':socialAccount已經被綁定到您的帳號。', + 'social_account_already_used_existing' => ':socialAccount帳號已經被其他使用者使用。', + 'social_account_not_used' => ':socialAccount帳號沒有綁定到任何使用者,請在您的個人資料設定中綁定。', + 'social_account_register_instructions' => '如果您還沒有帳號,您可以使用 :socialAccount 選項註冊帳號。', + 'social_driver_not_found' => '未找到社交驅動程式', + 'social_driver_not_configured' => '您的:socialAccount社交設定不正確。', + + // System + 'path_not_writable' => '無法上傳到檔案路徑“:filePath”,請確保它可寫入伺服器。', + 'cannot_get_image_from_url' => '無法從 :url 中獲取圖片', + 'cannot_create_thumbs' => '伺服器無法建立縮圖,請檢查您是否安裝了GD PHP外掛。', + 'server_upload_limit' => '上傳圖片時發生錯誤。', + 'image_upload_error' => '上傳圖片時發生錯誤', + + // Attachments + 'attachment_page_mismatch' => '附件更新期間的頁面不符合', + + // Pages + 'page_draft_autosave_fail' => '無法儲存草稿,確保您在儲存頁面之前已經連接到互聯網', + 'page_custom_home_deletion' => '無法刪除一個被設定為首頁的頁面', + + // Entities + 'entity_not_found' => '未找到實體', + 'book_not_found' => '未找到圖書', + 'page_not_found' => '未找到頁面', + 'chapter_not_found' => '未找到章節', + 'selected_book_not_found' => '選中的書未找到', + 'selected_book_chapter_not_found' => '未找到所選的圖書或章節', + 'guests_cannot_save_drafts' => '訪客不能儲存草稿', + + // Users + 'users_cannot_delete_only_admin' => '您不能刪除唯一的管理員帳號', + 'users_cannot_delete_guest' => '您不能刪除訪客使用者', + + // Roles + 'role_cannot_be_edited' => '無法編輯這個角色', + 'role_system_cannot_be_deleted' => '無法刪除系統角色', + 'role_registration_default_cannot_delete' => '無法刪除設定為預設註冊的角色', + + // Comments + 'comment_list' => '讀取評論時發生錯誤。', + 'cannot_add_comment_to_draft' => '您不能為草稿加入評論。', + 'comment_add' => '加入/更新評論時發生錯誤。', + 'comment_delete' => '刪除評論時發生錯誤。', + 'empty_comment' => '不能加入空的評論。', + + // Error pages + '404_page_not_found' => '無法找到頁面', + 'sorry_page_not_found' => '對不起,無法找到您想進入的頁面。', + 'return_home' => '返回首頁', + 'error_occurred' => '發生錯誤', + 'app_down' => ':appName現在正在關閉', + 'back_soon' => '請耐心等待網站的恢複。', +]; \ No newline at end of file diff --git a/resources/lang/zh_TW/pagination.php b/resources/lang/zh_TW/pagination.php new file mode 100644 index 000000000..fc2f4a059 --- /dev/null +++ b/resources/lang/zh_TW/pagination.php @@ -0,0 +1,19 @@ + '« 上一頁', + 'next' => '下一頁 »', + +]; diff --git a/resources/lang/zh_TW/passwords.php b/resources/lang/zh_TW/passwords.php new file mode 100644 index 000000000..aa93eec1e --- /dev/null +++ b/resources/lang/zh_TW/passwords.php @@ -0,0 +1,22 @@ + '密碼必須至少包含六個字元並與確認相符。', + 'user' => "使用該Email位址的使用者不存在。", + 'token' => '此密碼重置 Session 無效。', + 'sent' => '我們已經透過Email發送您的密碼重置連結。', + 'reset' => '您的密碼已被重置。', + +]; diff --git a/resources/lang/zh_TW/settings.php b/resources/lang/zh_TW/settings.php new file mode 100644 index 000000000..806df0442 --- /dev/null +++ b/resources/lang/zh_TW/settings.php @@ -0,0 +1,117 @@ + '設定', + 'settings_save' => '儲存設定', + 'settings_save_success' => '設定已儲存', + + /** + * App settings + */ + + 'app_settings' => 'App設定', + 'app_name' => 'App名', + 'app_name_desc' => '此名稱將在網頁頂端和Email中顯示。', + 'app_name_header' => '在網頁頂端顯示應用名稱?', + 'app_public_viewing' => '開放公開閱覽?', + 'app_secure_images' => '啟用更高安全性的圖片上傳?', + 'app_secure_images_desc' => '出於效能考量,所有圖片都是公開的。這個選項會在圖片的網址前加入一個隨機並難以猜測的字元串,從而使直接進入變得困難。', + 'app_editor' => '頁面編輯器', + 'app_editor_desc' => '選擇所有使用者將使用哪個編輯器來編輯頁面。', + 'app_custom_html' => '自訂HTML頂端內容', + 'app_custom_html_desc' => '此處加入的任何內容都將插入到每個頁面的部分的底部,這對於覆蓋樣式或加入分析程式碼很方便。', + 'app_logo' => 'App Logo', + 'app_logo_desc' => '這個圖片的高度應該為43px。
大圖片將會被縮小。', + 'app_primary_color' => 'App主要配色', + 'app_primary_color_desc' => '請使用十六進位數值。
保留空白則重置回預設配色。', + 'app_homepage' => 'App首頁', + 'app_homepage_desc' => '選擇要做為首頁的頁面,這將會替換預設首頁,而且這個頁面的權限設定將被忽略。', + 'app_homepage_default' => '預設首頁選擇', + 'app_disable_comments' => '關閉評論', + 'app_disable_comments_desc' => '在App的所有頁面上關閉評論,已經存在的評論也不會顯示。', + + /** + * Registration settings + */ + + 'reg_settings' => '註冊設定', + 'reg_allow' => '開放註冊?', + 'reg_default_role' => '註冊後的預設使用者角色', + 'reg_confirm_email' => '需要Email驗證?', + 'reg_confirm_email_desc' => '如果使用網域名稱限制,則需要Email驗證,並且本設定將被忽略。', + 'reg_confirm_restrict_domain' => '網域名稱限制', + 'reg_confirm_restrict_domain_desc' => '輸入您想要限制註冊的Email域域名稱列表,用逗號隔開。在被允許與本系統連結之前,使用者會收到一封Email來確認他們的位址。
注意,使用者在註冊成功後可以修改他們的Email位址。', + 'reg_confirm_restrict_domain_placeholder' => '尚未設定限制的網域', + + /** + * Role settings + */ + + 'roles' => '角色', + 'role_user_roles' => '使用者角色', + 'role_create' => '建立角色', + 'role_create_success' => '角色建立成功', + 'role_delete' => '刪除角色', + 'role_delete_confirm' => '這將會刪除名為 \':roleName\' 的角色.', + 'role_delete_users_assigned' => '有:userCount位使用者屬於此角色。如果您想將此角色中的使用者遷移,請在下面選擇一個新角色。', + 'role_delete_no_migration' => "不要遷移使用者", + 'role_delete_sure' => '您確定要刪除這個角色?', + 'role_delete_success' => '角色刪除成功', + 'role_edit' => '編輯角色', + 'role_details' => '角色詳細資訊', + 'role_name' => '角色名', + 'role_desc' => '角色簡述', + 'role_system' => '系統權限', + 'role_manage_users' => '管理使用者', + 'role_manage_roles' => '管理角色與角色權限', + 'role_manage_entity_permissions' => '管理所有圖書,章節和頁面的權限', + 'role_manage_own_entity_permissions' => '管理自己的圖書,章節和頁面的權限', + 'role_manage_settings' => '管理App設定', + 'role_asset' => '資源項目', + 'role_asset_desc' => '對系統內資源的預設權限將由這裡的權限控制。若有單獨設定在書本、章節和頁面上的權限,將會覆蓋這裡的權限設定。', + 'role_all' => '全部', + 'role_own' => '擁有', + 'role_controlled_by_asset' => '依據隸屬的資源來決定', + 'role_save' => '儲存角色', + 'role_update_success' => '角色更新成功', + 'role_users' => '此角色的使用者', + 'role_users_none' => '目前沒有使用者被分配到這個角色', + + /** + * Users + */ + + 'users' => '使用者', + 'user_profile' => '使用者資料', + 'users_add_new' => '加入使用者', + 'users_search' => '搜尋使用者', + 'users_role' => '使用者角色', + 'users_external_auth_id' => '外部身份驗證ID', + 'users_password_warning' => '如果您想更改密碼,請填寫以下內容:', + 'users_system_public' => '此使用者代表進入您的App的任何訪客。它不能用於登入,而是自動分配。', + 'users_books_view_type' => '圖書瀏覽佈局偏好', + 'users_delete' => '刪除使用者', + 'users_delete_named' => '刪除使用者 :userName', + 'users_delete_warning' => '這將從系統中完全刪除名為 \':userName\' 的使用者。', + 'users_delete_confirm' => '您確定要刪除這個使用者?', + 'users_delete_success' => '使用者刪除成功。', + 'users_edit' => '編輯使用者', + 'users_edit_profile' => '編輯資料', + 'users_edit_success' => '使用者更新成功', + 'users_avatar' => '使用者大頭照', + 'users_avatar_desc' => '目前圖片應該為約256px的正方形。', + 'users_preferred_language' => '語言', + 'users_social_accounts' => '社群網站帳號', + 'users_social_accounts_info' => '在這里,您可以連結您的其他帳號,以便方便地登入。如果您選擇解除連結,之後將不能透過此社群網站帳號登入,請設定社群網站帳號來取消本系統p的進入權限。', + 'users_social_connect' => '連結帳號', + 'users_social_disconnect' => '解除連結帳號', + 'users_social_connected' => ':socialAccount 帳號已經成功連結到您的資料。', + 'users_social_disconnected' => ':socialAccount 帳號已經成功解除連結。', +]; diff --git a/resources/lang/zh_TW/validation.php b/resources/lang/zh_TW/validation.php new file mode 100644 index 000000000..5b708064d --- /dev/null +++ b/resources/lang/zh_TW/validation.php @@ -0,0 +1,108 @@ + ':attribute 需要被同意。', + 'active_url' => ':attribute 並不是一個有效的網址', + 'after' => ':attribute 必須是在 :date 後的日期。', + 'alpha' => ':attribute 只能包含字母。', + 'alpha_dash' => ':attribute 只能包含字母、數字和橫線。', + 'alpha_num' => ':attribute 只能包含字母和數字。', + 'array' => ':attribute 必須是陣列。', + 'before' => ':attribute 必須是在 :date 前的日期。', + 'between' => [ + 'numeric' => ':attribute 必須在:min到:max之間。', + 'file' => ':attribute 必須為:min到:max KB。', + 'string' => ':attribute 必須在:min到:max個字元之間。', + 'array' => ':attribute 必須在:min到:max項之間.', + ], + 'boolean' => ':attribute 字段必須為 true 或 false。', + 'confirmed' => ':attribute 確認不符。', + 'date' => ':attribute 不是一個有效的日期。', + 'date_format' => ':attribute 格式不符 :format。', + 'different' => ':attribute 和 :other 必須不同。', + 'digits' => ':attribute 必須為:digits位數。', + 'digits_between' => ':attribute 必須為:min到:max位數。', + 'email' => ':attribute 必須是有效的電子郵件位址。', + 'filled' => ':attribute 字段是必需的。', + 'exists' => '選中的 :attribute 無效。', + 'image' => ':attribute 必須是一個圖片。', + 'in' => '選中的 :attribute 無效。', + 'integer' => ':attribute 必須是一個整數。', + 'ip' => ':attribute 必須是一個有效的IP位址。', + 'max' => [ + 'numeric' => ':attribute 不能超過:max。', + 'file' => ':attribute 不能超過:max KB。', + 'string' => ':attribute 不能超過:max個字元。', + 'array' => ':attribute 不能有超過:max項。', + ], + 'mimes' => ':attribute 必須是 :values 類型的檔案。', + 'min' => [ + 'numeric' => ':attribute 至少為:min。', + 'file' => ':attribute 至少為:min KB。', + 'string' => ':attribute 至少為:min個字元。', + 'array' => ':attribute 至少有:min項。', + ], + 'not_in' => '選中的 :attribute 無效。', + 'numeric' => ':attribute 必須是一個數。', + 'regex' => ':attribute 格式無效。', + 'required' => ':attribute 字段是必需的。', + 'required_if' => '當:other為:value時,:attribute 字段是必需的。', + 'required_with' => '當:values存在時,:attribute 字段是必需的。', + 'required_with_all' => '當:values存在時,:attribute 字段是必需的。', + 'required_without' => '當:values不存在時,:attribute 字段是必需的。', + 'required_without_all' => '當:values均不存在時,:attribute 字段是必需的。', + 'same' => ':attribute 與 :other 必須匹配。', + 'size' => [ + 'numeric' => ':attribute 必須為:size。', + 'file' => ':attribute 必須為:size KB。', + 'string' => ':attribute 必須為:size個字元。', + 'array' => ':attribute 必須包含:size項。', + ], + 'string' => ':attribute 必須是字元串。', + 'timezone' => ':attribute 必須是有效的區域。', + 'unique' => ':attribute 已經被使用。', + 'url' => ':attribute 格式無效。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'password-confirm' => [ + 'required_with' => '需要確認密碼', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; From 007059273e6c8222b3b661b54c81d56097552e74 Mon Sep 17 00:00:00 2001 From: Jason Cheng Date: Mon, 2 Apr 2018 15:54:06 +0800 Subject: [PATCH 12/31] Add translate. Add translate. --- resources/lang/zh_TW/common.php | 2 ++ resources/lang/zh_TW/entities.php | 1 + resources/lang/zh_TW/errors.php | 2 ++ resources/lang/zh_TW/settings.php | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/lang/zh_TW/common.php b/resources/lang/zh_TW/common.php index 1691038aa..7e785cd7f 100644 --- a/resources/lang/zh_TW/common.php +++ b/resources/lang/zh_TW/common.php @@ -49,6 +49,8 @@ return [ 'toggle_details' => '顯示/隱藏詳細資訊', 'toggle_thumbnails' => '顯示/隱藏縮圖', 'details' => '詳細資訊', + 'grid_view' => '縮圖檢視', + 'list_view' => '清單撿視', /** * Header diff --git a/resources/lang/zh_TW/entities.php b/resources/lang/zh_TW/entities.php index c5001318d..b354a2f2f 100644 --- a/resources/lang/zh_TW/entities.php +++ b/resources/lang/zh_TW/entities.php @@ -162,6 +162,7 @@ return [ 'pages_md_preview' => '預覽', 'pages_md_insert_image' => '插入圖片', 'pages_md_insert_link' => '插入連結', + 'pages_md_insert_drawing' => '插入繪圖', 'pages_not_in_chapter' => '本頁面不在某章節中', 'pages_move' => '移動頁面', 'pages_move_success' => '頁面已移動到「:parentName」', diff --git a/resources/lang/zh_TW/errors.php b/resources/lang/zh_TW/errors.php index 4ac6cd400..4d7992ec8 100644 --- a/resources/lang/zh_TW/errors.php +++ b/resources/lang/zh_TW/errors.php @@ -36,9 +36,11 @@ return [ 'cannot_create_thumbs' => '伺服器無法建立縮圖,請檢查您是否安裝了GD PHP外掛。', 'server_upload_limit' => '上傳圖片時發生錯誤。', 'image_upload_error' => '上傳圖片時發生錯誤', + 'image_upload_type_error' => '上傳圖片類型錯誤', // Attachments 'attachment_page_mismatch' => '附件更新期間的頁面不符合', + 'attachment_not_found' => '沒有找到附件', // Pages 'page_draft_autosave_fail' => '無法儲存草稿,確保您在儲存頁面之前已經連接到互聯網', diff --git a/resources/lang/zh_TW/settings.php b/resources/lang/zh_TW/settings.php index 806df0442..a61b15d23 100644 --- a/resources/lang/zh_TW/settings.php +++ b/resources/lang/zh_TW/settings.php @@ -96,7 +96,7 @@ return [ 'users_external_auth_id' => '外部身份驗證ID', 'users_password_warning' => '如果您想更改密碼,請填寫以下內容:', 'users_system_public' => '此使用者代表進入您的App的任何訪客。它不能用於登入,而是自動分配。', - 'users_books_view_type' => '圖書瀏覽佈局偏好', + //'users_books_view_type' => '圖書瀏覽佈局偏好', 'users_delete' => '刪除使用者', 'users_delete_named' => '刪除使用者 :userName', 'users_delete_warning' => '這將從系統中完全刪除名為 \':userName\' 的使用者。', From 64d5763d08c4df03f4a74fe050f73f88d768c05e Mon Sep 17 00:00:00 2001 From: Jason Cheng Date: Mon, 2 Apr 2018 16:09:23 +0800 Subject: [PATCH 13/31] Add zh_TW Locales. Add zh_TW Locales. --- config/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/app.php b/config/app.php index fad0c20f2..b3bc4b8fd 100755 --- a/config/app.php +++ b/config/app.php @@ -61,7 +61,7 @@ return [ */ 'locale' => env('APP_LANG', 'en'), - 'locales' => ['en', 'de', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'ja', 'pl', 'it', 'ru', 'zh_CN'], + 'locales' => ['en', 'de', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'ja', 'pl', 'it', 'ru', 'zh_CN', 'zh_TW'], /* |-------------------------------------------------------------------------- From e392e1fd8b961fb1d6a49eb8d0666e95e989b5a5 Mon Sep 17 00:00:00 2001 From: Marcos Date: Tue, 3 Apr 2018 15:58:04 +0200 Subject: [PATCH 14/31] Completely overhaul of the Spanish translation, added missing strings --- resources/lang/en/entities.php | 4 +- resources/lang/es/auth.php | 70 ++++++++-------- resources/lang/es/common.php | 16 ++-- resources/lang/es/components.php | 15 +++- resources/lang/es/entities.php | 139 ++++++++++++++++++++----------- resources/lang/es/errors.php | 57 +++++++------ resources/lang/es/passwords.php | 10 +-- resources/lang/es/settings.php | 70 ++++++++-------- resources/lang/es/validation.php | 50 +++++------ 9 files changed, 247 insertions(+), 184 deletions(-) diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index c25dbb623..a4d3ae6e8 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -190,7 +190,7 @@ return [ 'pages_draft_edit_active' => [ 'start_a' => ':count users have started editing this page', 'start_b' => ':userName has started editing this page', - 'time_a' => 'since the pages was last updated', + 'time_a' => 'since the page was last updated', 'time_b' => 'in the last :minCount minutes', 'message' => ':start :time. Take care not to overwrite each other\'s updates!', ], @@ -208,7 +208,7 @@ return [ 'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.", 'tags_add' => 'Add another tag', 'attachments' => 'Attachments', - 'attachments_explain' => 'Upload some files or attach some link to display on your page. These are visible in the page sidebar.', + 'attachments_explain' => 'Upload some files or attach some links to display on your page. These are visible in the page sidebar.', 'attachments_explain_instant_save' => 'Changes here are saved instantly.', 'attachments_items' => 'Attached Items', 'attachments_upload' => 'Upload File', diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php index 572267904..6cad2a323 100644 --- a/resources/lang/es/auth.php +++ b/resources/lang/es/auth.php @@ -16,59 +16,61 @@ return [ /** * Login & Register */ - 'sign_up' => 'Inscribete', - 'log_in' => 'Log in', - 'logout' => 'Logout', + 'sign_up' => 'Registrarse', + 'log_in' => 'Acceder', + 'log_in_with' => 'Acceder con :socialDriver', + 'sign_up_with' => 'Registrarse con :socialDriver', + 'logout' => 'Salir', 'name' => 'Nombre', - 'username' => 'Username', - 'email' => 'Email', - 'password' => 'Password', - 'password_confirm' => 'Confirmar Password', - 'password_hint' => 'Debe contener al menos 5 caracteres', - 'forgot_password' => 'Olvidó Password?', + 'username' => 'Usuario', + 'email' => 'Correo electrónico', + 'password' => 'Contraseña', + 'password_confirm' => 'Confirmar Contraseña', + 'password_hint' => 'Debe contener más de 5 caracteres', + 'forgot_password' => '¿Contraseña Olvidada?', 'remember_me' => 'Recordarme', 'ldap_email_hint' => 'Por favor introduzca un mail para utilizar con esta cuenta.', - 'create_account' => 'Crear una cuenta', + 'create_account' => 'Crear una Cuenta', 'social_login' => 'Login Social', 'social_registration' => 'Registro Social', 'social_registration_text' => 'Registrar y entrar utilizando otro servicio.', - 'register_thanks' => 'Gracias por registrarse!', - 'register_confirm' => 'Por favor chequee su email y haga clic en el botón de confirmación enviado para acceder a :appName.', + 'register_thanks' => '¡Gracias por registrarse!', + 'register_confirm' => 'Por favor compruebe su correo electrónico y haga clic en el botón de confirmación enviado para acceder a :appName.', 'registrations_disabled' => 'Los registros están deshabilitados actualmente', - 'registration_email_domain_invalid' => 'Este dominio de Email no tiene acceso a esta aplicación', - 'register_success' => 'Gracias por registrarse! Ahora se encuentra registrado y logueado.', + 'registration_email_domain_invalid' => 'Este dominio de correo electrónico no tiene acceso a esta aplicación', + 'register_success' => '¡Gracias por registrarse! Ahora se encuentra registrado y logueado.', /** * Password Reset */ - 'reset_password' => 'Reset Password', - 'reset_password_send_instructions' => 'Introduzca su email a continuación y le será enviado un correo con un link para la restauración', - 'reset_password_send_button' => 'Enviar Link de Reset', - 'reset_password_sent_success' => 'Un link para resetear password ha sido enviado a :email.', - 'reset_password_success' => 'Su password ha sido reiniciado de manera éxitosa.', + 'reset_password' => 'Resetear Contraseña', + 'reset_password_send_instructions' => 'Introduzca su correo electrónico a continuación y le será enviado un correo con un link para la restauración', + 'reset_password_send_button' => 'Enviar Enlace de Reseteo', + 'reset_password_sent_success' => 'Un enlace para resetear la contraseña ha sido enviado a :email.', + 'reset_password_success' => 'Su password ha sido reseteado de manera éxitosa.', - 'email_reset_subject' => 'Reset de su password de :appName', - 'email_reset_text' => 'Ud. esta recibiendo este email debido a que recibimos una solicitud de reset de password de su cuenta.', - 'email_reset_not_requested' => 'Si ud. no solicitó un reset de password, no es requerida ninguna acción.', + 'email_reset_subject' => 'Resetee la contraseña de :appName', + 'email_reset_text' => 'Está recibiendo este correo electrónico debido a que recibimos una solicitud de reseteo de contraseña de su cuenta.', + 'email_reset_not_requested' => 'Si no ha solicitado un reseteo de la contraseña, no es requerida ninguna acción por su parte.', /** * Email Confirmation */ - 'email_confirm_subject' => 'Confirme su email en :appName', - 'email_confirm_greeting' => 'Gracias por unirse a :appName!', - 'email_confirm_text' => 'Por favor confirme su dirección de email haciendo click en el siguiente botón:', - 'email_confirm_action' => 'Confirmar Email', - 'email_confirm_send_error' => 'Confirmation de email requerida pero el sistema no pudo enviar el mail. Contacte al administrador para asegurarse que el email está seteado correctamente.', - 'email_confirm_success' => 'Su email hasido confirmado!', - 'email_confirm_resent' => 'Email de confirmación reenviado, Por favor chequee su Inbox.', + 'email_confirm_subject' => 'Confirme su correo electrónico en :appName', + 'email_confirm_greeting' => '¡Gracias por unirse a :appName!', + 'email_confirm_text' => 'Por favor confirme su dirección de correo electrónico haciendo click en el siguiente botón:', + 'email_confirm_action' => 'Confirmar Correo Electrónico', + 'email_confirm_send_error' => 'Confirmation de correo electrónico requerida pero el sistema no pudo enviar el correo. Contacte con el administrador para asegurarse de que el correo electrónico está configurado correctamente.', + 'email_confirm_success' => '¡Su correo electrónico ha sido confirmado!', + 'email_confirm_resent' => 'correo electrónico de confirmación reenviado, compruebe su bandeja de entrada.', - 'email_not_confirmed' => 'Dirección de email no confirmada', - 'email_not_confirmed_text' => 'Su cuenta de email todavía no ha sido confirmada.', - 'email_not_confirmed_click_link' => 'Por favor chequee el email con el link de confirmación que ha sido enviado luego de registrarse.', - 'email_not_confirmed_resend' => 'Si no puede encontrar el email, puede solicitar el renvío del email de confirmación rellenando el formulario a continuación.', - 'email_not_confirmed_resend_button' => 'Reenviar Email de confirmación', + 'email_not_confirmed' => 'Dirección de Correo Electrónico no confirmada', + 'email_not_confirmed_text' => 'Su Cuenta de Correo electrónico todavía no ha sido confirmada.', + 'email_not_confirmed_click_link' => 'Por favor siga el enlace en el correo electrónico que ha sido enviado durante el proceso de registro.', + 'email_not_confirmed_resend' => 'Si no puede encontrar el correo electrónico, puede solicitar el renvío del correo electrónico de confirmación rellenando el formulario que se muestra a continuación.', + 'email_not_confirmed_resend_button' => 'Reenviar Correo Electrónico de confirmación', ]; diff --git a/resources/lang/es/common.php b/resources/lang/es/common.php index a173f286e..dabeec472 100644 --- a/resources/lang/es/common.php +++ b/resources/lang/es/common.php @@ -10,6 +10,7 @@ return [ 'save' => 'Guardar', 'continue' => 'Continuar', 'select' => 'Seleccionar', + 'more' => 'Más', /** * Form Labels @@ -18,7 +19,8 @@ return [ 'description' => 'Descripción', 'role' => 'Rol', 'cover_image' => 'Imagen de portada', - 'cover_image_description' => 'Esta imagen debe ser aproximadamente 300x170px.', + 'cover_image_description' => 'Esta imagen debe ser aproximadamente de 440x250px.', + /** * Actions */ @@ -29,22 +31,26 @@ return [ 'edit' => 'Editar', 'sort' => 'Ordenar', 'move' => 'Mover', + 'reply' => 'Responder', 'delete' => 'Borrar', 'search' => 'Buscar', 'search_clear' => 'Limpiar búsqueda', - 'reset' => 'Reset', + 'reset' => 'Resetear', 'remove' => 'Remover', - + 'add' => 'Añadir', /** * Misc */ 'deleted_user' => 'Usuario borrado', 'no_activity' => 'Ninguna actividad para mostrar', - 'no_items' => 'No hay items disponibles', + 'no_items' => 'No hay elementos disponibles', 'back_to_top' => 'Volver arriba', 'toggle_details' => 'Alternar detalles', 'toggle_thumbnails' => 'Alternar miniaturas', + 'details' => 'Detalles', + 'grid_view' => 'Vista en Cuadrícula', + 'list_view' => 'Vista en Lista', /** * Header @@ -55,6 +61,6 @@ return [ /** * Email Content */ - 'email_action_help' => 'Si está teniendo problemas haga click en el botón ":actionText", copie y pegue la siguiente URL en su navegador web:', + 'email_action_help' => 'Si está teniendo problemas clicando en el botón ":actionText", copie y pegue la siguiente URL en su navegador web:', 'email_rights' => 'Todos los derechos reservados', ]; diff --git a/resources/lang/es/components.php b/resources/lang/es/components.php index 980765866..94d8cf09c 100644 --- a/resources/lang/es/components.php +++ b/resources/lang/es/components.php @@ -5,7 +5,7 @@ return [ * Image Manager */ 'image_select' => 'Seleccionar Imagen', - 'image_all' => 'Todo', + 'image_all' => 'Todas', 'image_all_title' => 'Ver todas las imágenes', 'image_book_title' => 'Ver las imágenes subidas a este libro', 'image_page_title' => 'Ver las imágenes subidas a esta página', @@ -13,12 +13,21 @@ return [ 'image_uploaded' => 'Subido el :uploadedDate', 'image_load_more' => 'Cargar más', 'image_image_name' => 'Nombre de imagen', - 'image_delete_confirm' => 'Esta imagen esta siendo utilizada en las páginas a continuación, haga click de nuevo para confirmar que quiere borrar esta imagen.', + 'image_delete_confirm' => 'Esta imagen está siendo utilizada en las páginas mostradas a continuación, haga click de nuevo para confirmar que quiere borrar esta imagen.', 'image_select_image' => 'Seleccionar Imagen', 'image_dropzone' => 'Arrastre las imágenes o hacer click aquí para Subir', 'images_deleted' => 'Imágenes borradas', - 'image_preview' => 'Preview de la imagen', + 'image_preview' => 'Previsualización de la imagen', 'image_upload_success' => 'Imagen subida éxitosamente', 'image_update_success' => 'Detalles de la imagen actualizados exitosamente', 'image_delete_success' => 'Imagen borrada exitosamente' + 'image_upload_remove' => 'Borrar', + + /** + * Code editor + */ + 'code_editor' => 'Editar Código', + 'code_language' => 'Lenguaje del Código', + 'code_content' => 'Contenido del Código', + 'code_save' => 'Guardar Código', ]; diff --git a/resources/lang/es/entities.php b/resources/lang/es/entities.php index ba4ca955a..b57d51491 100644 --- a/resources/lang/es/entities.php +++ b/resources/lang/es/entities.php @@ -14,65 +14,85 @@ return [ 'recent_activity' => 'Actividad reciente', 'create_now' => 'Crear uno ahora', 'revisions' => 'Revisiones', + 'meta_revision' => 'Revisión #:revisionCount', 'meta_created' => 'Creado el :timeLength', - 'meta_created_name' => 'Creado el :timeLength por :user', + 'meta_created_name' => 'Creado el :timeLength por :user', 'meta_updated' => 'Actualizado el :timeLength', 'meta_updated_name' => 'Actualizado el :timeLength por :user', - 'x_pages' => ':count Páginas', 'entity_select' => 'Seleccione entidad', 'images' => 'Imágenes', 'my_recent_drafts' => 'Mis borradores recientes', 'my_recently_viewed' => 'Mis visualizaciones recientes', - 'no_pages_viewed' => 'Ud. no ha visto ninguna página', + 'no_pages_viewed' => 'No ha visto ninguna página', 'no_pages_recently_created' => 'Ninguna página ha sido creada recientemente', 'no_pages_recently_updated' => 'Ninguna página ha sido actualizada recientemente', - 'export' => 'Export', - 'export_html' => 'Contained Web File', - 'export_pdf' => 'PDF File', - 'export_text' => 'Plain Text File', + 'export' => 'Exportar', + 'export_html' => 'Archivo web', + 'export_pdf' => 'Archivo PDF', + 'export_text' => 'Archivo de texto', /** * Permissions and restrictions */ 'permissions' => 'Permisos', - 'permissions_intro' => 'una vez habilitado, Estos permisos tendrán prioridad por encima de cualquier permiso establecido.', - 'permissions_enable' => 'Habilitar permisos custom', + 'permissions_intro' => 'Una vez habilitado, estos permisos tendrán prioridad por encima de cualquier permiso establecido.', + 'permissions_enable' => 'Habilitar permisos personalizados', 'permissions_save' => 'Guardar permisos', /** * Search */ - 'search_results' => 'Buscar resultados', + 'search_results' => 'Resultados de búsqueda', + 'search_total_results_found' => 'Se han encontrado :count resultados|Se han encontrado :count resultados en total', 'search_clear' => 'Limpiar resultados', 'search_no_pages' => 'Ninguna página encontrada para la búsqueda', - 'search_for_term' => 'Busqueda por :term', + 'search_for_term' => 'Búsqueda por :term', + 'search_more' => 'Más Resultados', + 'search_filters' => 'Filtros de Búsqueda', + 'search_content_type' => 'Tipo de Contenido', + 'search_exact_matches' => 'Coincidencias Exactas', + 'search_tags' => 'Búsquedas Etiquetadas', + 'search_viewed_by_me' => 'Vistas por mí', + 'search_not_viewed_by_me' => 'No vistas por mí', + 'search_permissions_set' => 'Permisos ajustados', + 'search_created_by_me' => 'Creadas por mí', + 'search_updated_by_me' => 'Actualizadas por mí', + 'search_updated_before' => 'Actualizadas antes de', + 'search_updated_after' => 'Actualizadas después de', + 'search_created_before' => 'Creadas antes de', + 'search_created_after' => 'Creadas después de', + 'search_set_date' => 'Ajustar Fecha', + 'search_update' => 'Actualizar Búsqueda', /** * Books */ 'book' => 'Libro', 'books' => 'Libros', + 'x_books' => ':count Libro|:count Libros', 'books_empty' => 'No hay libros creados', 'books_popular' => 'Libros populares', 'books_recent' => 'Libros recientes', + 'books_new' => 'Libros nuevos', 'books_popular_empty' => 'Los libros más populares aparecerán aquí.', + 'books_new_empty' => 'Los libros más recientes aparecerán aquí.', 'books_create' => 'Crear nuevo libro', 'books_delete' => 'Borrar libro', 'books_delete_named' => 'Borrar libro :bookName', - 'books_delete_explain' => 'Esto borrará el libro con el nombre \':bookName\', Todos las páginas y capítulos serán removios.', + 'books_delete_explain' => 'Esto borrará el libro con el nombre \':bookName\', Todos las páginas y capítulos serán borrados.', 'books_delete_confirmation' => '¿Está seguro de que desea borrar este libro?', 'books_edit' => 'Editar Libro', 'books_edit_named' => 'Editar Libro :bookName', 'books_form_book_name' => 'Nombre de libro', 'books_save' => 'Guardar libro', - 'books_permissions' => 'permisos de libro', - 'books_permissions_updated' => 'Permisos de libro actualizados', + 'books_permissions' => 'Permisos del libro', + 'books_permissions_updated' => 'Permisos del libro actualizados', 'books_empty_contents' => 'Ninguna página o capítulo ha sido creada para este libro.', 'books_empty_create_page' => 'Crear una nueva página', 'books_empty_or' => 'ó', 'books_empty_sort_current_book' => 'Organizar el libro actual', 'books_empty_add_chapter' => 'Agregar un capítulo', - 'books_permissions_active' => 'Permisos de libro activados', + 'books_permissions_active' => 'Permisos de libro activos', 'books_search_this' => 'Buscar en este libro', 'books_navigation' => 'Navegación de libro', 'books_sort' => 'Organizar contenido de libro', @@ -85,14 +105,14 @@ return [ */ 'chapter' => 'Capítulo', 'chapters' => 'Capítulos', + 'x_chapters' => ':count Capítulo|:count Capítulos', 'chapters_popular' => 'Capítulos populares', 'chapters_new' => 'Nuevo capítulo', 'chapters_create' => 'Crear nuevo capítulo', 'chapters_delete' => 'Borrar capítulo', 'chapters_delete_named' => 'Borrar capítulo :chapterName', - 'chapters_delete_explain' => 'Esto borrará el caítulo con el nombre \':chapterName\', todas las páginas serán removidas - y agregadas directamente al libro padre.', - 'chapters_delete_confirm' => 'Está ud. seguro de borrar este capítulo?', + 'chapters_delete_explain' => 'Esto borrará el capítulo con el nombre \':chapterName\', todas las páginas serán eliminadas y agregadas directamente al libro padre.', + 'chapters_delete_confirm' => '¿Está seguro de borrar este capítulo?', 'chapters_edit' => 'Editar capítulo', 'chapters_edit_named' => 'Editar capítulo :chapterName', 'chapters_save' => 'Guardar capítulo', @@ -101,14 +121,16 @@ return [ 'chapter_move_success' => 'Capítulo movido a :bookName', 'chapters_permissions' => 'Permisos de capítulo', 'chapters_empty' => 'No existen páginas en este capítulo.', - 'chapters_permissions_active' => 'Permisos de capítulo activado', + 'chapters_permissions_active' => 'Permisos de capítulo activos', 'chapters_permissions_success' => 'Permisos de capítulo actualizados', + 'chapters_search_this' => 'Buscar este capítulo', /** * Pages */ 'page' => 'Página', 'pages' => 'Páginas', + 'x_pages' => ':count Página|:count Páginas', 'pages_popular' => 'Páginas populares', 'pages_new' => 'Nueva página', 'pages_attachments' => 'Adjuntos', @@ -119,8 +141,8 @@ return [ 'pages_delete_draft' => 'Borrar borrador de página', 'pages_delete_success' => 'Página borrada', 'pages_delete_draft_success' => 'Borrador de página borrado', - 'pages_delete_confirm' => 'Está ud. seguro de borrar esta página ?', - 'pages_delete_draft_confirm' => 'Está ud. seguro de que desea borrar este borrador de página?', + 'pages_delete_confirm' => '¿Está seguro de borrar esta página?', + 'pages_delete_draft_confirm' => '¿Está seguro de que desea borrar este borrador de página?', 'pages_editing_named' => 'Editando página :pageName', 'pages_edit_toggle_header' => 'Toggle Título', 'pages_edit_save_draft' => 'Guardar borrador', @@ -130,81 +152,86 @@ return [ 'pages_edit_draft_save_at' => 'Borrador guardado el ', 'pages_edit_delete_draft' => 'Borrar borrador', 'pages_edit_discard_draft' => 'Descartar borrador', - 'pages_edit_set_changelog' => 'Set Changelog', + 'pages_edit_set_changelog' => 'Ajustar Log de cambios', 'pages_edit_enter_changelog_desc' => 'Introduzca una breve descripción de los cambios que ha realizado', - 'pages_edit_enter_changelog' => 'Entrar en Changelog', + 'pages_edit_enter_changelog' => 'Entrar al Log de cambios', 'pages_save' => 'Guardar página', 'pages_title' => 'Título de página', 'pages_name' => 'Nombre de página', 'pages_md_editor' => 'Editor', - 'pages_md_preview' => 'Preview', + 'pages_md_preview' => 'Previsualizar', 'pages_md_insert_image' => 'Insertar Imagen', 'pages_md_insert_link' => 'Insertar link de entidad', - 'pages_not_in_chapter' => 'La página no esá en el caítulo', + 'pages_md_insert_drawing' => 'Insertar Dibujo', + 'pages_not_in_chapter' => 'La página no está en un capítulo', 'pages_move' => 'Mover página', 'pages_move_success' => 'Página movida a ":parentName"', 'pages_permissions' => 'Permisos de página', 'pages_permissions_success' => 'Permisos de página actualizados', + 'pages_revision' => 'Revisión', 'pages_revisions' => 'Revisiones de página', 'pages_revisions_named' => 'Revisiones de página para :pageName', - 'pages_revision_named' => 'Revisión de ágina para :pageName', + 'pages_revision_named' => 'Revisión de página para :pageName', 'pages_revisions_created_by' => 'Creado por', 'pages_revisions_date' => 'Fecha de revisión', - 'pages_revisions_changelog' => 'Changelog', + 'pages_revisions_number' => '#', + 'pages_revisions_changelog' => 'Log de cambios', 'pages_revisions_changes' => 'Cambios', 'pages_revisions_current' => 'Versión actual', - 'pages_revisions_preview' => 'Preview', + 'pages_revisions_preview' => 'Previsualizar', 'pages_revisions_restore' => 'Restaurar', 'pages_revisions_none' => 'Esta página no tiene revisiones', - 'pages_copy_link' => 'Copiar Link', + 'pages_copy_link' => 'Copiar Enlace', 'pages_permissions_active' => 'Permisos de página activos', 'pages_initial_revision' => 'Publicación inicial', 'pages_initial_name' => 'Página nueva', - 'pages_editing_draft_notification' => 'Ud. está actualmente editando un borrador que fue guardado porúltima vez el :timeDiff.', - 'pages_draft_edited_notification' => 'Esta página ha sido actualizada desde aquel momento. Se recomienda que cancele este borrador.', + 'pages_editing_draft_notification' => 'Está actualmente editando un borrador que fue guardado por última vez el :timeDiff.', + 'pages_draft_edited_notification' => 'Esta página ha sido actualizada desde ese momento. Se recomienda que cancele este borrador.', 'pages_draft_edit_active' => [ 'start_a' => ':count usuarios han comenzado a editar esta página', 'start_b' => ':userName ha comenzado a editar esta página', - 'time_a' => 'desde que las página fue actualizada', + 'time_a' => 'desde que la página fue actualizada', 'time_b' => 'en los últimos :minCount minutos', - 'message' => ':start :time. Ten cuidado de no sobreescribir los cambios del otro usuario', + 'message' => ':start :time. ¡Ten cuidado de no sobreescribir los cambios del otro usuario!', ], 'pages_draft_discarded' => 'Borrador descartado, el editor ha sido actualizado con el contenido de la página actual', /** * Editor sidebar */ - 'page_tags' => 'Etiquetas de página', + 'page_tags' => 'Etiquetas de Página', + 'chapter_tags' => 'Etiquetas de Capítulo', + 'book_tags' => 'Etiquetas de Libro', 'tag' => 'Etiqueta', 'tags' => 'Etiquetas', 'tag_value' => 'Valor de la etiqueta (Opcional)', - 'tags_explain' => "Agregar algunas etiquetas para mejorar la categorización de su contenido. \n Ud. puede asignar un valor a una etiqueta para una organizacón a mayor detalle.", + 'tags_explain' => "Agrege algunas etiquetas para mejorar la categorización de su contenido. \n Puede asignar un valor a una etiqueta para una organizacón a mayor detalle.", 'tags_add' => 'Agregar otra etiqueta', 'attachments' => 'Adjuntos', - 'attachments_explain' => 'Subir ficheros o agregar links para mostrar en la página. Estos son visibles en la barra lateral de la página.', + 'attachments_explain' => 'Subir ficheros o agregar enlaces para mostrar en la página. Estos son visibles en la barra lateral de la página.', 'attachments_explain_instant_save' => 'Los cambios son guardados de manera instantánea .', - 'attachments_items' => 'Items adjuntados', - 'attachments_upload' => 'Fichero adjuntado', - 'attachments_link' => 'Adjuntar Link', - 'attachments_set_link' => 'Setear Link', + 'attachments_items' => 'Elementos adjuntados', + 'attachments_upload' => 'Subir Archivo', + 'attachments_link' => 'Adjuntar Enlace', + 'attachments_set_link' => 'Ajustar Enlace', 'attachments_delete_confirm' => 'Haga click en borrar nuevamente para confirmar que quiere borrar este adjunto.', - 'attachments_dropzone' => 'Arrastre ficheros aquío haga click aquípara adjuntar un fichero', - 'attachments_no_files' => 'Ningún fichero ha sido adjuntado', - 'attachments_explain_link' => 'Ud. puede agregar un link o si lo prefiere puede agregar un fichero. Esto puede ser un link a otra página o un link a un fichero en la nube.', - 'attachments_link_name' => 'Nombre de Link', - 'attachment_link' => 'Link adjunto', - 'attachments_link_url' => 'Link a fichero', + 'attachments_dropzone' => 'Arrastre ficheros aquí o haga click aquí para adjuntar un fichero', + 'attachments_no_files' => 'No se han subido ficheros', + 'attachments_explain_link' => 'Puede agregar un enlace si prefiere no subir un archivo. Puede ser un enlace a otra página o un enlace a un fichero en la nube.', + 'attachments_link_name' => 'Nombre del Enlace', + 'attachment_link' => 'Enlace adjunto', + 'attachments_link_url' => 'Enlace a fichero', 'attachments_link_url_hint' => 'Url del sitio o fichero', 'attach' => 'Adjuntar', 'attachments_edit_file' => 'Editar fichero', 'attachments_edit_file_name' => 'Nombre del fichero', - 'attachments_edit_drop_upload' => 'Arrastre a los ficheros o haga click aquípara subir o sobreescribir', + 'attachments_edit_drop_upload' => 'Arrastre a los ficheros o haga click aquí para subir y sobreescribir', 'attachments_order_updated' => 'Orden de adjuntos actualizado', 'attachments_updated_success' => 'Detalles de adjuntos actualizados', 'attachments_deleted' => 'Adjunto borrado', 'attachments_file_uploaded' => 'Fichero subido éxitosamente', 'attachments_file_updated' => 'Fichero actualizado éxitosamente', - 'attachments_link_attached' => 'Link agregado éxitosamente a la ágina', + 'attachments_link_attached' => 'Enlace agregado éxitosamente a la ágina', /** * Profile View @@ -220,6 +247,18 @@ return [ */ 'comment' => 'Comentario', 'comments' => 'Comentarios', - 'comment_placeholder' => 'Introduzca sus comentarios aquí', + 'comment_add' => 'Añadir Comentario', + 'comment_placeholder' => 'Introduzca su comentario aquí', + 'comment_count' => '{0} Sin Comentarios|{1} 1 Comentario|[2,*] :count Comentarios', 'comment_save' => 'Guardar comentario', -]; + 'comment_saving' => 'Guardando comentario...', + 'comment_deleting' => 'Borrando comentario...', + 'comment_new' => 'Nuevo Comentario', + 'comment_created' => 'comentado :createDiff', + 'comment_updated' => 'Actualizado :updateDiff por :username', + 'comment_deleted_success' => 'Comentario borrado', + 'comment_created_success' => 'Comentario añadido', + 'comment_updated_success' => 'Comentario actualizado', + 'comment_delete_confirm' => '¿Está seguro de que quiere borrar este comentario?', + 'comment_in_reply_to' => 'En respuesta a :commentId', +]; \ No newline at end of file diff --git a/resources/lang/es/errors.php b/resources/lang/es/errors.php index e488b6a1b..73c3063b6 100644 --- a/resources/lang/es/errors.php +++ b/resources/lang/es/errors.php @@ -7,40 +7,45 @@ return [ */ // Permissions - 'permission' => 'Ud. no tiene permisos para visualizar la página solicitada.', - 'permissionJson' => 'Ud. no tiene permisos para ejecutar la acción solicitada.', + 'permission' => 'UNo tiene permisos para visualizar la página solicitada.', + 'permissionJson' => 'No tiene permisos para ejecutar la acción solicitada.', // Auth - 'error_user_exists_different_creds' => 'Un usuario con el email :email ya existe pero con credenciales diferentes.', - 'email_already_confirmed' => 'El email ya ha sido confirmado, Intente loguearse en la aplicación.', - 'email_confirmation_invalid' => 'Este token de confirmación no e válido o ya ha sido usado,Intente registrar uno nuevamente.', - 'email_confirmation_expired' => 'El token de confirmación ha expirado, Un nuevo email de confirmacón ha sido enviado.', + 'error_user_exists_different_creds' => 'Un usuario con el correo electrónico :email ya existe pero con credenciales diferentes.', + 'email_already_confirmed' => 'El correo electrónico ya ha sido confirmado, intente acceder a la aplicación.', + 'email_confirmation_invalid' => 'Este token de confirmación no es válido o ya ha sido usado, intente registrar uno nuevamente.', + 'email_confirmation_expired' => 'El token de confirmación ha expirado, un nuevo email de confirmacón ha sido enviado.', 'ldap_fail_anonymous' => 'El acceso con LDAP ha fallado usando binding anónimo', - 'ldap_fail_authed' => 'El acceso LDAP usando el dn & password detallados', + 'ldap_fail_authed' => 'El acceso LDAP ha fallado usando el dn & contraseña enviados', 'ldap_extension_not_installed' => 'La extensión LDAP PHP no se encuentra instalada', 'ldap_cannot_connect' => 'No se puede conectar con el servidor ldap, la conexión inicial ha fallado', 'social_no_action_defined' => 'Acción no definida', - 'social_account_in_use' => 'la cuenta :socialAccount ya se encuentra en uso, intente loguearse a través de la opcón :socialAccount .', - 'social_account_email_in_use' => 'El email :email ya se encuentra en uso. Si ud. ya dispone de una cuenta puede loguearse a través de su cuenta :socialAccount desde la configuración de perfil.', + 'social_login_bad_response' => "Se ha recibido un error durante el acceso con :socialAccount error: \n:error", + 'social_account_in_use' => 'la cuenta :socialAccount ya se encuentra en uso, intente acceder a través de la opción :socialAccount .', + 'social_account_email_in_use' => 'El correo electrónico :email ya se encuentra en uso. Si ya dispone de una cuenta puede acceder a través de su cuenta :socialAccount desde la configuración de perfil.', 'social_account_existing' => 'La cuenta :socialAccount ya se encuentra asignada a su perfil.', - 'social_account_already_used_existing' => 'La cuenta :socialAccount ya se encuentra usada por otro usuario.', - 'social_account_not_used' => 'La cuenta :socialAccount no está asociada a ningún usuario. Por favor adjuntela a su configuración de perfil. ', + 'social_account_already_used_existing' => 'La cuenta :socialAccount ya está siendo usada por otro usuario.', + 'social_account_not_used' => 'La cuenta :socialAccount no está asociada a ningún usuario. Por favor adjúntela a su configuración de perfil. ', 'social_account_register_instructions' => 'Si no dispone de una cuenta, puede registrar una cuenta usando la opción de :socialAccount .', 'social_driver_not_found' => 'Driver social no encontrado', 'social_driver_not_configured' => 'Su configuración :socialAccount no es correcta.', // System - 'path_not_writable' => 'La ruta :filePath no pudo ser cargada. Asegurese de que es escribible por el servidor.', + 'path_not_writable' => 'El fichero no pudo ser subido a la ruta :filePath . Asegúrese de que es escribible por el servidor.', 'cannot_get_image_from_url' => 'No se puede obtener la imagen desde :url', - 'cannot_create_thumbs' => 'El servidor no puede crear la imagen miniatura. Por favor chequee que tiene la extensión GD instalada.', - 'server_upload_limit' => 'El servidor no permite la subida de ficheros de este tamañ. Por favor intente con un fichero de menor tamañ.', + 'cannot_create_thumbs' => 'El servidor no puede crear la miniatura de la imagen. Compruebe que tiene la extensión PHP GD instalada.', + 'server_upload_limit' => 'El servidor no permite la subida de ficheros de este tamaño. Intente subir un fichero de menor tamaño.', + 'uploaded' => 'El servidor no permite la subida de ficheros de este tamaño. Intente subir un fichero de menor tamaño.', 'image_upload_error' => 'Ha ocurrido un error al subir la imagen', + 'image_upload_type_error' => 'El tipo de imagen que se quiere subir no es válido', // Attachments 'attachment_page_mismatch' => 'Página no coincidente durante la subida del adjunto ', + 'attachment_not_found' => 'No se encontró el adjunto', // Pages - 'page_draft_autosave_fail' => 'Fallo al guardar borrador. Asegurese de que tiene conexión a Internet antes de guardar este borrador', + 'page_draft_autosave_fail' => 'Fallo al guardar borrador. Asegúrese de que tiene conexión a Internet antes de guardar este borrador', + 'page_custom_home_deletion' => 'No se puede borrar una página mientras esté configurada como página de inicio', // Entities 'entity_not_found' => 'Entidad no encontrada', @@ -49,7 +54,7 @@ return [ 'chapter_not_found' => 'Capítulo no encontrado', 'selected_book_not_found' => 'El libro seleccionado no fue encontrado', 'selected_book_chapter_not_found' => 'El libro o capítulo seleccionado no fue encontrado', - 'guests_cannot_save_drafts' => 'Los invitados no pueden guardar los borradores', + 'guests_cannot_save_drafts' => 'Los invitados no pueden guardar borradores', // Users 'users_cannot_delete_only_admin' => 'No se puede borrar el único administrador', @@ -58,20 +63,20 @@ return [ // Roles 'role_cannot_be_edited' => 'Este rol no puede ser editado', 'role_system_cannot_be_deleted' => 'Este rol es un rol de sistema y no puede ser borrado', - 'role_registration_default_cannot_delete' => 'Este rol no puede ser borrado mientras sea el rol por defecto de registro', + 'role_registration_default_cannot_delete' => 'Este rol no puede ser borrado mientras sea el rol por defecto de nuevos registros', - // Error pages - '404_page_not_found' => 'Página no encontrada', - 'sorry_page_not_found' => 'Lo sentimos, la página que intenta acceder no pudo ser encontrada.', - 'return_home' => 'Volver al home', - 'error_occurred' => 'Ha ocurrido un error', - 'app_down' => 'La aplicación :appName se encuentra caída en este momento', - 'back_soon' => 'Volverá a estar operativa en corto tiempo.', - - // Comments + // Comments 'comment_list' => 'Se ha producido un error al buscar los comentarios.', 'cannot_add_comment_to_draft' => 'No puedes añadir comentarios a un borrador.', 'comment_add' => 'Se ha producido un error al añadir el comentario.', 'comment_delete' => 'Se ha producido un error al eliminar el comentario.', 'empty_comment' => 'No se puede agregar un comentario vacío.', + + // Error pages + '404_page_not_found' => 'Página no encontrada', + 'sorry_page_not_found' => 'Lo sentimos, la página a la que intenta acceder no pudo ser encontrada.', + 'return_home' => 'Volver a la página de inicio', + 'error_occurred' => 'Ha ocurrido un error', + 'app_down' => 'La aplicación :appName se encuentra caída en este momento', + 'back_soon' => 'Volverá a estar operativa pronto.', ]; diff --git a/resources/lang/es/passwords.php b/resources/lang/es/passwords.php index 3fa17b066..2d23ee46d 100644 --- a/resources/lang/es/passwords.php +++ b/resources/lang/es/passwords.php @@ -13,10 +13,10 @@ return [ | */ - 'password' => 'El Password debe ser como mínimo de seis caracteres y coincidir con la confirmación.', - 'user' => "No podemos encontrar un usuario con esta dirección de e-mail.", - 'token' => 'El token de reset del password es inválido.', - 'sent' => 'Hemos enviado a su cuenta de e-mail un link para restaurar su password!', - 'reset' => 'Su password ha sido restaurado!', + 'password' => 'La contraseña debe ser como mínimo de seis caracteres y coincidir con la confirmación.', + 'user' => "No podemos encontrar un usuario con esta dirección de correo electrónico.", + 'token' => 'El token de reseteo de la contraseña es inválido.', + 'sent' => '¡Hemos enviado a su cuenta de e-mail un enlace para restaurar su contraseña!', + 'reset' => '¡Su contraseña ha sido restaurada!', ]; diff --git a/resources/lang/es/settings.php b/resources/lang/es/settings.php index 3c3281d28..ea1a128f9 100644 --- a/resources/lang/es/settings.php +++ b/resources/lang/es/settings.php @@ -16,35 +16,38 @@ return [ * App settings */ - 'app_settings' => 'Ajustes de App', - 'app_name' => 'Nombre de aplicación', - 'app_name_desc' => 'Este nombre es mostrado en la cabecera y en cualquier email de la aplicación', - 'app_name_header' => 'Mostrar el nombre de la aplicación en la cabecera?', - 'app_public_viewing' => 'Permitir vista pública?', - 'app_secure_images' => 'Habilitar mayor seguridad para subir imágenes?', - 'app_secure_images_desc' => 'Por razones de performance, todas las imágenes son púicas. Esta opción agrega una cadena larga difícil de adivinar, asegúrese que los indices de directorios no esán habilitados para prevenir el acceso fácil a las imágenes.', - 'app_editor' => 'Editor de página', - 'app_editor_desc' => 'Seleccione cuál editor ser usado por todos los usuarios para editar páginas.', - 'app_custom_html' => 'Contenido de cabecera HTML customizable', - 'app_custom_html_desc' => 'Cualquier contenido agregado aquíseráinsertado al final de la secón de cada ágina. Esto esútil para sobreescribir estilo o agregar código para anaíticas.', + 'app_settings' => 'Ajustes de la aplicación', + 'app_name' => 'Nombre de la aplicación', + 'app_name_desc' => 'Este nombre se muestra en la cabecera y en cualquier correo electrónico', + 'app_name_header' => '¿Mostrar el nombre de la aplicación en la cabecera?', + 'app_public_viewing' => '¿Permitir vista pública?', + 'app_secure_images' => '¿Habilitar mayor seguridad para subir imágenes?', + 'app_secure_images_desc' => 'Por razones de rendimiento, todas las imágenes son públicas. Esta opción agrega una cadena de texto larga difícil de adivinar. Asegúrese que los índices de directorio no están habilitados para evitar el acceso fácil a las imágenes.', + 'app_editor' => 'Editor de páginas', + 'app_editor_desc' => 'Seleccione qué editor se usará por todos los usuarios para editar páginas.', + 'app_custom_html' => 'Contenido de cabecera HTML personalizado', + 'app_custom_html_desc' => 'Cualquier contenido agregado aquí será insertado al final de la sección de cada página. Esto es útil para sobreescribir estilos o agregar código para analíticas web.', 'app_logo' => 'Logo de la aplicación', - 'app_logo_desc' => 'Esta imagen debería de ser 43px en altura.
Iágenes grandes seán escaladas.', + 'app_logo_desc' => 'Esta imagen debería de ser 43px de altura.
Las imágenes grandes serán escaladas.', 'app_primary_color' => 'Color primario de la aplicación', - 'app_primary_color_desc' => 'Esto debería ser un valor hexadecimal.
Deje el valor vaío para reiniciar al valor por defecto.', + 'app_primary_color_desc' => 'Esto debería ser un valor hexadecimal.
Deje el valor vacío para restaurar al valor por defecto.', + 'app_homepage' => 'Página de inicio', + 'app_homepage_desc' => 'Elija la página que se mostrará al inicio en lugar de la vista predeterminada. Se ignorarán los permisos de la página seleccionada.', + 'app_homepage_default' => 'Página de inicio seleccionada', 'app_disable_comments' => 'Deshabilitar comentarios', - 'app_disable_comments_desc' => 'Deshabilita los comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran. ', + 'app_disable_comments_desc' => 'Deshabilita los comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.', /** * Registration settings */ 'reg_settings' => 'Ajustes de registro', - 'reg_allow' => 'Permitir registro?', - 'reg_default_role' => 'Rol de usuario por defecto despúes del registro', - 'reg_confirm_email' => 'Requerir email de confirmaación?', - 'reg_confirm_email_desc' => 'Si la restricción por dominio es usada, entonces la confirmaciónpor email serárequerida y el valor a continuón será ignorado.', + 'reg_allow' => '¿Permitir registro?', + 'reg_default_role' => 'Rol de usuario por defecto después del registro', + 'reg_confirm_email' => '¿Requerir correo electrónico de confirmaación?', + 'reg_confirm_email_desc' => 'Si se emplea la restricción por dominio, entonces se requerirá la confirmación por correo electrónico y el valor a continuación será ignorado.', 'reg_confirm_restrict_domain' => 'Restringir registro al dominio', - 'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comasa de los emails del dominio a los que les gustaría restringir el registro por dominio. A los usuarios les seá enviado un emal para confirmar la dirección antes de que se le permita interactuar con la aplicacón.
Note que los usuarios se les permitir ácambiar sus direcciones de email luego de un registr éxioso.', + 'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comas de los dominio a los que les gustaría restringir el registro de usuarios. A los usuarios les será enviado un correo electrónico para confirmar la dirección antes de que se le permita interactuar con la aplicación.
Tenga en cuenta que los usuarios podrán cambiar sus direcciones de correo electrónico después de registrarse exitosamente.', 'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida', /** @@ -57,7 +60,7 @@ return [ 'role_create_success' => 'Rol creado satisfactoriamente', 'role_delete' => 'Borrar rol', 'role_delete_confirm' => 'Se borrará el rol con nombre \':roleName\'.', - 'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si ud. quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.', + 'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.', 'role_delete_no_migration' => "No migrar usuarios", 'role_delete_sure' => 'Está seguro que desea borrar este rol?', 'role_delete_success' => 'Rol borrado satisfactoriamente', @@ -68,14 +71,14 @@ return [ 'role_system' => 'Permisos de sistema', 'role_manage_users' => 'Gestionar usuarios', 'role_manage_roles' => 'Gestionar roles y permisos de roles', - 'role_manage_entity_permissions' => 'Gestionar todos los permisos de libros, capítulos y áginas', - 'role_manage_own_entity_permissions' => 'Gestionar permisos en libros propios, capítulos y páginas', - 'role_manage_settings' => 'Gestionar ajustes de activos', - 'role_asset' => 'Permisos de activos', - 'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los activos del sistema. Permisos a Libros, Capítulos y áginas sobreescribiran estos permisos.', + 'role_manage_entity_permissions' => 'Gestionar todos los permisos de libros, capítulos y páginas', + 'role_manage_own_entity_permissions' => 'Gestionar permisos en libros, capítulos y páginas propias', + 'role_manage_settings' => 'Gestionar ajustes de la aplicación', + 'role_asset' => 'Permisos de contenido', + 'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los contenidos del sistema. Los permisos de Libros, Capítulos y Páginas sobreescribiran estos permisos.', 'role_all' => 'Todo', 'role_own' => 'Propio', - 'role_controlled_by_asset' => 'Controlado por el actvo al que ha sido subido', + 'role_controlled_by_asset' => 'Controlado por el contenido al que ha sido subido', 'role_save' => 'Guardar rol', 'role_update_success' => 'Rol actualizado éxitosamente', 'role_users' => 'Usuarios en este rol', @@ -91,25 +94,24 @@ return [ 'users_search' => 'Buscar usuarios', 'users_role' => 'Roles de usuario', 'users_external_auth_id' => 'ID externo de autenticación', - 'users_password_warning' => 'Solo rellene a continuación si desea cambiar su password:', - 'users_system_public' => 'Este usuario representa cualquier usuario invitado que visita la aplicación. No puede utilizarse para hacer login sio que es asignado automáticamente.', - 'users_books_view_type' => 'Diseño de pantalla preferido para libros', + 'users_password_warning' => 'Solo debe rellenar este campo si desea cambiar su contraseña:', + 'users_system_public' => 'Este usuario representa cualquier usuario invitado que visita la aplicación. No puede utilizarse para acceder pero es asignado automáticamente.', 'users_delete' => 'Borrar usuario', 'users_delete_named' => 'Borrar usuario :userName', 'users_delete_warning' => 'Se borrará completamente el usuario con el nombre \':userName\' del sistema.', - 'users_delete_confirm' => 'Está seguro que desea borrar este usuario?', + 'users_delete_confirm' => '¿Está seguro que desea borrar este usuario?', 'users_delete_success' => 'Usuarios removidos éxitosamente', 'users_edit' => 'Editar Usuario', 'users_edit_profile' => 'Editar perfil', 'users_edit_success' => 'Usuario actualizado', 'users_avatar' => 'Avatar del usuario', - 'users_avatar_desc' => 'Esta imagen debe ser aproximadamente 256px por lado.', - 'users_preferred_language' => 'Lenguaje preferido', + 'users_avatar_desc' => 'Esta imagen debe ser aproximadamente de 256px por lado.', + 'users_preferred_language' => 'Idioma preferido', 'users_social_accounts' => 'Cuentas sociales', - 'users_social_accounts_info' => 'Aquí puede conectar sus otras cuentas para un ápido y ás ácil login. Desconectando una cuenta aqu íno revca accesos ya autorizados. Revoque el acceso desde se perfil desde los ajustes de perfil en la cuenta social conectada.', + 'users_social_accounts_info' => 'Aquí puede conectar sus otras cuentas para un acceso rápido y fácil a la aplicación. Desconectando una cuenta aquí no revoca accesos ya autorizados. Revoque el acceso desde los ajustes de perfil en la cuenta social conectada.', 'users_social_connect' => 'Conectar cuenta', 'users_social_disconnect' => 'Desconectar cuenta', - 'users_social_connected' => 'La cuenta :socialAccount ha sido éxitosamente añadida a su perfil.', + 'users_social_connected' => 'La cuenta :socialAccount ha sido añadida éxitosamente a su perfil.', 'users_social_disconnected' => 'La cuenta :socialAccount ha sido desconectada éxitosamente de su perfil.', ]; diff --git a/resources/lang/es/validation.php b/resources/lang/es/validation.php index 3c79de2bb..e41f757d4 100644 --- a/resources/lang/es/validation.php +++ b/resources/lang/es/validation.php @@ -14,17 +14,17 @@ return [ */ 'accepted' => 'El :attribute debe ser aceptado.', - 'active_url' => 'El :attribute no es una URl válida.', + 'active_url' => 'El :attribute no es una URL válida.', 'after' => 'El :attribute debe ser una fecha posterior :date.', 'alpha' => 'El :attribute solo puede contener letras.', 'alpha_dash' => 'El :attribute solo puede contener letras, números y guiones.', - 'alpha_num' => 'El :attribute solo puede contener letras y número.', + 'alpha_num' => 'El :attribute solo puede contener letras y números.', 'array' => 'El :attribute debe de ser un array.', 'before' => 'El :attribute debe ser una fecha anterior a :date.', 'between' => [ 'numeric' => 'El :attribute debe estar entre :min y :max.', 'file' => 'El :attribute debe estar entre :min y :max kilobytes.', - 'string' => 'El :attribute debe estar entre :min y :max carácteres.', + 'string' => 'El :attribute debe estar entre :min y :max caracteres.', 'array' => 'El :attribute debe estar entre :min y :max items.', ], 'boolean' => 'El campo :attribute debe ser true o false.', @@ -34,46 +34,46 @@ return [ 'different' => ':attribute y :other deben ser diferentes.', 'digits' => ':attribute debe ser de :digits dígitos.', 'digits_between' => ':attribute debe ser un valor entre :min y :max dígios.', - 'email' => ':attribute debe ser una dirección álida.', + 'email' => ':attribute debe ser un correo electrónico válido.', 'filled' => 'El campo :attribute es requerido.', 'exists' => 'El :attribute seleccionado es inválido.', 'image' => 'El :attribute debe ser una imagen.', 'in' => 'El selected :attribute es inválio.', 'integer' => 'El :attribute debe ser un entero.', - 'ip' => 'El :attribute debe ser una dirección IP álida.', + 'ip' => 'El :attribute debe ser una dirección IP válida.', 'max' => [ - 'numeric' => ':attribute no puede ser mayor que :max.', - 'file' => ':attribute no puede ser mayor que :max kilobytes.', - 'string' => ':attribute no puede ser mayor que :max carácteres.', - 'array' => ':attribute no puede contener más de :max items.', + 'numeric' => 'El :attribute no puede ser mayor que :max.', + 'file' => 'El :attribute no puede ser mayor que :max kilobytes.', + 'string' => 'El :attribute no puede ser mayor que :max carácteres.', + 'array' => 'El :attribute no puede contener más de :max items.', ], - 'mimes' => ':attribute debe ser un fichero de tipo: :values.', + 'mimes' => 'El :attribute debe ser un fichero de tipo: :values.', 'min' => [ - 'numeric' => ':attribute debe ser al menos de :min.', - 'file' => ':attribute debe ser al menos :min kilobytes.', - 'string' => ':attribute debe ser al menos :min caracteres.', - 'array' => ':attribute debe tener como mínimo :min items.', + 'numeric' => 'El :attribute debe ser al menos de :min.', + 'file' => 'El :attribute debe ser al menos :min kilobytes.', + 'string' => 'El :attribute debe ser al menos :min caracteres.', + 'array' => 'El :attribute debe tener como mínimo :min items.', ], - 'not_in' => ':attribute seleccionado es inválio.', - 'numeric' => ':attribute debe ser numérico.', - 'regex' => ':attribute con formato inválido', - 'required' => ':attribute es requerido.', - 'required_if' => ':attribute es requerido cuando :other vale :value.', + 'not_in' => 'El :attribute seleccionado es inválio.', + 'numeric' => 'El :attribute debe ser numérico.', + 'regex' => 'El formato de :attribute es inválido', + 'required' => 'El :attribute es requerido.', + 'required_if' => 'El :attribute es requerido cuando :other vale :value.', 'required_with' => 'El campo :attribute es requerido cuando se encuentre entre los valores :values.', 'required_with_all' => 'El campo :attribute es requerido cuando los valores sean :values.', - 'required_without' => ':attribute es requerido cuando no se encuentre entre los valores :values.', - 'required_without_all' => ':attribute es requerido cuando ninguno de los valores :values están presentes.', - 'same' => ':attribute y :other deben coincidir.', + 'required_without' => 'El :attribute es requerido cuando no se encuentre entre los valores :values.', + 'required_without_all' => 'El :attribute es requerido cuando ninguno de los valores :values están presentes.', + 'same' => 'El :attribute y :other deben coincidir.', 'size' => [ 'numeric' => ':attribute debe ser :size.', 'file' => ':attribute debe ser :size kilobytes.', 'string' => ':attribute debe ser :size caracteres.', 'array' => ':attribute debe contener :size items.', ], - 'string' => 'El atributo :attribute debe ser una cadena.', + 'string' => 'El atributo :attribute debe ser una cadena de texto.', 'timezone' => 'El atributo :attribute debe ser una zona válida.', 'unique' => 'El atributo :attribute ya ha sido tomado.', - 'url' => 'El atributo :attribute tiene un formato inválid.', + 'url' => 'El atributo :attribute tiene un formato inválido.', /* |-------------------------------------------------------------------------- @@ -88,7 +88,7 @@ return [ 'custom' => [ 'password-confirm' => [ - 'required_with' => 'Confirmación de Password requerida', + 'required_with' => 'Requerida confirmación de contraseña', ], ], From 60a224f7a19188075b88fc3b777686e53305716f Mon Sep 17 00:00:00 2001 From: Marcos Date: Thu, 5 Apr 2018 02:58:32 +0200 Subject: [PATCH 15/31] Missing comma --- resources/lang/es/components.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/es/components.php b/resources/lang/es/components.php index 94d8cf09c..a13d5d4fb 100644 --- a/resources/lang/es/components.php +++ b/resources/lang/es/components.php @@ -20,7 +20,7 @@ return [ 'image_preview' => 'Previsualización de la imagen', 'image_upload_success' => 'Imagen subida éxitosamente', 'image_update_success' => 'Detalles de la imagen actualizados exitosamente', - 'image_delete_success' => 'Imagen borrada exitosamente' + 'image_delete_success' => 'Imagen borrada exitosamente', 'image_upload_remove' => 'Borrar', /** From 9c0761909982e7ca41b1072371f287ce91a3faf8 Mon Sep 17 00:00:00 2001 From: Marcos Date: Thu, 5 Apr 2018 03:57:35 +0200 Subject: [PATCH 16/31] orthography --- resources/lang/es/entities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/es/entities.php b/resources/lang/es/entities.php index b57d51491..e68522820 100644 --- a/resources/lang/es/entities.php +++ b/resources/lang/es/entities.php @@ -205,7 +205,7 @@ return [ 'tag' => 'Etiqueta', 'tags' => 'Etiquetas', 'tag_value' => 'Valor de la etiqueta (Opcional)', - 'tags_explain' => "Agrege algunas etiquetas para mejorar la categorización de su contenido. \n Puede asignar un valor a una etiqueta para una organizacón a mayor detalle.", + 'tags_explain' => "Agrege algunas etiquetas para mejorar la categorización de su contenido. \n Puede asignar un valor a una etiqueta para una organización a mayor detalle.", 'tags_add' => 'Agregar otra etiqueta', 'attachments' => 'Adjuntos', 'attachments_explain' => 'Subir ficheros o agregar enlaces para mostrar en la página. Estos son visibles en la barra lateral de la página.', @@ -261,4 +261,4 @@ return [ 'comment_updated_success' => 'Comentario actualizado', 'comment_delete_confirm' => '¿Está seguro de que quiere borrar este comentario?', 'comment_in_reply_to' => 'En respuesta a :commentId', -]; \ No newline at end of file +]; From 11470b85f95ad51a538b34a6a6999f55ae7f2b90 Mon Sep 17 00:00:00 2001 From: abno85 Date: Thu, 12 Apr 2018 13:48:07 +0200 Subject: [PATCH 17/31] Update German localization Added a few missing strings and (hopefully) fixed my borked first commit. --- resources/lang/de/activities.php | 3 +++ resources/lang/de/auth.php | 12 ++---------- resources/lang/de/common.php | 10 ++++++++-- resources/lang/de/components.php | 11 +++++++++-- resources/lang/de/entities.php | 12 +++--------- resources/lang/de/errors.php | 16 ++++------------ resources/lang/de/settings.php | 15 +++------------ 7 files changed, 32 insertions(+), 47 deletions(-) diff --git a/resources/lang/de/activities.php b/resources/lang/de/activities.php index 3318ea752..38d02bd9c 100644 --- a/resources/lang/de/activities.php +++ b/resources/lang/de/activities.php @@ -36,5 +36,8 @@ return [ 'book_delete_notification' => 'hat Buch erfolgreich gelöscht:', 'book_sort' => 'hat Buch sortiert:', 'book_sort_notification' => 'hat Buch erfolgreich neu sortiert:', + + // Other + 'commented_on' => 'kommentierte', ]; diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php index 8f4afe654..7b1ebec6e 100644 --- a/resources/lang/de/auth.php +++ b/resources/lang/de/auth.php @@ -12,14 +12,14 @@ return [ */ 'failed' => 'Die eingegebenen Anmeldedaten sind ungültig.', 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.', - /** * Login & Register */ 'sign_up' => 'Registrieren', 'log_in' => 'Anmelden', + 'log_in_with' => 'Anmelden mit :socialDriver', + 'sign_up_with' => 'Registrieren mit :socialDriver', 'logout' => 'Abmelden', - 'name' => 'Name', 'username' => 'Benutzername', 'email' => 'E-Mail', @@ -33,15 +33,11 @@ return [ 'social_login' => 'Mit Sozialem Netzwerk anmelden', 'social_registration' => 'Mit Sozialem Netzwerk registrieren', 'social_registration_text' => 'Mit einer dieser Dienste registrieren oder anmelden', - - 'register_thanks' => 'Vielen Dank für Ihre Registrierung!', 'register_confirm' => 'Bitte prüfen Sie Ihren Posteingang und bestätigen Sie die Registrierung.', 'registrations_disabled' => 'Eine Registrierung ist momentan nicht möglich', 'registration_email_domain_invalid' => 'Sie können sich mit dieser E-Mail nicht registrieren.', 'register_success' => 'Vielen Dank für Ihre Registrierung! Die Daten sind gespeichert und Sie sind angemeldet.', - - /** * Password Reset */ @@ -50,12 +46,9 @@ return [ 'reset_password_send_button' => 'Passwort zurücksetzen', 'reset_password_sent_success' => 'Eine E-Mail mit dem Link zum Zurücksetzen Ihres Passwortes wurde an :email gesendet.', 'reset_password_success' => 'Ihr Passwort wurde erfolgreich zurückgesetzt.', - 'email_reset_subject' => 'Passwort zurücksetzen für :appName', 'email_reset_text' => 'Sie erhalten diese E-Mail, weil jemand versucht hat, Ihr Passwort zurückzusetzen.', 'email_reset_not_requested' => 'Wenn Sie das nicht waren, brauchen Sie nichts weiter zu tun.', - - /** * Email Confirmation */ @@ -66,7 +59,6 @@ return [ 'email_confirm_send_error' => 'Leider konnte die für die Registrierung notwendige E-Mail zur bestätigung Ihrer E-Mail-Adresse nicht versandt werden. Bitte kontaktieren Sie den Systemadministrator!', 'email_confirm_success' => 'Ihre E-Mail-Adresse wurde bestätigt!', 'email_confirm_resent' => 'Bestätigungs-E-Mail wurde erneut versendet, bitte überprüfen Sie Ihren Posteingang.', - 'email_not_confirmed' => 'E-Mail-Adresse ist nicht bestätigt', 'email_not_confirmed_text' => 'Ihre E-Mail-Adresse ist bisher nicht bestätigt.', 'email_not_confirmed_click_link' => 'Bitte klicken Sie auf den Link in der E-Mail, die Sie nach der Registrierung erhalten haben.', diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php index 2cc980846..d3c0b4897 100644 --- a/resources/lang/de/common.php +++ b/resources/lang/de/common.php @@ -10,6 +10,7 @@ return [ 'save' => 'Speichern', 'continue' => 'Weiter', 'select' => 'Auswählen', + 'more' => 'Mehr', /** * Form Labels @@ -18,7 +19,7 @@ return [ 'description' => 'Beschreibung', 'role' => 'Rolle', 'cover_image' => 'Titelbild', - 'cover_image_description' => 'Das Bild sollte eine Auflösung von 300x170px haben.', + 'cover_image_description' => 'Das Bild sollte eine Auflösung von 440x250px haben.', /** * Actions @@ -30,12 +31,13 @@ return [ 'edit' => 'Bearbeiten', 'sort' => 'Sortieren', 'move' => 'Verschieben', + 'reply' => 'Antworten', 'delete' => 'Löschen', 'search' => 'Suchen', 'search_clear' => 'Suche löschen', 'reset' => 'Zurücksetzen', 'remove' => 'Entfernen', - + 'add' => 'Hinzufügen', /** * Misc @@ -46,6 +48,10 @@ return [ 'back_to_top' => 'nach oben', 'toggle_details' => 'Details zeigen/verstecken', 'toggle_thumbnails' => 'Thumbnails zeigen/verstecken', + 'details' => 'Details', + 'grid_view' => 'Gitteransicht', + 'list_view' => 'Listenansicht', + /** * Header */ diff --git a/resources/lang/de/components.php b/resources/lang/de/components.php index 26bf3e626..510af4dd3 100644 --- a/resources/lang/de/components.php +++ b/resources/lang/de/components.php @@ -1,6 +1,5 @@ 'Bildvorschau', 'image_upload_success' => 'Bild erfolgreich hochgeladen', 'image_update_success' => 'Bilddetails erfolgreich aktualisiert', - 'image_delete_success' => 'Bild erfolgreich gelöscht' + 'image_delete_success' => 'Bild erfolgreich gelöscht', + 'image_upload_remove' => 'Entfernen', + /** + * Code editor + */ + 'code_editor' => 'Code editieren', + 'code_language' => 'Code Sprache', + 'code_content' => 'Code Inhalt', + 'code_save' => 'Code speichern', ]; diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index b75c647bc..9fe869a70 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -1,6 +1,5 @@ 'HTML-Datei', 'export_pdf' => 'PDF-Datei', 'export_text' => 'Textdatei', - /** * Permissions and restrictions */ @@ -38,7 +36,6 @@ return [ 'permissions_intro' => 'Wenn individuelle Berechtigungen aktiviert werden, überschreiben diese Einstellungen durch Rollen zugewiesene Berechtigungen.', 'permissions_enable' => 'Individuelle Berechtigungen aktivieren', 'permissions_save' => 'Berechtigungen speichern', - /** * Search */ @@ -63,7 +60,6 @@ return [ 'search_created_after' => 'Erstellt nach', 'search_set_date' => 'Datum auswählen', 'search_update' => 'Suche aktualisieren', - /** * Books */ @@ -99,7 +95,6 @@ return [ 'books_sort_named' => 'Buch ":bookName" sortieren', 'books_sort_show_other' => 'Andere Bücher anzeigen', 'books_sort_save' => 'Neue Reihenfolge speichern', - /** * Chapters */ @@ -124,7 +119,6 @@ return [ 'chapters_permissions_active' => 'Kapitel-Berechtigungen aktiv', 'chapters_permissions_success' => 'Kapitel-Berechtigungenen aktualisisert', 'chapters_search_this' => 'Dieses Kapitel durchsuchen', - /** * Pages */ @@ -162,6 +156,7 @@ return [ 'pages_md_preview' => 'Vorschau', 'pages_md_insert_image' => 'Bild einfügen', 'pages_md_insert_link' => 'Link zu einem Objekt einfügen', + 'pages_md_insert_drawing' => 'Zeichnung einfügen', 'pages_not_in_chapter' => 'Seite ist in keinem Kapitel', 'pages_move' => 'Seite verschieben', 'pages_move_success' => 'Seite nach ":parentName" verschoben', @@ -194,11 +189,12 @@ return [ 'message' => ':start :time. Achten Sie darauf, keine Änderungen von anderen Benutzern zu überschreiben!', ], 'pages_draft_discarded' => 'Entwurf verworfen. Der aktuelle Seiteninhalt wurde geladen.', - /** * Editor sidebar */ 'page_tags' => 'Seiten-Schlagwörter', + 'chapter_tags' => 'Kapitel-Schlagwörter', + 'book_tags' => 'Buch-Schlagwörter', 'tag' => 'Schlagwort', 'tags' => 'Schlagwörter', 'tag_value' => 'Inhalt (Optional)', @@ -229,7 +225,6 @@ return [ 'attachments_file_uploaded' => 'Datei erfolgreich hochgeladen', 'attachments_file_updated' => 'Datei erfolgreich aktualisiert', 'attachments_link_attached' => 'Link erfolgreich der Seite hinzugefügt', - /** * Profile View */ @@ -238,7 +233,6 @@ return [ 'profile_not_created_pages' => ':userName hat noch keine Seiten erstellt.', 'profile_not_created_chapters' => ':userName hat noch keine Kapitel erstellt.', 'profile_not_created_books' => ':userName hat noch keine Bücher erstellt.', - /** * Comments */ diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php index 0b961f8ee..df941acd0 100644 --- a/resources/lang/de/errors.php +++ b/resources/lang/de/errors.php @@ -1,15 +1,11 @@ 'Sie haben keine Berechtigung, auf diese Seite zuzugreifen.', 'permissionJson' => 'Sie haben keine Berechtigung, die angeforderte Aktion auszuführen.', - // Auth 'error_user_exists_different_creds' => 'Ein Benutzer mit der E-Mail-Adresse :email ist bereits mit anderen Anmeldedaten registriert.', 'email_already_confirmed' => 'Die E-Mail-Adresse ist bereits bestätigt. Bitte melden Sie sich an.', @@ -20,6 +16,7 @@ return [ 'ldap_extension_not_installed' => 'LDAP-PHP-Erweiterung ist nicht installiert.', 'ldap_cannot_connect' => 'Die Verbindung zum LDAP-Server ist fehlgeschlagen. Beim initialen Verbindungsaufbau trat ein Fehler auf.', 'social_no_action_defined' => 'Es ist keine Aktion definiert', + 'social_login_bad_response' => "Fehler bei der :socialAccount-Anmeldung: \n:error", 'social_account_in_use' => 'Dieses :socialAccount-Konto wird bereits verwendet. Bitte melden Sie sich mit dem :socialAccount-Konto an.', 'social_account_email_in_use' => 'Die E-Mail-Adresse ":email" ist bereits registriert. Wenn Sie bereits registriert sind, können Sie Ihr :socialAccount-Konto in Ihren Profil-Einstellungen verknüpfen.', 'social_account_existing' => 'Dieses :socialAccount-Konto ist bereits mit Ihrem Profil verknüpft.', @@ -28,20 +25,19 @@ return [ 'social_account_register_instructions' => 'Wenn Sie bisher keinen Social-Media Konto besitzen, können Sie ein solches Konto mit der :socialAccount Option anlegen.', 'social_driver_not_found' => 'Treiber für Social-Media-Konten nicht gefunden', 'social_driver_not_configured' => 'Ihr :socialAccount-Konto ist nicht korrekt konfiguriert.', - // System 'path_not_writable' => 'Die Datei kann nicht in den angegebenen Pfad :filePath hochgeladen werden. Stellen Sie sicher, dass dieser Ordner auf dem Server beschreibbar ist.', 'cannot_get_image_from_url' => 'Bild konnte nicht von der URL :url geladen werden.', 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfen Sie, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.', 'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.', - + 'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.', // Attachments 'attachment_page_mismatch' => 'Die Seite stimmte nach dem Hochladen des Anhangs nicht überein.', - + 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', // Pages 'page_draft_autosave_fail' => 'Fehler beim Speichern des Entwurfs. Stellen Sie sicher, dass Sie mit dem Internet verbunden sind, bevor Sie den Entwurf dieser Seite speichern.', - + 'page_custom_home_deletion' => 'Eine als Startseite gesetzte Seite kann nicht gelöscht werden.', // Entities 'entity_not_found' => 'Eintrag nicht gefunden', 'book_not_found' => 'Buch nicht gefunden', @@ -50,23 +46,19 @@ return [ 'selected_book_not_found' => 'Das gewählte Buch wurde nicht gefunden.', 'selected_book_chapter_not_found' => 'Das gewählte Buch oder Kapitel wurde nicht gefunden.', 'guests_cannot_save_drafts' => 'Gäste können keine Entwürfe speichern', - // Users 'users_cannot_delete_only_admin' => 'Sie können den einzigen Administrator nicht löschen.', 'users_cannot_delete_guest' => 'Sie können den Gast-Benutzer nicht löschen', - // Roles 'role_cannot_be_edited' => 'Diese Rolle kann nicht bearbeitet werden.', 'role_system_cannot_be_deleted' => 'Dies ist eine Systemrolle und kann nicht gelöscht werden', 'role_registration_default_cannot_delete' => 'Diese Rolle kann nicht gelöscht werden, solange sie als Standardrolle für neue Registrierungen gesetzt ist', - // Comments 'comment_list' => 'Beim Abrufen der Kommentare ist ein Fehler aufgetreten.', 'cannot_add_comment_to_draft' => 'Du kannst keine Kommentare zu einem Entwurf hinzufügen.', 'comment_add' => 'Beim Hinzufügen des Kommentars ist ein Fehler aufgetreten.', 'comment_delete' => 'Beim Löschen des Kommentars ist ein Fehler aufgetreten.', 'empty_comment' => 'Kann keinen leeren Kommentar hinzufügen', - // Error pages '404_page_not_found' => 'Seite nicht gefunden', 'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Sie angefordert haben, wurde nicht gefunden.', diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index e9d19e01b..5e9e2f43e 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -1,21 +1,16 @@ 'Einstellungen', 'settings_save' => 'Einstellungen speichern', 'settings_save_success' => 'Einstellungen gespeichert', - /** * App settings */ - 'app_settings' => 'Anwendungseinstellungen', 'app_name' => 'Anwendungsname', 'app_name_desc' => 'Dieser Name wird im Header und in E-Mails angezeigt.', @@ -31,13 +26,14 @@ return [ 'app_logo_desc' => "Dieses Bild sollte 43px hoch sein.\nGrößere Bilder werden verkleinert.", 'app_primary_color' => 'Primäre Anwendungsfarbe', 'app_primary_color_desc' => "Dies sollte ein HEX Wert sein.\nWenn Sie nicht eingeben, wird die Anwendung auf die Standardfarbe zurückgesetzt.", + 'app_homepage' => 'Startseite der Anwendung', + 'app_homepage_desc' => 'Wählen Sie eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', + 'app_homepage_default' => 'Ausgewählte Startseite', 'app_disable_comments' => 'Kommentare deaktivieren', 'app_disable_comments_desc' => 'Deaktiviert Kommentare über alle Seiten in der Anwendung. Vorhandene Kommentare werden nicht angezeigt.', - /** * Registration settings */ - 'reg_settings' => 'Registrierungseinstellungen', 'reg_allow' => 'Registrierung erlauben?', 'reg_default_role' => 'Standard-Benutzerrolle nach Registrierung', @@ -46,11 +42,9 @@ return [ 'reg_confirm_restrict_domain' => 'Registrierung auf bestimmte Domains einschränken', 'reg_confirm_restrict_domain_desc' => "Fügen sie eine durch Komma getrennte Liste von Domains hinzu, auf die die Registrierung eingeschränkt werden soll. Benutzern wird eine E-Mail gesendet, um ihre E-Mail Adresse zu bestätigen, bevor sie diese Anwendung nutzen können.\nHinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung ändern.", 'reg_confirm_restrict_domain_placeholder' => 'Keine Einschränkung gesetzt', - /** * Role settings */ - 'roles' => 'Rollen', 'role_user_roles' => 'Benutzer-Rollen', 'role_create' => 'Neue Rolle anlegen', @@ -80,11 +74,9 @@ return [ 'role_update_success' => 'Rolle erfolgreich gespeichert', 'role_users' => 'Dieser Rolle zugeordnete Benutzer', 'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet', - /** * Users */ - 'users' => 'Benutzer', 'user_profile' => 'Benutzerprofil', 'users_add_new' => 'Benutzer hinzufügen', @@ -98,7 +90,6 @@ return [ 'users_delete_warning' => 'Der Benutzer ":userName" wird aus dem System gelöscht.', 'users_delete_confirm' => 'Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?', 'users_delete_success' => 'Benutzer erfolgreich gelöscht.', - 'users_books_view_type' => 'Bevorzugtes Display-Layout für Bücher', 'users_edit' => 'Benutzer bearbeiten', 'users_edit_profile' => 'Profil bearbeiten', 'users_edit_success' => 'Benutzer erfolgreich aktualisisert', From 448f7d091bb2eeaca89d4a19f2dc0e64cdefb325 Mon Sep 17 00:00:00 2001 From: abno85 Date: Fri, 13 Apr 2018 08:44:54 +0200 Subject: [PATCH 18/31] Add comment_add Missed 'comment_add' the last time --- resources/lang/de/entities.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index 9fe869a70..460110eb4 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -238,6 +238,7 @@ return [ */ 'comment' => 'Kommentar', 'comments' => 'Kommentare', + 'comment_add' => 'Kommentieren', 'comment_placeholder' => 'Geben Sie hier Ihre Kommentare ein (Markdown unterstützt)', 'comment_count' => '{0} Keine Kommentare|{1} 1 Kommentar|[2,*] :count Kommentare', 'comment_save' => 'Kommentar speichern', From d92efd4edc9ec642c0d5015183c6c56bde3e0fd8 Mon Sep 17 00:00:00 2001 From: Abijeet Date: Wed, 28 Mar 2018 00:47:38 +0530 Subject: [PATCH 19/31] Adds the media plugin to TinyMCE to allow insertion of videos. Fixes #266 Signed-off-by: Abijeet --- resources/assets/sass/_pages.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss index 3749b5321..2de274520 100755 --- a/resources/assets/sass/_pages.scss +++ b/resources/assets/sass/_pages.scss @@ -309,4 +309,14 @@ .comment-editor .CodeMirror, .comment-editor .CodeMirror-scroll { min-height: 175px; +} + +/* FIXME - Ugly hack to modify the media plugin for TinyMCE */ +.mce-floatpanel[aria-label="Insert/edit media"] { + .mce-open { + display: none; + } + .mce-tab:last-of-type { + display: none; + } } \ No newline at end of file From 93f92e9e1682e062c7fbfa575450cef121407da3 Mon Sep 17 00:00:00 2001 From: Abijeet Date: Wed, 28 Mar 2018 23:22:08 +0530 Subject: [PATCH 20/31] Updated the TinyMCE to version 4.7.9. Added some code to remove the box-shadow around the TinyMCE toolbar. Signed-off-by: Abijeet --- .../tinymce/plugins/advlist/plugin.min.js | 2 +- .../libs/tinymce/plugins/anchor/plugin.min.js | 2 +- .../tinymce/plugins/autolink/plugin.min.js | 2 +- .../tinymce/plugins/autoresize/plugin.min.js | 2 +- .../tinymce/plugins/autosave/plugin.min.js | 2 +- .../libs/tinymce/plugins/bbcode/plugin.min.js | 2 +- .../tinymce/plugins/charmap/plugin.min.js | 2 +- .../libs/tinymce/plugins/code/plugin.min.js | 2 +- .../tinymce/plugins/codesample/plugin.min.js | 2 +- .../tinymce/plugins/colorpicker/plugin.min.js | 2 +- .../tinymce/plugins/contextmenu/plugin.min.js | 2 +- .../plugins/directionality/plugin.min.js | 2 +- .../tinymce/plugins/emoticons/plugin.min.js | 2 +- .../tinymce/plugins/fullpage/plugin.min.js | 2 +- .../tinymce/plugins/fullscreen/plugin.min.js | 2 +- public/libs/tinymce/plugins/help/img/logo.png | Bin 23101 -> 13208 bytes .../libs/tinymce/plugins/help/plugin.min.js | 2 +- public/libs/tinymce/plugins/hr/plugin.min.js | 2 +- .../libs/tinymce/plugins/image/plugin.min.js | 2 +- .../tinymce/plugins/imagetools/plugin.min.js | 3 +-- .../tinymce/plugins/importcss/plugin.min.js | 2 +- .../plugins/insertdatetime/plugin.min.js | 2 +- .../plugins/legacyoutput/plugin.min.js | 2 +- .../libs/tinymce/plugins/link/plugin.min.js | 2 +- .../libs/tinymce/plugins/lists/plugin.min.js | 2 +- .../libs/tinymce/plugins/media/plugin.min.js | 2 +- .../tinymce/plugins/nonbreaking/plugin.min.js | 2 +- .../tinymce/plugins/noneditable/plugin.min.js | 2 +- .../tinymce/plugins/pagebreak/plugin.min.js | 2 +- .../libs/tinymce/plugins/paste/plugin.min.js | 2 +- .../tinymce/plugins/preview/plugin.min.js | 2 +- .../libs/tinymce/plugins/print/plugin.min.js | 2 +- .../libs/tinymce/plugins/save/plugin.min.js | 2 +- .../plugins/searchreplace/plugin.min.js | 2 +- .../plugins/spellchecker/plugin.min.js | 2 +- .../tinymce/plugins/tabfocus/plugin.min.js | 2 +- .../libs/tinymce/plugins/table/plugin.min.js | 3 +-- .../tinymce/plugins/template/plugin.min.js | 2 +- .../tinymce/plugins/textcolor/plugin.min.js | 2 +- .../tinymce/plugins/textpattern/plugin.min.js | 2 +- public/libs/tinymce/plugins/toc/plugin.min.js | 2 +- .../plugins/visualblocks/plugin.min.js | 2 +- .../tinymce/plugins/visualchars/plugin.min.js | 2 +- .../tinymce/plugins/wordcount/plugin.min.js | 2 +- .../skins/lightgray/content.inline.min.css | 2 +- .../tinymce/skins/lightgray/content.min.css | 2 +- .../skins/lightgray/content.mobile.min.css | 1 + .../skins/lightgray/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 17572 -> 18808 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 2 +- .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 17408 -> 18644 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 17484 -> 18720 bytes .../libs/tinymce/skins/lightgray/skin.min.css | 2 +- .../skins/lightgray/skin.mobile.min.css | 2 ++ .../libs/tinymce/themes/inlite/theme.min.js | 2 +- .../libs/tinymce/themes/mobile/theme.min.js | 1 + .../libs/tinymce/themes/modern/theme.min.js | 2 +- public/libs/tinymce/tinymce.min.js | 18 ++---------------- resources/assets/sass/_pages.scss | 17 +++++++++++------ 59 files changed, 66 insertions(+), 73 deletions(-) create mode 100644 public/libs/tinymce/skins/lightgray/content.mobile.min.css create mode 100644 public/libs/tinymce/skins/lightgray/fonts/tinymce-mobile.woff create mode 100644 public/libs/tinymce/skins/lightgray/skin.mobile.min.css create mode 100644 public/libs/tinymce/themes/mobile/theme.min.js diff --git a/public/libs/tinymce/plugins/advlist/plugin.min.js b/public/libs/tinymce/plugins/advlist/plugin.min.js index e281ace27..c6e0a8989 100644 --- a/public/libs/tinymce/plugins/advlist/plugin.min.js +++ b/public/libs/tinymce/plugins/advlist/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0&&f[0].nodeName===c)})}};j(a,"lists")&&(a.addCommand("ApplyUnorderedListStyle",function(a,b){f("UL",b["list-style-type"])}),a.addCommand("ApplyOrderedListStyle",function(a,b){f("OL",b["list-style-type"])}),a.addButton("numlist",{type:h.length>0?"splitbutton":"button",tooltip:"Numbered list",menu:h,onPostRender:k("OL"),onshow:g,onselect:function(a){f("OL",a.control.settings.data)},onclick:function(){a.execCommand("InsertOrderedList")}}),a.addButton("bullist",{type:i.length>0?"splitbutton":"button",tooltip:"Bullet list",onPostRender:k("UL"),menu:i,onshow:g,onselect:function(a){f("UL",a.control.settings.data)},onclick:function(){a.execCommand("InsertUnorderedList")}}))}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(t,e,n){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===n?null:{"list-style-type":n})},r=function(t){t.addCommand("ApplyUnorderedListStyle",function(e,r){n(t,"UL",r["list-style-type"])}),t.addCommand("ApplyOrderedListStyle",function(e,r){n(t,"OL",r["list-style-type"])})},o=function(t){var e=t.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return e?e.split(/[ ,]/):[]},i=function(t){var e=t.getParam("advlist_bullet_styles","default,circle,disc,square");return e?e.split(/[ ,]/):[]},l=function(t){return t&&/^(TH|TD)$/.test(t.nodeName)},a=function(t){return function(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)&&(r=e,(n=t).$.contains(n.getBody(),r));var n,r}},s=function(t){var e=t.dom.getParent(t.selection.getNode(),"ol,ul");return t.dom.getStyle(e,"listStyleType")||""},u=function(t){return e.map(t,function(t){return{text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()}),data:"default"===t?"":t}})},c=function(t,n){return function(r){var o=r.control;t.on("NodeChange",function(r){var i=function(t,e){for(var n=0;n0&&u[0].nodeName===n)})}},d=function(t,e,r,o,i,l){var a;t.addButton(e,{active:!1,type:"splitbutton",tooltip:r,menu:u(l),onPostRender:c(t,i),onshow:(a=t,function(t){var e=s(a);t.control.items().each(function(t){t.active(t.settings.data===e)})}),onselect:function(e){n(t,i,e.control.settings.data)},onclick:function(){t.execCommand(o)}})},p=function(t,e,n,r,o,i){var l,a,s,u,p;i.length>0?d(t,e,n,r,o,i):(a=e,s=n,u=r,p=o,(l=t).addButton(a,{active:!1,type:"button",tooltip:s,onPostRender:c(l,p),onclick:function(){l.execCommand(u)}}))},f=function(t){p(t,"numlist","Numbered list","InsertOrderedList","OL",o(t)),p(t,"bullist","Bullet list","InsertUnorderedList","UL",i(t))};t.add("advlist",function(t){var n,o,i;o="lists",i=(n=t).settings.plugins?n.settings.plugins:"",-1!==e.inArray(i.split(/[ ,]/),o)&&(f(t),r(t))})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/anchor/plugin.min.js b/public/libs/tinymce/plugins/anchor/plugin.min.js index 6b3361d26..ed6279d3f 100644 --- a/public/libs/tinymce/plugins/anchor/plugin.min.js +++ b/public/libs/tinymce/plugins/anchor/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ic&&(b=c)}return b}function f(a,b){1!=a.nodeType||a.hasChildNodes()?h.setStart(a,e(a,b)):h.setStartBefore(a)}function g(a,b){1!=a.nodeType||a.hasChildNodes()?h.setEnd(a,e(a,b)):h.setEndAfter(a)}var h,j,k,l,m,n,o,p,q,r;if("A"!=a.selection.getNode().tagName){if(h=a.selection.getRng(!0).cloneRange(),h.startOffset<5){if(p=h.endContainer.previousSibling,!p){if(!h.endContainer.firstChild||!h.endContainer.firstChild.nextSibling)return;p=h.endContainer.firstChild.nextSibling}if(q=p.length,f(p,q),g(p,q),h.endOffset<5)return;j=h.endOffset,l=p}else{if(l=h.endContainer,3!=l.nodeType&&l.firstChild){for(;3!=l.nodeType&&l.firstChild;)l=l.firstChild;3==l.nodeType&&(f(l,0),g(l,l.nodeValue.length))}j=1==h.endOffset?2:h.endOffset-1-b}k=j;do f(l,j>=2?j-2:0),g(l,j>=1?j-1:0),j-=1,r=h.toString();while(" "!=r&&""!==r&&160!=r.charCodeAt(0)&&j-2>=0&&r!=d);c(h.toString(),d)?(f(l,j),g(l,k),j+=1):0===h.startOffset?(f(l,0),g(l,k)):(f(l,j),g(l,k)),n=h.toString(),"."==n.charAt(n.length-1)&&g(l,k-1),n=h.toString(),o=n.match(i),o&&("www."==o[1]?o[1]="http://www.":/@$/.test(o[1])&&!/^mailto:/.test(o[1])&&(o[1]="mailto:"+o[1]),m=a.selection.getBookmark(),a.selection.setRng(h),a.execCommand("createlink",!1,o[1]+o[2]),a.settings.default_link_target&&a.dom.setAttrib(a.selection.getNode(),"target",a.settings.default_link_target),a.selection.moveToBookmark(m),a.nodeChanged())}}var h,i=/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i;return b.settings.autolink_pattern&&(i=b.settings.autolink_pattern),b.on("keydown",function(a){if(13==a.keyCode)return f(b)}),a.ie?void b.on("focus",function(){if(!h){h=!0;try{b.execCommand("AutoUrlDetect",!1,!0)}catch(a){}}}):(b.on("keypress",function(a){if(41==a.keyCode)return d(b)}),void b.on("keyup",function(a){if(32==a.keyCode)return e(b)}))}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return e.getParam("autolink_pattern",/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i)},i=function(e){return e.getParam("default_link_target","")},o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;t>n&&(t=n)}return t},r=function(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setStart(t,o(t,n)):e.setStartBefore(t)},a=function(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setEnd(t,o(t,n)):e.setEndAfter(t)},f=function(e,t,o){var f,s,d,l,c,u,g,h,C,m,y=n(e),k=i(e);if("A"!==e.selection.getNode().tagName){if((f=e.selection.getRng(!0).cloneRange()).startOffset<5){if(!(h=f.endContainer.previousSibling)){if(!f.endContainer.firstChild||!f.endContainer.firstChild.nextSibling)return;h=f.endContainer.firstChild.nextSibling}if(C=h.length,r(f,h,C),a(f,h,C),f.endOffset<5)return;s=f.endOffset,l=h}else{if(3!==(l=f.endContainer).nodeType&&l.firstChild){for(;3!==l.nodeType&&l.firstChild;)l=l.firstChild;3===l.nodeType&&(r(f,l,0),a(f,l,l.nodeValue.length))}s=1===f.endOffset?2:f.endOffset-1-t}for(d=s;r(f,l,s>=2?s-2:0),a(f,l,s>=1?s-1:0),s-=1," "!==(m=f.toString())&&""!==m&&160!==m.charCodeAt(0)&&s-2>=0&&m!==o;);var p;(p=f.toString())===o||" "===p||160===p.charCodeAt(0)?(r(f,l,s),a(f,l,d),s+=1):0===f.startOffset?(r(f,l,0),a(f,l,d)):(r(f,l,s),a(f,l,d)),"."===(u=f.toString()).charAt(u.length-1)&&a(f,l,d-1),(g=(u=f.toString().trim()).match(y))&&("www."===g[1]?g[1]="http://www.":/@$/.test(g[1])&&!/^mailto:/.test(g[1])&&(g[1]="mailto:"+g[1]),c=e.selection.getBookmark(),e.selection.setRng(f),e.execCommand("createlink",!1,g[1]+g[2]),k&&e.dom.setAttrib(e.selection.getNode(),"target",k),e.selection.moveToBookmark(c),e.nodeChanged())}},s=function(e){var n;e.on("keydown",function(t){13!==t.keyCode||f(e,-1,"")}),t.ie?e.on("focus",function(){if(!n){n=!0;try{e.execCommand("AutoUrlDetect",!1,!0)}catch(t){}}}):(e.on("keypress",function(t){41!==t.keyCode||f(e,-1,"(")}),e.on("keyup",function(t){32!==t.keyCode||f(e,0,"")}))};e.add("autolink",function(e){s(e)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/autoresize/plugin.min.js b/public/libs/tinymce/plugins/autoresize/plugin.min.js index 081b5d32d..9f2b8fc54 100644 --- a/public/libs/tinymce/plugins/autoresize/plugin.min.js +++ b/public/libs/tinymce/plugins/autoresize/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ih.autoresize_min_height&&(m=n),h.autoresize_max_height&&n>h.autoresize_max_height?(m=h.autoresize_max_height,k.style.overflowY="auto",l.style.overflowY="auto"):(k.style.overflowY="hidden",l.style.overflowY="hidden",k.scrollTop=0),m!==i&&(g=m-i,e.setStyle(a.iframeElement,"height",m+"px"),i=m,b.webKit&&g<0&&f(d))}}function g(b,c,e){d.setEditorTimeout(a,function(){f({}),b--?g(b,c,e):e&&e()},c)}var h=a.settings,i=0;a.settings.inline||(h.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight),10),h.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0),10),a.on("init",function(){var b,c;b=a.getParam("autoresize_overflow_padding",1),c=a.getParam("autoresize_bottom_margin",50),b!==!1&&a.dom.setStyles(a.getBody(),{paddingLeft:b,paddingRight:b}),c!==!1&&a.dom.setStyles(a.getBody(),{paddingBottom:c})}),a.on("nodechange setcontent keyup FullscreenStateChanged",f),a.getParam("autoresize_on_init",!0)&&a.on("init",function(){g(20,100,function(){g(5,1e3)})}),a.addCommand("mceAutoResize",f))}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var t=function(e){var n=e,i=function(){return n};return{get:i,set:function(t){n=t},clone:function(){return t(i())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.Env"),i=tinymce.util.Tools.resolve("tinymce.util.Delay"),o=function(t){return parseInt(t.getParam("autoresize_min_height",t.getElement().offsetHeight),10)},r=function(t){return parseInt(t.getParam("autoresize_max_height",0),10)},a=function(t){return t.getParam("autoresize_overflow_padding",1)},u=function(t){return t.getParam("autoresize_bottom_margin",50)},s=function(t){return t.getParam("autoresize_on_init",!0)},l=function(t,e,n,o,r){i.setEditorTimeout(t,function(){c(t,e),n--?l(t,e,n,o,r):r&&r()},o)},g=function(t,e){var n=t.getBody();n&&(n.style.overflowY=e?"":"hidden",e||(n.scrollTop=0))},c=function(t,e){var i,a,u,s,l,f,d,m,p,y,h,v=t.dom;if(a=t.getDoc())if((S=t).plugins.fullscreen&&S.plugins.fullscreen.isFullscreen())g(t,!0);else{var S;u=a.body,s=o(t),f=v.getStyle(u,"margin-top",!0),d=v.getStyle(u,"margin-bottom",!0),m=v.getStyle(u,"padding-top",!0),p=v.getStyle(u,"padding-bottom",!0),y=v.getStyle(u,"border-top-width",!0),h=v.getStyle(u,"border-bottom-width",!0),l=u.offsetHeight+parseInt(f,10)+parseInt(d,10)+parseInt(m,10)+parseInt(p,10)+parseInt(y,10)+parseInt(h,10),(isNaN(l)||l<=0)&&(l=n.ie?u.scrollHeight:n.webkit&&0===u.clientHeight?0:u.offsetHeight),l>o(t)&&(s=l);var _=r(t);_&&l>_?(s=_,g(t,!0)):g(t,!1),s!==e.get()&&(i=s-e.get(),v.setStyle(t.iframeElement,"height",s+"px"),e.set(s),n.webkit&&i<0&&c(t,e))}},f={setup:function(t,e){t.on("init",function(){var e,n,i=t.dom;e=a(t),n=u(t),!1!==e&&i.setStyles(t.getBody(),{paddingLeft:e,paddingRight:e}),!1!==n&&i.setStyles(t.getBody(),{paddingBottom:n})}),t.on("nodechange setcontent keyup FullscreenStateChanged",function(n){c(t,e)}),s(t)&&t.on("init",function(){l(t,e,20,100,function(){l(t,e,5,1e3)})})},resize:c},d=function(t,e){t.addCommand("mceAutoResize",function(){f.resize(t,e)})};e.add("autoresize",function(e){if(!e.inline){var n=t(0);d(e,n),f.setup(e,n)}})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/autosave/plugin.min.js b/public/libs/tinymce/plugins/autosave/plugin.min.js index 447ddf836..77d0af969 100644 --- a/public/libs/tinymce/plugins/autosave/plugin.min.js +++ b/public/libs/tinymce/plugins/autosave/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;iq.autosave_retention)||(h(!1),!1)}function h(a){c.removeItem(o+"draft"),c.removeItem(o+"time"),a!==!1&&b.fire("RemoveDraft")}function i(){!n()&&b.isDirty()&&(c.setItem(o+"draft",b.getContent({format:"raw",no_events:!0})),c.setItem(o+"time",(new Date).getTime()),b.fire("StoreDraft"))}function j(){g()&&(b.setContent(c.getItem(o+"draft"),{format:"raw"}),b.fire("RestoreDraft"))}function k(){p||(setInterval(function(){b.removed||i()},q.autosave_interval),p=!0)}function l(){var a=this;a.disabled(!g()),b.on("StoreDraft RestoreDraft RemoveDraft",function(){a.disabled(!g())}),k()}function m(){b.undoManager.beforeChange(),j(),h(),b.undoManager.add()}function n(a){var c=b.settings.forced_root_block;return a=d.trim("undefined"==typeof a?b.getBody().innerHTML:a),""===a||new RegExp("^<"+c+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
$","i").test(a)}var o,p,q=b.settings;o=q.autosave_prefix||"tinymce-autosave-{path}{query}-{id}-",o=o.replace(/\{path\}/g,document.location.pathname),o=o.replace(/\{query\}/g,document.location.search),o=o.replace(/\{id\}/g,b.id),q.autosave_interval=f(q.autosave_interval,"30s"),q.autosave_retention=f(q.autosave_retention,"20m"),b.addButton("restoredraft",{title:"Restore last draft",onclick:m,onPostRender:l}),b.addMenuItem("restoredraft",{text:"Restore last draft",onclick:m,onPostRender:l,context:"file"}),b.settings.autosave_restore_when_empty!==!1&&(b.on("init",function(){g()&&n()&&j()}),b.on("saveContent",function(){h()})),e.onbeforeunload=a._beforeUnloadHandler,this.hasDraft=g,this.storeDraft=i,this.restoreDraft=j,this.removeDraft=h,this.isEmpty=n}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var t=function(e){var r=e,n=function(){return r};return{get:n,set:function(t){r=t},clone:function(){return t(n())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(t){return t.fire("RestoreDraft")},o=function(t){return t.fire("StoreDraft")},i=function(t){return t.fire("RemoveDraft")},s=function(t,e){return((t=/^(\d+)([ms]?)$/.exec(""+(t||e)))[2]?{s:1e3,m:6e4}[t[2]]:1)*parseInt(t,10)},u=function(t){return t.getParam("autosave_ask_before_unload",!0)},f=function(t){var e=t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-");return e=(e=(e=(e=e.replace(/\{path\}/g,document.location.pathname)).replace(/\{query\}/g,document.location.search)).replace(/\{hash\}/g,document.location.hash)).replace(/\{id\}/g,t.id)},c=function(t){return s(t.settings.autosave_interval,"30s")},l=function(t){return s(t.settings.autosave_retention,"20m")},m=function(t,e){var r=t.settings.forced_root_block;return""===(e=n.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+r+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
$","i").test(e)},v=function(t){var e=parseInt(r.getItem(f(t)+"time"),10)||0;return!((new Date).getTime()-e>l(t)&&(d(t,!1),1))},d=function(t,e){var n=f(t);r.removeItem(n+"draft"),r.removeItem(n+"time"),!1!==e&&i(t)},D=function(t){var e=f(t);!m(t)&&t.isDirty()&&(r.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),r.setItem(e+"time",(new Date).getTime().toString()),o(t))},g=function(t){var e=f(t);v(t)&&(t.setContent(r.getItem(e+"draft"),{format:"raw"}),a(t))},y={isEmpty:m,hasDraft:v,removeDraft:d,storeDraft:D,restoreDraft:g,startStoreDraft:function(t,e){var r=c(t);e.get()||(setInterval(function(){t.removed||D(t)},r),e.set(!0))},restoreLastDraft:function(t){t.undoManager.transact(function(){g(t),d(t)}),t.focus()}},p=function(t,e){return function(){var r=Array.prototype.slice.call(arguments);return t.apply(null,[e].concat(r))}},h=function(t){return{hasDraft:p(y.hasDraft,t),storeDraft:p(y.storeDraft,t),restoreDraft:p(y.restoreDraft,t),removeDraft:p(y.removeDraft,t),isEmpty:p(y.isEmpty,t)}},_=tinymce.util.Tools.resolve("tinymce.EditorManager");_._beforeUnloadHandler=function(){var t;return n.each(_.get(),function(e){e.plugins.autosave&&e.plugins.autosave.storeDraft(),!t&&e.isDirty()&&u(e)&&(t=e.translate("You have unsaved changes are you sure you want to navigate away?"))}),t};var b=function(t){window.onbeforeunload=_._beforeUnloadHandler},I=function(t,e){return function(r){var n=r.control;n.disabled(!y.hasDraft(t)),t.on("StoreDraft RestoreDraft RemoveDraft",function(){n.disabled(!y.hasDraft(t))}),y.startStoreDraft(t,e)}},w=function(t,e){t.addButton("restoredraft",{title:"Restore last draft",onclick:function(){y.restoreLastDraft(t)},onPostRender:I(t,e)}),t.addMenuItem("restoredraft",{text:"Restore last draft",onclick:function(){y.restoreLastDraft(t)},onPostRender:I(t,e),context:"file"})};e.add("autosave",function(e){var r=t(!1);return b(e),w(e,r),h(e)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/bbcode/plugin.min.js b/public/libs/tinymce/plugins/bbcode/plugin.min.js index 966358a0d..158927458 100644 --- a/public/libs/tinymce/plugins/bbcode/plugin.min.js +++ b/public/libs/tinymce/plugins/bbcode/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i(.*?)<\/a>/gi,"[url=$1]$2[/url]"),c(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),c(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),c(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),c(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),c(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),c(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),c(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),c(/(.*?)<\/font>/gi,"$1"),c(//gi,"[img]$1[/img]"),c(/(.*?)<\/span>/gi,"[code]$1[/code]"),c(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),c(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),c(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),c(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),c(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),c(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),c(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),c(/<\/(strong|b)>/gi,"[/b]"),c(/<(strong|b)>/gi,"[b]"),c(/<\/(em|i)>/gi,"[/i]"),c(/<(em|i)>/gi,"[i]"),c(/<\/u>/gi,"[/u]"),c(/(.*?)<\/span>/gi,"[u]$1[/u]"),c(//gi,"[u]"),c(/]*>/gi,"[quote]"),c(/<\/blockquote>/gi,"[/quote]"),c(/
/gi,"\n"),c(//gi,"\n"),c(/
/gi,"\n"),c(/

/gi,""),c(/<\/p>/gi,"\n"),c(/ |\u00a0/gi," "),c(/"/gi,'"'),c(/</gi,"<"),c(/>/gi,">"),c(/&/gi,"&"),a},_punbb_bbcode2html:function(a){function c(b,c){a=a.replace(b,c)}return a=b.trim(a),c(/\n/gi,"
"),c(/\[b\]/gi,""),c(/\[\/b\]/gi,""),c(/\[i\]/gi,""),c(/\[\/i\]/gi,""),c(/\[u\]/gi,""),c(/\[\/u\]/gi,""),c(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),c(/\[url\](.*?)\[\/url\]/gi,'$1'),c(/\[img\](.*?)\[\/img\]/gi,''),c(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),c(/\[code\](.*?)\[\/code\]/gi,'$1 '),c(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),a}}}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(o){o=t.trim(o);var e=function(t,e){o=o.replace(t,e)};return e(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/(.*?)<\/font>/gi,"$1"),e(//gi,"[img]$1[/img]"),e(/(.*?)<\/span>/gi,"[code]$1[/code]"),e(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/(.*?)<\/span>/gi,"[u]$1[/u]"),e(//gi,"[u]"),e(/]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/
/gi,"\n"),e(//gi,"\n"),e(/
/gi,"\n"),e(/

/gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),o},i=function(o){o=t.trim(o);var e=function(t,e){o=o.replace(t,e)};return e(/\n/gi,"
"),e(/\[b\]/gi,""),e(/\[\/b\]/gi,""),e(/\[i\]/gi,""),e(/\[\/i\]/gi,""),e(/\[u\]/gi,""),e(/\[\/u\]/gi,""),e(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),e(/\[url\](.*?)\[\/url\]/gi,'$1'),e(/\[img\](.*?)\[\/img\]/gi,''),e(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),e(/\[code\](.*?)\[\/code\]/gi,'$1 '),e(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),o};o.add("bbcode",function(){return{init:function(o){o.on("beforeSetContent",function(o){o.content=i(o.content)}),o.on("postProcess",function(o){o.set&&(o.content=i(o.content)),o.get&&(o.content=e(o.content))})}}})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/charmap/plugin.min.js b/public/libs/tinymce/plugins/charmap/plugin.min.js index 3fd9e23d5..14d1653ba 100644 --- a/public/libs/tinymce/plugins/charmap/plugin.min.js +++ b/public/libs/tinymce/plugins/charmap/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i",d=0;d

'+n+"
"}else c+=""}c+=""}c+="";var o={type:"container",html:c,onclick:function(a){var c=a.target;if(/^(TD|DIV)$/.test(c.nodeName)){var d=b(c).firstChild;d&&d.hasAttribute("data-chr")&&(h(d.getAttribute("data-chr")),a.ctrlKey||f.close())}},onmouseover:function(a){var c=b(a.target);c&&c.firstChild?(f.find("#preview").text(c.firstChild.firstChild.data),f.find("#previewTitle").text(c.title)):(f.find("#preview").text(" "),f.find("#previewTitle").text(" "))}};f=a.windowManager.open({title:"Special character",spacing:10,padding:10,items:[o,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){f.close()}}]})}var j=b.isArray;return a.addCommand("mceShowCharmap",i),a.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),a.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"}),{getCharMap:g,insertChar:h}}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e,t){return e.fire("insertCustomChar",{chr:t})},a=function(e,a){var i=t(e,a).chr;e.execCommand("mceInsertContent",!1,i)},i=tinymce.util.Tools.resolve("tinymce.util.Tools"),r=function(e){return e.settings.charmap},n=function(e){return e.settings.charmap_append},o=i.isArray,l=function(e){return o(e)?[].concat((t=e,i.grep(t,function(e){return o(e)&&2===e.length}))):"function"==typeof e?e():[];var t},c=function(e){return function(e,t){var a=r(e);a&&(t=l(a));var i=n(e);return i?[].concat(t).concat(l(i)):t}(e,[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]])},s=function(e){return{getCharMap:function(){return c(e)},insertChar:function(t){a(e,t)}}},u=function(e){var t,a,i,r=Math.min(e.length,25),n=Math.ceil(e.length/r);for(t='',i=0;i",a=0;a
'+s+"
"}else t+="
"}return t+=""},d=function(e){for(;e;){if("TD"===e.nodeName)return e;e=e.parentNode}},m=function(e){var t,i={type:"container",html:u(c(e)),onclick:function(i){var r=i.target;if(/^(TD|DIV)$/.test(r.nodeName)){var n=d(r).firstChild;if(n&&n.hasAttribute("data-chr")){var o=n.getAttribute("data-chr"),l=parseInt(o,10);isNaN(l)||a(e,String.fromCharCode(l)),i.ctrlKey||t.close()}}},onmouseover:function(e){var a=d(e.target);a&&a.firstChild?(t.find("#preview").text(a.firstChild.firstChild.data),t.find("#previewTitle").text(a.title)):(t.find("#preview").text(" "),t.find("#previewTitle").text(" "))}};t=e.windowManager.open({title:"Special character",spacing:10,padding:10,items:[i,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){t.close()}}]})},g=function(e){e.addCommand("mceShowCharmap",function(){m(e)})},p=function(e){e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})};e.add("charmap",function(e){return g(e),p(e),s(e)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/code/plugin.min.js b/public/libs/tinymce/plugins/code/plugin.min.js index 7a0437ed9..c983b5cf1 100644 --- a/public/libs/tinymce/plugins/code/plugin.min.js +++ b/public/libs/tinymce/plugins/code/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ia.length)break a;if(!(q instanceof e)){k.lastIndex=0;var r=k.exec(q);if(r){m&&(n=r[1].length);var s=r.index-1+n,r=r[0].slice(n),t=r.length,u=s+t,v=q.slice(0,s+1),w=q.slice(u+1),x=[p,1];v&&x.push(v);var y=new e(h,l?c.tokenize(r,l):r,o);x.push(y),w&&x.push(w),Array.prototype.splice.apply(f,x)}}}}}return f},hooks:{all:{},add:function(a,b){var d=c.hooks.all;d[a]=d[a]||[],d[a].push(b)},run:function(a,b){var d=c.hooks.all[a];if(d&&d.length)for(var e,f=0;e=d[f++];)e(b)}}},d=c.Token=function(a,b,c){this.type=a,this.content=b,this.alias=c};if(d.stringify=function(a,b,e){if("string"==typeof a)return a;if("Array"===c.util.type(a))return a.map(function(c){return d.stringify(c,b,a)}).join("");var f={type:a.type,content:d.stringify(a.content,b,e),tag:"span",classes:["token",a.type],attributes:{},language:b,parent:e};if("comment"==f.type&&(f.attributes.spellcheck="true"),a.alias){var g="Array"===c.util.type(a.alias)?a.alias:[a.alias];Array.prototype.push.apply(f.classes,g)}c.hooks.run("wrap",f);var h="";for(var i in f.attributes)h+=(h?" ":"")+i+'="'+(f.attributes[i]||"")+'"';return"<"+f.tag+' class="'+f.classes.join(" ")+'" '+h+">"+f.content+""},!b.document)return b.addEventListener?(b.addEventListener("message",function(a){var d=JSON.parse(a.data),e=d.language,f=d.code,g=d.immediateClose;b.postMessage(c.highlight(f,c.languages[e],e)),g&&b.close()},!1),b.Prism):b.Prism}();return"undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof global&&(global.Prism=c),c.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/i,inside:{tag:{pattern:/|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/i,inside:{tag:{pattern:/|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(a){"php"===a.language&&(a.tokenStack=[],a.backupCode=a.code,a.code=a.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(b){return a.tokenStack.push(b),"{{{PHP"+a.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(a){"php"===a.language&&(a.code=a.backupCode,delete a.backupCode)}),c.hooks.add("after-highlight",function(a){if("php"===a.language){for(var b,d=0;b=a.tokenStack[d];d++)a.highlightedCode=a.highlightedCode.replace("{{{PHP"+(d+1)+"}}}",c.highlight(b,a.grammar,"php").replace(/\$/g,"$$$$"));a.element.innerHTML=a.highlightedCode}}),c.hooks.add("wrap",function(a){"php"===a.language&&"markup"===a.type&&(a.content=a.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(a){a.languages.ruby=a.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var b={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:a.util.clone(a.languages.ruby)}};a.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:b}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:b}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:b}}]}(c),c}),g("7",["6"],function(a){return a("tinymce.dom.DOMUtils")}),g("5",[],function(){function a(a){return a&&"PRE"==a.nodeName&&a.className.indexOf("language-")!==-1}function b(a){return function(b,c){return a(c)}}return{isCodeSample:a,trimArg:b}}),g("4",["7","3","5"],function(a,b,c){function d(a){var b=[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],c=a.settings.codesample_languages;return c?c:b}function e(a,c,d){a.undoManager.transact(function(){var e=f(a);d=i.encode(d),e?(a.dom.setAttrib(e,"class","language-"+c),e.innerHTML=d,b.highlightElement(e),a.selection.select(e)):(a.insertContent('
'+d+"
"),a.selection.select(a.$("#__new").removeAttr("id")[0]))})}function f(a){var b=a.selection.getNode();return c.isCodeSample(b)?b:null}function g(a){var b=f(a);return b?b.textContent:""}function h(a){var b,c=f(a);return c?(b=c.className.match(/language-(\w+)/),b?b[1]:""):""}var i=a.DOM;return{open:function(a){a.windowManager.open({title:"Insert/Edit code sample",minWidth:Math.min(i.getViewPort().w,a.getParam("codesample_dialog_width",800)),minHeight:Math.min(i.getViewPort().h,a.getParam("codesample_dialog_height",650)),layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:h(a),values:d(a)},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:g(a),autofocus:!0}],onSubmit:function(b){e(a,b.data.language,b.data.code)}})}}}),g("0",["1","2","3","4","5"],function(a,b,c,d,e){var f,g=e.trimArg;return b.add("codesample",function(b,h){function i(){var a,c=b.settings.codesample_content_css;b.inline&&f||!b.inline&&j||(b.inline?f=!0:j=!0,c!==!1&&(a=b.dom.create("link",{rel:"stylesheet",href:c?c:h+"/css/prism.css"}),b.getDoc().getElementsByTagName("head")[0].appendChild(a)))}var j,k=b.$;a.ceFalse&&(b.on("PreProcess",function(a){k("pre[contenteditable=false]",a.node).filter(g(e.isCodeSample)).each(function(a,b){var c=k(b),d=b.textContent;c.attr("class",k.trim(c.attr("class"))),c.removeAttr("contentEditable"),c.empty().append(k("").each(function(){this.textContent=d}))})}),b.on("SetContent",function(){var a=k("pre").filter(g(e.isCodeSample)).filter(function(a,b){return"false"!==b.contentEditable});a.length&&b.undoManager.transact(function(){a.each(function(a,d){k(d).find("br").each(function(a,c){c.parentNode.replaceChild(b.getDoc().createTextNode("\n"),c)}),d.contentEditable=!1,d.innerHTML=b.dom.encode(d.textContent),c.highlightElement(d),d.className=k.trim(d.className)})})}),b.addCommand("codesample",function(){var a=b.selection.getNode();b.selection.isCollapsed()||e.isCodeSample(a)?d.open(b):b.formatter.toggle("code")}),b.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),b.on("init",i))}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e=function(t){var a=t,n=function(){return a};return{get:n,set:function(e){a=e},clone:function(){return e(n())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=function(e){return e.settings.codesample_content_css},i=function(e){return e.settings.codesample_languages},r=function(e){return Math.min(a.DOM.getViewPort().w,e.getParam("codesample_dialog_width",800))},s=function(e){return Math.min(a.DOM.getViewPort().w,e.getParam("codesample_dialog_height",650))},o={},l=void 0!==o?o:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},c=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=l.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(m instanceof i)){u.lastIndex=0;var b=u.exec(m);if(b){d&&(p=b[1].length);var y=b.index-1+p,v=y+(b=b[0].slice(p)).length,k=m.slice(0,y+1),w=m.slice(v+1),x=[h,1];k&&x.push(k);var S=new i(o,g?t.tokenize(b,g):b,f);x.push(S),w&&x.push(w),Array.prototype.splice.apply(r,x)}}}}}return r},hooks:{all:{},add:function(e,a){var n=t.hooks.all;n[e]=n[e]||[],n[e].push(a)},run:function(e,a){var n=t.hooks.all[e];if(n&&n.length)for(var i=0,r=void 0;r=n[i++];)r(a)}}},a=t.Token=function(e,t,a){this.type=e,this.content=t,this.alias=a};if(a.stringify=function(e,n,i){if("string"==typeof e)return e;if("Array"===t.util.type(e))return e.map(function(t){return a.stringify(t,n,e)}).join("");var r={type:e.type,content:a.stringify(e.content,n,i),tag:"span",classes:["token",e.type],attributes:{},language:n,parent:i};if("comment"===r.type&&(r.attributes.spellcheck="true"),e.alias){var s="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,s)}t.hooks.run("wrap",r);var o="";for(var l in r.attributes)o+=(o?" ":"")+l+'="'+(r.attributes[l]||"")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'" '+o+">"+r.content+""},!l.document)return l.addEventListener?(l.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,i=a.code,r=a.immediateClose;l.postMessage(t.highlight(i,t.languages[n],n)),r&&l.close()},!1),l.Prism):l.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof global&&(global.Prism=c),c.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/i,inside:{tag:{pattern:/|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/i,inside:{tag:{pattern:/|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(t){return e.tokenStack.push(t),"{{{PHP"+e.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),c.hooks.add("after-highlight",function(e){if("php"===e.language){for(var t=0,a=void 0;a=e.tokenStack[t];t++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(t+1)+"}}}",c.highlight(a,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),c.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(e){e.languages.ruby=e.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var t={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:t}},{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:t}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:t}}]}(c);var u={isCodeSample:function(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function(e){return function(t,a){return e(a)}}},g=function(e){var t=e.selection.getNode();return u.isCodeSample(t)?t:null},d=g,p=function(e,t,n){e.undoManager.transact(function(){var i=g(e);n=a.DOM.encode(n),i?(e.dom.setAttrib(i,"class","language-"+t),i.innerHTML=n,c.highlightElement(i),e.selection.select(i)):(e.insertContent('
'+n+"
"),e.selection.select(e.$("#__new").removeAttr("id")[0]))})},f=function(e){var t=g(e);return t?t.textContent:""},h=function(e){var t=i(e);return t||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},m=function(e){var t,a=d(e);return a&&(t=a.className.match(/language-(\w+)/))?t[1]:""},b=function(e){var t=r(e),a=s(e),n=m(e),i=h(e),o=f(e);e.windowManager.open({title:"Insert/Edit code sample",minWidth:t,minHeight:a,layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:n,values:i},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:o,autofocus:!0}],onSubmit:function(t){p(e,t.data.language,t.data.code)}})},y=function(e){e.addCommand("codesample",function(){var t=e.selection.getNode();e.selection.isCollapsed()||u.isCodeSample(t)?b(e):e.formatter.toggle("code")})},v=function(e){var t=e.$;e.on("PreProcess",function(e){t("pre[contenteditable=false]",e.node).filter(u.trimArg(u.isCodeSample)).each(function(e,a){var n=t(a),i=a.textContent;n.attr("class",t.trim(n.attr("class"))),n.removeAttr("contentEditable"),n.empty().append(t("").each(function(){this.textContent=i}))})}),e.on("SetContent",function(){var a=t("pre").filter(u.trimArg(u.isCodeSample)).filter(function(e,t){return"false"!==t.contentEditable});a.length&&e.undoManager.transact(function(){a.each(function(a,n){t(n).find("br").each(function(t,a){a.parentNode.replaceChild(e.getDoc().createTextNode("\n"),a)}),n.contentEditable=!1,n.innerHTML=e.dom.encode(n.textContent),c.highlightElement(n),n.className=t.trim(n.className)})})})},k=function(e,t,a,i){var r,s=n(e);e.inline&&a.get()||!e.inline&&i.get()||(e.inline?a.set(!0):i.set(!0),!1!==s&&(r=e.dom.create("link",{rel:"stylesheet",href:s||t+"/css/prism.css"}),e.getDoc().getElementsByTagName("head")[0].appendChild(r)))},w=function(e){e.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),e.addMenuItem("codesample",{cmd:"codesample",text:"Code sample",icon:"codesample"})},x=e(!1);t.add("codesample",function(t,a){var n=e(!1);v(t),w(t),y(t),t.on("init",function(){k(t,a,x,n)}),t.on("dblclick",function(e){u.isCodeSample(e.target)&&b(t)})})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/colorpicker/plugin.min.js b/public/libs/tinymce/plugins/colorpicker/plugin.min.js index 35bfea214..3ffbe1650 100644 --- a/public/libs/tinymce/plugins/colorpicker/plugin.min.js +++ b/public/libs/tinymce/plugins/colorpicker/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e=a.left&&b<=a.right&&c>=a.top&&c<=a.bottom},c=function(c,d,e){return!e.collapsed&&a.foldl(e.getClientRects(),function(a,e){return a||b(e,c,d)},!1)};return{isXYWithinRange:c}}),g("0",["1","2","3","4","5","6"],function(a,b,c,d,e,f){var g=a.DOM;return c.add("contextmenu",function(a){var c,h,i=a.settings.contextmenu_never_use_native,j=function(a){return a.ctrlKey&&!i},k=function(){return b.mac&&b.webkit},l=function(){return h===!0},m=function(a){return a&&"IMG"===a.nodeName},n=function(a,b){return m(a.target)&&f.isXYWithinRange(a.clientX,a.clientY,b)===!1};return a.on("mousedown",function(b){k()&&2===b.button&&!j(b)&&a.selection.isCollapsed()&&a.once("contextmenu",function(b){m(b.target)||a.selection.placeCaretAt(b.clientX,b.clientY)})}),a.on("contextmenu",function(b){var f;if(!j(b)){if(n(b,a.selection.getRng())&&a.selection.select(b.target),b.preventDefault(),f=a.settings.contextmenu||"link openlink image inserttable | cell row column deletetable",c)c.show();else{var i=[];e.each(f.split(/[ ,]/),function(b){var c=a.menuItems[b];"|"==b&&(c={text:b}),c&&(c.shortcut="",i.push(c))});for(var k=0;k'}),a+=""}),a+=""}var e=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:d,onclick:function(b){var c=a.dom.getParent(b.target,"a");c&&(a.insertContent(''+c.getAttribute('),this.hide())}},tooltip:"Emoticons"})}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]],o=function(t){var o;return o='',e.each(i,function(i){o+="",e.each(i,function(e){var i=t+"/img/smiley-"+e+".gif";o+=''}),o+=""}),o+="
"},n=function(t,e){var i=o(e);t.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:i,onclick:function(e){var i,o,n,a=t.dom.getParent(e.target,"a");a&&(i=t,o=a.getAttribute("data-mce-url"),n=a.getAttribute("data-mce-alt"),i.insertContent(i.dom.createHTML("img",{src:o,alt:n})),this.hide())}},tooltip:"Emoticons"})};t.add("emoticons",function(t,e){n(t,e)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/fullpage/plugin.min.js b/public/libs/tinymce/plugins/fullpage/plugin.min.js index 6aa103dd6..9d2cdff91 100644 --- a/public/libs/tinymce/plugins/fullpage/plugin.min.js +++ b/public/libs/tinymce/plugins/fullpage/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i"})}),c},c=function(a){return a.replace(//g,function(a,b){return unescape(b)})};return{protectHtml:b,unprotectHtml:c}}),g("0",["1","2","3","4","5","6"],function(a,b,c,d,e,f){return d.add("fullpage",function(d){function g(){var a=h();d.windowManager.open({title:"Document properties",data:a,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(b){i(e.extend(a,b.data))}})}function h(){function a(a,b){var c=a.attr(b);return c||""}var b,c,f=j(),g={};return g.fontface=d.getParam("fullpage_default_fontface",""),g.fontsize=d.getParam("fullpage_default_fontsize",""),b=f.firstChild,7==b.type&&(g.xml_pi=!0,c=/encoding="([^"]+)"/.exec(b.value),c&&(g.docencoding=c[1])),b=f.getAll("#doctype")[0],b&&(g.doctype=""),b=f.getAll("title")[0],b&&b.firstChild&&(g.title=b.firstChild.value),p(f.getAll("meta"),function(a){var b,c=a.attr("name"),d=a.attr("http-equiv");c?g[c.toLowerCase()]=a.attr("content"):"Content-Type"==d&&(b=/charset\s*=\s*(.*)\s*/gi.exec(a.attr("content")),b&&(g.docencoding=b[1]))}),b=f.getAll("html")[0],b&&(g.langcode=a(b,"lang")||a(b,"xml:lang")),g.stylesheets=[],e.each(f.getAll("link"),function(a){"stylesheet"==a.attr("rel")&&g.stylesheets.push(a.attr("href"))}),b=f.getAll("body")[0],b&&(g.langdir=a(b,"dir"),g.style=a(b,"style"),g.visited_color=a(b,"vlink"),g.link_color=a(b,"link"),g.active_color=a(b,"alink")),g}function i(a){function f(a,b,c){a.attr(b,c?c:void 0)}function g(a){i.firstChild?i.insert(a,i.firstChild):i.append(a)}var h,i,k,l,m,o=d.dom;h=j(),i=h.getAll("head")[0],i||(l=h.getAll("html")[0],i=new b("head",1),l.firstChild?l.insert(i,l.firstChild,!0):l.append(i)),l=h.firstChild,a.xml_pi?(m='version="1.0"',a.docencoding&&(m+=' encoding="'+a.docencoding+'"'),7!=l.type&&(l=new b("xml",7),h.insert(l,h.firstChild,!0)),l.value=m):l&&7==l.type&&l.remove(),l=h.getAll("#doctype")[0],a.doctype?(l||(l=new b("#doctype",10),a.xml_pi?h.insert(l,h.firstChild):g(l)),l.value=a.doctype.substring(9,a.doctype.length-1)):l&&l.remove(),l=null,p(h.getAll("meta"),function(a){"Content-Type"==a.attr("http-equiv")&&(l=a)}),a.docencoding?(l||(l=new b("meta",1),l.attr("http-equiv","Content-Type"),l.shortEnded=!0,g(l)),l.attr("content","text/html; charset="+a.docencoding)):l&&l.remove(),l=h.getAll("title")[0],a.title?(l?l.empty():(l=new b("title",1),g(l)),l.append(new b("#text",3)).value=a.title):l&&l.remove(),p("keywords,description,author,copyright,robots".split(","),function(c){var d,e,f=h.getAll("meta"),i=a[c];for(d=0;d"))}function j(){return new a({validate:!1,root_name:"#document"}).parse(n)}function k(a){function b(a){return a.replace(/<\/?[A-Z]+/g,function(a){return a.toLowerCase()})}var c,g,h,i,k,m="",q=d.dom;if(!(a.selection||(h=f.protectHtml(d.settings.protect,a.content),"raw"==a.format&&n||a.source_view&&d.getParam("fullpage_hide_in_source_view")))){0!==h.length||a.source_view||(h=e.trim(n)+"\n"+e.trim(h)+"\n"+e.trim(o)),h=h.replace(/<(\/?)BODY/gi,"<$1body"),c=h.indexOf("",c),n=b(h.substring(0,c+1)),g=h.indexOf("\n"),i=j(),p(i.getAll("style"),function(a){a.firstChild&&(m+=a.firstChild.value)}),k=i.getAll("body")[0],k&&q.setAttribs(d.getBody(),{style:k.attr("style")||"",dir:k.attr("dir")||"",vLink:k.attr("vlink")||"",link:k.attr("link")||"",aLink:k.attr("alink")||""}),q.remove("fullpage_styles");var r=d.getDoc().getElementsByTagName("head")[0];m&&(q.add(r,"style",{id:"fullpage_styles"},m),k=q.get("fullpage_styles"),k.styleSheet&&(k.styleSheet.cssText=m));var s={};e.each(r.getElementsByTagName("link"),function(a){"stylesheet"==a.rel&&a.getAttribute("data-mce-fullpage")&&(s[a.href]=a)}),e.each(i.getAll("link"),function(a){var b=a.attr("href");return!b||(s[b]||"stylesheet"!=a.attr("rel")||q.add(r,"link",{rel:"stylesheet",text:"text/css",href:b,"data-mce-fullpage":"1"}),void delete s[b])}),e.each(s,function(a){a.parentNode.removeChild(a)})}}function l(){var a,b="",c="";return d.getParam("fullpage_default_xml_pi")&&(b+='\n'),b+=d.getParam("fullpage_default_doctype",""),b+="\n\n\n",(a=d.getParam("fullpage_default_title"))&&(b+=""+a+"\n"),(a=d.getParam("fullpage_default_encoding"))&&(b+='\n'),(a=d.getParam("fullpage_default_font_family"))&&(c+="font-family: "+a+";"),(a=d.getParam("fullpage_default_font_size"))&&(c+="font-size: "+a+";"),(a=d.getParam("fullpage_default_text_color"))&&(c+="color: "+a+";"),b+="\n\n"}function m(a){a.selection||a.source_view&&d.getParam("fullpage_hide_in_source_view")||(a.content=f.unprotectHtml(e.trim(n)+"\n"+e.trim(a.content)+"\n"+e.trim(o)))}var n,o,p=e.each;d.addCommand("mceFullPageProperties",g),d.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),d.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"}),d.on("BeforeSetContent",k),d.on("GetContent",m)}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e=function(t){var n=t,l=function(){return n};return{get:l,set:function(e){n=e},clone:function(){return e(l())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=tinymce.util.Tools.resolve("tinymce.html.DomParser"),i=tinymce.util.Tools.resolve("tinymce.html.Node"),r=tinymce.util.Tools.resolve("tinymce.html.Serializer"),o=function(e){return e.getParam("fullpage_hide_in_source_view")},a=function(e){return e.getParam("fullpage_default_xml_pi")},c=function(e){return e.getParam("fullpage_default_encoding")},s=function(e){return e.getParam("fullpage_default_font_family")},u=function(e){return e.getParam("fullpage_default_font_size")},d=function(e){return e.getParam("fullpage_default_text_color")},f=function(e){return e.getParam("fullpage_default_title")},g=function(e){return e.getParam("fullpage_default_doctype","")},m=function(e){return l({validate:!1,root_name:"#document"}).parse(e)},h=m,p=function(e,t){var l,i,r=m(t),o={};function a(e,t){return e.attr(t)||""}return o.fontface=s(e),o.fontsize=u(e),7===(l=r.firstChild).type&&(o.xml_pi=!0,(i=/encoding="([^"]+)"/.exec(l.value))&&(o.docencoding=i[1])),(l=r.getAll("#doctype")[0])&&(o.doctype=""),(l=r.getAll("title")[0])&&l.firstChild&&(o.title=l.firstChild.value),n.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?o[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(o.docencoding=t[1])}),(l=r.getAll("html")[0])&&(o.langcode=a(l,"lang")||a(l,"xml:lang")),o.stylesheets=[],n.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&o.stylesheets.push(e.attr("href"))}),(l=r.getAll("body")[0])&&(o.langdir=a(l,"dir"),o.style=a(l,"style"),o.visited_color=a(l,"vlink"),o.link_color=a(l,"link"),o.active_color=a(l,"alink")),o},y=function(e,t,l){var o,a,c,s,u,d=e.dom;function f(e,t,n){e.attr(t,n||undefined)}function g(e){a.firstChild?a.insert(e,a.firstChild):a.append(e)}o=m(l),(a=o.getAll("head")[0])||(s=o.getAll("html")[0],a=new i("head",1),s.firstChild?s.insert(a,s.firstChild,!0):s.append(a)),s=o.firstChild,t.xml_pi?(u='version="1.0"',t.docencoding&&(u+=' encoding="'+t.docencoding+'"'),7!==s.type&&(s=new i("xml",7),o.insert(s,o.firstChild,!0)),s.value=u):s&&7===s.type&&s.remove(),s=o.getAll("#doctype")[0],t.doctype?(s||(s=new i("#doctype",10),t.xml_pi?o.insert(s,o.firstChild):g(s)),s.value=t.doctype.substring(9,t.doctype.length-1)):s&&s.remove(),s=null,n.each(o.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(s=e)}),t.docencoding?(s||((s=new i("meta",1)).attr("http-equiv","Content-Type"),s.shortEnded=!0,g(s)),s.attr("content","text/html; charset="+t.docencoding)):s&&s.remove(),s=o.getAll("title")[0],t.title?(s?s.empty():g(s=new i("title",1)),s.append(new i("#text",3)).value=t.title):s&&s.remove(),n.each("keywords,description,author,copyright,robots".split(","),function(e){var n,l,r=o.getAll("meta"),a=t[e];for(n=0;n"))},v=function(e,t){var l=p(e,t.get());e.windowManager.open({title:"Document properties",data:l,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(i){var r=y(e,n.extend(l,i.data),t.get());t.set(r)}})},_=function(e,t){e.addCommand("mceFullPageProperties",function(){v(e,t)})},b=function(e,t){return n.each(e,function(e){t=t.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),t},x=function(e){return e.replace(//g,function(e,t){return unescape(t)})},k=n.each,C=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},A=function(e){var t,n="",l="";if(a(e)){var i=c(e);n+='\n'}return n+=g(e),n+="\n\n\n",(t=f(e))&&(n+=""+t+"\n"),(t=c(e))&&(n+='\n'),(t=s(e))&&(l+="font-family: "+t+";"),(t=u(e))&&(l+="font-size: "+t+";"),(t=d(e))&&(l+="color: "+t+";"),n+="\n\n"},w=function(e,t,l){e.on("BeforeSetContent",function(i){!function(e,t,l,i){var r,a,c,s,u,d="",f=e.dom;if(!(i.selection||(c=b(e.settings.protect,i.content),"raw"===i.format&&t.get()||i.source_view&&o(e)))){0!==c.length||i.source_view||(c=n.trim(t.get())+"\n"+n.trim(c)+"\n"+n.trim(l.get())),-1!==(r=(c=c.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",r),t.set(C(c.substring(0,r+1))),-1===(a=c.indexOf("\n")),s=h(t.get()),k(s.getAll("style"),function(e){e.firstChild&&(d+=e.firstChild.value)}),(u=s.getAll("body")[0])&&f.setAttribs(e.getBody(),{style:u.attr("style")||"",dir:u.attr("dir")||"",vLink:u.attr("vlink")||"",link:u.attr("link")||"",aLink:u.attr("alink")||""}),f.remove("fullpage_styles");var g=e.getDoc().getElementsByTagName("head")[0];d&&(f.add(g,"style",{id:"fullpage_styles"},d),(u=f.get("fullpage_styles")).styleSheet&&(u.styleSheet.cssText=d));var m={};n.each(g.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),n.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||f.add(g,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),n.each(m,function(e){e.parentNode.removeChild(e)})}}(e,t,l,i)}),e.on("GetContent",function(i){var r,a,c,s;r=e,a=t.get(),c=l.get(),(s=i).selection||s.source_view&&o(r)||(s.content=x(n.trim(a)+"\n"+n.trim(s.content)+"\n"+n.trim(c)))})},P=function(e){e.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),e.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"})};t.add("fullpage",function(t){var n=e(""),l=e("");_(t,n),P(t),w(t,n,l)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/fullscreen/plugin.min.js b/public/libs/tinymce/plugins/fullscreen/plugin.min.js index 3db217657..cd8feb7c3 100644 --- a/public/libs/tinymce/plugins/fullscreen/plugin.min.js +++ b/public/libs/tinymce/plugins/fullscreen/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i*?%_#SM)QlQv9ofJF*6DwEO@qGX zfPA~xoSA+MDd8U>mB)i?C}WSyrkY{{Nc16D27Qnk~^dQWsz>25;EhfTcOh06VW~fcfjIGO%i?mTJjd9j~$P z*-{0Y0(CL&U3!xbuuxfE<3`-0j~7>3HDJk&PJ4|5J{fq`fK^MiGzGA#Z%jQ`uF&TC zM%)=?)@~a5=E&&!F83TB^B$z$*J(DXWo!it5AAMkBH8TevrE ze&%tk<9N7;(EwVp%qPsqF~l0Md{<#z&)Q$)vRhcgy5YcqRZF#0OUI(DY&TFY-)09^ zWAzQ0H*)XME!mSe*2OnGT1I?_K?`?>?fyblM+&q`0M=U*#}|8+Ic4tHq#$dT@J;+E zR3ogx6fK$aBQ;FI*VtM##uk02IA^TYtdD#!#=^0>Z6EsMueuvp7fnB3fZ9@kRmKNa zQUz})7^l>P24@C$@%+?dWPrDM%`C=e#(73%KXW)ki!m}6C@03rc==o7`nLg5Pn-P;)Lk|if3eE)ck zVZ)j1I)8JWTXT7^aVCMm6W-=~ixrA5*_{M~>hc->jo zxbDISvVAlDazj!Mp6a6ABG)+t>`!!g(t>j#EdPS36UfhOQUE?51~ezm{}h$tyG(Tz^(1nt6>vO1`9iw0p74pLG0-j(5EI&*>xJ?jhW&vD-%NM!vp+PjCREnJ<8a7?WBPi=9&D+{{rp4Hwx z@}c(b{7>4t^Vha@5C642IdY|rKT!D(wXNR#5Z5p<^02CK=elFf=BKqKhv%xkUnyTl zeacsW^H}=+&;PR8;?2t;yVr)Yg3EU$k`%UqjoveznejqrNn@ zb&b4k(aIq&47^I(H$~|_|JUpNliR!U&u;4(`MlcuDQ&9{e^L8av?p^v@6h$u?)-BS zt8YKmZJ&A$IX7@xL*@mA9l-w3npF{4g`w4idq_Z~DXl?V%FhR-4rypv-+1kaAWuOz z$5>EOMD}yk-@A0(0!PP`@A0CAdt_W=UAs@`gI;6$5mxoIIjc_bYBGw@A4zw0c;mSKV>l8$jiGm)z*1_`GH(>l#p1neCeUe*m`dXB}2I zDtjfWnz8VsL(H9(Kj4juSgMuf1?9rr%um0B>mU1N;XBjXo%^(mX0!6`GNK_J-^}&a zRrg#ZuzXK{4_&c-yMJYRx1UJu@~^b4zpq%o!`Jze#yT+kT6_5x!~{*@~G zALUVd-s($OeH&Dt`qG{pPPBIAp6!g9;W_%L-h_Q`_{IN!~MHs%_iEv zL*+XKlb00%anTe8U2AIVMVi|N)xBPD8cR&lhs1`Rv_GyNh7IaN)1q}lp4*2*CW1W@ z+wejb*h^DZ#i2C~_mD4s(|(|J2=9uS0zqL2+<9WnfC6(ucGmMIlzlRAckfdkfB-gA zIJQez7fWBy4k1~}^LpU3KVVId_C8q8?*{t3#>2W<;XTH6j~DdTt6zn-0H= z{4?9S@?TY*o36_2@fWS#O8voDwp-iQKKE%`_c!~L*E#u5Qaw*_)nd8stibbeHnyo|GL@vLTm??t+V6gcyVCnv#-Q!4k0qJJlON~uya)9+QfR#>plfRl{@L=v{ ztL{984sbMYZPN=I8$*#xsXILi6oD2hOp0iQ>bnA!q+^$kIqMJLWA_#q>3r2}!Pwez z$NXTqsH*=~#z&T-ybG7qfloPUZycWL`o34_^LF~9dOywe7pQ$xEi#B`pp?dBEPHT` zPy*L(oZ#9xhNj~V-RlipxJ9@z%2`2Wg8MuNkT5d2JD2V?FyB7`_wl*`-={8RV8HoS zJ)3On&Rwf#7fE&e4Fx1P7}WN(>-^e{zTetC{99MK6;qW4HMzG>QynP)3>+DopkQ@x zW_)UUvButxn$zFQQC6M3TdaSyJAO_7IOp3m?oXGhbPOuLTYmS2s{dMprRo?3j0x*Q zS8koIEf$nIIcgr(a$Ws2r8UZPS7*n3T=B%ZtruGT2h9zPG-O`{tQ6s{rVwUN*blopZy0#maWO?`x2QC5xwxfj(MQcLzcS7E7aA9Fw^aCA~&HKZS;b~YE(8*Qa~2|5h`#5LOfGrP8|Ik`sk zWX(OmtDm2FkNUgx?OQ=hc&K_%dy9vkrZ z(J~c^tI0Z+0n5~aR7gB9(h0z$;}$`t@N1t0V8h>UOO8CA^%u99->w`wQ-FD%?q35-= z1#^&E)H6JtvTSfXz;2+yDzs)5O})7YtjdNKZjonkTB@I85ojIqNn`k%?GiGsSuHFe z7oF>pBi&tK0Yktf$c?Hk0BNq?4i?l)1+ZY%TzE;HXEO$^-|SCmd(rjJ=7$Ak7r3>{ ztZyi$a=%}=nSf6a-xHBi)ZagFfo4W0!-}DdPyo0is0%3#j`_Bp;a8N>B#X$nP^c&j zQ=qw3i^pH5E@gnhwL3etpj=XY-6NOs4D|)|`W@XvFPuzam;nn&uSQJ;00mk)=B{r| z4!^aW@7coS@H0_e%nQ&&ZQ&jZz~6Is68F~!HZL@f{gfB*cA%Ejulw4&hCf>B0zN7Z zxN7V}f!f-x`Z#V_nA~!{t&u%IZXiaH60B0&z5h{GWx%RTr6mKr%bE;rKVW`a7~ zyKjp+!VIurg?|+jTf7EoVNCy)+Gb89boMuRDm#ySuHo8 zVxLpFYn8-xv7ThRi+~Gv-Rg69NC`in9N!V#UR!sfOd0<->>5CYOI!F471`H?!5#({ zkO>y3cenL!dQv$C!QwhcJ^Mji7#8Dg(O8Nt-_d>FL(5q(wsOR41%2Bsl?7D4XMMNG z@WPr={$l|scVpOq;@b5i=NKrg-bw>kHJ-o!=?33tQ{b;R`;2LE7_f|y5D(U!v|&JB zxBk9+=*b4mO8Q{WwfAg(DvSS8uDI*K^S+LCJ7-Rv8)(WZZpzBsz`mkxVD**O#>Zml z`=E7w5v6r>0?QOuunV{w!x!lHs;f$OKUqUUHCde&)EnM06r_GcIaC&~>&)@d29!nYPN9SVJ;3Fo`QyG#QA9 z?Lsjr7k1a2z5x^qd}V=KpadjiKv!#4FFz1ig+nubFLzUIWCg;T$#Qi!vT*M9Ly-Co zyNbBKs4Fd;&vAiPVY2#x<~)NkDws`xDRTo^v*1_Nlof7<8@k{cX)#&_V5JwhhI6FyN#16EOw(X1R~lEE~Ns-TpeJd=T~B|1ywXE!_9xCT=&KLmRNG% z8B!`4E#%uqz#X04_g>7sAN{oeVQmb&E!b7uLwkfO6zPB2$?8~evwzBhB_rpsJGwyX zZNZY8PvM>ghDr_IN*{qWaBEEwcUJ`Z<<3P`bD_n2>L+GS^Lz`zz14?RL*`{6H*j2A z^lz!Y8(5Be*!TFleQ{c&f)?;U$Y7^Y`B!Z7j`KV#elVEufg+6Zi~Z}7&dW5)I)tN zSZfFIgRWXBCAo{qC^Q!HgWbZ-sGa{+9{Dx_*LD;q*i8(#R~2X#QDB<0w*V5>>@;>< zwr_C#dwRtNg>@jAHh^O=)~^L~I~u6iH&Hv(eM|M-z{)}%2z&%uC@nxh zT$2l}qZU}iVX-sV%$#JFy1R~*zjAcfX#(L!+NU4Hlo500ma%b2)qOBfSGx<5`RSk7 zcZ*zPvHjB)%HV}V8A2%(hXtqzY{ZrMXjzIV48X43&jSFCv4({)n`=}FAOK)cA9-hc zPwuI9Z}Gs;nF?DN#CXZ@eCc-@Y|8USSHLIRQ9ZlS5CL3R55+ zPW9W4Wi{MFKcuWOJ25VE1BtUL!wo#P@=V<&Kd4+EtYiKQ=fp>^~EE8_sW3m z!{orq#S1PRfWe)~zpD~pnel3U=Q}}t6D$%d9_v-6h$;aVFDCB;R(`ht_>8?UTb+L_ zfv%`8+SI*780=G&!chG?YLfA?@ZP$5=v}E$JxY^!?+BVWQRHW*KelE+v&CJi6n#UnREI`mS%c-#_Bt_s;la1rO@bRAUCA+ zM*opO3n#4;r?nGS;e*y>1uS*AUsDOd;(sppxy=EryQvys_t;HP_nq|0w*KIZ(`Q#` zHhz`+!eUC1P=*MAwNU~z^FJyBuwWa<8DIe<1fP}zSi<e^o`86;C(U z46K=!{(e+5u#!&(`ikn)l5t`l4&=&7?AAdpXiYA_${1j2%vAY+rM{_o23X_{zT}Wq z1AyfNP;LF<4+_BTfGu&&GM>3!pI+bTS$l;tO!q?>ikpO*4+vo4wEl4!fCbyAC}1^p z6bCGE=zkqkkSKj(u!P+mI$HU5cK;|_BW)?>G(bY&E$KXjH}G2N#wsZH6~KaBmIYQa zk-kLi4im~M3lO>x*$iaz=+e44=3At-$`7!a_feXhuUY&gNtxJJQd`UVj0##L-7=wG zIsjTdhgJ%-VuodawX!(F@*Xk*SU0O#N|gLAobN8EF=i()c(a8vV0yZt3=+6U#WoI-6tP;VBWowdL-Oz=a8OE$;4GUJz#G_)s z2g$NWG=U#1ra_d(1Y`f&BeMh2UpBrdpvCgN#c2ru0$MnHebAZ|3~S^8D1y$ zNFNp*w4%w3#ekJA4p_FbIJN7A@;_M1{(8*4l;3fMNGKESI_Qb0cS9MX0v36H)c{!T zB)xdv!>^Ukv(&iKz|lM0K1S<7O8FP=p*r0+P_1G7DY@uBs8$kU2`+TaKsU~c3)}Y+ zE0q0B|3v!wsjT$;nD>#|f2GO(a{gapR=PK~1kidA5LD12;`+$pKns8`|$ zTobo><^RfO8g6ii#Ybrn>#r@?)RL;%x75b@=%?8KFfy}ZWoAm<-k}RHtLR{*lS&)= zSJdpXF=+pcJ-T_g_}vz#g-N1;j7Jm&E$43lq;$}VO+t4(vful7Ao3s#*lu0-9J{Vi zNr*lNsxoY)%BXw%L}gf(XGa)?COvQGyj+i+Z{!04A53DWdt`>CV|UepR$GahT{6B;*aOpQsfAlg>qhDuf{aE&6u|OvJ z!dFqRswAcr1D1|W7j$}lVGoVaJj|S`{asSCS13bw@lb|{aah&DumA!#eFv5m*1_5Z zXdP|Q>E-ycEP1-6YyAfS3Q~heZWd5paS_!&opFf&>hF&xkq6~%ZsqfGfYVd`xlBt< z7kH&|X*4siKJzu9;cn=HGOOrd#eSwID910+mSG}|M58$o zTCmEaU4NC_lk=H8_*&FNS^M&7nb(%Ex)}Sgyx$2vP1%1n$7zY@C1I(e?%psraYY!) zaGDp&Fo8`%*oBQT+12-Ht4!LY5%yMP6tj(MEwQwVCLL$Hs1Hy72zH3lP`w3@+I5o@ zEkM>o04a&&`Vcs*RM29~cF!c3_YW#yu}w=Y&nLfdcxHtb-2k)dDG98c3C0ijBdX-W ziN%_NY8LgO@r#XdP?xkOz`?4YYzN?7HqFUpRf)vt)8#if9BeXzJ@)f?QT? z5|#&8j@eCK>Tw$RzMJ2mw3WQaOdK?nVG;lq_ty56@6OappIb>WVzrKQyEVJmcewMq zl}}+$azCyPnNxNX;}GUF$G?XI^}FVau3;F^N!t^GOy7T8pBErE6fxp^_H*(Fzl8}H zu0V#0J4lcf$a%}|uZ5g4qF?=#-E+{35 z*LB2W9%`zHw(fQGO~P%+ywZySt8#SpVyCh$KeDyPQy0Gl^AmO9avkx+h*1?2&@eR~0GG)P5TG(#Lb1Ep zB#d_awXiH64%~aHYy>R2cqqe!4QpV6`)V~f#swUfUXJ-D{wykgh9#D>b4VbLa&GEv zp$?63gh`xfsKVyvRR3p+U5jgW%DFFw?Gf=#1N2lJ^~bXo4_#Cc)}-n|H>&^zKxyhh z=X$w}o*C#cD}H2V^2le?EqJdAR|88PFJ*!)xmy8?wwWkvwEmF2svua!CZWf&h_&N* zTP+O#2bsvB48`hUReF_h_9z3E3tEY;{43BrWP;<*N>GuJH5sJkxhYe^|zEctkE zLMRovGGeDf`TX2H0IsS)Z&z)?Uh2u)d560PY}Cbf1YEZQdadezk|gbeNGqB-?~!*Q zdB!y*JG0-BaUB6mBw`+47}v}3yia!Kk1rxB8^%I8%xb5afV(gQb)sfqFt(C2DF91B z2)#e#wycD(JmCSWMMPJ-`;7!(vAnO0j&|?90G3SlMWH#rnDKTGEu@;s!CfUSIT*4@eG=z#!M@ttqw(_9xt1|2(V7Wr7+nFd$ow*;D16aty(;p@bAef|F zaT$Om<2nbXL4q@SgQUC^0}jq%=An$^bQqSd-0h)J?;Y?8m3(rWP=!XZ8U};u2Eb@i z@h+}`zonlWk{#<`?*mdq(E1~x2!I}d3EQ%M8Jh~q_5)}p;%b_V1j1qhVus55U%CAc z8nA~@ruwXOf@JpSs$lTs4bmZ|rr%_fbiA2_w2GO8dVQ~{>v|3)d(qdk+T_T$<3AY* zuo|QyK}YQoy@i@X?kfbox&4>CGD;;*isxa*)*ki{X-fgvu~^{j!>cNBFL)h*!Zp?& znFFxqRuHfvw2upH#V$}2CEP2PAY5WbNdy z7RG1~qe8LOPGpkg2ep$QE`SAaQG*>}OcMyOrTZzx6W=>ve^zfdW><0ZFYd zoiqz5%R6FVrkM;MoUw@TV2n8gHxmJ>(iRwQL>U9j=Z!juj`ff}I>RJCmk z02K@p(^J|Vn5}l5$|j4)lZiv~7eufFR+taG2f!R*%){|x5v&Jj!L(e^nowa4dOgUi z!>l~8>cXV4{i@EyEe0;*aZ~n0#agXdhB~w-Fj2Xb6Fwh<{-XasBJ{^Tur0p^dm`2U zYN{y6>fyH&Qml}8tz>Hb7b!oSyrchlzKK~*<%hww9R za6G_c6F;iXVx?=sTjF$7*|f+aAUI=%HQhm}*;lBfI8Qi_b|Z=kXu-hDJX|9`q5!ns z%OoCGsX5pCsW}nNz&oD>SQ)cY&`M1?WcdrnkXb#BHsZ(XzGFRpCwKLe_)mivtOEmv ze`*D5ls(Q~D|w9-@2||wjem*|i#0-}m4_TdX+ViHx28V*Vcxq{4*VYo#qBhRa;GsZ z11%qlXFvlK$ILWt4`qhv~a|` zpjAEPWqb#FX09%qV+I0NZRE6#B3Q+nQvw-nOKGa)gU8@H8xD2R3}PSTU7>DXG;xbh_`t2eOdi_#MQ&cmE0mQD?kab0;H5#@p?0f!jl86$n{bQrJ-`QG&jwn zrP-hN>_5`ui~PBcg(7juj{f&Hr#5_8#5Ui-xcBj-@fL$t_x>7Gx+^-JgIxtNZK$y$6L&_ z>H(|h=HW<#Rreg%45Ypl#rY-+SlRoT?GL_+`q+t7@B7^J4S&BDQAm*t`acO6953~v z4wdZxFOM{6l~&p%_ZBK-YIVvr2qUQINe?X!$G(6-{$~_Xqm~g8QWS&>>LsBI zw`faE)WU86A?73{aObKSN+p0|rYa3~=O53pe$E;DYVD{uQxHz;DJ?UGW#^;~Xa3r` z*pL1F^ZDgdXzq6r_NkUF1}zb1nBkd+YXGegWj2n_3WvHzuIp-G=4z@?Ocn<_0H91{ zDsoL)zBZ@^N%1=BCCzFpU>0iuxV~?)50xsZp`teqyfnRUF8My3QgGhpOIU(3;Ux zXH08kLCXcJheEJ|Sy2O=KvOBB^WJm$e*BerhDlJnsFFW=GmB=;MQ1LzoU*&<$5Ffu zAhNQ!N!7E%oDv3hm(~;C3b0v2VMbWlPO54OtNDkHc}QV`D;D-W7ZHP|PGM}F{XcAI z%YFdn;``K4G)7E;x=k{++5z)bj&EwqepWvFUQjzJ-Typa@RK5OVP(smjB6E6_z-v> zc|FHbm<~};8<)NM0G8-}=otywFFaT7`%UdZ0la6sU?lfv3d%B!b5`5>=ezgVzzcRZ zv%T+Cw2S9GEYj*#`B02OOTZ%pt!V>HYjy1bOI}}5^HBR?Dcl7sWms2mo^b(I9-v%x zX8}RVSpp*I#`eBX*$yC1FXOqeirH5TS}5;m zZrFf%2xuADRLl&l%iN+4_H7DQmk}jBUcky{BRs7El$-8FCaL$Q{(gSVBHkATGMWd7 zuny^evHE$o0wU_e+9?c+$r%Ec)FM|=%%XrLeE?XuGfCZRuyZknWGdePfY31203FOs z{VW8LR9Huy4d!KXU1*V}Ky~RE=Ho}S@lMICt>S_ZTrcwfnF#lEaP=JL=2mp2D zF7wZ0W0UU=Ws++@56BARR8(KYB>XJ(&M`w(C1sO<^LzA|4%-LfmVLe< zbfQ4^Hz+hd-M*98^fWS0l;;oU_Iih^~Ynv=G8IG0D zuM!~my(<=g??*mA7cenhJkO+LpMOc;_hMerm{`OwVP?62g}I37Xl7#*4ad7GvB*UK zl}$!heyVZ7`q#;IZ&n+-DS>Xh9=kdAh|4YC{`^qK|4D~iZR!qPgK+6BdB-l~0 z;rbLymow8+R;ae697w@ z!20Xf6bcAiBGDx8dBQUZP76(vY}4)ez%07QbwVRge$##7DqvCozy%Z+w3<6My#z*s zQ@OD%_Ys5vaCnT+bEem$#m(@SAb03EN0gtG7TD+^DVIhQ!Q z5Qynl#Z%KPLdY0y!ch;9H3LKnyqI?u-eA|nJ>|MsQ8iN(rQ}P~1DbyK!3?il9x%UK z?S2>Hu!e~QTGYVGObtQHF%PFj11&Z0RDUmXvttJG+RS&w!D?Lku-1sFB!GiHTDvY=?aTz{bw}PZ27`VJ*z>2V!>p41XG+151LH z&1}oQ35GR09Vq{<0f>EuVm>q23*!l$?Ac?{unT-xp?K&zxmPcAvDWzC@SN`X3WLf>upk`ae_|b)?c)yG*N?&kC?oMzvkRDp4(965i#Z6(a#!ozR|USm66wz5;#`0W4fcT2 zFlN#)L-v`2-+w~-V;sA2e9QPQLa3C_tqJHh$>+_m6JA+KQy73?{Q*ipL<7bq{obvB)X!M$KHy7) z6`O)Gp%hJ>09wqjCNgM+3Mn(v|5ni2rJ)a=dFYsdfK^@QCIc(g4Q!|;u<`+m$;PB; zMwZ+ItOk)E52eI&eXs#Q3$S8>3z+>I-wMn{CD)aWc(GWi+;8b$lZ3 zgu6C4pTuJ&+H!`=Qh9$cCZ)!REunv1O`LyCSK;Zg(|t1J9!_&XYo$2O zGpj<-!u$&(m@xwZtI!ODS*>L?aAq;EswR^Vr?xJ;`zGPh`d!yRBzG!*`jz4G{sZdx zT}?kWQCvS0EJ6BT$3$0Olpn6JOIPh~R6o&AFyr`)NljDcw8x0rFCBNE*HmKD19Y5ETf4Vz*0svv(2Fl6EN+Hg6Wk5w47CtNu zd05G3@^?MgB>i#y_nWic-B^W`v1D-AV?OeK2*%%@{T#ug%Fvc4<~{UcF|p4FzyLP> zHx`>V(E~4ab_Rx1Bp426YUxhs$mK~V3DSSqul_D^c0wf1($Lj#ub8E zK9AqXWpZx7Dq#yS4PEhE(mcQayA6x7H84X!fuK;C?0mPz{6WNN!TJ=4_Jna(`EJ4| z070VviIHL~8i&R8UTKl;!Ui`GAWEOfJMMm-AI%P6;h4v%55T})NyQNcxeU+&v;cnM zwy3Mcc(hW*GR!^pA;yXv%5%FOcsid0;*3?U=Ubek<*wc-JTw3-{94?@*q=4wK}!WR z>$?Am5)MpDivcdHncn>&0jnz!sQ|1*0tyCpz7JMa3|LuZ2|J0(#^l3y0*Hz8n!j(u z0qn&zU3X;|^3ZE>OH2?Su!uQ=T@?c?fJvA9uTyj92l!^1oc;B6C%^!p`hFT?bC|0# zo||xr!#DsgLNKHeg}xcHOs{WKgD{m~vbV4QASPjW&ipz7k~Xecqw2Te69WhU4~=wR zitj2k+466vU;I;?XE26!aYyfaNxR|PJQ!@Bq%-#Sx`2h*2+#nWpERsd9h7GNds&-R#A)t4@�x8a_6hzULJ1Og=3n8m7@LHN&c08QS_81L zvgm@D&)@(=nRrWaOlvOT9&0cP^BpCGAq0KT&%X_Sm6~d4!`8Km0s_PAV`C^~AOC+ZJL zytniD!W=a3`n|rK@l4Jw_GuxKid^|*7Sy!KbJeoKvq%x4kX)2iD7Q`)CW0Dl#+WcZ;lk1g7~x)@5l#haTG=YiN{ z1+7v|j$%)I0IFF1^5Xkd?piKryO&kc?-KvT0s-fZbqC|E*!F)?_)<-9H<)4o0000< KMNUMnLSTZ+CVU?N literal 23101 zcmY(q1ymftvoE~3y9Eu9;O_1Y3v6)r#oZ;?VgZ7?OK{8L?!kiucXti$@bbU+e)oHC z&Y79&>guYlK6B3es=F!@q#}obN`eXi05BBfrPTlc80LR85E=2`bKxy2>)#9BNadoe}$*QPX=S5pQ6d}#rIpiltd=^rcT5CHIC2LO&u006;s0D#CjyX}kczYY{< zd0jUE01fXyHw+*%`@=sAx;7d*?mEgqL31YuR#OWnGcc>SgY!RW06^GV@E_>_b~mN; zcCdGJ6Z96L{x1o^fAoLYY}AzhCE{);Lan0=qLgxS1yk~{ae=R0Rc94PBubV~-j8b}c?xPA3Lr`Bam&`tT_gZ{5<;ZxO z;nhk{^{HYW5$wn;Oc;JyMjGTTd^>A^Sq3JuFj(6ZZ^a}rE1ZwHTZ}EPIZb`@IjKp& zlOMwDClaYCMZl~l1Ys^+A=0Gu%sP!e{Zvd?Z1*p9c==LMMFut2utKTAZL9~LSlK$} z30XM3F)O87`K|hdc{UD#YXU*kiweclf_x@Nyfh$py1>+`^}8cECtsOWiw{CMx!ocx z&fbkdp7Ml5_z?W$+i9CDm1gE0o24XU<{^^64X0&4Urp!3Jep_?$Sh`xi~M|UmGtU5A-d5CSbT5g6fY|h+pi+h~~&*)p9=XO!y&FW1<57h>2hSl+8 z{i60ykK*7tx4L~6-X9oLm_oW*ZyJKHogcRcDZUz8C`NCHZ;26T6KJNoBy~!`F>vlM zpgxXCT?knjr{u7E2l(NzR$+&{Bb+83GS~&z$EX%HPNiOZ+CgsW?B1c zG~FOP!Y!{8RxSO&JHq)haqSHc#sGVy)cfZSodvQhpD!>Z-8%^JUU!{moq86}Oog*a$1Muj?UX zwrD1B@7#=3T5!rBt%}MXYVd$qltHcAM0{yDJYTEVDwll-P1b>)tb6IHA|&h!J=1y6)XlZX&kcdOXY5u7G_X>lJ zFR}N=9H#}BaJF#!d!_~4v&s@XCVnq2)VDQNA?4GUcrR;BHrETWO-Hd}^k?-p%N#(H zC|}jb3i?sBx-qxVly4bz6%2_9Erh0lOo&)%XCYTx#iav+n7Xt|2Cse|In*NjYH60N z>Pr0sYzmI=x&}1KEcK(wjp|KXNxPj~zrQ`_? zMxLY@NNk{G>0s0Z%>ANe8RVhTxI#Uq#`WkHG;UzI!1axPX*Ow--EkGYxJ|E)@vhw5 z*Y`QKKuFK*Poa#h!icwk`Z_QWr^`nn^0RhYf&CTCO%5h1Df~xn$Bd$H!aZz_j$BGc z4f1L_;d|gj;$*B_4kcdfSd%%Y(eUtT(v9Z)CX?Xl>1XA&2l79dr;A5i-kd6VHl*QH ztFhBrZ|1jIZN2oJHqn}bXPtSA4iPXnGWiW4;)Z^u;^wc`w^>~yj5%$lRvV-nthFZ( z#IIl>SGA+>KNJ<8_)dVUaF{C;jRy}x3r)l>L2%M_+x*D9y~X5>(KKv^qn^X-9=u=u z81S4Q?JoRj1Lq?iuQQMQtzMDCbE>iWxz^vVj#FXJ*^>O%lQ2TntXo;>nPiM0DPkZk z1zu1hQ^h{|b5?#8p_O<5giuFbO|OEwli8+A4Ma&Px|-jxy`VWkao1xiV*`WlJNNTs z$E96^xKLn>W-N1`6J1yHyY#8c(q2C`e2c)?syV}Gm>%$L*j-6LQJAU>H(YLD{Os0} zXJx?APU+mOKOA=|*HQGO1b@T-{_pWTm%&wKeiHiE``7hwGVLm9@l*|wy6YM|yU(7v zpEW`FFO-u+QMsn&SJq?Pap4dJ(NszTgRCB3vok4Q<3H7N7Ar~Rin!%<0|X8XbVWiY z1HJ{plXZ05G_?m41%7Qn@)FKnlO&d#=pb80nTk|)^fV=ph?|n??l(mdNbOJkXkJ}` z%aUc-{$FKU7E2Cxo>B{N}@1de1EJxDEG;uos~GU6YRw(&>g&z z22jE~^tg{ocH5Kt#&Y5XlPiMXMl*%gn`Egrk~T$vg8_J2mHmL-agtr@z z3+RMh_`GJeuXHFF8~^-w2H~{gmjRU}Z<$9i^E3-MB;baQrOrIAe3%>ihc84_^(4kT zc8fD-kQ8+dqy|S=zp^nl$r7F(Me$dOYx-22cip*D({2fnn%)C>VNprGkwxv9JnE2< z6xPA!x6KfGdV#0L&5Nin7+B9@WJvEu>}-PT(HG&A(mtMjf~ROLWmh#@`X8KoZk-;1 z+UFa8BIUjXo9mKth_bEvPkxKf7hR$qxd7~~vPp2=5)`FGbih7fs%o!^Y@?Q_|B^Nhady?6}I^`f2pKske|< zL!6S{?s}n${h-oe_iHXX{4GzxJo;Vme%!FLc9DyGFLU?K+mE3FaRgp(fC2H?h9n$6 zPUbja!7V7Yoi5MdhQb)>k_Ckmo;~6=tGnb*cns>;bHdfp6*TDSI&FUKg0LW+7AN;9 zrp14WyV_V;w0MEBMDB0z^LMz^i+c|V5M8gU<3?i9ke24hQu*Wi1mu-X@7@h%b;Crlr;MBO`#;kti=dQS>PWUr{-#b`kRczNl z0b%p2B(p#4#|%!=Qfz&~uW4f{b-i4jEb1=KNdzd_6k9>(VTgXM>w(AZd*L)9OiVR| zP-<`rhE6S@=rcgC{etW=mr?0J|ME};omK{u-Pdal5dKng+Qc_Vse7V087)e%Te-pK5a6}AzEwH&rM|XU$#v05Xp1rd>K;}a1ScrO~;2hRRGmV+*o?v@mlQWA3%waz`+m#Ll+fiZ#5dPk`pl~&C}WmF8A zTTk9_>J<9l!aw10GZ{MGBj<_Tr^!khhCRHGxz?it)9#PXxnP;q1eJII-&96X#~a{T zQqp)x(~ZmyL{apFEV1ZrookBZnDoWRuI+{gYKSBdcoK5#`xKt)JM>VTwNk5=^o|aH zpmrrZ)OI%weh63SluFkiL;1*yp#4pY!4|uut~&A~;y21>t~n;hR%Bc%R+ISKUpf_n zu%}Hntwv#e=V{eC^_YK?p)D{ZY_&>?((64=IO4|)4UdX99V9_HQF)@on(lkJ4z`daxz6c7v>po;g03v=8gTUZt;UR24R_iJlldUM;kR*By@y+G}3UBg4q z6P+tsQ~+ua*N=qwU9{cAL|c_#)RhVIT>m~-loun#U*_+F+X=gu%SQ@Pg^$-!5I604 z;omomjEv}NjvbSS;+m{_4LVfd+eLjpIllRYu7o6GXFLF(7_Kd+hH{d;VF7DQ*;xDV zv%svmgfNNT_mge_p^$=%FUUAFjXfL~==c^^V$;PD2(FGtLPBu%d=Wur+@tUR^iw+p zV4sWl@QRbvn`X8ZA6xhBi8y>6**O5|?9o7&B*4JH{7>`I#pNT&g8*zjs|loj%kDth zuded<{j;J>1N1VUvJEjICOr@r3DGg^wOX#o}i39(Fyz~gg9ntb7>tv^YsiTJHIPo152lm4yicv(AzOYg9z>fnSo!r5bDra+6 z6A>yUkcd>j2`06^b9GglD)cuzKV2ovZ5yfksN;8MHh4P370{oZ3j6XeBP=IH@39sX5Q_fg%9nno zkP%NZ6h<$(T)QCL=$vrxg`j1jwJ14c$uA)O(!oNENp#cz=ZT13b5eCq7W9TV3m+^( zoZKXl)^|Hu(w#)1sYyldKs=up30pbyPnymCPJ?WHUe)Ze>21Zc&}{;MTJq9f8t#^& zCTFfEWYXOc{!6gqM?4MU<)t?$ zsvnNv^bSDQ*iFh|cJC502huFM7wlt(AMA3JjuvaJGl&&D!bXm3b$0r=HY=C0wXc*g z>zyaIiOMr8qnXA8z;b;(6m5Y%`Jqm!Tq%uj5w<{`I z4JqOfO$-o@16W6)?i-w-F3k;)n+7u>1JcQh2;jh4EoWmo9Uyq zj}Q?*WG{byOHXx6MWO9Fb9ER9?E_vj_f&*oG*l^3vOS&zfVG~PRMkp&Hp653mFIjV z)DWzR^IJ632j%W)#+Am5OK>npGV>;OMOI=}rx z!6Z+hee@ZBme!5gdq>H*wve(2Zh+pS5!3Qtc0$Pj>xj?A4ys1Q>gxg+`h-SSM9FKS z2(z0fns26ice}Xo$Y8>@k^}nlq}OOOz|!73&&>pG1>XXAP^vqa`PvE-Bp8BeKdAwd zt^ZL#OAbdejLC6V5miKvq_fX9oMogII{-lZG27+iZGiN);a{_ya-? zcQ?eOsoS-CRV(9kN+)2mKH8?wljbP|h=u)%a8yXYpMf`+%Ira(e#4y&gC4aH3-X_Y zCDR00hvp+F?nx!@m5i82)rY?gY0YIrbX|FMW`4?Ml5!X;D5^LHJo z<3(AHQ9hm~!^|26f}(!HyI!lJ^UTW#cLiZlYG6=3kDu4d#PL^A?=&0?%MKyVzhaxX zN386eAmpPVxuU(~doN_wom4Rm?#}UZ*4FS5cZXq|a`}t&C?446!)c`-w4qe# zP(+CQVkBU6r_f1Zgb>iTP3G*U?jB_tZVBi@p(eU^X!1g8$2bHJg$7P3DJ5F+fY1 zExpdK3Qnsk`k~-d#ZdaKj8p=$x9!zo2E2@lG>;mT=~oWCd4eOEZUhjfip9IVz7Y8R z1W&|bl3aw?lO_jiS2euR&~^Wn4#o0=Nw3v;5K;dZ#(FDW=Ame*5XU>|`JwJ<4*1A1 zI!>n-BCSPv3ijC6FXTx{2zP(U`sM2)BFkXz_8p;=jLAw?rQ#~mw>BAFJ;9sb9351bugeBaND66BoB7vLdyhbGx^cGhEIY;+gag2+8%}!5$LN?;E)#xjWTO&-U z`WZq_O5*6ad9^Emro9l;{?&c!3Ov?RCnXdH_`*82ZCh3IoFm5flYMm-JN$IyBPLJR zF0uNJG7N4O^Zi3FHXF!3em~KpAWr>btXu{fB63#Hdz^SMEvVE^!bS$f_K{H5F|WDg z@}owlb6G`i^cTSviOLhln*+jZWvygNxYjvYLyoS1y~Fi(LYC#-^$s6s7hBj~gO#2x zJm5~BuAJb#kEkcUk48yWLTN-$sl$3vHEly$5|tmpSiCpe z-__*KIAnai7%+=@!CKn-Z@wuzJ$s*I;UMUqu(Dhv52drj%X8;x&9+mTuBM4g7=5h^b{sfm1$OlI#^hYfy z1${0|*($i0Qs+xEQbuB(8f&lYe$nqJ$%9z262lyoH)Y8D#1dV#w#9vGA`YD2VZDUX z^*CZNk8+W>caRnx(?-~)uds|GC2tYYDenABb?=WtNZV-9%aReVhB;vBtM9=kqr5Po zd7X)#3rIv%J!LS`+Tu?-ZQog|+oI$5NUIN+XmBVB*Y^>>CDGN&{~pFZTdJiLyeE6L zxCc;_F`{rXk8|#vyo{fxol&QPizG*C`-lxL`_D2XKV5GSh=McvqrGeb<*%lWw7xQg z?$2ee^y4cJCpy<^seD*@hU;R3^B6dJBWs>yM_-%{6h{mL8;-;fa0kTvfu!^W8MWc# zBL_jEetu9`z@f(hoKk8aTG)*?cdO~BR)mZ9HVB>||0-(ufK~SQIy|#&T<2*?uf5%o z33+H|zh=>odV_p{n^RY7fd{)z3TEM(OEF&VKd5LwA_!w`6OHygsru6tZUOTx}(KuKxz;t<;PDwjBrG$K#6DTVq88rO&~_L?YR~^1UrjR^v>zkR zH44Y!Df9x_UIQKBl|z&SQ-L*~TZ5KY>Frluy33rrzJF0=7_?l0(zE8$nj4GOsZMZ z{Zi9kL(xw6<@QqTiMK1##D?!dbA;RurtLnv$;$o`#u`Ck2wFCd3^>aun&G9=qC1z( zYaX1NiOf~(l<~JH{h!L}es+YtWf)-lhliwzBV|nT0yb=rBRo){5fv{uJ2zu2=H&Hm zTvk!e1bdxX1u9VT>|;>X(;qgz8tYEyHId(Z@*ul9hCrz>BQnp$vUrXH+`)eIhf%h}Y=8%(R2}l% z)QZ!C=+(zIdsI*;O$%p@x8^aH0pQ!6*q>ITqCjqWe8%(cec?prfUDt_oe6?bs!vUEBqC&?gx&QMN3 z){~r}Af-V#+=0B)R*^)Gz!~pqjPC{S2LfTz)5VoJ6kd#7#Y}j8PU*e_jDRSr)c&J6 znzLz-F#_T}if~L4x?e1dB`JfuAgYnEdci5Q`j(CFb3G~^>GK5pLk=_LXOx(J$clD7 z%A}KjZV#iQNRzdM(G|x6<=)FllXKj{-?zId8vge3gZ^&yF>DfsUUa^6Gn&4HJezcdX1vm z9?ND(u|rUf5#noQV8liidcBav0J7E}tqSxrHSNPx0NngMK&FV^m42n7IKmBn6O`RI zXbr;}1rRSg<;?zcq7aufE<*biX9F{Okc&K(gp|#0?o)5g{ik+hf4W280bYM|{Ogbk zcy`vTn|cf><>wn{*{2(gGX=oulF7Lmj5>zvZ+n0S1z(^H3%pOsq)8;!uP^SU+j$6c zR!gUG6>~e!ge#mvD7Kh}o-8H^_3Q`YGX(#@SX6Qfc>5;wA5cxTrxf!|3oOJvgUf}} z^TJ%o*F)683d>EEy_<40*y<;IVQUju^4?>i(-D7I}MKMH2NTPmYq!|8jl~c z^>M0j=F)aUvW?7qts{pL(9nG|Wnn2}zQ*Bv?7r5tfngf0il^@xMaUpnCLsst)u&CX zm5n2wJMm!K{Q1)4LMgV7&hOaFis|QluT5#8IT3RAzzU53R6`wGUz?@8PIz(dyKx() zGci8Ztnr@CM(^GO2P7y2f@jsQ!hIq|%NR#@Kw*?Utph^3B`Smq)3tWIkA^Bg!MdS05N(_j3#0LQB_+-;LUy;7b*-V zi&w?3A@xLja+vf-hcVgnZ$D2>i%y{#mE#mZYOusI#F7vmXK}kQ6@yXcu0MqRE;Blp74MMy~kLm&R~K)sl!wAK6WGaxLu zS~^=l&0UGZ%U@xutd}d$BM+Cwf2|ZSN;PX8xhZ}}rw)b{>jgj@aPd!EZI-OGs81t* z6*{tXt4>R_a>7L0O;~w$w4aO;!?a3tO8n-|Nj7Z^(%i5iod~gqR0baq$QuY*pa_f@KS*5dtnF@&{XjNz(n*JGJ$Uh8mpU8S*&^AEJ9SM^wzn86bBRk0EMEj0tVQC^l9vV@Pfoqtwa%FN-uV zogMi_eE_G0h^ESS>@o-WTL7v)GRxRdy|9j{`z*7d?JgW+n>sQSO#8e0GzfQvK8vM6 z82Y{5v@abJheaR4{K*PM=b;7vR5SSmuEd`IBPTnAAjK12XKN<};~%n5)}-rEB+CZa zE4PSp?;XOsg9_>INd(VkTzL4?s3A2ME>cPl#?C+cuwSsXq+rTgegkB6i@kA zQ^2VQAuFu*R;j5v?J7!s#PT!?r~2Vmy5TMs?9V9#8jK-7?j-3>7`{f3T6-dr z{y=KEISfO71IaIc8g`tU?J{rmH&6!B=l8LXFt3ZYn`?&q*YDJ0(^>esAU|V#zkhR& zXudN~8&hZgj-ogZrPJb}@H$HGcxP5R=R2+0b~C@)2Y-%EqZ;AFWT;KhJ**hH@X<@DfB|7#)RCRFg1? zuP~Iy3?NAbC~o_Vf-V?Ki)=SGD>&GwR({Q8BVNy&#l55bD~(B_gY#97A^}eI+Re0h zrTbIKHHTeykb|&4haDZW*Cs6)tOOc-vjsfMK7tUC+CeU_45?w+!B$cl33J0b`@u84 zAvd`&W`T;?o9b8X_p!esAD2j&;}Sg@`mQVzjl6gIJhRK}ZQNwq%*Ira1WvDyoeQAZ zW^Q?g0!=kNJsT&BzCN7XYdedo$mae9PM?0;(;0XfFnkKJ>(^VTHXN%}vMYLrOfx!C zIhUU2e$I*8_@PZf)BnQ!m%4Q+i>>WgCmg|P9%Ghg4Nh`-ciN&~&_*B4+X5(nq7~1! z+4Joh=fDZTRK}VgxCO&RlID?#@%d!;Wti8~@~7S)XNeCdOUY5u29A!vAGOo1crSeA zF!J+5M}_O@Ts7FyVm@RVJSSxReqrmuRPV|wQFz;|6J{fPQYTjSBj-q#YO9I?&ho$&5suW8OfpcK}c9*aA& zO-@QSL9H_tI*td$5%W?$1CfyJ$~w>{(2oS-VgF_QeqO%#@*A-Q*|KElYAs}{<)E=L z)(?f)>->1Rw#2q81OtVsD7030AqELm&Md^|8KoH-TvP?ZsS9R}zz8jPj>@SQlF;S& z#66gQBI@3pXLaB82>q}^Ojb`%PICtOhZ=mE-<7j^CIcQAw=v zy*9wE2_&kumT;@vzEjdE!L2|)1jR+ohE9pvyp`na>UV^-pvSEtaKp;!C5p*=<*tWF z_tNDW+|V{%bRZ{j9)yve{9wOu{S54#T3?9?sjTDxI`kYVa)(6q^@Xd>;dNz>vD60M23v^obrkbb8wMEdX`)X6#qj*YH z#r_1`;OE|j8*vh%3O=?ku0x4q4dr4jDhw!yxvu<6g^~=pI;M9eu})FZ4TM>gs-d`} zDK2h-oAI_Zn>#Jwi<+Z{1{81IQ@|7al?o#9EFWEzU?%zyF54svc}$)xA@b75Q|T0v zj>_T|`Z2I~fT4Y3{yR=?W|^^P&yHIY9-)s*!cZcm7wNTiak&Q&NTfk*UjqBOgI(_K z`7vrX3=Tf3WECS`5X*m=6sM^^`N&OsuEP+9=|@9qP_Pp`71<;!SO{NNMNdhm!A2Ex zb}Jw)OIrgzKK=?oh~dE#7Z3>ic_wl5+!sgX8XQe?(=A^xXlKF~fc$&qS4VJmJ)o$$ zzv{|?8*V3=XN42HYLF!)n~XXKfywTt*4p_6H_z+<6lWD~O0QCmjW; zOG;1A^wq3~Z+8n&X&Nm^W1@Pl0NMI$u$1LT%~fJgPT#lU=%o<@azT#y()_BE@bFth zmRz;+UkI?{1oGkkNT^indw8Zi1qp6FdM&Bu!%MYFWx87bQO9=CZdpWyICW)`HTk@` zKe;AqHQY4&*5dect``_T?&{nnQ>vI_(eAZMx6r3}WL&T)gfNRw(2r=E{sIGLPDKAL zlbKe@c`e$(3Qj4A=_pozq@WEB0SgnWf1PIwlG)!g+bQ-%hSzeTs2 z3g=#1g100qLHUsn8-0lfPSx-&s!CVR?RZ_ch2z z@ScMVHYJgJKHHLjReE*XRK}dR)#L}yh*7Oir9eS72_(DZ50-8`p=7A`H`C+0d7ffq z#wFQsdLW-5%G|qIV*n}a9SE7&$yK2irS6#AI`pJfajzD)U>s0+?Oe0YOSMuloXVrH z=Z(BdRy7%K)X04OA&&o)E%gz;Y~kcDhDd&u322rF`Iu?({pgQ%N^h}^=TFzZQmb2; z&Io%O4kB-MPt=A!hFgqAx?bT+9kLhfaKx`Qx$?qdfphC8bg@UbLH&9OgF!w!ymiOD zb6_$oOV`Q#-jL70ALlq^6&$hivZfN;0I7g>!@3hWdleWp1<&dZ16X9;(W0cigZ-MS zoRlnMesXY6?r9lXWq3CvCG5wVrM2P!{j;-%n(DMDc$2ZvVU56qu%Vn+k8r@No5+?F zwc!abcvV=Ne%76|tSOLPtS-wYD8&Mf%7iVa?IXJ;IZs zN=N^kIArGcuwUE$#}PmKy@GSi)J~mWhYza0zHMkv%N%nl?5$78R08m?IW7!SBv&dM zgKr+-glfSoPN{l^j^NqJJ9W05U8`}y)4f^zk9|Mod*iBxE{%p5!j@Ndl6qAN?&!mlWLN)ABlL4@uRCykv~vTNg&hs0}Cq=|vVFLekeZJ(cLnX2gT7qMUUqM=^*fX-owW??o|(T zri|Df8+k@i;TIy0u=stqtMN*pK^)@;W`-*-A+wv}w|C4%ZGSNCKc*uL#~`2mfi}C7 z2Z}Im*v&FS(O(o-)B1La--{}E57`UuEXYXl!t!6$S`SHJuleOM5&2i>Tqs58md}Ir z7$$<2-m|HrFK9KPSG5D$(MobvSs6d5^l%BCXYUzxlF8zgWP5+fxyRg~>WQNCS`_3} zy&oq>nngd=kInpM!2<6W2-6dW$8<_)%~-|?%snP<)`Vb^DKRqD1dpNr>MrH|h80b{Dp*(?T=@d)@~P6#ikmdyBH23VU>6S~g&Z74J) zb`bL#02<0SR1H3hax0*4f!|gzIk8@wA+oL7i0;fGG8Sz!5xA`-vt{XYPfqxQC<@~~ z&CuBu(a{G*c>lC~34165TV)C4Efkc(5><@z; z3<1oMYXyI&)f-{%7(R0ZbS41?f8Ub(0eAkd!Ilstcs>GR(;X}RJVNrBZ~bjFy|y9^ zm6JqGX^C>*$&+QF`DpzZm$PrB!i9MGuvBppc$B|v-Iwpc!e5*ZqaaIok}@+O@&1O7 zO-U)z5j+;dcxSFq^nz2hpe-6fn(+fYsHOz;gcA@1D^>a*3rNV5Igw6f>BCJ8^ zSCo~&CnGTx>*Xf`tx{BRYHHmpU<>*#FTcnydXq#za)UorT4#|B?qzO-z3jfIUXU5h zg?SD$`q5z{st0egL3D){=g=1j`#%)2L@#!HKg;MH4>HE?R=dgSl(Ef6z7Ja3Kc+^5 z7p0gs$Y}AhX|vU#AhXGfYgAdBa$L>GBRmv$LL&&|5M+%Fz*@i$$!i+x?$-Dh|NJ)7 z2h~V*eB8xL)Q@Ui%o?yrF#2pRHGT{IRtnn{fMaSUgs&RAgvQpUa_r*lWZ)nh{8LMbBQf?5w{10l4# zV9v63!Js|rINA+ejtXZ|NmDGe=yhLM1QQ8M9*2IJGQ<)d{cCa&q2L3hgrmrO`g3;Z z1j-2q91Fvh+0iV^f!2h;)J=K1SY+jZra*7I5aX!W& z=Yfy1u42i*2s2GQxomK&e3jP{NfWjwdtqsNDp(7>ubg3lGbUKl1D}(_}`(40QL~oDal7iKxYbomx%%#04U9X0~81CzivXgZG@a zoZsDCV_3&9pvjkVT+5qjpKd>N%%dXWv34@YZoJhTxmX-2be12Bpi}<#9d-P)*%UK_ zv4kGBg^3HR^93c1`r9(p1s7SLJ&YZpNGhe^M2q;BJOWBmifVX1QA-bC#=aJN z1)*OmmUGXP^_RUce7H%O`kDC+sp2y>x=U8dC!K;S9hcCIBlSHjoTCc5d7d@2rknP^ z?<9+pcz-w%qRdc0R)zevn6wmCz91d_zZgcYHph5rv5XJjE{4O+Si&Mkn~n}#HyBRn zq%^lC&Dt^aa*(XeNGgK{AXdc0S6Rm57kh-YL$Rfap9}Lw6Hl^Lg0<9WVW^JF`Ey^C zOZ=d7B>4K(TR)*I0UTC#=m1ZhKQP~}pQp;5g2CXEx^)z@AdTxOFJ zaFyS~Y5~?p#f9KZ-HsJY0b(Hwh}pbxf*j>5o93B#pf_*d5g2I(z@{AbA&fJwLxU&S(>CDiSD zwE4b2k#9!qVo4kEYW^wtQKA>jSKW)6ta(nHFG$VFQ0aY5qBO_0C~{C_OJ`8of^-s0 z?m=6EwPk5`jOIFc)Iy=6`zv6Sc%)Rr;K1Q3ldR*&bV=)(lgvBjghQZneGg**17SgQq$F3W!=zoTwBL>l@bqIGPh)$8&@nRC_b$vu=PyB|r6~CX zKR!dfw-;!GQT|fN$nhW@dpDv$<01_HWq|((8z=g*uI{Wi>a((s?k97I7pw_XqlGYs zlw6)A61Jp}hPY^?qDfAv_Tc125MOM3;#gb&*DHn(zSuYIW0%IJ)U9VGnZa!gdnou6 zRSn`)Ip6l$_Si06bmnt_8u9t(F%u4Avy4q3*eH@#}e!^Zb>)aAm*9VL(WHR(Fx6q(W` z-Wf#nkIf`Xv#J(g_L6e*;E&r%<(a6k`7QdMF6H?cgch<<-#|-hnF0d zo39WCDZ+7EQDGDPobD;toZ=4Dql;e^;L@|uOQ_Cop!_!Z4;(xv0CP&~G{lRkZ65PA za}9k=1j>WO+)6~Gis76}Zq$WkmB#xv8j9Mh2h?&9;G@^1)Q2O~3J^dZ#MwtED8NSv zY2yAl?X3EW(ZtA1B_I?R8bpT7Kp2NM^$Rp+@vKuWUl0OjZvgMII3=Y-D+8n}EHYs~eeU(2#s*SjP=cNc{ICNFl z0dJPe{_zO@b^#XJ_^tGeR1FkC`RK|52t5pS6G!{2W0`&nKi4E7*XWeGln3Y+M_0?7qSdP&y!p=+ycq)oN_s_Xs4W zSWq&fZ{|@rO$09x3P~c>L;DfmJ}~{zdJ#x(!{KD=MI6jbMR?hYu7LED`q5W@R}TCu z?4UIz?-=rg!r*YjkPbvS^R#0n9m!W%ET}u`WinJ9jR2upjQD}+T{3~ubadD3)2Va) z!&>Q6f>sBHbZ=JgAseaY;Nb!^Bl4n@!m9OQ52eRR*s4*9FETJ%MojY$lcB1eWrF-g zKJR;HlC{2t?yIm0rb4{y#!;_sfrH$?#+}2kq3&^g! z0<_NrS=`tcg?nMFmJS5c%7+>yymoeJ5;J22UiPBSA`=Sm?&w_if)i6#D^qYbTluPs zEINP=HsK#5=2@8VN{cPfC!GQ}YeWE}n|TH(MmO`G#*!oC=!CeX{6|y{E0tM^h)0+m z{2~lwi7d_l$^@-Et^CF}%cZ?;xa8E}O4OJK6=;NwjpvYqAeew77eOcI2pT+P5vZ#i z+Qnk;PSfupml|P4vRc#YdRFo_*H;EsFoo5^?G=BSREwTSs38Y8c zbF30X09<~e{}xDG8KFDczzLp0=+-hRZVn$RC zET?v#+M@1NUR?ef$A(%PfsHF759+0c_+vw`zakS(vYgT^$3~DalSjO4r8~);vh}n7 z?9KmIy}VR8lW}FPKm8T8-$_>Bo(1i-9;M$|q~?SLnkP_&hEiG^Q9Q$|oW^}`Xmd(s zp+{?>XFOqc3q|wcQpByY&qx761;-GXs7#F24%J!1_hwu0YNA`o2>+a3GH3DcULCZC z$=ru#WtqC;&W8l4Jj(EQm6v!nt}ru(VEjO4YA^w>$wVpnArev->%g~p%tGoe)yLTw z6G@M4H?EQia|~TV$+jpbxvgR3N52zur4NbrSn%oMo<3l1PHTzop+5nc0$_gyorWM` zg`*^*?nHX{sRBRmYW}N*Sao*mN7|y@+qLV`nl(9?eR86W9}vX&oxx0K(}?LH7Wv}5 zVk9!to3R9Kg)jhDt>(Bkz(Ad_ z-NXYw83vYiafwS%%;Qff41{Pe9KgHhSgbOR0EB>uR6qXr$h*0+i8kl~}{sI8l}x8J1qbE;#@I7(z)zK~&{^m$uJxzD3I`Uzt`$@lnxE-g-wLc! zM$WpH*@4GmXJ;zUzG3AK^4Bg5=ymJnudE+OKX!Z$uH?X`m+dfc+W58ej)u_qDv|Fh z#-)hnase?os)+vLs3-*^6I#0R(G2HvDMK+bN5E7qABhAhhX_;T7I-|`0F_E^BjWmOxSE<#FCO;gH6p^qe$k* zDBDx4AI_$mti{Y#&}@KtWOXs}e8r5IYv!-2oodU_Kq14$!K%{H{H~(N(U334gS>CW z!G$XkXE7?c(9n%H2d%DKI)82LFqV()?tm5TFyVlNpUDyTTXG_?4A#LHYioO#d(+>lMh(4K$N2$l46O!&H@&3oXrhqk*BjsqQ{A3+)6kP42oB#|V`y>MCy zK{A;_+e`9Y!BPxTzMUz+51$$!Ko*VVTCl42F&rlF>p)JyabVRH94>%tEeS_ad2@0L zPQlSpFX8OGD+qW@Bc3pDx`$PQ^Y!>xFn@K;T{*e=j}`YRIu0kONHDxE;aGN@rQ$sX zY0Qp)>8vLn{lpS>*fkYGckBnlsSQX%as%Z4T->+d_Wa_)BCkJJ#6{jJjygXB$EG~@ z_}igUf(+Tshu&%^I>tX@i7z+zK7VfB@Z5r8uco;r{%`_~$D5OP0`k2RmfByM_j+}| zNn?s0$M<*&X}M9aAy5>%mjzzFOpuD!+!fW|!228W@(VpE%nn%45Ar>~AHO5-d)$Gy zz`+A7mMtB$W)GbsC1O)$msfQtEeEtZyZ5kFwbQ^#Rpn=38TD*{R18X?9)Q+gtNcU9 z^I%x%Py(y83M4Sh@mSZ~V1WBk1)*vvpQ z5d$}L0IQ%cCx0?eNWnn_RgrMx4PfWSf-*T92Mo-GpP?a76z_NQR#czFI4Z~>6e5O$ zIQe*l*OxmDN2Kqm-BWi(ZQ)dS9i!Rpo)c%rzZD*-G%MR`s z0LjHQyXyW`Ut2dd(p-NdY>KaBevNgtk(`3UBaL|Me;JS<;+7MS<>VEfONtWdH#9fY z{4N@fOo&CACx#m8eviXMn{fJ!gcBxCmE6iA#`EM9UWH@R-^Jk&*v9I<7`D@YLg1aZ zHq;N4;C)=JL_Ok|IDT;1=;H09lrzcVm{yPLS__DovTISZjOBn9uGlbrH>^BhpO}A6 zQV@TX5s$nCO6%MmcMSd@3+2+*nWnLUQiNcYd$vtk<>8Ri#>G{>VVByVxm3gT(4eeZ z*Fci;;Sqvd31c6qa}3!K++87Aem7X4Pv)(zn?GrE;iH2$OB$Yk0eCwB(DMAm(Zzoz zO9L>{Aygj#LgQA5$a?|S{tUmD2yk2-V|EkA6#WrlK$XZpN7{YphcGx=DF(!9eFPXe zKa@ipSwb{QQf<(3fG08sdA5Y{IT)EYR~RWDnzycDkQLXjrBL6{;}J!6T{&TNe$vVU zV@R)Ir7?Jn#;ddogBu%i38l_sGru+bzk5$dO;PO$$$-SW>?mQgLJ_iUp zg&=}7u6gXOz4z*h+=P-Uq!bZV!HF?XP8wTusfd9;uxb9QK%({qP?u-(gcg*49N)zU z)=%{LaxY|BIHIe@lGTbyV+#K1#KU#L{MGe;1Ld|T)L2&pAjF}db^iw)uX}OQ@wKsN z=pUfqe0n$@T)4VsnW4w74dmt@!@9%WJrO4r6BIjhkV9JDJ+~dSz`>=koQxgN!ZSfj z(xX#g-GS^O^tHOk9;U#m(r-oF6tK5|RkYzrn83ND1*~B1`4DxHW{APzcs?A=s@zf7 zyYNmNYEKk-;w!YnaK;hM@ z%l#cix5R1JxZqd&{ zHC2MbW8&l1;*bO!Jr6xEWDh^e*#NrJFCW!w3x)9<^ourG6tDwy3#S{2#5%C8JQgYd znbp_5rkfIXlawN;tO#Usvl#Y;4=m54OF!}QXmeRoe#^7(kO5ITmx~Y}CoiYU2B}VP zm3K}CSP^)+_`xf|c;e`S*O2y19z(?go*=urgsdn|I(`EQ-NqGEyz2!aJV4o+q~HXz zSS{sO=xyna9D=S>{4A{RGHZa=wIFwf}m*ybj!@!(w9*P-*?3)8tlRSB~)wK_UOZqJ= zZL4+FH9u5T_y0h?bM5@M_JT}w-~Q=;YA*%FaD*P#&qCCvIG|(Awco;#eHifZhbEoc zYc=2oSY=aA1g#*bt$yny_3}~jZp7iQjl+pRv7G!os68aW8iHO!2ph31o(LSns^VYb zx;cdrkv_o?#1`|ht4m9Ek9i*B?SyeO~{sbneUu7PBn+NGhcFI_4+0-0>`y~M4NalkmCrC>CHPjLZ zPy*9p(LDgA9gMqrkdzoa=twaU;Mns@AZr+^8h#Ya&;#l~l;>EKoBCySl5YN;aq8Ad z3fMcLlSkm9pCbGJrY9mdgR<+5GzKYq_I?T8{{hANtNE+yMxxA@;?U3jl(jY0)qd)d z%^xFOai$-xhwLQDx*e|WvjZ%)P#S3MnltQI045B^wR9TU@cDgGV{P3$9MAp37JmsVhqVEWhe@E5 zetOC1+;Yf?mgW}+&c@k#-$b~l;!U-b1)bSg-vk+xC8(ukVg=3~FiB7$HDoS$r{P#5 znm7*wdmtzV@$K;f!hK?s3{|H3>n&)NLPRVEJ0n3zUJvDfcP5Q0cpHxp1=?W6`+Zyy zX+;n`aR{rg@%q$j96Lejq((fdqnwbZdAxz<`nuk3#Z_%uwjV&PraAthSf=FR2u}Ld zgg`iez#aos7y$yHlb^tpha(SRa2D^FbwnI>?L-q-1i^{fJfMkTMBoA}jp9&I;Zx^v z`-I+B;m0lcNlEH4riU7^I=Bb2yWR-yQFNIMykMv2t*&_h+Vz*BeWNIk7vT5IrDIC| zL$K>%1=&gm$9=Yd#X9T*TK%VOz$&!&S1I-omP-j*>oQSVDK>De-w3-&SrM$_FcISc zSk0@NGi;|o zu*0mI=JMjG^+dv(06ULjOq#!X?}CY=zX@;Lsp^oA&TkLh(X&r@m6*v5{d1QdF=o| z4$xel;zT_Dbp-x{B#oqy-gR7)WNnqUa$Fc@JpNT#RlkI=sJ65nm+ee=hqv}-e@^~4 zxx$FDybrH0e3Trf{H8^*NKd)I7NPN`KsjM_{odM--IhzN-lc@# zVBI)i7Ori?X}j{R9OTf6iecPxFlvZw|18Nx!7@gqn7mX;KB}ms=n|}gU4i|CS9tw_ z$$`AQn+z+y3cxp>U`2HamQA>2%S0c7aQh#Ta5Gl{v65(B^~9>ivJSwCR7KoL>ft?QsFtzQCwPqi#0yrXCz8qV#g~+#h%g zd_EMGQ|>fMtLpCI_w}2KZ9JL>;3ZZMk1=R&`NjJHqEr|nwz%v!lsbUQ4}|Gn$^zPjR`lf!G^J2|1+GtsVT3MVcR!OPd-( z*v1pX(wKO|L1);i2+a=yaMo3vT<|d|IjS?vC@bTZ7a7}T)bWn&!sEP+hnNJBm!aS3(Un&t5UMcmu+mh!T=9WCidixs7lpo(9v)b^v=2 zNo-EbB)c8eci#_z-4(t--tp0Js1)UTVgAa!_bak{xekIBGOMouY<{LH+VRw_g8IWp zp8kcmKe)Ei4+{~$1&F)h2PV{-HuTj2Afu$;1{C@o8_nltp*mJ$7#thp7z9=iQUTZZ&Z|EcT8Y7t|;;>owc z%9G=^qRkIswebr8R-z$_xJn48_&Q`=zj2!E@-f9L zaQ|{3C!Z|dUWlF-@ZDw@-E+b?S1kV*sjl{SKamO`Vqx?NHWK+lCQeZkw&Re%vwtqE z{^=OJg#eBVn0CoBQZ~RD03HUZxTo3z^p^gCfh&P!IuXMCr_`vtB5uZB2V%S#$SItb zS6Iksy$wZZph+(L1Cp9h<3J+vwoqg3ilUOj;Q+`-A=-LVQq0%fzMP+6Wl*!hs&P3MA?%C%9D{U?M0-ArqIR8F&d=kj|iH1E@y?;-j3XZ3s*r(Km!ehY6wP#_h<5 zY-~S|FXt|BAD8HFBrq?r6zqstA zl1eDR{wxj!R-ij~>@OE%5mR7V9BE%kK15vq$^}YwJH1>|q=- zPFXn~`%&MNWc4C5T5mwm4yBv$pP zjrDa)uyo%S$MJm$%8s?r`F;d!$M_$dUeZKiE@Kg7;8eFyJUmamCHirI*s1dGI&o_m z=5DND*^S%svgM8{6;yV&tSWjUSrBtj$!ZCaj7w4s&N2n!RF|~`L0Od=t;Qc}Ziqqa{O^__kGw<-9jpQ=H?Z8a`TFS7ZfNNCN$8WlMUtE%T6iW%D4bD))%jcwKm|=pL>Q{xn$9i zjFcnii#D1twq%{lqnrUP_a{MphR}Xkd?<9~78FtapKNCc+U`#(l2HcTs&_#>{uGOW z6pKUfuD$|#VvO_P+O;lcb1;=nlWd)T!bydn;`IcWx_PLvzUDN5KtAH`1!}FBFsATz z#-)b8P?~Mjw^_OBH$Y{2pyA)#U(bgU7~Z38tr<2*Xi~2a04v{$h8jG`r{SH%GQn0e zjmy3wfbUXhv5$a;{i*m3u%H`)FS8SL=37u!UC;DbFT+*$c03w`Dv2Sf9&H1`If!o( zl+lK`BADe0C2olY%$KkQh(xNIFdDc5Db(MYPLKN{wt%o=V0X6CX&bLCz43jk-}KE^ z=`9~w0I}bts!Xu@f;kR=eXGRTxs{L`0WjM?{#un~L00mL6F$={&Vk1Fkc)kL;hF|( z@rIa%xYoQ?H8kL7((k$dh;;sxOh-@x5OCl53~06|-w9a^^Z2?Z>$wjs#`{}G`SBg= zKyY=!Wx7)S#UJ0zT~$8{Wr;ksG0w7W7MkdpA|?HtIsqj1PqpkPj8ldVvXj~iv+uX! z2JnpO?57MFj@-cg#%rGVOjd6o#|*R>CZT}9JHIsh87FcVHLym|iWx@PczS3|;8 zf|Q#YYHI%K(G;wXfs{ZvvVrM&IrpqX5Dy&an^FA1ILLzAR6rdHi=Jg=;xG$iUm!r5 zB8iYxBB;bgn_%;5(9IA1}~G;aqys((9~8X5deSo2}3rP z^>bc3>>AtKu`(*&VdZn2R3`M_`5~SYm-`Q~ zEdL$afC6>)eX+`x444AVw03`NRb%lJYnq1AEQ^z#6V7?=>eT_P1#22cFIZh~E%}g? zUhOA~-m)l}16vnVMB2%EcQv1$cs(uf*|mV^tZAfw+F<(Z3UTP<-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e Ctrl + Shift + P",action:"Focus to contextual toolbar"},{shortcut:b+" + K",action:"Insert link (if link plugin activated)"},{shortcut:b+" + S",action:"Save (if save plugin activated)"},{shortcut:b+" + F",action:"Find (if searchreplace plugin activated)"}];return{shortcuts:d}}),g("5",["8","9"],function(a,b){var c=function(){var c=function(a){return'aria-label="Action: '+a.action+", Shortcut: "+a.shortcut.replace(/Ctrl/g,"Control")+'"'},d=a.map(b.shortcuts,function(a){return'"+a.action+""+a.shortcut+""}).join("");return{title:"Handy Shortcuts",type:"container",style:"overflow-y: auto; overflow-x: hidden; max-height: 250px",items:[{type:"container",html:'
'+d+"
ActionShortcut
"}]}};return{makeTab:c}}),g("a",["e","j"],function(a,b){var c=function(){var a=b.keys,c=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b};return void 0===a?c:a}(),d=function(a,b){for(var d=c(a),e=0,f=d.length;e${name}'),h=function(a,b){return c.find(f.urls,function(a){return a.key===b}).fold(function(){var c=a.plugins[b].getMetadata;return"function"==typeof c?g(c()):b},function(a){return g({name:a.name,url:"https://www.tinymce.com/docs/plugins/"+a.key})})},i=function(a){var e=b.keys(a.plugins);return void 0===a.settings.forced_plugins?e:c.filter(e,d.not(d.curry(c.contains,a.settings.forced_plugins)))},j=function(a){var b=i(a),d=c.map(b,function(b){return"
  • "+h(a,b)+"
  • "}),e=d.length,f=d.join("");return"

    Plugins installed ("+e+"):

      "+f+"
    "},k=function(a){return{type:"container",html:'
    '+j(a)+"
    ",flex:1}},l=function(){return{type:"container",html:'

    Premium plugins:

    • PowerPaste
    • Spell Checker Pro
    • Accessibility Checker
    • Advanced Code Editor
    • Enhanced Media Embed
    • Link Checker

    Learn more...

    ',flex:1}},m=function(a){return{title:"Plugins",type:"container",style:"overflow-y: auto; overflow-x: hidden;",layout:"flex",padding:10,spacing:10,items:[k(a),l()]}};return{makeTab:m}}),g("7",["4"],function(a){var b=function(a,b){return 0===a.indexOf("@")?"X.X.X":a+"."+b},c=function(){var c=b(a.majorVersion,a.minorVersion),d='TinyMCE '+c+"";return[{type:"label",html:"You are using "+d},{type:"spacer",flex:1},{text:"Close",onclick:function(){this.parent().parent().close()}}]};return{makeRow:c}}),g("2",["4","5","6","7"],function(a,b,c,d){var e=function(a,e){return function(){a.windowManager.open({title:"Help",bodyType:"tabpanel",layout:"flex",body:[b.makeTab(),c.makeTab(a,e)],buttons:d.makeRow(),onPostRender:function(){var a=this.getEl("title");a.innerHTML='TinyMCE Logo'}})}};return{openDialog:e}}),g("0",["1","2"],function(a,b){var c=function(a,c){a.addButton("help",{icon:"help",onclick:b.openDialog(a,c)}),a.addMenuItem("Help",{text:"Help",icon:"help",context:"view",onclick:b.openDialog(a,c)}),a.addCommand("mceHelp",b.openDialog(a,c)),a.shortcuts.add("Alt+0","Open help dialog",b.openDialog(a,c))};return a.add("help",c),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e,t,n,r,o,a,i=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return function(){return e}},c={noop:function(){},noarg:function(e){return function(){return e()}},compose:function(e,t){return function(){return e(t.apply(null,arguments))}},constant:u,identity:function(e){return e},tripleEquals:function(e,t){return e===t},curry:function(e){for(var t=new Array(arguments.length-1),n=1;n-1},g=function(e,t){for(var n=e.length,r=new Array(n),o=0;o Ctrl + Shift + P",action:"Focus to contextual toolbar"},{shortcut:T+" + K",action:"Insert link (if link plugin activated)"},{shortcut:T+" + S",action:"Save (if save plugin activated)"},{shortcut:T+" + F",action:"Find (if searchreplace plugin activated)"}]},O=function(){var e=b(_.shortcuts,function(e){return''+A.translate(e.action)+""+e.shortcut+"";var t}).join("");return{title:"Handy Shortcuts",type:"container",style:"overflow-y: auto; overflow-x: hidden; max-height: 250px",items:[{type:"container",html:'
    "+e+"
    '+A.translate("Action")+""+A.translate("Shortcut")+"
    "}]}},H=(a=Object.keys)===undefined?function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t}:a,M=function(e,t){for(var n=H(e),r=0,o=n.length;r${name}'),z=function(e){var t,n,r=(t=e,n=L.keys(t.plugins),t.settings.forced_plugins===undefined?n:x(n,c.not(c.curry(C,t.settings.forced_plugins)))),o=b(r,function(t){return"
  • "+(n=e,r=t,w(B,function(e){return e.key===r}).fold(function(){var e=n.plugins[r].getMetadata;return"function"==typeof e?j(e()):r},function(e){return j({name:e.name,url:"https://www.tinymce.com/docs/plugins/"+e.key})}))+"
  • ";var n,r}),a=o.length,i=o.join("");return"

    "+A.translate(["Plugins installed ({0}):",a])+"

      "+i+"
    "},D=function(e){return{title:"Plugins",type:"container",style:"overflow-y: auto; overflow-x: hidden;",layout:"flex",padding:10,spacing:10,items:[(t=e,{type:"container",html:'
    '+z(t)+"
    ",flex:1}),{type:"container",html:'

    '+A.translate("Premium plugins:")+'

    • PowerPaste
    • Spell Checker Pro
    • Accessibility Checker
    • Advanced Code Editor
    • Enhanced Media Embed
    • Link Checker

    '+A.translate("Learn more...")+"

    ",flex:1}]};var t},q=tinymce.util.Tools.resolve("tinymce.EditorManager"),N=function(){var e,t,n='TinyMCE '+(e=q.majorVersion,t=q.minorVersion,0===e.indexOf("@")?"X.X.X":e+"."+t)+"";return[{type:"label",html:A.translate(["You are using {0}",n])},{type:"spacer",flex:1},{text:"Close",onclick:function(){this.parent().parent().close()}}]},R=function(e,t){return function(){e.windowManager.open({title:"Help",bodyType:"tabpanel",layout:"flex",body:[O(),D(e)],buttons:N(),onPostRender:function(){this.getEl("title").innerHTML='TinyMCE Logo'}})}},V=function(e,t){e.addCommand("mceHelp",R(e,t))},U=function(e,t){e.addButton("help",{icon:"help",onclick:R(e,t)}),e.addMenuItem("help",{text:"Help",icon:"help",context:"help",onclick:R(e,t)})};i.add("help",function(e,t){U(e,t),V(e,t),e.shortcuts.add("Alt+0","Open help dialog","mceHelp")})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/hr/plugin.min.js b/public/libs/tinymce/plugins/hr/plugin.min.js index 6c0dfa447..72bc2cabd 100644 --- a/public/libs/tinymce/plugins/hr/plugin.min.js +++ b/public/libs/tinymce/plugins/hr/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
    ")})},o=function(n){n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})};n.add("hr",function(n){t(n),o(n)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/image/plugin.min.js b/public/libs/tinymce/plugins/image/plugin.min.js index 1374178a4..cc6cdae6e 100644 --- a/public/libs/tinymce/plugins/image/plugin.min.js +++ b/public/libs/tinymce/plugins/image/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i=300?void e("HTTP Error: "+g.status):(a=JSON.parse(g.responseText),a&&"string"==typeof a.location?void b(d(c.basePath,a.location)):void e("Invalid JSON: "+g.responseText))},h=new FormData,h.append("file",a.blob(),a.filename()),g.send(h)}function f(b,c){return new a(function(a,d){try{c(b,a,d,i)}catch(a){d(a.message)}})}function g(a){return a===e}function h(b){return!c.url&&g(c.handler)?a.reject("Upload url missng from the settings."):f(b,c.handler)}var i=function(){};return c=b.extend({credentials:!1,handler:e},c),{upload:h}}}),h("b",Math),g("a",["2","b","d"],function(a,b,c){var d=function(a,d){function e(a,b){f.parentNode&&f.parentNode.removeChild(f),d({width:a,height:b})}var f=c.createElement("img");f.onload=function(){e(b.max(f.width,f.clientWidth),b.max(f.height,f.clientHeight))},f.onerror=function(){e()};var g=f.style;g.visibility="hidden",g.position="fixed",g.bottom=g.left=0,g.width=g.height="auto",c.body.appendChild(f),f.src=a},e=function(b,c,d){function e(b,d){return d=d||[],a.each(b,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c(b)),d.push(b)}),d}return e(b,d||[])},f=function(a){return a&&(a=a.replace(/px$/,"")),a},g=function(a){return a.length>0&&/^[0-9]+$/.test(a)&&(a+="px"),a},h=function(a){if(a.margin){var b=a.margin.split(" ");switch(b.length){case 1:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[0],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[0];break;case 2:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[1];break;case 3:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[1];break;case 4:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[3]}delete a.margin}return a};return{getImageSize:d,buildListItems:e,removePixelSuffix:f,addPixelSuffix:g,mergeMargins:h}}),h("c",RegExp),g("3",["5","6","2","7","8","9","a","b","c","d"],function(a,b,c,d,e,f,g,h,i,j){return function(j){function k(a){var c=j.settings.image_list;"string"==typeof c?d.send({url:c,success:function(c){a(b.parse(c))}}):"function"==typeof c?c(a):a(c)}function l(b){function d(){var a=new e(s.getEl()),b=this.value(),c=new f({url:B.images_upload_url,basePath:B.images_upload_base_path,credentials:B.images_upload_credentials,handler:B.images_upload_handler}),d=j.editorUpload.blobCache.create({blob:b,name:b.name?b.name.replace(/\.[^\.]+$/,""):null,base64:"data:image/fake;base64,="}),g=function(){a.hide(),URL.revokeObjectURL(d.blobUri())};return a.show(),c.upload(d).then(function(a){var b=s.find("#src");return b.value(a),s.find("tabpanel")[0].activateTab(0),b.fire("change"),g(),a},function(a){j.windowManager.alert(a),g()})}function k(a){return j.schema.getTextBlockElements()[a.nodeName]}function l(){var a,b,c,d;a=s.find("#width")[0],b=s.find("#height")[0],a&&b&&(c=a.value(),d=b.value(),s.find("#constrain")[0].checked()&&v&&w&&c&&d&&(v!=c?(d=h.round(c/v*d),isNaN(d)||b.value(d)):(c=h.round(d/w*c),isNaN(c)||a.value(c))),v=c,w=d)}function m(){if(j.settings.image_advtab){var a=s.toJSON(),b=A.parseStyle(a.style);b=g.mergeMargins(b),a.vspace&&(b["margin-top"]=b["margin-bottom"]=g.addPixelSuffix(a.vspace)),a.hspace&&(b["margin-left"]=b["margin-right"]=g.addPixelSuffix(a.hspace)),a.border&&(b["border-width"]=g.addPixelSuffix(a.border)),s.find("#style").value(A.serializeStyle(A.parseStyle(A.serializeStyle(b))))}}function n(){if(j.settings.image_advtab){var a=s.toJSON(),b=A.parseStyle(a.style);s.find("#vspace").value(""),s.find("#hspace").value(""),b=g.mergeMargins(b),(b["margin-top"]&&b["margin-bottom"]||b["margin-right"]&&b["margin-left"])&&(b["margin-top"]===b["margin-bottom"]?s.find("#vspace").value(g.removePixelSuffix(b["margin-top"])):s.find("#vspace").value(""),b["margin-right"]===b["margin-left"]?s.find("#hspace").value(g.removePixelSuffix(b["margin-right"])):s.find("#hspace").value("")),b["border-width"]&&s.find("#border").value(g.removePixelSuffix(b["border-width"])),s.find("#style").value(A.serializeStyle(A.parseStyle(A.serializeStyle(b))))}}function o(a){function b(){a.onload=a.onerror=null,j.selection&&(j.selection.select(a),j.nodeChanged())}a.onload=function(){z.width||z.height||!C||A.setAttribs(a,{width:a.clientWidth,height:a.clientHeight}),b()},a.onerror=b}function p(){var a,b;m(),l(),z=c.extend(z,s.toJSON()),z.alt||(z.alt=""),z.title||(z.title=""),""===z.width&&(z.width=null),""===z.height&&(z.height=null),z.style||(z.style=null),z={src:z.src,alt:z.alt,title:z.title,width:z.width,height:z.height,style:z.style,caption:z.caption,"class":z["class"]},j.undoManager.transact(function(){if(!z.src)return void(t&&(A.remove(t),j.focus(),j.nodeChanged()));if(""===z.title&&(z.title=null),t?A.setAttribs(t,z):(z.id="__mcenew",j.focus(),j.selection.setContent(A.createHTML("img",z)),t=A.get("__mcenew"),A.setAttrib(t,"id",null)),j.editorUpload.uploadImagesAuto(),z.caption===!1&&A.is(t.parentNode,"figure.image")&&(a=t.parentNode,A.insertAfter(t,a),A.remove(a)),z.caption!==!0)o(t);else if(!A.is(t.parentNode,"figure.image")){b=t,t=t.cloneNode(!0),a=A.create("figure",{"class":"image"}),a.appendChild(t),a.appendChild(A.create("figcaption",{contentEditable:!0},"Caption")),a.contentEditable=!1;var c=A.getParent(b,k);c?A.split(c,b,a):A.replace(a,b),j.selection.select(a)}})}function q(a){var b,d,e,f=a.meta||{};x&&x.value(j.convertURL(this.value(),"src")),c.each(f,function(a,b){s.find("#"+b).value(a)}),f.width||f.height||(b=j.convertURL(this.value(),"src"),d=j.settings.image_prepend_url,e=new i("^(?:[a-z]+:)?//","i"),d&&!e.test(b)&&b.substring(0,d.length)!==d&&(b=d+b),this.value(b),g.getImageSize(j.documentBaseURI.toAbsolute(this.value()),function(a){a.width&&a.height&&C&&(v=a.width,w=a.height,s.find("#width").value(v),s.find("#height").value(w))}))}function r(a){a.meta=s.toJSON()}var s,t,u,v,w,x,y,z={},A=j.dom,B=j.settings,C=B.image_dimensions!==!1;t=j.selection.getNode(),u=A.getParent(t,"figure.image"),u&&(t=A.select("img",u)[0]),t&&("IMG"!=t.nodeName||t.getAttribute("data-mce-object")||t.getAttribute("data-mce-placeholder"))&&(t=null),t&&(v=A.getAttrib(t,"width"),w=A.getAttrib(t,"height"),z={src:A.getAttrib(t,"src"),alt:A.getAttrib(t,"alt"),title:A.getAttrib(t,"title"),"class":A.getAttrib(t,"class"),width:v,height:w,caption:!!u}),b&&(x={type:"listbox",label:"Image list",values:g.buildListItems(b,function(a){a.value=j.convertURL(a.value||a.url,"src")},[{text:"None",value:""}]),value:z.src&&j.convertURL(z.src,"src"),onselect:function(a){var b=s.find("#alt");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),s.find("#src").value(a.control.value()).fire("change")},onPostRender:function(){x=this}}),j.settings.image_class_list&&(y={name:"class",type:"listbox",label:"Class",values:g.buildListItems(j.settings.image_class_list,function(a){a.value&&(a.textStyle=function(){return j.formatter.getCssText({inline:"img",classes:[a.value]})})})});var D=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:q,onbeforecall:r},x];if(j.settings.image_description!==!1&&D.push({name:"alt",type:"textbox",label:"Image description"}),j.settings.image_title&&D.push({name:"title",type:"textbox",label:"Image Title"}),C&&D.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:l,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:l,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),D.push(y),j.settings.image_caption&&a.ceFalse&&D.push({name:"caption",type:"checkbox",label:"Caption"}),j.settings.image_advtab||j.settings.images_upload_url){var E=[{title:"General",type:"form",items:D}];if(j.settings.image_advtab&&(t&&(t.style.marginLeft&&t.style.marginRight&&t.style.marginLeft===t.style.marginRight&&(z.hspace=g.removePixelSuffix(t.style.marginLeft)),t.style.marginTop&&t.style.marginBottom&&t.style.marginTop===t.style.marginBottom&&(z.vspace=g.removePixelSuffix(t.style.marginTop)),t.style.borderWidth&&(z.border=g.removePixelSuffix(t.style.borderWidth)),z.style=j.dom.serializeStyle(j.dom.parseStyle(j.dom.getAttrib(t,"style")))),E.push({title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:n},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:m},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]})),j.settings.images_upload_url){var F=".jpg,.jpeg,.png,.gif",G={title:"Upload",type:"form",layout:"flex",direction:"column",align:"stretch",padding:"20 20 20 20",items:[{type:"container",layout:"flex",direction:"column",align:"center",spacing:10,items:[{text:"Browse for an image",type:"browsebutton",accept:F,onchange:d},{text:"OR",type:"label"}]},{text:"Drop an image here",type:"dropzone",accept:F,height:100,onchange:d}]};E.push(G)}s=j.windowManager.open({title:"Insert/edit image",data:z,bodyType:"tabpanel",body:E,onSubmit:p})}else s=j.windowManager.open({title:"Insert/edit image",data:z,body:D,onSubmit:p})}function m(){k(l)}return{open:m}}}),g("0",["1","2","3"],function(a,b,c){return a.add("image",function(a){a.on("preInit",function(){function c(a){var b=a.attr("class");return b&&/\bimage\b/.test(b)}function d(a){return function(d){function e(b){b.attr("contenteditable",a?"true":null)}for(var f,g=d.length;g--;)f=d[g],c(f)&&(f.attr("contenteditable",a?"false":null),b.each(f.getAll("figcaption"),e))}}a.parser.addNodeFilter("figure",d(!0)),a.serializer.addNodeFilter("figure",d(!1))}),a.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:c(a).open,stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),a.addMenuItem("image",{icon:"image",text:"Image",onclick:c(a).open,context:"insert",prependToContext:!0}),a.addCommand("mceImage",c(a).open)}),function(){}}),d("0")()}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),n={hasDimensions:function(e){return!1!==e.settings.image_dimensions},hasAdvTab:function(e){return!0===e.settings.image_advtab},getPrependUrl:function(e){return e.getParam("image_prepend_url","")},getClassList:function(e){return e.getParam("image_class_list")},hasDescription:function(e){return!1!==e.settings.image_description},hasImageTitle:function(e){return!0===e.settings.image_title},hasImageCaption:function(e){return!0===e.settings.image_caption},getImageList:function(e){return e.getParam("image_list",!1)},hasUploadUrl:function(e){return e.getParam("images_upload_url",!1)},hasUploadHandler:function(e){return e.getParam("images_upload_handler",!1)},getUploadUrl:function(e){return e.getParam("images_upload_url")},getUploadHandler:function(e){return e.getParam("images_upload_handler")},getUploadBasePath:function(e){return e.getParam("images_upload_base_path")},getUploadCredentials:function(e){return e.getParam("images_upload_credentials")}},a="undefined"!=typeof window?window:Function("return this;")(),i=function(e,t){for(var n=t!==undefined&&null!==t?t:a,i=0;i0&&/^[0-9]+$/.test(e)&&(e+="px"),e},mergeMargins:function(e){if(e.margin){var t=e.margin.split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e},createImageList:function(e,t){var a=n.getImageList(e);"string"==typeof a?u.send({url:a,success:function(e){t(JSON.parse(e))}}):"function"==typeof a?a(t):t(a)},waitLoadImage:function(e,t,a){function i(){a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())}a.onload=function(){t.width||t.height||!n.hasDimensions(e)||e.dom.setAttribs(a,{width:a.clientWidth,height:a.clientHeight}),i()},a.onerror=i},blobToDataUri:function(e){return new s(function(t,n){var a=new l;a.onload=function(){t(a.result)},a.onerror=function(){n(l.error.message)},a.readAsDataURL(e)})}},g={makeTab:function(e,t){return{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:(a=e,function(e){var t=a.dom,i=e.control.rootControl;if(n.hasAdvTab(a)){var r=i.toJSON(),o=t.parseStyle(r.style);i.find("#vspace").value(""),i.find("#hspace").value(""),((o=d.mergeMargins(o))["margin-top"]&&o["margin-bottom"]||o["margin-right"]&&o["margin-left"])&&(o["margin-top"]===o["margin-bottom"]?i.find("#vspace").value(d.removePixelSuffix(o["margin-top"])):i.find("#vspace").value(""),o["margin-right"]===o["margin-left"]?i.find("#hspace").value(d.removePixelSuffix(o["margin-right"])):i.find("#hspace").value("")),o["border-width"]&&i.find("#border").value(d.removePixelSuffix(o["border-width"])),i.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(o))))}})},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,defaults:{type:"textbox",maxWidth:50,onchange:function(n){t(e,n.control.rootControl)}},items:[{label:"Vertical space",name:"vspace"},{label:"Border width",name:"border"},{label:"Horizontal space",name:"hspace"},{label:"Border style",type:"listbox",name:"borderStyle",width:90,maxWidth:90,onselect:function(n){t(e,n.control.rootControl)},values:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]};var a}},m=function(e,t){e.state.set("oldVal",e.value()),t.state.set("oldVal",t.value())},f=function(e,t){var n=e.find("#width")[0],a=e.find("#height")[0],i=e.find("#constrain")[0];n&&a&&i&&t(n,a,i.checked())},p=function(e,t,n){var a=e.state.get("oldVal"),i=t.state.get("oldVal"),r=e.value(),o=t.value();n&&a&&i&&r&&o&&(r!==a?(o=Math.round(r/a*o),isNaN(o)||t.value(o)):(r=Math.round(o/i*r),isNaN(r)||e.value(r))),m(e,t)},h=function(e){f(e,p)},b={createUi:function(){var e=function(e){h(e.control.rootControl)};return{type:"container",label:"Dimensions",layout:"flex",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:5,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:5,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}},syncSize:function(e){f(e,m)},updateSize:h},v=function(e){e.meta=e.control.rootControl.toJSON()},y=function(e,a){var i=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:function(a){var i,r,o,l,s,u,c,g,m;r=e,u=(i=a).meta||{},c=i.control,g=c.rootControl,(m=g.find("#image-list")[0])&&m.value(r.convertURL(c.value(),"src")),t.each(u,function(e,t){g.find("#"+t).value(e)}),u.width||u.height||(o=r.convertURL(c.value(),"src"),l=n.getPrependUrl(r),s=new RegExp("^(?:[a-z]+:)?//","i"),l&&!s.test(o)&&o.substring(0,l.length)!==l&&(o=l+o),c.value(o),d.getImageSize(r.documentBaseURI.toAbsolute(c.value()),function(e){e.width&&e.height&&n.hasDimensions(r)&&(g.find("#width").value(e.width),g.find("#height").value(e.height),b.updateSize(g))}))},onbeforecall:v},a];return n.hasDescription(e)&&i.push({name:"alt",type:"textbox",label:"Image description"}),n.hasImageTitle(e)&&i.push({name:"title",type:"textbox",label:"Image Title"}),n.hasDimensions(e)&&i.push(b.createUi()),n.getClassList(e)&&i.push({name:"class",type:"listbox",label:"Class",values:d.buildListItems(n.getClassList(e),function(t){t.value&&(t.textStyle=function(){return e.formatter.getCssText({inline:"img",classes:[t.value]})})})}),n.hasImageCaption(e)&&i.push({name:"caption",type:"checkbox",label:"Caption"}),i},x={makeTab:function(e,t){return{title:"General",type:"form",items:y(e,t)}},getGeneralItems:y},w=function(){return o.getOrDie("URL")},S=function(e){return w().createObjectURL(e)},U=function(e){w().revokeObjectURL(e)},T=tinymce.util.Tools.resolve("tinymce.ui.Factory"),C=function(){},I=function(e,t){return e?e.replace(/\/$/,"")+"/"+t.replace(/^\//,""):t};function P(e){var n=function(t,n,a,i){var r,l;(r=new function(){return new(o.getOrDie("XMLHttpRequest"))}).open("POST",e.url),r.withCredentials=e.credentials,r.upload.onprogress=function(e){i(e.loaded/e.total*100)},r.onerror=function(){a("Image upload failed due to a XHR Transport error. Code: "+r.status)},r.onload=function(){var t;r.status<200||r.status>=300?a("HTTP Error: "+r.status):(t=JSON.parse(r.responseText))&&"string"==typeof t.location?n(I(e.basePath,t.location)):a("Invalid JSON: "+r.responseText)},(l=new FormData).append("file",t.blob(),t.filename()),r.send(l)};return e=t.extend({credentials:!1,handler:n},e),{upload:function(t){return e.url||e.handler!==n?(a=t,i=e.handler,new s(function(e,t){try{i(a,e,t,C)}catch(n){t(n.message)}})):s.reject("Upload url missing from the settings.");var a,i}}}var L=function(e){return function(t){var a=T.get("Throbber"),i=t.control.rootControl,r=new a(i.getEl()),o=t.control.value(),l=S(o),s=P({url:n.getUploadUrl(e),basePath:n.getUploadBasePath(e),credentials:n.getUploadCredentials(e),handler:n.getUploadHandler(e)}),u=function(){r.hide(),U(l)};return r.show(),d.blobToDataUri(o).then(function(t){var n=e.editorUpload.blobCache.create({blob:o,blobUri:l,name:o.name?o.name.replace(/\.[^\.]+$/,""):null,base64:t.split(",")[1]});return s.upload(n).then(function(e){var t=i.find("#src");return t.value(e),i.find("tabpanel")[0].activateTab(0),t.fire("change"),u(),e})})["catch"](function(t){e.windowManager.alert(t),u()})}},_=".jpg,.jpeg,.png,.gif",N={makeTab:function(e){return{title:"Upload",type:"form",layout:"flex",direction:"column",align:"stretch",padding:"20 20 20 20",items:[{type:"container",layout:"flex",direction:"column",align:"center",spacing:10,items:[{text:"Browse for an image",type:"browsebutton",accept:_,onchange:L(e)},{text:"OR",type:"label"}]},{text:"Drop an image here",type:"dropzone",accept:_,height:100,onchange:L(e)}]}}};function A(e){var a=function(e,t){if(n.hasAdvTab(e)){var a=e.dom,i=t.toJSON(),r=a.parseStyle(i.style);r=d.mergeMargins(r),i.vspace&&(r["margin-top"]=r["margin-bottom"]=d.addPixelSuffix(i.vspace)),i.hspace&&(r["margin-left"]=r["margin-right"]=d.addPixelSuffix(i.hspace)),i.border&&(r["border-width"]=d.addPixelSuffix(i.border)),i.borderStyle&&(r["border-style"]=i.borderStyle),t.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(r))))}};function i(i){var r,o,l,s,u={},c=e.dom;function m(){var n,i;b.updateSize(r),a(e,r),(u=t.extend(u,r.toJSON())).alt||(u.alt=""),u.title||(u.title=""),""===u.width&&(u.width=null),""===u.height&&(u.height=null),u.style||(u.style=null),u={src:u.src,alt:u.alt,title:u.title,width:u.width,height:u.height,style:u.style,caption:u.caption,"class":u["class"]},e.undoManager.transact(function(){if(u.src){if(""===u.title&&(u.title=null),o?c.setAttribs(o,u):(u.id="__mcenew",e.focus(),e.selection.setContent(c.createHTML("img",u)),o=c.get("__mcenew"),c.setAttrib(o,"id",null)),e.editorUpload.uploadImagesAuto(),!1===u.caption&&c.is(o.parentNode,"figure.image")&&(n=o.parentNode,c.insertAfter(o,n),c.remove(n)),!0!==u.caption)d.waitLoadImage(e,u,o);else if(!c.is(o.parentNode,"figure.image")){i=o,o=o.cloneNode(!0),(n=c.create("figure",{"class":"image"})).appendChild(o),n.appendChild(c.create("figcaption",{contentEditable:!0},"Caption")),n.contentEditable=!1;var t=c.getParent(i,function(t){return e.schema.getTextBlockElements()[t.nodeName]});t?c.split(t,i,n):c.replace(n,i),e.selection.select(n)}}else if(o){var a=c.is(o.parentNode,"figure.image")?o.parentNode:o;c.remove(a),e.focus(),e.nodeChanged(),c.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})}if(o=e.selection.getNode(),(l=c.getParent(o,"figure.image"))&&(o=c.select("img",l)[0]),o&&("IMG"!==o.nodeName||o.getAttribute("data-mce-object")||o.getAttribute("data-mce-placeholder"))&&(o=null),o&&(u={src:c.getAttrib(o,"src"),alt:c.getAttrib(o,"alt"),title:c.getAttrib(o,"title"),"class":c.getAttrib(o,"class"),width:c.getAttrib(o,"width"),height:c.getAttrib(o,"height"),caption:!!l}),i&&(s={type:"listbox",label:"Image list",name:"image-list",values:d.buildListItems(i,function(t){t.value=e.convertURL(t.value||t.url,"src")},[{text:"None",value:""}]),value:u.src&&e.convertURL(u.src,"src"),onselect:function(e){var t=r.find("#alt");(!t.value()||e.lastControl&&t.value()===e.lastControl.text())&&t.value(e.control.text()),r.find("#src").value(e.control.value()).fire("change")},onPostRender:function(){s=this}}),n.hasAdvTab(e)||n.hasUploadUrl(e)||n.hasUploadHandler(e)){var f=[x.makeTab(e,s)];n.hasAdvTab(e)&&(o&&(o.style.marginLeft&&o.style.marginRight&&o.style.marginLeft===o.style.marginRight&&(u.hspace=d.removePixelSuffix(o.style.marginLeft)),o.style.marginTop&&o.style.marginBottom&&o.style.marginTop===o.style.marginBottom&&(u.vspace=d.removePixelSuffix(o.style.marginTop)),o.style.borderWidth&&(u.border=d.removePixelSuffix(o.style.borderWidth)),u.borderStyle=o.style.borderStyle,u.style=e.dom.serializeStyle(e.dom.parseStyle(e.dom.getAttrib(o,"style")))),f.push(g.makeTab(e,a))),(n.hasUploadUrl(e)||n.hasUploadHandler(e))&&f.push(N.makeTab(e)),r=e.windowManager.open({title:"Insert/edit image",data:u,bodyType:"tabpanel",body:f,onSubmit:m})}else r=e.windowManager.open({title:"Insert/edit image",data:u,body:x.getGeneralItems(e,s),onSubmit:m});b.syncSize(r)}return{open:function(){d.createImageList(e,i)}}}var k=function(e){e.addCommand("mceImage",A(e).open)},D=function(e){return function(n){for(var a,i,r=n.length,o=function(t){t.attr("contenteditable",e?"true":null)};r--;)a=n[r],(i=a.attr("class"))&&/\bimage\b/.test(i)&&(a.attr("contenteditable",e?"false":null),t.each(a.getAll("figcaption"),o))}},R=function(e){e.on("preInit",function(){e.parser.addNodeFilter("figure",D(!0)),e.serializer.addNodeFilter("figure",D(!1))})},z=function(e){e.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:A(e).open,stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),e.addMenuItem("image",{icon:"image",text:"Image",onclick:A(e).open,context:"insert",prependToContext:!0})};e.add("image",function(e){R(e),z(e),k(e)})}(); \ No newline at end of file diff --git a/public/libs/tinymce/plugins/imagetools/plugin.min.js b/public/libs/tinymce/plugins/imagetools/plugin.min.js index d4d3605dc..0d3579688 100644 --- a/public/libs/tinymce/plugins/imagetools/plugin.min.js +++ b/public/libs/tinymce/plugins/imagetools/plugin.min.js @@ -1,2 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ic?a=c:a0?3*d:d),f=.3086,g=.6094,h=.082,c(b,[f*(1-e)+e,g*(1-e),h*(1-e),0,0,f*(1-e),g*(1-e)+e,h*(1-e),0,0,f*(1-e),g*(1-e),h*(1-e)+e,0,0,0,0,0,1,0,0,0,0,0,1])}function g(b,d){var e,f,g,h,i;return d=a(d,-180,180)/180*Math.PI,e=Math.cos(d),f=Math.sin(d),g=.213,h=.715,i=.072,c(b,[g+e*(1-g)+f*-g,h+e*-h+f*-h,i+e*-i+f*(1-i),0,0,g+e*-g+.143*f,h+e*(1-h)+.14*f,i+e*-i+f*-.283,0,0,g+e*-g+f*-(1-g),h+e*-h+f*h,i+e*(1-i)+f*i,0,0,0,0,0,1,0,0,0,0,0,1])}function h(b,d){return d=a(255*d,-255,255),c(b,[1,0,0,0,d,0,1,0,0,d,0,0,1,0,d,0,0,0,1,0,0,0,0,0,1])}function i(b,d,e,f){return d=a(d,0,2),e=a(e,0,2),f=a(f,0,2),c(b,[d,0,0,0,0,0,e,0,0,0,0,0,f,0,0,0,0,0,1,0,0,0,0,0,1])}function j(b,e){return e=a(e,0,1),c(b,d([.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0,0,0,0,0,1],e))}function k(b,e){return e=a(e,0,1),c(b,d([.33,.34,.33,0,0,.33,.34,.33,0,0,.33,.34,.33,0,0,0,0,0,1,0,0,0,0,0,1],e))}var l=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10];return{identity:b,adjust:d,multiply:c,adjustContrast:e,adjustBrightness:h,adjustSaturation:f,adjustHue:g,adjustColors:i,adjustSepia:j,adjustGrayscale:k}}),g("e",["q","d","t"],function(a,b,c){function d(c,d){function e(a,b){var c,d,e,f,g,h=a.data,i=b[0],j=b[1],k=b[2],l=b[3],m=b[4],n=b[5],o=b[6],p=b[7],q=b[8],r=b[9],s=b[10],t=b[11],u=b[12],v=b[13],w=b[14],x=b[15],y=b[16],z=b[17],A=b[18],B=b[19];for(g=0;gc?a=c:a2)&&(i=i<.5?.5:2,k=!0),(j<.5||j>2)&&(j=j<.5?.5:2,k=!0);var l=f(a,i,j);return k?l.then(function(a){return e(a,b,c)}):l}function f(b,e,f){return new a(function(a){var g=d.getWidth(b),h=d.getHeight(b),i=Math.floor(g*e),j=Math.floor(h*f),k=c.create(i,j),l=c.get2dContext(k);l.drawImage(b,0,0,g,h,0,0,i,j),a(k)})}return{scale:e}}),g("f",["q","d","u"],function(a,b,c){function d(c,d){var e=c.toCanvas(),f=a.create(e.width,e.height),g=a.get2dContext(f),h=0,i=0;return d=d<0?360+d:d,90!=d&&270!=d||a.resize(f,f.height,f.width),90!=d&&180!=d||(h=f.width),270!=d&&180!=d||(i=f.height),g.translate(h,i),g.rotate(d*Math.PI/180),g.drawImage(e,0,0),b.fromCanvas(f,c.getType())}function e(c,d){var e=c.toCanvas(),f=a.create(e.width,e.height),g=a.get2dContext(f);return"v"==d?(g.scale(1,-1),g.drawImage(e,0,-f.height)):(g.scale(-1,1),g.drawImage(e,-f.width,0)),b.fromCanvas(f,c.getType())}function f(c,d,e,f,g){var h=c.toCanvas(),i=a.create(f,g),j=a.get2dContext(i);return j.drawImage(h,-d,-e),b.fromCanvas(i,c.getType())}function g(a,d,e){return c.scale(a.toCanvas(),d,e).then(function(c){return b.fromCanvas(c,a.getType())})}return{rotate:d,flip:e,crop:f,resize:g}}),g("2",["e","f"],function(a,b){var c=function(b){return a.invert(b)},d=function(b){return a.sharpen(b)},e=function(b){return a.emboss(b)},f=function(b,c){return a.gamma(b,c)},g=function(b,c){return a.exposure(b,c)},h=function(b,c,d,e){return a.colorize(b,c,d,e)},i=function(b,c){return a.brightness(b,c)},j=function(b,c){return a.hue(b,c)},k=function(b,c){return a.saturate(b,c)},l=function(b,c){return a.contrast(b,c)},m=function(b,c){return a.grayscale(b,c)},n=function(b,c){return a.sepia(b,c)},o=function(a,c){return b.flip(a,c)},p=function(a,c,d,e,f){return b.crop(a,c,d,e,f)},q=function(a,c,d){return b.resize(a,c,d)},r=function(a,c){return b.rotate(a,c)};return{invert:c,sharpen:d,emboss:e,brightness:i,hue:j,saturate:k,contrast:l,grayscale:m,sepia:n,colorize:h,gamma:f,exposure:g,flip:o,crop:p,resize:q,rotate:r}}),h("g",tinymce.util.Tools.resolve),g("3",["g"],function(a){return a("tinymce.Env")}),g("4",["g"],function(a){return a("tinymce.PluginManager")}),g("5",["g"],function(a){return a("tinymce.util.Delay")}),g("6",["g"],function(a){return a("tinymce.util.Promise")}),g("7",["g"],function(a){return a("tinymce.util.Tools")}),g("8",["g"],function(a){return a("tinymce.util.URI")}),g("9",[],function(){function a(a){function b(a){return/^[0-9\.]+px$/.test(a)}var c,d;return c=a.style.width,d=a.style.height,c||d?b(c)&&b(d)?{w:parseInt(c,10),h:parseInt(d,10)}:null:(c=a.width,d=a.height,c&&d?{w:parseInt(c,10),h:parseInt(d,10)}:null)}function b(a,b){var c,d;b&&(c=a.style.width,d=a.style.height,(c||d)&&(a.style.width=b.w+"px",a.style.height=b.h+"px",a.removeAttribute("data-mce-style")),c=a.width,d=a.height,(c||d)&&(a.setAttribute("width",b.w),a.setAttribute("height",b.h)))}function c(a){return{w:a.naturalWidth,h:a.naturalHeight}}return{getImageSize:a,setImageSize:b,getNaturalImageSize:c}}),h("12",Array),h("13",Error),g("w",["12","13"],function(a,b){var c=function(){},d=function(a,b){return function(){return a(b.apply(null,arguments))}},e=function(a){return function(){return a}},f=function(a){return a},g=function(a,b){return a===b},h=function(b){for(var c=new a(arguments.length-1),d=1;d-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e=300?c.handleHttpError(b.status):a.resolve(b.blob)})}var f=function(a,b){var c=a.indexOf("?")===-1?"?":"&";return/[?&]apiKey=/.test(a)||!b?a:a+c+"apiKey="+encodeURIComponent(b)},g=function(b,e){return d.requestUrlAsBlob(f(b,e),{"Content-Type":"application/json;charset=UTF-8","tiny-api-key":e}).then(function(b){return b.status<200||b.status>=300?c.handleServiceErrorResponse(b.status,b.blob):a.resolve(b.blob)})},h=function(a,b){return b?g(a,b):e(a)};return{getUrl:h}}),g("j",["g"],function(a){return a("tinymce.dom.DOMUtils")}),g("k",["g"],function(a){return a("tinymce.ui.Container")}),g("l",["g"],function(a){return a("tinymce.ui.Form")}),g("x",["g"],function(a){return a("tinymce.geom.Rect")}),g("y",["g"],function(a){return a("tinymce.ui.Control")}),g("z",["g"],function(a){return a("tinymce.ui.DragHelper")}),g("15",["g"],function(a){return a("tinymce.dom.DomQuery")}),g("16",["g"],function(a){return a("tinymce.util.Observable")}),g("17",["g"],function(a){return a("tinymce.util.VK")}),g("10",["15","z","x","7","16","17"],function(a,b,c,d,e,f){var g=0;return function(h,i,j,k,l){function m(a,b){return{x:b.x+a.x,y:b.y+a.y,w:b.w,h:b.h}}function n(a,b){return{x:b.x-a.x,y:b.y-a.y,w:b.w,h:b.h}}function o(){return n(j,h)}function p(a,b,d,e){var f,g,i,k,l;f=b.x,g=b.y,i=b.w,k=b.h,f+=d*a.deltaX,g+=e*a.deltaY,i+=d*a.deltaW,k+=e*a.deltaH,i<20&&(i=20),k<20&&(k=20),l=h=c.clamp({x:f,y:g,w:i,h:k},j,"move"==a.name),l=n(j,l),y.fire("updateRect",{rect:l}),v(l)}function q(){function c(a){var c;return new b(D,{document:k.ownerDocument,handle:D+"-"+a.name,start:function(){c=h},drag:function(b){p(a,c,b.deltaX,b.deltaY)}})}a('
    ').appendTo(k),d.each(B,function(b){a("#"+D,k).append('