Merge branch 'master' into release
This commit is contained in:
commit
9a7fecd269
|
@ -0,0 +1,84 @@
|
||||||
|
# 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.
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
## 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
|
|
@ -21,3 +21,4 @@ nbproject
|
||||||
.buildpath
|
.buildpath
|
||||||
.project
|
.project
|
||||||
.settings/
|
.settings/
|
||||||
|
webpack-stats.json
|
3
LICENSE
3
LICENSE
|
@ -1,6 +1,7 @@
|
||||||
The MIT License (MIT)
|
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
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -6,8 +6,6 @@ class Chapter extends Entity
|
||||||
|
|
||||||
protected $fillable = ['name', 'description', 'priority', 'book_id'];
|
protected $fillable = ['name', 'description', 'priority', 'book_id'];
|
||||||
|
|
||||||
protected $with = ['book'];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the book this chapter is within.
|
* Get the book this chapter is within.
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
|
|
@ -197,9 +197,8 @@ class Entity extends Ownable
|
||||||
* @param $path
|
* @param $path
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getUrl($path)
|
public function getUrl($path = '/')
|
||||||
{
|
{
|
||||||
return '/';
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,17 +107,14 @@ class ChapterController extends Controller
|
||||||
* @param $bookSlug
|
* @param $bookSlug
|
||||||
* @param $chapterSlug
|
* @param $chapterSlug
|
||||||
* @return Response
|
* @return Response
|
||||||
|
* @throws \BookStack\Exceptions\NotFoundException
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $bookSlug, $chapterSlug)
|
public function update(Request $request, $bookSlug, $chapterSlug)
|
||||||
{
|
{
|
||||||
$chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
|
$chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
|
||||||
$this->checkOwnablePermission('chapter-update', $chapter);
|
$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);
|
$this->entityRepo->updateFromInput('chapter', $chapter, $request->all());
|
||||||
}
|
|
||||||
$chapter->fill($request->all());
|
|
||||||
$chapter->updated_by = user()->id;
|
|
||||||
$chapter->save();
|
|
||||||
Activity::add($chapter, 'chapter_update', $chapter->book->id);
|
Activity::add($chapter, 'chapter_update', $chapter->book->id);
|
||||||
return redirect($chapter->getUrl());
|
return redirect($chapter->getUrl());
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,4 +118,20 @@ class HomeController extends Controller
|
||||||
{
|
{
|
||||||
return view('partials/custom-head-content');
|
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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,11 +275,10 @@ class PageController extends Controller
|
||||||
$draft = $this->entityRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown']));
|
$draft = $this->entityRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown']));
|
||||||
|
|
||||||
$updateTime = $draft->updated_at->timestamp;
|
$updateTime = $draft->updated_at->timestamp;
|
||||||
$utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset;
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
'message' => trans('entities.pages_edit_draft_save_at'),
|
'message' => trans('entities.pages_edit_draft_save_at'),
|
||||||
'timestamp' => $utcUpdateTimestamp
|
'timestamp' => $updateTime
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,6 +585,8 @@ class PageController extends Controller
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->checkOwnablePermission('page-create', $parent);
|
||||||
|
|
||||||
$this->entityRepo->changePageParent($page, $parent);
|
$this->entityRepo->changePageParent($page, $parent);
|
||||||
Activity::add($page, 'page_move', $page->book->id);
|
Activity::add($page, 'page_move', $page->book->id);
|
||||||
session()->flash('success', trans('entities.pages_move_success', ['parentName' => $parent->name]));
|
session()->flash('success', trans('entities.pages_move_success', ['parentName' => $parent->name]));
|
||||||
|
@ -593,12 +594,70 @@ class PageController extends Controller
|
||||||
return redirect($page->getUrl());
|
return redirect($page->getUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the view to copy a page.
|
||||||
|
* @param string $bookSlug
|
||||||
|
* @param string $pageSlug
|
||||||
|
* @return mixed
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function showCopy($bookSlug, $pageSlug)
|
||||||
|
{
|
||||||
|
$page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
|
||||||
|
$this->checkOwnablePermission('page-update', $page);
|
||||||
|
session()->flashInput(['name' => $page->name]);
|
||||||
|
return view('pages/copy', [
|
||||||
|
'book' => $page->book,
|
||||||
|
'page' => $page
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a copy of a page within the requested target destination.
|
||||||
|
* @param string $bookSlug
|
||||||
|
* @param string $pageSlug
|
||||||
|
* @param Request $request
|
||||||
|
* @return mixed
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function copy($bookSlug, $pageSlug, Request $request)
|
||||||
|
{
|
||||||
|
$page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
|
||||||
|
$this->checkOwnablePermission('page-update', $page);
|
||||||
|
|
||||||
|
$entitySelection = $request->get('entity_selection', null);
|
||||||
|
if ($entitySelection === null || $entitySelection === '') {
|
||||||
|
$parent = $page->chapter ? $page->chapter : $page->book;
|
||||||
|
} else {
|
||||||
|
$stringExploded = explode(':', $entitySelection);
|
||||||
|
$entityType = $stringExploded[0];
|
||||||
|
$entityId = intval($stringExploded[1]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$parent = $this->entityRepo->getById($entityType, $entityId);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
session()->flash(trans('entities.selected_book_chapter_not_found'));
|
||||||
|
return redirect()->back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->checkOwnablePermission('page-create', $parent);
|
||||||
|
|
||||||
|
$pageCopy = $this->entityRepo->copyPage($page, $parent, $request->get('name', ''));
|
||||||
|
|
||||||
|
Activity::add($pageCopy, 'page_create', $pageCopy->book->id);
|
||||||
|
session()->flash('success', trans('entities.pages_copy_success'));
|
||||||
|
|
||||||
|
return redirect($pageCopy->getUrl());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the permissions for this page.
|
* Set the permissions for this page.
|
||||||
* @param string $bookSlug
|
* @param string $bookSlug
|
||||||
* @param string $pageSlug
|
* @param string $pageSlug
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||||
|
* @throws NotFoundException
|
||||||
*/
|
*/
|
||||||
public function restrict($bookSlug, $pageSlug, Request $request)
|
public function restrict($bookSlug, $pageSlug, Request $request)
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,16 +89,17 @@ class SearchController extends Controller
|
||||||
{
|
{
|
||||||
$entityTypes = $request->filled('types') ? collect(explode(',', $request->get('types'))) : collect(['page', 'chapter', 'book']);
|
$entityTypes = $request->filled('types') ? collect(explode(',', $request->get('types'))) : collect(['page', 'chapter', 'book']);
|
||||||
$searchTerm = $request->get('term', false);
|
$searchTerm = $request->get('term', false);
|
||||||
|
$permission = $request->get('permission', 'view');
|
||||||
|
|
||||||
// Search for entities otherwise show most popular
|
// Search for entities otherwise show most popular
|
||||||
if ($searchTerm !== false) {
|
if ($searchTerm !== false) {
|
||||||
$searchTerm .= ' {type:'. implode('|', $entityTypes->toArray()) .'}';
|
$searchTerm .= ' {type:'. implode('|', $entityTypes->toArray()) .'}';
|
||||||
$entities = $this->searchService->searchEntities($searchTerm)['results'];
|
$entities = $this->searchService->searchEntities($searchTerm, 'all', 1, 20, $permission)['results'];
|
||||||
} else {
|
} else {
|
||||||
$entityNames = $entityTypes->map(function ($type) {
|
$entityNames = $entityTypes->map(function ($type) {
|
||||||
return 'BookStack\\' . ucfirst($type);
|
return 'BookStack\\' . ucfirst($type);
|
||||||
})->toArray();
|
})->toArray();
|
||||||
$entities = $this->viewService->getPopular(20, 0, $entityNames);
|
$entities = $this->viewService->getPopular(20, 0, $entityNames, $permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('search/entity-ajax-list', ['entities' => $entities]);
|
return view('search/entity-ajax-list', ['entities' => $entities]);
|
||||||
|
|
|
@ -6,7 +6,6 @@ class Page extends Entity
|
||||||
|
|
||||||
protected $simpleAttributes = ['name', 'id', 'slug'];
|
protected $simpleAttributes = ['name', 'id', 'slug'];
|
||||||
|
|
||||||
protected $with = ['book'];
|
|
||||||
public $textField = 'text';
|
public $textField = 'text';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -492,14 +492,19 @@ class EntityRepo
|
||||||
public function createFromInput($type, $input = [], $book = false)
|
public function createFromInput($type, $input = [], $book = false)
|
||||||
{
|
{
|
||||||
$isChapter = strtolower($type) === 'chapter';
|
$isChapter = strtolower($type) === 'chapter';
|
||||||
$entity = $this->getEntity($type)->newInstance($input);
|
$entityModel = $this->getEntity($type)->newInstance($input);
|
||||||
$entity->slug = $this->findSuitableSlug($type, $entity->name, false, $isChapter ? $book->id : false);
|
$entityModel->slug = $this->findSuitableSlug($type, $entityModel->name, false, $isChapter ? $book->id : false);
|
||||||
$entity->created_by = user()->id;
|
$entityModel->created_by = user()->id;
|
||||||
$entity->updated_by = user()->id;
|
$entityModel->updated_by = user()->id;
|
||||||
$isChapter ? $book->chapters()->save($entity) : $entity->save();
|
$isChapter ? $book->chapters()->save($entityModel) : $entityModel->save();
|
||||||
$this->permissionService->buildJointPermissionsForEntity($entity);
|
|
||||||
$this->searchService->indexEntity($entity);
|
if (isset($input['tags'])) {
|
||||||
return $entity;
|
$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->fill($input);
|
||||||
$entityModel->updated_by = user()->id;
|
$entityModel->updated_by = user()->id;
|
||||||
$entityModel->save();
|
$entityModel->save();
|
||||||
|
|
||||||
|
if (isset($input['tags'])) {
|
||||||
|
$this->tagRepo->saveTagsToEntity($entityModel, $input['tags']);
|
||||||
|
}
|
||||||
|
|
||||||
$this->permissionService->buildJointPermissionsForEntity($entityModel);
|
$this->permissionService->buildJointPermissionsForEntity($entityModel);
|
||||||
$this->searchService->indexEntity($entityModel);
|
$this->searchService->indexEntity($entityModel);
|
||||||
return $entityModel;
|
return $entityModel;
|
||||||
|
@ -583,6 +593,30 @@ class EntityRepo
|
||||||
return $slug;
|
return $slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a new draft page instance.
|
||||||
|
* @param Book $book
|
||||||
|
* @param Chapter|bool $chapter
|
||||||
|
* @return Page
|
||||||
|
*/
|
||||||
|
public function getDraftPage(Book $book, $chapter = false)
|
||||||
|
{
|
||||||
|
$page = $this->page->newInstance();
|
||||||
|
$page->name = trans('entities.pages_initial_name');
|
||||||
|
$page->created_by = user()->id;
|
||||||
|
$page->updated_by = user()->id;
|
||||||
|
$page->draft = true;
|
||||||
|
|
||||||
|
if ($chapter) {
|
||||||
|
$page->chapter_id = $chapter->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$book->pages()->save($page);
|
||||||
|
$page = $this->page->find($page->id);
|
||||||
|
$this->permissionService->buildJointPermissionsForEntity($page);
|
||||||
|
return $page;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Publish a draft page to make it a normal page.
|
* Publish a draft page to make it a normal page.
|
||||||
* Sets the slug and updates the content.
|
* Sets the slug and updates the content.
|
||||||
|
@ -611,6 +645,43 @@ class EntityRepo
|
||||||
return $draftPage;
|
return $draftPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a copy of a page in a new location with a new name.
|
||||||
|
* @param Page $page
|
||||||
|
* @param Entity $newParent
|
||||||
|
* @param string $newName
|
||||||
|
* @return Page
|
||||||
|
*/
|
||||||
|
public function copyPage(Page $page, Entity $newParent, $newName = '')
|
||||||
|
{
|
||||||
|
$newBook = $newParent->isA('book') ? $newParent : $newParent->book;
|
||||||
|
$newChapter = $newParent->isA('chapter') ? $newParent : null;
|
||||||
|
$copyPage = $this->getDraftPage($newBook, $newChapter);
|
||||||
|
$pageData = $page->getAttributes();
|
||||||
|
|
||||||
|
// Update name
|
||||||
|
if (!empty($newName)) {
|
||||||
|
$pageData['name'] = $newName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy tags from previous page if set
|
||||||
|
if ($page->tags) {
|
||||||
|
$pageData['tags'] = [];
|
||||||
|
foreach ($page->tags as $tag) {
|
||||||
|
$pageData['tags'][] = ['name' => $tag->name, 'value' => $tag->value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set priority
|
||||||
|
if ($newParent->isA('chapter')) {
|
||||||
|
$pageData['priority'] = $this->getNewChapterPriority($newParent);
|
||||||
|
} else {
|
||||||
|
$pageData['priority'] = $this->getNewBookPriority($newParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->publishPageDraft($copyPage, $pageData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves a page revision into the system.
|
* Saves a page revision into the system.
|
||||||
* @param Page $page
|
* @param Page $page
|
||||||
|
@ -774,7 +845,9 @@ class EntityRepo
|
||||||
$scriptSearchRegex = '/<script.*?>.*?<\/script>/ms';
|
$scriptSearchRegex = '/<script.*?>.*?<\/script>/ms';
|
||||||
$matches = [];
|
$matches = [];
|
||||||
preg_match_all($scriptSearchRegex, $html, $matches);
|
preg_match_all($scriptSearchRegex, $html, $matches);
|
||||||
if (count($matches) === 0) return $html;
|
if (count($matches) === 0) {
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($matches[0] as $match) {
|
foreach ($matches[0] as $match) {
|
||||||
$html = str_replace($match, htmlentities($match), $html);
|
$html = str_replace($match, htmlentities($match), $html);
|
||||||
|
@ -793,30 +866,6 @@ class EntityRepo
|
||||||
return strip_tags($html);
|
return strip_tags($html);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a new draft page instance.
|
|
||||||
* @param Book $book
|
|
||||||
* @param Chapter|bool $chapter
|
|
||||||
* @return Page
|
|
||||||
*/
|
|
||||||
public function getDraftPage(Book $book, $chapter = false)
|
|
||||||
{
|
|
||||||
$page = $this->page->newInstance();
|
|
||||||
$page->name = trans('entities.pages_initial_name');
|
|
||||||
$page->created_by = user()->id;
|
|
||||||
$page->updated_by = user()->id;
|
|
||||||
$page->draft = true;
|
|
||||||
|
|
||||||
if ($chapter) {
|
|
||||||
$page->chapter_id = $chapter->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
$book->pages()->save($page);
|
|
||||||
$page = $this->page->find($page->id);
|
|
||||||
$this->permissionService->buildJointPermissionsForEntity($page);
|
|
||||||
return $page;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for image usage within page content.
|
* Search for image usage within page content.
|
||||||
* @param $imageString
|
* @param $imageString
|
||||||
|
|
|
@ -9,14 +9,16 @@ class ExportService
|
||||||
{
|
{
|
||||||
|
|
||||||
protected $entityRepo;
|
protected $entityRepo;
|
||||||
|
protected $imageService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ExportService constructor.
|
* ExportService constructor.
|
||||||
* @param $entityRepo
|
* @param $entityRepo
|
||||||
*/
|
*/
|
||||||
public function __construct(EntityRepo $entityRepo)
|
public function __construct(EntityRepo $entityRepo, ImageService $imageService)
|
||||||
{
|
{
|
||||||
$this->entityRepo = $entityRepo;
|
$this->entityRepo = $entityRepo;
|
||||||
|
$this->imageService = $imageService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,6 +26,7 @@ class ExportService
|
||||||
* Includes required CSS & image content. Images are base64 encoded into the HTML.
|
* Includes required CSS & image content. Images are base64 encoded into the HTML.
|
||||||
* @param Page $page
|
* @param Page $page
|
||||||
* @return mixed|string
|
* @return mixed|string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function pageToContainedHtml(Page $page)
|
public function pageToContainedHtml(Page $page)
|
||||||
{
|
{
|
||||||
|
@ -38,6 +41,7 @@ class ExportService
|
||||||
* Convert a chapter to a self-contained HTML file.
|
* Convert a chapter to a self-contained HTML file.
|
||||||
* @param Chapter $chapter
|
* @param Chapter $chapter
|
||||||
* @return mixed|string
|
* @return mixed|string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function chapterToContainedHtml(Chapter $chapter)
|
public function chapterToContainedHtml(Chapter $chapter)
|
||||||
{
|
{
|
||||||
|
@ -56,6 +60,7 @@ class ExportService
|
||||||
* Convert a book to a self-contained HTML file.
|
* Convert a book to a self-contained HTML file.
|
||||||
* @param Book $book
|
* @param Book $book
|
||||||
* @return mixed|string
|
* @return mixed|string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function bookToContainedHtml(Book $book)
|
public function bookToContainedHtml(Book $book)
|
||||||
{
|
{
|
||||||
|
@ -71,6 +76,7 @@ class ExportService
|
||||||
* Convert a page to a PDF file.
|
* Convert a page to a PDF file.
|
||||||
* @param Page $page
|
* @param Page $page
|
||||||
* @return mixed|string
|
* @return mixed|string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function pageToPdf(Page $page)
|
public function pageToPdf(Page $page)
|
||||||
{
|
{
|
||||||
|
@ -85,6 +91,7 @@ class ExportService
|
||||||
* Convert a chapter to a PDF file.
|
* Convert a chapter to a PDF file.
|
||||||
* @param Chapter $chapter
|
* @param Chapter $chapter
|
||||||
* @return mixed|string
|
* @return mixed|string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function chapterToPdf(Chapter $chapter)
|
public function chapterToPdf(Chapter $chapter)
|
||||||
{
|
{
|
||||||
|
@ -103,6 +110,7 @@ class ExportService
|
||||||
* Convert a book to a PDF file
|
* Convert a book to a PDF file
|
||||||
* @param Book $book
|
* @param Book $book
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function bookToPdf(Book $book)
|
public function bookToPdf(Book $book)
|
||||||
{
|
{
|
||||||
|
@ -118,6 +126,7 @@ class ExportService
|
||||||
* Convert normal webpage HTML to a PDF.
|
* Convert normal webpage HTML to a PDF.
|
||||||
* @param $html
|
* @param $html
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
protected function htmlToPdf($html)
|
protected function htmlToPdf($html)
|
||||||
{
|
{
|
||||||
|
@ -146,45 +155,14 @@ class ExportService
|
||||||
// Replace image src with base64 encoded image strings
|
// Replace image src with base64 encoded image strings
|
||||||
if (isset($imageTagsOutput[0]) && count($imageTagsOutput[0]) > 0) {
|
if (isset($imageTagsOutput[0]) && count($imageTagsOutput[0]) > 0) {
|
||||||
foreach ($imageTagsOutput[0] as $index => $imgMatch) {
|
foreach ($imageTagsOutput[0] as $index => $imgMatch) {
|
||||||
$oldImgString = $imgMatch;
|
$oldImgTagString = $imgMatch;
|
||||||
$srcString = $imageTagsOutput[2][$index];
|
$srcString = $imageTagsOutput[2][$index];
|
||||||
$isLocal = strpos(trim($srcString), 'http') !== 0;
|
$imageEncoded = $this->imageService->imageUriToBase64($srcString);
|
||||||
if ($isLocal) {
|
if ($imageEncoded === null) {
|
||||||
$pathString = public_path(trim($srcString, '/'));
|
$imageEncoded = $srcString;
|
||||||
} else {
|
|
||||||
$pathString = $srcString;
|
|
||||||
}
|
}
|
||||||
|
$newImgTagString = str_replace($srcString, $imageEncoded, $oldImgTagString);
|
||||||
// Attempt to find local files even if url not absolute
|
$htmlContent = str_replace($oldImgTagString, $newImgTagString, $htmlContent);
|
||||||
$base = baseUrl('/');
|
|
||||||
if (strpos($srcString, $base) === 0) {
|
|
||||||
$isLocal = true;
|
|
||||||
$relString = str_replace($base, '', $srcString);
|
|
||||||
$pathString = public_path(trim($relString, '/'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($isLocal && !file_exists($pathString)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if ($isLocal) {
|
|
||||||
$imageContent = file_get_contents($pathString);
|
|
||||||
} else {
|
|
||||||
$ch = curl_init();
|
|
||||||
curl_setopt_array($ch, [CURLOPT_URL => $pathString, CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 5]);
|
|
||||||
$imageContent = curl_exec($ch);
|
|
||||||
$err = curl_error($ch);
|
|
||||||
curl_close($ch);
|
|
||||||
if ($err) {
|
|
||||||
throw new \Exception("Image fetch failed, Received error: " . $err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$imageEncoded = 'data:image/' . pathinfo($pathString, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageContent);
|
|
||||||
$newImageString = str_replace($srcString, $imageEncoded, $oldImgString);
|
|
||||||
} catch (\ErrorException $e) {
|
|
||||||
$newImageString = '';
|
|
||||||
}
|
|
||||||
$htmlContent = str_replace($oldImgString, $newImageString, $htmlContent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,8 @@ class ImageService extends UploadService
|
||||||
* @param Image $image
|
* @param Image $image
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
protected function isGif(Image $image) {
|
protected function isGif(Image $image)
|
||||||
|
{
|
||||||
return strtolower(pathinfo($this->getPath($image), PATHINFO_EXTENSION)) === 'gif';
|
return strtolower(pathinfo($this->getPath($image), PATHINFO_EXTENSION)) === 'gif';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,6 +321,53 @@ class ImageService extends UploadService
|
||||||
return $image;
|
return $image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a image URI to a Base64 encoded string.
|
||||||
|
* Attempts to find locally via set storage method first.
|
||||||
|
* @param string $uri
|
||||||
|
* @return null|string
|
||||||
|
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||||
|
*/
|
||||||
|
public function imageUriToBase64(string $uri)
|
||||||
|
{
|
||||||
|
$isLocal = strpos(trim($uri), 'http') !== 0;
|
||||||
|
|
||||||
|
// Attempt to find local files even if url not absolute
|
||||||
|
$base = baseUrl('/');
|
||||||
|
if (!$isLocal && strpos($uri, $base) === 0) {
|
||||||
|
$isLocal = true;
|
||||||
|
$uri = str_replace($base, '', $uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
$imageData = null;
|
||||||
|
|
||||||
|
if ($isLocal) {
|
||||||
|
$uri = trim($uri, '/');
|
||||||
|
$storage = $this->getStorage();
|
||||||
|
if ($storage->exists($uri)) {
|
||||||
|
$imageData = $storage->get($uri);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
$ch = curl_init();
|
||||||
|
curl_setopt_array($ch, [CURLOPT_URL => $uri, CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 5]);
|
||||||
|
$imageData = curl_exec($ch);
|
||||||
|
$err = curl_error($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
if ($err) {
|
||||||
|
throw new \Exception("Image fetch failed, Received error: " . $err);
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($imageData === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'data:image/' . pathinfo($uri, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a public facing url for an image by checking relevant environment variables.
|
* Gets a public facing url for an image by checking relevant environment variables.
|
||||||
* @param string $filePath
|
* @param string $filePath
|
||||||
|
|
|
@ -67,13 +67,19 @@ class PermissionService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare the local entity cache and ensure it's empty
|
* Prepare the local entity cache and ensure it's empty
|
||||||
|
* @param Entity[] $entities
|
||||||
*/
|
*/
|
||||||
protected function readyEntityCache()
|
protected function readyEntityCache($entities = [])
|
||||||
{
|
{
|
||||||
$this->entityCache = [
|
$this->entityCache = [];
|
||||||
'books' => collect(),
|
|
||||||
'chapters' => collect()
|
foreach ($entities as $entity) {
|
||||||
];
|
$type = $entity->getType();
|
||||||
|
if (!isset($this->entityCache[$type])) {
|
||||||
|
$this->entityCache[$type] = collect();
|
||||||
|
}
|
||||||
|
$this->entityCache[$type]->put($entity->id, $entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,17 +89,14 @@ class PermissionService
|
||||||
*/
|
*/
|
||||||
protected function getBook($bookId)
|
protected function getBook($bookId)
|
||||||
{
|
{
|
||||||
if (isset($this->entityCache['books']) && $this->entityCache['books']->has($bookId)) {
|
if (isset($this->entityCache['book']) && $this->entityCache['book']->has($bookId)) {
|
||||||
return $this->entityCache['books']->get($bookId);
|
return $this->entityCache['book']->get($bookId);
|
||||||
}
|
}
|
||||||
|
|
||||||
$book = $this->book->find($bookId);
|
$book = $this->book->find($bookId);
|
||||||
if ($book === null) {
|
if ($book === null) {
|
||||||
$book = false;
|
$book = false;
|
||||||
}
|
}
|
||||||
if (isset($this->entityCache['books'])) {
|
|
||||||
$this->entityCache['books']->put($bookId, $book);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $book;
|
return $book;
|
||||||
}
|
}
|
||||||
|
@ -105,17 +108,14 @@ class PermissionService
|
||||||
*/
|
*/
|
||||||
protected function getChapter($chapterId)
|
protected function getChapter($chapterId)
|
||||||
{
|
{
|
||||||
if (isset($this->entityCache['chapters']) && $this->entityCache['chapters']->has($chapterId)) {
|
if (isset($this->entityCache['chapter']) && $this->entityCache['chapter']->has($chapterId)) {
|
||||||
return $this->entityCache['chapters']->get($chapterId);
|
return $this->entityCache['chapter']->get($chapterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
$chapter = $this->chapter->find($chapterId);
|
$chapter = $this->chapter->find($chapterId);
|
||||||
if ($chapter === null) {
|
if ($chapter === null) {
|
||||||
$chapter = false;
|
$chapter = false;
|
||||||
}
|
}
|
||||||
if (isset($this->entityCache['chapters'])) {
|
|
||||||
$this->entityCache['chapters']->put($chapterId, $chapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $chapter;
|
return $chapter;
|
||||||
}
|
}
|
||||||
|
@ -179,6 +179,7 @@ class PermissionService
|
||||||
* @param Collection $books
|
* @param Collection $books
|
||||||
* @param array $roles
|
* @param array $roles
|
||||||
* @param bool $deleteOld
|
* @param bool $deleteOld
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
protected function buildJointPermissionsForBooks($books, $roles, $deleteOld = false)
|
protected function buildJointPermissionsForBooks($books, $roles, $deleteOld = false)
|
||||||
{
|
{
|
||||||
|
@ -250,7 +251,7 @@ class PermissionService
|
||||||
$this->deleteManyJointPermissionsForRoles($roles);
|
$this->deleteManyJointPermissionsForRoles($roles);
|
||||||
|
|
||||||
// Chunk through all books
|
// Chunk through all books
|
||||||
$this->bookFetchQuery()->chunk(5, function ($books) use ($roles) {
|
$this->bookFetchQuery()->chunk(20, function ($books) use ($roles) {
|
||||||
$this->buildJointPermissionsForBooks($books, $roles);
|
$this->buildJointPermissionsForBooks($books, $roles);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -279,6 +280,7 @@ class PermissionService
|
||||||
/**
|
/**
|
||||||
* Delete the entity jointPermissions for a particular entity.
|
* Delete the entity jointPermissions for a particular entity.
|
||||||
* @param Entity $entity
|
* @param Entity $entity
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function deleteJointPermissionsForEntity(Entity $entity)
|
public function deleteJointPermissionsForEntity(Entity $entity)
|
||||||
{
|
{
|
||||||
|
@ -288,6 +290,7 @@ class PermissionService
|
||||||
/**
|
/**
|
||||||
* Delete all of the entity jointPermissions for a list of entities.
|
* Delete all of the entity jointPermissions for a list of entities.
|
||||||
* @param Entity[] $entities
|
* @param Entity[] $entities
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
protected function deleteManyJointPermissionsForEntities($entities)
|
protected function deleteManyJointPermissionsForEntities($entities)
|
||||||
{
|
{
|
||||||
|
@ -314,10 +317,11 @@ class PermissionService
|
||||||
* Create & Save entity jointPermissions for many entities and jointPermissions.
|
* Create & Save entity jointPermissions for many entities and jointPermissions.
|
||||||
* @param Collection $entities
|
* @param Collection $entities
|
||||||
* @param array $roles
|
* @param array $roles
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
protected function createManyJointPermissions($entities, $roles)
|
protected function createManyJointPermissions($entities, $roles)
|
||||||
{
|
{
|
||||||
$this->readyEntityCache();
|
$this->readyEntityCache($entities);
|
||||||
$jointPermissions = [];
|
$jointPermissions = [];
|
||||||
|
|
||||||
// Fetch Entity Permissions and create a mapping of entity restricted statuses
|
// Fetch Entity Permissions and create a mapping of entity restricted statuses
|
||||||
|
@ -342,7 +346,7 @@ class PermissionService
|
||||||
// Create a mapping of role permissions
|
// Create a mapping of role permissions
|
||||||
$rolePermissionMap = [];
|
$rolePermissionMap = [];
|
||||||
foreach ($roles as $role) {
|
foreach ($roles as $role) {
|
||||||
foreach ($role->getRelationValue('permissions') as $permission) {
|
foreach ($role->permissions as $permission) {
|
||||||
$rolePermissionMap[$role->getRawAttribute('id') . ':' . $permission->getRawAttribute('name')] = true;
|
$rolePermissionMap[$role->getRawAttribute('id') . ':' . $permission->getRawAttribute('name')] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -630,16 +634,17 @@ class PermissionService
|
||||||
* @param string $tableName
|
* @param string $tableName
|
||||||
* @param string $entityIdColumn
|
* @param string $entityIdColumn
|
||||||
* @param string $entityTypeColumn
|
* @param string $entityTypeColumn
|
||||||
|
* @param string $action
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn)
|
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn, $action = 'view')
|
||||||
{
|
{
|
||||||
if ($this->isAdmin()) {
|
if ($this->isAdmin()) {
|
||||||
$this->clean();
|
$this->clean();
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->currentAction = 'view';
|
$this->currentAction = $action;
|
||||||
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
|
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
|
||||||
|
|
||||||
$q = $query->where(function ($query) use ($tableDetails) {
|
$q = $query->where(function ($query) use ($tableDetails) {
|
||||||
|
|
|
@ -67,7 +67,7 @@ class SearchService
|
||||||
* @param int $count - Count of each entity to search, Total returned could can be larger and not guaranteed.
|
* @param int $count - Count of each entity to search, Total returned could can be larger and not guaranteed.
|
||||||
* @return array[int, Collection];
|
* @return array[int, Collection];
|
||||||
*/
|
*/
|
||||||
public function searchEntities($searchString, $entityType = 'all', $page = 1, $count = 20)
|
public function searchEntities($searchString, $entityType = 'all', $page = 1, $count = 20, $action = 'view')
|
||||||
{
|
{
|
||||||
$terms = $this->parseSearchString($searchString);
|
$terms = $this->parseSearchString($searchString);
|
||||||
$entityTypes = array_keys($this->entities);
|
$entityTypes = array_keys($this->entities);
|
||||||
|
@ -87,8 +87,8 @@ class SearchService
|
||||||
if (!in_array($entityType, $entityTypes)) {
|
if (!in_array($entityType, $entityTypes)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$search = $this->searchEntityTable($terms, $entityType, $page, $count);
|
$search = $this->searchEntityTable($terms, $entityType, $page, $count, $action);
|
||||||
$entityTotal = $this->searchEntityTable($terms, $entityType, $page, $count, true);
|
$entityTotal = $this->searchEntityTable($terms, $entityType, $page, $count, $action, true);
|
||||||
if ($entityTotal > $page * $count) {
|
if ($entityTotal > $page * $count) {
|
||||||
$hasMore = true;
|
$hasMore = true;
|
||||||
}
|
}
|
||||||
|
@ -147,12 +147,13 @@ class SearchService
|
||||||
* @param string $entityType
|
* @param string $entityType
|
||||||
* @param int $page
|
* @param int $page
|
||||||
* @param int $count
|
* @param int $count
|
||||||
|
* @param string $action
|
||||||
* @param bool $getCount Return the total count of the search
|
* @param bool $getCount Return the total count of the search
|
||||||
* @return \Illuminate\Database\Eloquent\Collection|int|static[]
|
* @return \Illuminate\Database\Eloquent\Collection|int|static[]
|
||||||
*/
|
*/
|
||||||
public function searchEntityTable($terms, $entityType = 'page', $page = 1, $count = 20, $getCount = false)
|
public function searchEntityTable($terms, $entityType = 'page', $page = 1, $count = 20, $action = 'view', $getCount = false)
|
||||||
{
|
{
|
||||||
$query = $this->buildEntitySearchQuery($terms, $entityType);
|
$query = $this->buildEntitySearchQuery($terms, $entityType, $action);
|
||||||
if ($getCount) {
|
if ($getCount) {
|
||||||
return $query->count();
|
return $query->count();
|
||||||
}
|
}
|
||||||
|
@ -165,9 +166,10 @@ class SearchService
|
||||||
* Create a search query for an entity
|
* Create a search query for an entity
|
||||||
* @param array $terms
|
* @param array $terms
|
||||||
* @param string $entityType
|
* @param string $entityType
|
||||||
|
* @param string $action
|
||||||
* @return \Illuminate\Database\Eloquent\Builder
|
* @return \Illuminate\Database\Eloquent\Builder
|
||||||
*/
|
*/
|
||||||
protected function buildEntitySearchQuery($terms, $entityType = 'page')
|
protected function buildEntitySearchQuery($terms, $entityType = 'page', $action = 'view')
|
||||||
{
|
{
|
||||||
$entity = $this->getEntity($entityType);
|
$entity = $this->getEntity($entityType);
|
||||||
$entitySelect = $entity->newQuery();
|
$entitySelect = $entity->newQuery();
|
||||||
|
@ -212,7 +214,7 @@ class SearchService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, 'view');
|
return $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, $action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,11 +51,13 @@ class ViewService
|
||||||
* @param int $count
|
* @param int $count
|
||||||
* @param int $page
|
* @param int $page
|
||||||
* @param bool|false|array $filterModel
|
* @param bool|false|array $filterModel
|
||||||
|
* @param string $action - used for permission checking
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
public function getPopular($count = 10, $page = 0, $filterModel = false)
|
public function getPopular($count = 10, $page = 0, $filterModel = false, $action = 'view')
|
||||||
{
|
{
|
||||||
$skipCount = $count * $page;
|
$skipCount = $count * $page;
|
||||||
$query = $this->permissionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type')
|
$query = $this->permissionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action)
|
||||||
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
|
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
|
||||||
->groupBy('viewable_id', 'viewable_type')
|
->groupBy('viewable_id', 'viewable_type')
|
||||||
->orderBy('view_count', 'desc');
|
->orderBy('view_count', 'desc');
|
||||||
|
|
|
@ -4,12 +4,28 @@ return [
|
||||||
|
|
||||||
'env' => env('APP_ENV', 'production'),
|
'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' => [
|
'views' => [
|
||||||
'books' => env('APP_VIEWS_BOOKS', 'list')
|
'books' => env('APP_VIEWS_BOOKS', 'list')
|
||||||
],
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow <script> tags to entered within page content.
|
||||||
|
* <script> tags are escaped by default.
|
||||||
|
* Even when overridden the WYSIWYG editor may still escape script content.
|
||||||
|
*/
|
||||||
'allow_content_scripts' => env('ALLOW_CONTENT_SCRIPTS', false),
|
'allow_content_scripts' => env('ALLOW_CONTENT_SCRIPTS', false),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the default behaviour for allowing crawlers to crawl the instance.
|
||||||
|
* May be ignored if view has be overridden or modified.
|
||||||
|
* Defaults to null since, if not set, 'app-public' status used instead.
|
||||||
|
*/
|
||||||
|
'allow_robots' => env('ALLOW_ROBOTS', null),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Application Debug Mode
|
| Application Debug Mode
|
||||||
|
@ -61,7 +77,7 @@ return [
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'locale' => env('APP_LANG', 'en'),
|
'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'],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
@ -21,11 +21,11 @@ class DummyContentSeeder extends Seeder
|
||||||
$role = \BookStack\Role::getRole('viewer');
|
$role = \BookStack\Role::getRole('viewer');
|
||||||
$viewerUser->attachRole($role);
|
$viewerUser->attachRole($role);
|
||||||
|
|
||||||
factory(\BookStack\Book::class, 20)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
|
factory(\BookStack\Book::class, 5)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
|
||||||
->each(function($book) use ($editorUser) {
|
->each(function($book) use ($editorUser) {
|
||||||
$chapters = factory(\BookStack\Chapter::class, 5)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
|
$chapters = factory(\BookStack\Chapter::class, 3)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
|
||||||
->each(function($chapter) use ($editorUser, $book){
|
->each(function($chapter) use ($editorUser, $book){
|
||||||
$pages = factory(\BookStack\Page::class, 5)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id, 'book_id' => $book->id]);
|
$pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id, 'book_id' => $book->id]);
|
||||||
$chapter->pages()->saveMany($pages);
|
$chapter->pages()->saveMany($pages);
|
||||||
});
|
});
|
||||||
$pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
$pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class LargeContentSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the database seeds.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
// Create an editor user
|
||||||
|
$editorUser = factory(\BookStack\User::class)->create();
|
||||||
|
$editorRole = \BookStack\Role::getRole('editor');
|
||||||
|
$editorUser->attachRole($editorRole);
|
||||||
|
|
||||||
|
$largeBook = factory(\BookStack\Book::class)->create(['name' => 'Large book' . str_random(10), 'created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
||||||
|
$pages = factory(\BookStack\Page::class, 200)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
||||||
|
$chapters = factory(\BookStack\Chapter::class, 50)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
||||||
|
$largeBook->pages()->saveMany($pages);
|
||||||
|
$largeBook->chapters()->saveMany($chapters);
|
||||||
|
app(\BookStack\Services\PermissionService::class)->buildJointPermissions();
|
||||||
|
app(\BookStack\Services\SearchService::class)->indexAllEntities();
|
||||||
|
}
|
||||||
|
}
|
|
@ -3645,15 +3645,6 @@
|
||||||
"is-extglob": "1.0.0"
|
"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": {
|
"extract-text-webpack-plugin": {
|
||||||
"version": "4.0.0-beta.0",
|
"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",
|
"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"
|
"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": {
|
"filename-regex": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
|
||||||
|
@ -6844,11 +6825,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"moment": {
|
|
||||||
"version": "2.21.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz",
|
|
||||||
"integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ=="
|
|
||||||
},
|
|
||||||
"move-concurrently": {
|
"move-concurrently": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack",
|
"build": "webpack",
|
||||||
"production": "NODE_ENV=production webpack && rm -f ./public/dist/*styles.js",
|
"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",
|
"dev": "npm-run-all --parallel watch livereload",
|
||||||
"watch": "webpack --watch",
|
"watch": "webpack --watch",
|
||||||
"livereload": "livereload ./public/dist/",
|
"livereload": "livereload ./public/dist/",
|
||||||
|
@ -34,7 +35,6 @@
|
||||||
"jquery": "^3.3.1",
|
"jquery": "^3.3.1",
|
||||||
"markdown-it": "^8.3.1",
|
"markdown-it": "^8.3.1",
|
||||||
"markdown-it-task-lists": "^2.0.0",
|
"markdown-it-task-lists": "^2.0.0",
|
||||||
"moment": "^2.21.0",
|
|
||||||
"vue": "^2.2.6",
|
"vue": "^2.2.6",
|
||||||
"vuedraggable": "^2.14.1"
|
"vuedraggable": "^2.14.1"
|
||||||
},
|
},
|
||||||
|
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("advlist",function(a){function c(b){return a.$.contains(a.getBody(),b)}function d(a){return a&&/^(OL|UL|DL)$/.test(a.nodeName)&&c(a)}function e(a,c){var d=[];return c&&b.each(c.split(/[ ,]/),function(a){d.push({text:a.replace(/\-/g," ").replace(/\b\w/g,function(a){return a.toUpperCase()}),data:"default"==a?"":a})}),d}function f(b,c){var d="UL"==b?"InsertUnorderedList":"InsertOrderedList";a.execCommand(d,!1,c===!1?null:{"list-style-type":c})}function g(b){var c=a.dom.getStyle(a.dom.getParent(a.selection.getNode(),"ol,ul"),"listStyleType")||"";b.control.items().each(function(a){a.active(a.settings.data===c)})}var h,i,j=function(a,c){var d=a.settings.plugins?a.settings.plugins:"";return b.inArray(d.split(/[ ,]/),c)!==-1};h=e("OL",a.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman")),i=e("UL",a.getParam("advlist_bullet_styles","default,circle,disc,square"));var k=function(c){return function(){var e=this;a.on("NodeChange",function(a){var f=b.grep(a.parents,d);e.active(f.length>0&&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")()}();
|
!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;n<t.length;n++)if(e(t[n]))return n;return-1}(r.parents,l),s=-1!==i?r.parents.slice(0,i):r.parents,u=e.grep(s,a(t));o.active(u.length>0&&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))})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.Env")}),g("2",["3"],function(a){return a("tinymce.PluginManager")}),g("0",["1","2"],function(a,b){return b.add("anchor",function(b){var c=function(a){return!a.attr("href")&&(a.attr("id")||a.attr("name"))&&!a.firstChild},d=function(a){return function(b){for(var d=0;d<b.length;d++)c(b[d])&&b[d].attr("contenteditable",a)}},e=function(a){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(a)},f=function(){var a=b.selection.getNode(),c="A"==a.tagName&&""===b.dom.getAttrib(a,"href"),d="";c&&(d=a.id||a.name||""),b.windowManager.open({title:"Anchor",body:{type:"textbox",name:"id",size:40,label:"Id",value:d},onsubmit:function(d){var f=d.data.id;return e(f)?void(c?(a.removeAttribute("name"),a.id=f):(b.selection.collapse(!0),b.execCommand("mceInsertContent",!1,b.dom.createHTML("a",{id:f})))):(d.preventDefault(),void b.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."))}})};a.ceFalse&&b.on("PreInit",function(){b.parser.addNodeFilter("a",d("false")),b.serializer.addNodeFilter("a",d(null))}),b.addCommand("mceAnchor",f),b.addButton("anchor",{icon:"anchor",tooltip:"Anchor",onclick:f,stateSelector:"a:not([href])"}),b.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",onclick:f})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(t){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)},n=function(t){var e=t.selection.getNode();return"A"===e.tagName&&""===t.dom.getAttrib(e,"href")?e.id||e.name:""},o=function(t,e){var n=t.selection.getNode();"A"===n.tagName&&""===t.dom.getAttrib(n,"href")?(n.removeAttribute("name"),n.id=e):(t.focus(),t.selection.collapse(!0),t.execCommand("mceInsertContent",!1,t.dom.createHTML("a",{id:e})))},r=function(t){var r=n(t);t.windowManager.open({title:"Anchor",body:{type:"textbox",name:"id",size:40,label:"Id",value:r},onsubmit:function(n){var r,a,i=n.data.id;r=t,(e(a=i)?(o(r,a),0):(r.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))&&n.preventDefault()}})},a=function(t){t.addCommand("mceAnchor",function(){r(t)})},i=function(t){return function(e){for(var n=0;n<e.length;n++)(o=e[n]).attr("href")||!o.attr("id")&&!o.attr("name")||o.firstChild||e[n].attr("contenteditable",t);var o}},c=function(t){t.on("PreInit",function(){t.parser.addNodeFilter("a",i("false")),t.serializer.addNodeFilter("a",i(null))})},d=function(t){t.addButton("anchor",{icon:"anchor",tooltip:"Anchor",cmd:"mceAnchor",stateSelector:"a:not([href])"}),t.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",cmd:"mceAnchor"})};t.add("anchor",function(t){c(t),a(t),d(t)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.Env")}),g("2",["3"],function(a){return a("tinymce.PluginManager")}),g("0",["1","2"],function(a,b){var c=function(a,b){return a===b||" "===a||160===a.charCodeAt(0)};return b.add("autolink",function(b){function d(a){g(a,-1,"(",!0)}function e(a){g(a,0,"",!0)}function f(a){g(a,-1,"",!1)}function g(a,b,d){function e(a,b){if(b<0&&(b=0),3==a.nodeType){var c=a.data.length;b>c&&(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")()}();
|
!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)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("5",tinymce.util.Tools.resolve),g("1",["5"],function(a){return a("tinymce.dom.DOMUtils")}),g("2",["5"],function(a){return a("tinymce.Env")}),g("3",["5"],function(a){return a("tinymce.PluginManager")}),g("4",["5"],function(a){return a("tinymce.util.Delay")}),g("0",["1","2","3","4"],function(a,b,c,d){var e=a.DOM;return c.add("autoresize",function(a){function c(){return a.plugins.fullscreen&&a.plugins.fullscreen.isFullscreen()}function f(d){var g,j,k,l,m,n,o,p,q,r,s,t;if(j=a.getDoc()){if(k=j.body,l=j.documentElement,m=h.autoresize_min_height,!k||d&&"setcontent"===d.type&&d.initial||c())return void(k&&l&&(k.style.overflowY="auto",l.style.overflowY="auto"));o=a.dom.getStyle(k,"margin-top",!0),p=a.dom.getStyle(k,"margin-bottom",!0),q=a.dom.getStyle(k,"padding-top",!0),r=a.dom.getStyle(k,"padding-bottom",!0),s=a.dom.getStyle(k,"border-top-width",!0),t=a.dom.getStyle(k,"border-bottom-width",!0),n=k.offsetHeight+parseInt(o,10)+parseInt(p,10)+parseInt(q,10)+parseInt(r,10)+parseInt(s,10)+parseInt(t,10),(isNaN(n)||n<=0)&&(n=b.ie?k.scrollHeight:b.webkit&&0===k.clientHeight?0:k.offsetHeight),n>h.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")()}();
|
!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)}})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("6",tinymce.util.Tools.resolve),g("1",["6"],function(a){return a("tinymce.EditorManager")}),g("2",["6"],function(a){return a("tinymce.PluginManager")}),g("3",["6"],function(a){return a("tinymce.util.LocalStorage")}),g("4",["6"],function(a){return a("tinymce.util.Tools")}),h("5",window),g("0",["1","2","3","4","5"],function(a,b,c,d,e){return a._beforeUnloadHandler=function(){var b;return d.each(a.get(),function(a){a.plugins.autosave&&a.plugins.autosave.storeDraft(),!b&&a.isDirty()&&a.getParam("autosave_ask_before_unload",!0)&&(b=a.translate("You have unsaved changes are you sure you want to navigate away?"))}),b},b.add("autosave",function(b){function f(a,b){var c={s:1e3,m:6e4};return a=/^(\d+)([ms]?)$/.exec(""+(a||b)),(a[2]?c[a[2]]:1)*parseInt(a,10)}function g(){var a=parseInt(c.getItem(o+"time"),10)||0;return!((new Date).getTime()-a>q.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]|<br[^>]*>)+?|)</"+c+">|<br>$","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")()}();
|
!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]|<br[^>]*>)+?|)</"+r+">|<br>$","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)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("bbcode",function(){return{init:function(a){var b=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.on("beforeSetContent",function(a){a.content=b["_"+c+"_bbcode2html"](a.content)}),a.on("postProcess",function(a){a.set&&(a.content=b["_"+c+"_bbcode2html"](a.content)),a.get&&(a.content=b["_"+c+"_html2bbcode"](a.content))})},getInfo:function(){return{longname:"BBCode Plugin",author:"Ephox Corp",authorurl:"http://www.tinymce.com",infourl:"http://www.tinymce.com/wiki.php/Plugin:bbcode"}},_punbb_html2bbcode:function(a){function c(b,c){a=a.replace(b,c)}return a=b.trim(a),c(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),c(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),c(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),c(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),c(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),c(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),c(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),c(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),c(/<font>(.*?)<\/font>/gi,"$1"),c(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),c(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),c(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),c(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),c(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),c(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),c(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),c(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),c(/<u class=\"quoteStyle\">(.*?)<\/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 style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),c(/<u>/gi,"[u]"),c(/<blockquote[^>]*>/gi,"[quote]"),c(/<\/blockquote>/gi,"[/quote]"),c(/<br \/>/gi,"\n"),c(/<br\/>/gi,"\n"),c(/<br>/gi,"\n"),c(/<p>/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,"<br />"),c(/\[b\]/gi,"<strong>"),c(/\[\/b\]/gi,"</strong>"),c(/\[i\]/gi,"<em>"),c(/\[\/i\]/gi,"</em>"),c(/\[u\]/gi,"<u>"),c(/\[\/u\]/gi,"</u>"),c(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),c(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),c(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),c(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),c(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span> '),c(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span> '),a}}}),function(){}}),d("0")()}();
|
!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.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/<font>(.*?)<\/font>/gi,"$1"),e(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),e(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),e(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/<u class=\"quoteStyle\">(.*?)<\/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 style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),e(/<u>/gi,"[u]"),e(/<blockquote[^>]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/<br \/>/gi,"\n"),e(/<br\/>/gi,"\n"),e(/<br>/gi,"\n"),e(/<p>/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,"<br />"),e(/\[b\]/gi,"<strong>"),e(/\[\/b\]/gi,"</strong>"),e(/\[i\]/gi,"<em>"),e(/\[\/i\]/gi,"</em>"),e(/\[u\]/gi,"<u>"),e(/\[\/u\]/gi,"</u>"),e(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),e(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),e(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),e(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),e(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span> '),e(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span> '),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))})}}})}();
|
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.dom.DOMUtils")}),g("2",["3"],function(a){return a("tinymce.PluginManager")}),g("0",["1","2"],function(a,b){return b.add("code",function(b){function c(){var c=b.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:b.getParam("code_dialog_width",600),minHeight:b.getParam("code_dialog_height",Math.min(a.DOM.getViewPort().h-200,500)),spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(a){b.focus(),b.undoManager.transact(function(){b.setContent(a.data.code)}),b.selection.setCursorLocation(),b.nodeChanged()}});c.find("#code").value(b.getContent({source_view:!0}))}b.addCommand("mceCodeEditor",c),b.addButton("code",{icon:"code",tooltip:"Source code",onclick:c}),b.addMenuItem("code",{icon:"code",text:"Source code",context:"tools",onclick:c})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),e=function(t){return t.getParam("code_dialog_width",600)},o=function(t){return t.getParam("code_dialog_height",Math.min(n.DOM.getViewPort().h-200,500))},i=function(t,n){t.focus(),t.undoManager.transact(function(){t.setContent(n)}),t.selection.setCursorLocation(),t.nodeChanged()},c=function(t){return t.getContent({source_view:!0})},d=function(t){var n=e(t),d=o(t);t.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:n,minHeight:d,spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(n){i(t,n.data.code)}}).find("#code").value(c(t))},u=function(t){t.addCommand("mceCodeEditor",function(){d(t)})},a=function(t){t.addButton("code",{icon:"code",tooltip:"Source code",onclick:function(){d(t)}}),t.addMenuItem("code",{icon:"code",text:"Source code",onclick:function(){d(t)}})};t.add("code",function(t){return u(t),a(t),{}})}();
|
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Color")}),g("0",["1","2"],function(a,b){return a.add("colorpicker",function(a){function c(c,d){function e(a){var c=new b(a),d=c.toRgb();g.fromJSON({r:d.r,g:d.g,b:d.b,hex:c.toHex().substr(1)}),f(c.toHex())}function f(a){g.find("#preview")[0].getEl().style.background=a}var g=a.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:d,onchange:function(){var a=this.rgb();g&&(g.find("#r").value(a.r),g.find("#g").value(a.g),g.find("#b").value(a.b),g.find("#hex").value(this.value().substr(1)),f(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var a,b,c=g.find("colorpicker")[0];return a=this.name(),b=this.value(),"hex"==a?(b="#"+b,e(b),void c.value(b)):(b={r:g.find("#r").value(),g:g.find("#g").value(),b:g.find("#b").value()},c.value(b),void e(b))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){c("#"+this.toJSON().hex)}});e(d)}a.settings.color_picker_callback||(a.settings.color_picker_callback=c)}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Color"),i=function(e,n){e.find("#preview")[0].getEl().style.background=n},t=function(e,t){var l=n(t),a=l.toRgb();e.fromJSON({r:a.r,g:a.g,b:a.b,hex:l.toHex().substr(1)}),i(e,l.toHex())},l=function(e,n,l){var a=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:l,onchange:function(){var e=this.rgb();a&&(a.find("#r").value(e.r),a.find("#g").value(e.g),a.find("#b").value(e.b),a.find("#hex").value(this.value().substr(1)),i(a,this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,n,i=a.find("colorpicker")[0];if(e=this.name(),n=this.value(),"hex"===e)return t(a,n="#"+n),void i.value(n);n={r:a.find("#r").value(),g:a.find("#g").value(),b:a.find("#b").value()},i.value(n),t(a,n)}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){n("#"+a.toJSON().hex)}});t(a,l)};e.add("colorpicker",function(e){e.settings.color_picker_callback||(e.settings.color_picker_callback=function(n,i){l(e,n,i)})})}();
|
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("directionality",function(a){function c(c){var d,e=a.dom,f=a.selection.getSelectedBlocks();f.length&&(d=e.getAttrib(f[0],"dir"),b.each(f,function(a){e.getParent(a.parentNode,"*[dir='"+c+"']",e.getRoot())||(d!=c?e.setAttrib(a,"dir",c):e.setAttrib(a,"dir",null))}),a.nodeChanged())}function d(a){var c=[];return b.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(b){c.push(b+"[dir="+a+"]")}),c.join(",")}a.addCommand("mceDirectionLTR",function(){c("ltr")}),a.addCommand("mceDirectionRTL",function(){c("rtl")}),a.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:d("ltr")}),a.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:d("rtl")})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,i){var n,o=t.dom,c=t.selection.getSelectedBlocks();c.length&&(n=o.getAttrib(c[0],"dir"),e.each(c,function(t){o.getParent(t.parentNode,'*[dir="'+i+'"]',o.getRoot())||o.setAttrib(t,"dir",n!==i?i:null)}),t.nodeChanged())},n=function(t){t.addCommand("mceDirectionLTR",function(){i(t,"ltr")}),t.addCommand("mceDirectionRTL",function(){i(t,"rtl")})},o=function(t){var i=[];return e.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(e){i.push(e+"[dir="+t+"]")}),i.join(",")},c=function(t){t.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:o("ltr")}),t.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:o("rtl")})};t.add("directionality",function(t){n(t),c(t)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("emoticons",function(a,c){function d(){var a;return a='<table role="list" class="mce-grid">',b.each(e,function(d){a+="<tr>",b.each(d,function(b){var d=c+"/img/smiley-"+b+".gif";a+='<td><a href="#" data-mce-url="'+d+'" data-mce-alt="'+b+'" tabindex="-1" role="option" aria-label="'+b+'"><img src="'+d+'" style="width: 18px; height: 18px" role="presentation" /></a></td>'}),a+="</tr>"}),a+="</table>"}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('<img src="'+c.getAttribute("data-mce-url")+'" alt="'+c.getAttribute("data-mce-alt")+'" />'),this.hide())}},tooltip:"Emoticons"})}),function(){}}),d("0")()}();
|
!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='<table role="list" class="mce-grid">',e.each(i,function(i){o+="<tr>",e.each(i,function(e){var i=t+"/img/smiley-"+e+".gif";o+='<td><a href="#" data-mce-url="'+i+'" data-mce-alt="'+e+'" tabindex="-1" role="option" aria-label="'+e+'"><img src="'+i+'" style="width: 18px; height: 18px" role="presentation" /></a></td>'}),o+="</tr>"}),o+="</table>"},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)})}();
|
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.dom.DOMUtils")}),g("2",["3"],function(a){return a("tinymce.PluginManager")}),g("0",["1","2"],function(a,b){var c=a.DOM;return b.add("fullscreen",function(a){function b(){var a,b,c=window,d=document,e=d.body;return e.offsetWidth&&(a=e.offsetWidth,b=e.offsetHeight),c.innerWidth&&c.innerHeight&&(a=c.innerWidth,b=c.innerHeight),{w:a,h:b}}function d(){var a=c.getViewPort();return{x:a.x,y:a.y}}function e(a){window.scrollTo(a.x,a.y)}function f(){function f(){c.setStyle(p,"height",b().h-(o.clientHeight-p.clientHeight))}var n,o,p,q,r=document.body,s=document.documentElement;m=!m,o=a.getContainer(),n=o.style,p=a.getContentAreaContainer().firstChild,q=p.style,m?(l=d(),g=q.width,h=q.height,q.width=q.height="100%",j=n.width,k=n.height,n.width=n.height="",c.addClass(r,"mce-fullscreen"),c.addClass(s,"mce-fullscreen"),c.addClass(o,"mce-fullscreen"),c.bind(window,"resize",f),f(),i=f):(q.width=g,q.height=h,j&&(n.width=j),k&&(n.height=k),c.removeClass(r,"mce-fullscreen"),c.removeClass(s,"mce-fullscreen"),c.removeClass(o,"mce-fullscreen"),c.unbind(window,"resize",i),e(l)),a.fire("FullscreenStateChanged",{state:m})}var g,h,i,j,k,l,m=!1;if(!a.settings.inline)return a.on("init",function(){a.addShortcut("Ctrl+Shift+F","",f)}),a.on("remove",function(){i&&c.unbind(window,"resize",i)}),a.addCommand("mceFullScreen",f),a.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,onClick:function(){f(),a.focus()},onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})},context:"view"}),a.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Ctrl+Shift+F",onClick:f,onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})}}),{isFullscreen:function(){return m}}}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=function(n){var t=n,i=function(){return t};return{get:i,set:function(e){t=e},clone:function(){return e(i())}}},n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e){return{isFullscreen:function(){return null!==e.get()}}},i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r=function(e,n){e.fire("FullscreenStateChanged",{state:n})},l=i.DOM,o=function(e,n){var t,i,o,c,s,u,d=document.body,a=document.documentElement,h=n.get(),f=function(){var e,n,t,r;l.setStyle(o,"height",(t=window,r=document.body,r.offsetWidth&&(e=r.offsetWidth,n=r.offsetHeight),t.innerWidth&&t.innerHeight&&(e=t.innerWidth,n=t.innerHeight),{w:e,h:n}).h-(i.clientHeight-o.clientHeight))},m=function(){l.unbind(window,"resize",f)};if(t=(i=e.getContainer()).style,c=(o=e.getContentAreaContainer().firstChild).style,h)c.width=h.iframeWidth,c.height=h.iframeHeight,h.containerWidth&&(t.width=h.containerWidth),h.containerHeight&&(t.height=h.containerHeight),l.removeClass(d,"mce-fullscreen"),l.removeClass(a,"mce-fullscreen"),l.removeClass(i,"mce-fullscreen"),s=h.scrollPos,window.scrollTo(s.x,s.y),l.unbind(window,"resize",h.resizeHandler),e.off("remove",h.removeHandler),n.set(null),r(e,!1);else{var g={scrollPos:(u=l.getViewPort(),{x:u.x,y:u.y}),containerWidth:t.width,containerHeight:t.height,iframeWidth:c.width,iframeHeight:c.height,resizeHandler:f,removeHandler:m};c.width=c.height="100%",t.width=t.height="",l.addClass(d,"mce-fullscreen"),l.addClass(a,"mce-fullscreen"),l.addClass(i,"mce-fullscreen"),l.bind(window,"resize",f),e.on("remove",m),f(),n.set(g),r(e,!0)}},c=function(e,n){e.addCommand("mceFullScreen",function(){o(e,n)})},s=function(e){return function(n){var t=n.control;e.on("FullscreenStateChanged",function(e){t.active(e.state)})}},u=function(e){e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,cmd:"mceFullScreen",onPostRender:s(e),context:"view"}),e.addButton("fullscreen",{active:!1,tooltip:"Fullscreen",cmd:"mceFullScreen",onPostRender:s(e)})};n.add("fullscreen",function(n){var i=e(null);return n.settings.inline?t(i):(c(n,i),u(n),n.addShortcut("Ctrl+Shift+F","","mceFullScreen"),t(i))})}();
|
Binary file not shown.
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 13 KiB |
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("2",tinymce.util.Tools.resolve),g("1",["2"],function(a){return a("tinymce.PluginManager")}),g("0",["1"],function(a){return a.add("hr",function(a){a.addCommand("InsertHorizontalRule",function(){a.execCommand("mceInsertContent",!1,"<hr />")}),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")()}();
|
!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"<hr />")})},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)})}();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("6",tinymce.util.Tools.resolve),g("1",["6"],function(a){return a("tinymce.EditorManager")}),g("2",["6"],function(a){return a("tinymce.dom.DOMUtils")}),g("3",["6"],function(a){return a("tinymce.Env")}),g("4",["6"],function(a){return a("tinymce.PluginManager")}),g("5",["6"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2","3","4","5"],function(a,b,c,d,e){return d.add("importcss",function(d){function f(a){var b=c.cacheSuffix;return"string"==typeof a&&(a=a.replace("?"+b,"").replace("&"+b,"")),a}function g(b){var c=d.settings,e=c.skin!==!1&&(c.skin||"lightgray");if(e){var f=c.skin_url;return f=f?d.documentBaseURI.toAbsolute(f):a.baseURL+"/skins/"+e,b===f+"/content"+(d.inline?".inline":"")+".min.css"}return!1}function h(a){return"string"==typeof a?function(b){return b.indexOf(a)!==-1}:a instanceof RegExp?function(b){return a.test(b)}:a}function i(a,b){function c(a,d){var i,j=a.href;if(j=f(j),j&&b(j,d)&&!g(j)){r(a.imports,function(a){c(a,!0)});try{i=a.cssRules||a.rules}catch(a){}r(i,function(a){a.styleSheet?c(a.styleSheet,!0):a.selectorText&&r(a.selectorText.split(","),function(a){h.push(e.trim(a))})})}}var h=[],i={};r(d.contentCSS,function(a){i[a]=!0}),b||(b=function(a,b){return b||i[a]});try{r(a.styleSheets,function(a){c(a)})}catch(a){}return h}function j(a){var b,c=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(a);if(c){var f=c[1],g=c[2].substr(1).split(".").join(" "),h=e.makeMap("a,img");return c[1]?(b={title:a},d.schema.getTextBlockElements()[f]?b.block=f:d.schema.getBlockElements()[f]||h[f.toLowerCase()]?b.selector=f:b.inline=f):c[2]&&(b={inline:"span",title:a.substr(1),classes:g}),d.settings.importcss_merge_classes!==!1?b.classes=g:b.attributes={"class":g},b}}function k(a,b){return e.grep(a,function(a){return!a.filter||a.filter(b)})}function l(a){return e.map(a,function(a){return e.extend({},a,{original:a,selectors:{},filter:h(a.filter),item:{text:a.title,menu:[]}})})}function m(a,b){return null===b||a.settings.importcss_exclusive!==!1}function n(a,b,c){return!(m(d,b)?a in c:a in b.selectors)}function o(a,b,c){m(d,b)?c[a]=!0:b.selectors[a]=!0}function p(a,b,c){var e,f=d.settings;return e=c&&c.selector_converter?c.selector_converter:f.importcss_selector_converter?f.importcss_selector_converter:j,e.call(a,b,c)}var q=this,r=e.each;d.on("renderFormatsMenu",function(a){var c=d.settings,f={},g=h(c.importcss_selector_filter),j=a.control,m=l(c.importcss_groups),s=function(a,c){if(n(a,c,f)){o(a,c,f);var g=p(q,a,c);if(g){var h=g.name||b.DOM.uniqueId();return d.formatter.register(h,g),e.extend({},j.settings.itemDefaults,{text:g.title,format:h})}}return null};d.settings.importcss_append||j.items().remove(),r(i(a.doc||d.getDoc(),h(c.importcss_file_filter)),function(a){if(a.indexOf(".mce-")===-1&&(!g||g(a))){var b=k(m,a);if(b.length>0)e.each(b,function(b){var c=s(a,b);c&&b.item.menu.push(c)});else{var c=s(a,null);c&&j.add(c)}}}),r(m,function(a){a.item.menu.length>0&&j.add(a.item)}),a.control.renderNew()}),q.convertSelectorToFormat=j}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=tinymce.util.Tools.resolve("tinymce.EditorManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(e){return e.getParam("importcss_merge_classes")},o=function(e){return e.getParam("importcss_exclusive")},s=function(e){return e.getParam("importcss_selector_converter")},u=function(e){return e.getParam("importcss_selector_filter")},l=function(e){return e.getParam("importcss_groups")},a=function(e){return e.getParam("importcss_append")},f=function(e){return e.getParam("importcss_file_filter")},m=function(e){var t=r.cacheSuffix;return"string"==typeof e&&(e=e.replace("?"+t,"").replace("&"+t,"")),e},g=function(e,t){var r=e.settings,i=!1!==r.skin&&(r.skin||"lightgray");return!!i&&t===(r.skin_url?e.documentBaseURI.toAbsolute(r.skin_url):n.baseURL+"/skins/"+i)+"/content"+(e.inline?".inline":"")+".min.css"},p=function(e){return"string"==typeof e?function(t){return-1!==t.indexOf(e)}:e instanceof RegExp?function(t){return e.test(t)}:e},v=function(e,t,n){var r=[],c={};i.each(e.contentCSS,function(e){c[e]=!0}),n||(n=function(e,t){return t||c[e]});try{i.each(t.styleSheets,function(t){!function c(t,o){var s,u=t.href;if((u=m(u))&&n(u,o)&&!g(e,u)){i.each(t.imports,function(e){c(e,!0)});try{s=t.cssRules||t.rules}catch(l){}i.each(s,function(e){e.styleSheet?c(e.styleSheet,!0):e.selectorText&&i.each(e.selectorText.split(","),function(e){r.push(i.trim(e))})})}}(t)})}catch(o){}return r},h=function(e,t){var n,r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(r){var o=r[1],s=r[2].substr(1).split(".").join(" "),u=i.makeMap("a,img");return r[1]?(n={title:t},e.schema.getTextBlockElements()[o]?n.block=o:e.schema.getBlockElements()[o]||u[o.toLowerCase()]?n.selector=o:n.inline=o):r[2]&&(n={inline:"span",title:t.substr(1),classes:s}),!1!==c(e)?n.classes=s:n.attributes={"class":s},n}},d=function(e,t){return null===t||!1!==o(e)},y=h,_=function(e){e.on("renderFormatsMenu",function(n){var r,c={},o=p(u(e)),m=n.control,g=(r=l(e),i.map(r,function(e){return i.extend({},e,{original:e,selectors:{},filter:p(e.filter),item:{text:e.title,menu:[]}})})),y=function(n,r){if(_=n,T=c,!(d(e,x=r)?_ in T:_ in x.selectors)){p=n,y=c,d(e,v=r)?y[p]=!0:v.selectors[p]=!0;var o=(l=e,a=e.plugins.importcss,f=n,((g=r)&&g.selector_converter?g.selector_converter:s(l)?s(l):function(){return h(l,f)}).call(a,f,g));if(o){var u=o.name||t.DOM.uniqueId();return e.formatter.register(u,o),i.extend({},m.settings.itemDefaults,{text:o.title,format:u})}}var l,a,f,g,p,v,y,_,x,T;return null};a(e)||m.items().remove(),i.each(v(e,n.doc||e.getDoc(),p(f(e))),function(e){if(-1===e.indexOf(".mce-")&&(!o||o(e))){var t=(r=g,c=e,i.grep(r,function(e){return!e.filter||e.filter(c)}));if(t.length>0)i.each(t,function(t){var n=y(e,t);n&&t.item.menu.push(n)});else{var n=y(e,null);n&&m.add(n)}}var r,c}),i.each(g,function(e){e.item.menu.length>0&&m.add(e.item)}),n.control.renderNew()})},x=function(e){return{convertSelectorToFormat:function(t){return y(e,t)}}};e.add("importcss",function(e){return _(e),x(e)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("insertdatetime",function(a){function c(b,c){function d(a,b){if(a=""+a,a.length<b)for(var c=0;c<b-a.length;c++)a="0"+a;return a}return c=c||new Date,b=b.replace("%D","%m/%d/%Y"),b=b.replace("%r","%I:%M:%S %p"),b=b.replace("%Y",""+c.getFullYear()),b=b.replace("%y",""+c.getYear()),b=b.replace("%m",d(c.getMonth()+1,2)),b=b.replace("%d",d(c.getDate(),2)),b=b.replace("%H",""+d(c.getHours(),2)),b=b.replace("%M",""+d(c.getMinutes(),2)),b=b.replace("%S",""+d(c.getSeconds(),2)),b=b.replace("%I",""+((c.getHours()+11)%12+1)),b=b.replace("%p",""+(c.getHours()<12?"AM":"PM")),b=b.replace("%B",""+a.translate(j[c.getMonth()])),b=b.replace("%b",""+a.translate(i[c.getMonth()])),b=b.replace("%A",""+a.translate(h[c.getDay()])),b=b.replace("%a",""+a.translate(g[c.getDay()])),b=b.replace("%%","%")}function d(b){var d=c(b);if(a.settings.insertdatetime_element){var e;e=c(/%[HMSIp]/.test(b)?"%Y-%m-%dT%H:%M":"%Y-%m-%d"),d='<time datetime="'+e+'">'+d+"</time>";var f=a.dom.getParent(a.selection.getStart(),"time");if(f)return void a.dom.setOuterHTML(f,d)}a.insertContent(d)}var e,f,g="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),h="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),j="January February March April May June July August September October November December".split(" "),k=[];a.addCommand("mceInsertDate",function(){d(a.getParam("insertdatetime_dateformat",a.translate("%Y-%m-%d")))}),a.addCommand("mceInsertTime",function(){d(a.getParam("insertdatetime_timeformat",a.translate("%H:%M:%S")))}),a.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",onclick:function(){d(e||f)},menu:k}),b.each(a.settings.insertdatetime_formats||["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"],function(a){f||(f=a),k.push({text:c(a),onclick:function(){e=a,d(a)}})}),a.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:k,context:"insert"})}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=function(t){var n=t,r=function(){return n};return{get:r,set:function(e){n=e},clone:function(){return e(r())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},r=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},a=function(e){return e.getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d"))},i=n,o=r,u=function(e){var t=r(e);return t.length>0?t[0]:n(e)},c=function(e){return e.getParam("insertdatetime_element",!1)},l="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),m="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),s="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),d="January February March April May June July August September October November December".split(" "),p=function(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e},f=function(e,t,n){return n=n||new Date,t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",p(n.getMonth()+1,2))).replace("%d",p(n.getDate(),2))).replace("%H",""+p(n.getHours(),2))).replace("%M",""+p(n.getMinutes(),2))).replace("%S",""+p(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(d[n.getMonth()]))).replace("%b",""+e.translate(s[n.getMonth()]))).replace("%A",""+e.translate(m[n.getDay()]))).replace("%a",""+e.translate(l[n.getDay()]))).replace("%%","%")},g=function(e,t){if(c(e)){var n=f(e,t),r=void 0;r=/%[HMSIp]/.test(t)?f(e,"%Y-%m-%dT%H:%M"):f(e,"%Y-%m-%d");var a=e.dom.getParent(e.selection.getStart(),"time");a?(o=a,u=r,l=n,m=(i=e).dom.create("time",{datetime:u},l),o.parentNode.insertBefore(m,o),i.dom.remove(o),i.selection.select(m,!0),i.selection.collapse(!1)):e.insertContent('<time datetime="'+r+'">'+n+"</time>")}else e.insertContent(f(e,t));var i,o,u,l,m},y=f,M=function(e){e.addCommand("mceInsertDate",function(){g(e,a(e))}),e.addCommand("mceInsertTime",function(){g(e,i(e))})},v=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=function(e,t){var n,r,a,i=(r=t,a=o(n=e),v.map(a,function(e){return{text:y(n,e),onclick:function(){r.set(e),g(n,e)}}}));e.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",menu:i,onclick:function(){var n=t.get();g(e,n||u(e))}}),e.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:i,context:"insert"})};t.add("insertdatetime",function(t){var n=e(null);M(t),S(t,n)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("legacyoutput",function(a,c,d){a.settings.inline_styles=!1,a.on("init",function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",d=b.explode(a.settings.font_size_style_values),e=a.schema;a.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignjustify:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(a){return b.inArray(d,a.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}}),b.each("b,i,u,strike".split(","),function(a){e.addValidElements(a+"[*]")}),e.getElementRule("font")||e.addValidElements("font[face|size|color|style]"),b.each(c.split(","),function(a){var b=e.getElementRule(a);b&&(b.attributes.align||(b.attributes.align={},b.attributesOrder.push("align")))})}),a.addButton("fontsizeselect",function(){var b=[],c="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7",d=a.settings.fontsizeFormats||c;return a.$.each(d.split(" "),function(a,c){var d=c,e=c,f=c.split("=");f.length>1&&(d=f[0],e=f[1]),b.push({text:d,value:e})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:b,fixedWidth:!0,onPostRender:function(){var b=this;a.on("NodeChange",function(){var c;c=a.dom.getParent(a.selection.getNode(),"font"),c?b.value(c.size):b.value("")})},onclick:function(b){b.control.settings.value&&a.execCommand("FontSize",!1,b.control.settings.value)}}}),a.addButton("fontselect",function(){function b(a){a=a.replace(/;$/,"").split(";");for(var b=a.length;b--;)a[b]=a[b].split("=");return a}var c="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",e=[],f=b(a.settings.font_formats||c);return d.each(f,function(a,b){e.push({text:{raw:b[0]},value:b[1],textStyle:b[1].indexOf("dings")==-1?"font-family:"+b[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:e,fixedWidth:!0,onPostRender:function(){var b=this;a.on("NodeChange",function(){var c;c=a.dom.getParent(a.selection.getNode(),"font"),c?b.value(c.face):b.value("")})},onselect:function(b){b.control.settings.value&&a.execCommand("FontName",!1,b.control.settings.value)}}})}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(e){e.settings.inline_styles=!1,e.on("init",function(){var n,i,a,o;n=e,i="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",a=t.explode(n.settings.font_size_style_values),o=n.schema,n.formatter.register({alignleft:{selector:i,attributes:{align:"left"}},aligncenter:{selector:i,attributes:{align:"center"}},alignright:{selector:i,attributes:{align:"right"}},alignjustify:{selector:i,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(e){return t.inArray(a,e.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}}),t.each("b,i,u,strike".split(","),function(e){o.addValidElements(e+"[*]")}),o.getElementRule("font")||o.addValidElements("font[face|size|color|style]"),t.each(i.split(","),function(e){var t=o.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})},i=function(e){e.addButton("fontsizeselect",function(){var t=[],n=e.settings.fontsizeFormats||"8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7";return e.$.each(n.split(" "),function(e,n){var i=n,a=n,o=n.split("=");o.length>1&&(i=o[0],a=o[1]),t.push({text:i,value:a})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:t,fixedWidth:!0,onPostRender:function(){var t=this;e.on("NodeChange",function(){var n;(n=e.dom.getParent(e.selection.getNode(),"font"))?t.value(n.size):t.value("")})},onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addButton("fontselect",function(){var t=[],n=function(e){for(var t=(e=e.replace(/;$/,"").split(";")).length;t--;)e[t]=e[t].split("=");return e}(e.settings.font_formats||"Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats");return e.$.each(n,function(e,n){t.push({text:{raw:n[0]},value:n[1],textStyle:-1===n[1].indexOf("dings")?"font-family:"+n[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:t,fixedWidth:!0,onPostRender:function(){var t=this;e.on("NodeChange",function(){var n;(n=e.dom.getParent(e.selection.getNode(),"font"))?t.value(n.face):t.value("")})},onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}})};e.add("legacyoutput",function(e){n(e),i(e)})}();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("2",tinymce.util.Tools.resolve),g("1",["2"],function(a){return a("tinymce.PluginManager")}),g("0",["1"],function(a){return a.add("nonbreaking",function(a){var b=a.getParam("nonbreaking_force_tab"),c=function(a,b){for(var c="",d=0;d<b;d++)c+=a;return c},d=function(b){var d=a.plugins.visualchars&&a.plugins.visualchars.state?'<span class="mce-nbsp"> </span>':" ";a.insertContent(c(d,b)),a.dom.setAttrib(a.dom.select("span.mce-nbsp"),"data-mce-bogus","1")};if(a.addCommand("mceNonBreaking",function(){d(1)}),a.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),a.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),b){var e=+b>1?+b:3;a.on("keydown",function(a){if(9==a.keyCode){if(a.shiftKey)return;a.preventDefault(),d(e)}})}}),function(){}}),d("0")()}();
|
!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(n,e){var t,a=(t=n).plugins.visualchars&&t.plugins.visualchars.isEnabled()?'<span class="mce-nbsp"> </span>':" ";n.insertContent(function(n,e){for(var t="",a=0;a<e;a++)t+=n;return t}(a,e)),n.dom.setAttrib(n.dom.select("span.mce-nbsp"),"data-mce-bogus","1")},t=function(n){n.addCommand("mceNonBreaking",function(){e(n,1)})},a=tinymce.util.Tools.resolve("tinymce.util.VK"),i=function(n){var e=n.getParam("nonbreaking_force_tab",0);return"boolean"==typeof e?!0===e?3:0:e},o=function(n){var t=i(n);t>0&&n.on("keydown",function(i){if(i.keyCode===a.TAB&&!i.isDefaultPrevented()){if(i.shiftKey)return;i.preventDefault(),i.stopImmediatePropagation(),e(n,t)}})},r=function(n){n.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),n.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"})};n.add("nonbreaking",function(n){t(n),r(n),o(n)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2"],function(a,b){return a.add("noneditable",function(a){function c(a){return function(b){return(" "+b.attr("class")+" ").indexOf(a)!==-1}}function d(c){function d(b){var c=arguments,d=c[c.length-2],e=d>0?h.charAt(d-1):"";if('"'===e)return b;if(">"===e){var f=h.lastIndexOf("<",d);if(f!==-1){var g=h.substring(f,d);if(g.indexOf('contenteditable="false"')!==-1)return b}}return'<span class="'+i+'" data-mce-content="'+a.dom.encode(c[0])+'">'+a.dom.encode("string"==typeof c[1]?c[1]:c[0])+"</span>"}var e=g.length,h=c.content,i=b.trim(f);if("raw"!=c.format){for(;e--;)h=h.replace(g[e],d);c.content=h}}var e,f,g,h="contenteditable";e=" "+b.trim(a.getParam("noneditable_editable_class","mceEditable"))+" ",f=" "+b.trim(a.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";var i=c(e),j=c(f);g=a.getParam("noneditable_regexp"),g&&!g.length&&(g=[g]),a.on("PreInit",function(){g&&a.on("BeforeSetContent",d),a.parser.addAttributeFilter("class",function(a){for(var b,c=a.length;c--;)b=a[c],i(b)?b.attr(h,"true"):j(b)&&b.attr(h,"false")}),a.serializer.addAttributeFilter(h,function(a){for(var b,c=a.length;c--;)b=a[c],(i(b)||j(b))&&(g&&b.attr("data-mce-content")?(b.name="#text",b.type=3,b.raw=!0,b.value=b.attr("data-mce-content")):b.attr(h,null))})})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(t){return t.getParam("noneditable_noneditable_class","mceNonEditable")},r=function(t){return t.getParam("noneditable_editable_class","mceEditable")},a=function(t){var n=t.getParam("noneditable_regexp",[]);return n&&n.constructor===RegExp?[n]:n},i=function(t){return function(n){return-1!==(" "+n.attr("class")+" ").indexOf(t)}},o=function(t,n,e){return function(r){var a=arguments,i=a[a.length-2],o=i>0?n.charAt(i-1):"";if('"'===o)return r;if(">"===o){var c=n.lastIndexOf("<",i);if(-1!==c&&-1!==n.substring(c,i).indexOf('contenteditable="false"'))return r}return'<span class="'+e+'" data-mce-content="'+t.dom.encode(a[0])+'">'+t.dom.encode("string"==typeof a[1]?a[1]:a[0])+"</span>"}},c=function(t){var c,l,u="contenteditable";c=" "+n.trim(r(t))+" ",l=" "+n.trim(e(t))+" ";var f=i(c),s=i(l),d=a(t);t.on("PreInit",function(){d.length>0&&t.on("BeforeSetContent",function(n){!function(t,n,r){var a=n.length,i=r.content;if("raw"!==r.format){for(;a--;)i=i.replace(n[a],o(t,i,e(t)));r.content=i}}(t,d,n)}),t.parser.addAttributeFilter("class",function(t){for(var n,e=t.length;e--;)n=t[e],f(n)?n.attr(u,"true"):s(n)&&n.attr(u,"false")}),t.serializer.addAttributeFilter(u,function(t){for(var n,e=t.length;e--;)n=t[e],(f(n)||s(n))&&(d.length>0&&n.attr("data-mce-content")?(n.name="#text",n.type=3,n.raw=!0,n.value=n.attr("data-mce-content")):n.attr(u,null))})})};t.add("noneditable",function(t){c(t)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("3",tinymce.util.Tools.resolve),g("1",["3"],function(a){return a("tinymce.PluginManager")}),g("2",["3"],function(a){return a("tinymce.Env")}),g("0",["1","2"],function(a,b){return a.add("pagebreak",function(a){var c="mce-pagebreak",d=a.getParam("pagebreak_separator","<!-- pagebreak -->"),e=new RegExp(d.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(a){return"\\"+a}),"gi"),f='<img src="'+b.transparentSrc+'" class="'+c+'" data-mce-resize="false" data-mce-placeholder />';a.addCommand("mcePageBreak",function(){a.settings.pagebreak_split_block?a.insertContent("<p>"+f+"</p>"):a.insertContent(f)}),a.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),a.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"}),a.on("ResolveName",function(b){"IMG"==b.target.nodeName&&a.dom.hasClass(b.target,c)&&(b.name="pagebreak")}),a.on("click",function(b){b=b.target,"IMG"===b.nodeName&&a.dom.hasClass(b,c)&&a.selection.select(b)}),a.on("BeforeSetContent",function(a){a.content=a.content.replace(e,f)}),a.on("PreInit",function(){a.serializer.addNodeFilter("img",function(b){for(var c,e,f=b.length;f--;)if(c=b[f],e=c.attr("class"),e&&e.indexOf("mce-pagebreak")!==-1){var g=c.parent;if(a.schema.getBlockElements()[g.name]&&a.settings.pagebreak_split_block){g.type=3,g.value=d,g.raw=!0,c.remove();continue}c.type=3,c.value=d,c.raw=!0}})})}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return e.getParam("pagebreak_separator","\x3c!-- pagebreak --\x3e")},t=function(e){return e.getParam("pagebreak_split_block",!1)},r=function(){return"mce-pagebreak"},c=function(){return'<img src="'+a.transparentSrc+'" class="mce-pagebreak" data-mce-resize="false" data-mce-placeholder />'},o=function(e){var a=n(e),r=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi");e.on("BeforeSetContent",function(e){e.content=e.content.replace(r,c())}),e.on("PreInit",function(){e.serializer.addNodeFilter("img",function(n){for(var r,c,o=n.length;o--;)if((c=(r=n[o]).attr("class"))&&-1!==c.indexOf("mce-pagebreak")){var i=r.parent;if(e.schema.getBlockElements()[i.name]&&t(e)){i.type=3,i.value=a,i.raw=!0,r.remove();continue}r.type=3,r.value=a,r.raw=!0}})})},i=c,g=r,u=function(e){e.addCommand("mcePageBreak",function(){e.settings.pagebreak_split_block?e.insertContent("<p>"+i()+"</p>"):e.insertContent(i())})},m=function(e){e.on("ResolveName",function(a){"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,g())&&(a.name="pagebreak")})},s=function(e){e.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),e.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"})};e.add("pagebreak",function(e){u(e),s(e),o(e),m(e)})}();
|
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("4",tinymce.util.Tools.resolve),g("1",["4"],function(a){return a("tinymce.PluginManager")}),g("2",["4"],function(a){return a("tinymce.Env")}),g("3",["4"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2","3"],function(a,b,c){return a.add("preview",function(a){var d=a.settings,e=!b.ie;a.addCommand("mcePreview",function(){a.windowManager.open({title:"Preview",width:parseInt(a.getParam("plugin_preview_width","650"),10),height:parseInt(a.getParam("plugin_preview_height","500"),10),html:'<iframe src="javascript:\'\'" frameborder="0"'+(e?' sandbox="allow-scripts"':"")+"></iframe>",buttons:{text:"Close",onclick:function(){this.parent().parent().close()}},onPostRender:function(){var b,f="",g=a.dom.encode;f+='<base href="'+g(a.documentBaseURI.getURI())+'">',c.each(a.contentCSS,function(b){f+='<link type="text/css" rel="stylesheet" href="'+g(a.documentBaseURI.toAbsolute(b))+'">'});var h=d.body_id||"tinymce";h.indexOf("=")!=-1&&(h=a.getParam("body_id","","hash"),h=h[a.id]||h);var i=d.body_class||"";i.indexOf("=")!=-1&&(i=a.getParam("body_class","","hash"),i=i[a.id]||"");var j='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A") {e.preventDefault();}}}, false);</script> ',k=a.settings.directionality?' dir="'+a.settings.directionality+'"':"";if(b="<!DOCTYPE html><html><head>"+f+'</head><body id="'+g(h)+'" class="mce-content-body '+g(i)+'"'+g(k)+">"+a.getContent()+j+"</body></html>",e)this.getEl("body").firstChild.src="data:text/html;charset=utf-8,"+encodeURIComponent(b);else{var l=this.getEl("body").firstChild.contentWindow.document;l.open(),l.write(b),l.close()}}})}),a.addButton("preview",{title:"Preview",cmd:"mcePreview"}),a.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return parseInt(e.getParam("plugin_preview_width","650"),10)},i=function(e){return parseInt(e.getParam("plugin_preview_height","500"),10)},o=function(e){return e.getParam("content_style","")},r=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(e){var t="",n=e.dom.encode,i=o(e);t+='<base href="'+n(e.documentBaseURI.getURI())+'">',i&&(t+='<style type="text/css">'+i+"</style>"),r.each(e.contentCSS,function(i){t+='<link type="text/css" rel="stylesheet" href="'+n(e.documentBaseURI.toAbsolute(i))+'">'});var c=e.settings.body_id||"tinymce";-1!==c.indexOf("=")&&(c=(c=e.getParam("body_id","","hash"))[e.id]||c);var a=e.settings.body_class||"";-1!==a.indexOf("=")&&(a=(a=e.getParam("body_class","","hash"))[e.id]||"");var s=e.settings.directionality?' dir="'+e.settings.directionality+'"':"";return"<!DOCTYPE html><html><head>"+t+'</head><body id="'+n(c)+'" class="mce-content-body '+n(a)+'"'+n(s)+">"+e.getContent()+'<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A") {e.preventDefault();}}}, false);<\/script> </body></html>'},a=function(e,t,n){var i=c(e);if(n)t.src="data:text/html;charset=utf-8,"+encodeURIComponent(i);else{var o=t.contentWindow.document;o.open(),o.write(i),o.close()}},s=function(e){var o=!t.ie,r='<iframe src="" frameborder="0"'+(o?' sandbox="allow-scripts"':"")+"></iframe>",c=n(e),s=i(e);e.windowManager.open({title:"Preview",width:c,height:s,html:r,buttons:{text:"Close",onclick:function(e){e.control.parent().parent().close()}},onPostRender:function(t){var n=t.control.getEl("body").firstChild;a(e,n,o)}})},d=function(e){e.addCommand("mcePreview",function(){s(e)})},l=function(e){e.addButton("preview",{title:"Preview",cmd:"mcePreview"}),e.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})};e.add("preview",function(e){d(e),l(e)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("2",tinymce.util.Tools.resolve),g("1",["2"],function(a){return a("tinymce.PluginManager")}),g("0",["1"],function(a){return a.add("print",function(a){a.addCommand("mcePrint",function(){a.getWin().print()}),a.addButton("print",{title:"Print",cmd:"mcePrint"}),a.addShortcut("Meta+P","","mcePrint"),a.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print",shortcut:"Meta+P",context:"file"})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(t){t.addCommand("mcePrint",function(){t.getWin().print()})},i=function(t){t.addButton("print",{title:"Print",cmd:"mcePrint"}),t.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print"})};t.add("print",function(t){n(t),i(t),t.addShortcut("Meta+P","","mcePrint")})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("5",tinymce.util.Tools.resolve),g("1",["5"],function(a){return a("tinymce.PluginManager")}),g("2",["5"],function(a){return a("tinymce.dom.DOMUtils")}),g("3",["5"],function(a){return a("tinymce.EditorManager")}),g("4",["5"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2","3","4"],function(a,b,c,d){return a.add("save",function(a){function e(){var d;if(d=b.DOM.getParent(a.id,"form"),!a.getParam("save_enablewhendirty",!0)||a.isDirty())return c.triggerSave(),a.getParam("save_onsavecallback")?(a.execCallback("save_onsavecallback",a),void a.nodeChanged()):void(d?(a.setDirty(!1),d.onsubmit&&!d.onsubmit()||("function"==typeof d.submit?d.submit():f(a.translate("Error: Form submit field collision."))),a.nodeChanged()):f(a.translate("Error: No form element found.")))}function f(b){a.notificationManager.open({text:b,type:"error"})}function g(){var b=d.trim(a.startContent);return a.getParam("save_oncancelcallback")?void a.execCallback("save_oncancelcallback",a):(a.setContent(b),a.undoManager.clear(),void a.nodeChanged())}function h(){var b=this;a.on("nodeChange dirty",function(){b.disabled(a.getParam("save_enablewhendirty",!0)&&!a.isDirty())})}a.addCommand("mceSave",e),a.addCommand("mceCancel",g),a.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:h}),a.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:h}),a.addShortcut("Meta+S","","mceSave")}),function(){}}),d("0")()}();
|
!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(n){return n.getParam("save_enablewhendirty",!0)},o=function(n){return!!n.getParam("save_onsavecallback")},c=function(n){return!!n.getParam("save_oncancelcallback")},i=function(n,e){n.notificationManager.open({text:n.translate(e),type:"error"})},r=function(n){var t;if(t=e.DOM.getParent(n.id,"form"),!a(n)||n.isDirty()){if(n.save(),o(n))return n.execCallback("save_onsavecallback",n),void n.nodeChanged();t?(n.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():i(n,"Error: Form submit field collision.")),n.nodeChanged()):i(n,"Error: No form element found.")}},l=function(n){var e=t.trim(n.startContent);c(n)?n.execCallback("save_oncancelcallback",n):(n.setContent(e),n.undoManager.clear(),n.nodeChanged())},d=function(n){n.addCommand("mceSave",function(){r(n)}),n.addCommand("mceCancel",function(){l(n)})},s=function(n){return function(e){var t=e.control;n.on("nodeChange dirty",function(){t.disabled(a(n)&&!n.isDirty())})}},u=function(n){n.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:s(n)}),n.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:s(n)}),n.addShortcut("Meta+S","","mceSave")};n.add("save",function(n){u(n),d(n)})}();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("7",tinymce.util.Tools.resolve),g("1",["7"],function(a){return a("tinymce.PluginManager")}),g("2",["7"],function(a){return a("tinymce.dom.DOMUtils")}),g("3",["7"],function(a){return a("tinymce.util.Tools")}),g("4",["7"],function(a){return a("tinymce.EditorManager")}),g("5",["7"],function(a){return a("tinymce.util.Delay")}),g("6",["7"],function(a){return a("tinymce.Env")}),g("0",["1","2","3","4","5","6"],function(a,b,c,d,e,f){return a.add("tabfocus",function(a){function g(a){9!==a.keyCode||a.ctrlKey||a.altKey||a.metaKey||a.preventDefault()}function h(b){function g(e){function f(a){return"BODY"===a.nodeName||"hidden"!=a.type&&"none"!=a.style.display&&"hidden"!=a.style.visibility&&f(a.parentNode)}function g(a){return/INPUT|TEXTAREA|BUTTON/.test(a.tagName)&&d.get(b.id)&&a.tabIndex!=-1&&f(a)}if(j=i.select(":input:enabled,*[tabindex]:not(iframe)"),c.each(j,function(b,c){if(b.id==a.id)return h=c,!1}),e>0){for(l=h+1;l<j.length;l++)if(g(j[l]))return j[l]}else for(l=h-1;l>=0;l--)if(g(j[l]))return j[l];return null}var h,j,k,l;if(!(9!==b.keyCode||b.ctrlKey||b.altKey||b.metaKey||b.isDefaultPrevented())&&(k=c.explode(a.getParam("tab_focus",a.getParam("tabfocus_elements",":prev,:next"))),1==k.length&&(k[1]=k[0],k[0]=":prev"),j=b.shiftKey?":prev"==k[0]?g(-1):i.get(k[0]):":next"==k[1]?g(1):i.get(k[1]))){var m=d.get(j.id||j.name);j.id&&m?m.focus():e.setTimeout(function(){f.webkit||window.focus(),j.focus()},10),b.preventDefault()}}var i=b.DOM;a.on("init",function(){a.inline&&i.setAttrib(a.getBody(),"tabIndex",null),a.on("keyup",g),f.gecko?a.on("keypress keydown",h):a.on("keydown",h)})}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=tinymce.util.Tools.resolve("tinymce.EditorManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Delay"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=tinymce.util.Tools.resolve("tinymce.util.VK"),r={getTabFocus:function(e){return e.getParam("tab_focus",e.getParam("tabfocus_elements",":prev,:next"))}},c=t.DOM,s=function(e){e.keyCode!==u.TAB||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()},a=function(e){function t(t){var s,a,y,f;if(!(t.keyCode!==u.TAB||t.ctrlKey||t.altKey||t.metaKey||t.isDefaultPrevented())&&(1===(y=l.explode(r.getTabFocus(e))).length&&(y[1]=y[0],y[0]=":prev"),a=t.shiftKey?":prev"===y[0]?m(-1):c.get(y[0]):":next"===y[1]?m(1):c.get(y[1]))){var d=n.get(a.id||a.name);a.id&&d?d.focus():o.setTimeout(function(){i.webkit||window.focus(),a.focus()},10),t.preventDefault()}function m(i){function o(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&n.get(t.id)&&-1!==e.tabIndex&&function i(e){return"BODY"===e.nodeName||"hidden"!==e.type&&"none"!==e.style.display&&"hidden"!==e.style.visibility&&i(e.parentNode)}(e)}if(a=c.select(":input:enabled,*[tabindex]:not(iframe)"),l.each(a,function(t,n){if(t.id===e.id)return s=n,!1}),i>0){for(f=s+1;f<a.length;f++)if(o(a[f]))return a[f]}else for(f=s-1;f>=0;f--)if(o(a[f]))return a[f];return null}}e.on("init",function(){e.inline&&c.setAttrib(e.getBody(),"tabIndex",null),e.on("keyup",s),i.gecko?e.on("keypress keydown",t):e.on("keydown",t)})};e.add("tabfocus",function(e){a(e)})}();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("7",tinymce.util.Tools.resolve),g("1",["7"],function(a){return a("tinymce.PluginManager")}),g("2",["7"],function(a){return a("tinymce.util.Delay")}),g("3",["7"],function(a){return a("tinymce.util.VK")}),g("8",["7"],function(a){return a("tinymce.dom.TreeWalker")}),g("9",["7"],function(a){return a("tinymce.util.Tools")}),g("a",[],function(){var a=function(a){return a.sort(function(a,b){return a.start.length>b.start.length?-1:a.start.length<b.start.length?1:0})},b=function(a,b){for(var c=0;c<a.length;c++)if(0===b.indexOf(a[c].start)&&(!a[c].end||b.lastIndexOf(a[c].end)===b.length-a[c].end.length))return a[c]},c=function(a,b,c,d){var e=b.substr(c-a.end.length-d,a.end.length);return e===a.end},d=function(a,b,c){return a-b-c.end.length-c.start.length>0},e=function(b,e,f,g){var h,i,j=a(b);for(i=0;i<j.length;i++)if(h=j[i],void 0!==h.end&&c(h,e,f,g)&&d(f,g,h))return h};return{findPattern:b,findEndPattern:e}}),g("4",["8","9","a"],function(a,b,c){var d=function(a,b,c,d,e){return a=d>0?a.splitText(d):a,a.splitText(c-d-e),a.deleteData(0,b.start.length),a.deleteData(a.data.length-b.end.length,b.end.length),a},e=function(a,b,e){var f,g,h,i,j,k,l,m,n,o,p;if(f=a.selection,g=a.dom,f.isCollapsed()&&(h=f.getRng(!0),i=h.startContainer,j=h.startOffset,l=i.data,o=e===!0?1:0,3==i.nodeType&&(n=c.findEndPattern(b,l,j,o),void 0!==n&&(k=Math.max(0,j-o),k=l.lastIndexOf(n.start,k-n.end.length-1),k!==-1&&(m=g.createRng(),m.setStart(i,k),m.setEnd(i,j-o),n=c.findPattern(b,m.toString()),n&&n.end&&!(i.data.length<=n.start.length+n.end.length))))))return p=a.formatter.get(n.format),p&&p[0].inline?(a.undoManager.transact(function(){i=d(i,n,j,k,o),a.formatter.apply(n.format,{},i)}),i):void 0},f=function(d,e){var f,g,h,i,j,k,l,m,n,o,p;if(f=d.selection,g=d.dom,f.isCollapsed()&&(l=g.getParent(f.getStart(),"p"))){for(n=new a(l,l);j=n.next();)if(3==j.nodeType){i=j;break}if(i){if(m=c.findPattern(e,i.data),!m)return;if(o=f.getRng(!0),h=o.startContainer,p=o.startOffset,i==h&&(p=Math.max(0,p-m.start.length)),b.trim(i.data).length==m.start.length)return;m.format&&(k=d.formatter.get(m.format),k&&k[0].block&&(i.deleteData(0,m.start.length),d.formatter.apply(m.format,{},i),o.setStart(h,p),o.collapse(!0),f.setRng(o))),m.cmd&&d.undoManager.transact(function(){i.deleteData(0,m.start.length),d.execCommand(m.cmd)})}}};return{applyInlineFormat:e,applyBlockFormat:f}}),g("5",["3","4"],function(a,b){function c(a,c){var d,e;e=b.applyInlineFormat(a,c,!1),e&&(d=a.dom.createRng(),d.setStart(e,e.data.length),d.setEnd(e,e.data.length),a.selection.setRng(d)),b.applyBlockFormat(a,c)}function d(a,c){var d,e,f,g,h;d=b.applyInlineFormat(a,c,!0),d&&(h=a.dom,e=d.data.slice(-1),/[\u00a0 ]/.test(e)&&(d.deleteData(d.data.length-1,1),f=h.doc.createTextNode(e),d.nextSibling?h.insertAfter(f,d.nextSibling):d.parentNode.appendChild(f),g=h.createRng(),g.setStart(f,1),g.setEnd(f,1),a.selection.setRng(g)))}var e=function(a,b,c){for(var d=0;d<a.length;d++)if(c(a[d],b))return!0},f=function(b,c){return e(b,c,function(b,c){return b===c.keyCode&&a.modifierPressed(c)===!1})},g=function(a,b){return e(a,b,function(a,b){return a.charCodeAt(0)===b.charCode})};return{handleEnter:c,handleInlineKey:d,checkCharCode:g,checkKeyCode:f}}),g("6",[],function(){var a=[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"#",format:"h1"},{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:"1. ",cmd:"InsertOrderedList"},{start:"* ",cmd:"InsertUnorderedList"},{start:"- ",cmd:"InsertUnorderedList"}],b=function(b){return void 0!==b.textpattern_patterns?b.textpattern_patterns:a};return{getPatterns:b}}),g("0",["1","2","3","4","5","6"],function(a,b,c,d,e,f){return a.add("textpattern",function(a){var d=f.getPatterns(a.settings),g=[",",".",";",":","!","?"],h=[32];a.on("keydown",function(b){13!==b.keyCode||c.modifierPressed(b)||e.handleEnter(a,d)},!0),a.on("keyup",function(b){e.checkKeyCode(h,b)&&e.handleInlineKey(a,d)}),a.on("keypress",function(c){e.checkCharCode(g,c)&&b.setEditorTimeout(a,function(){e.handleInlineKey(a,d)})}),this.setPatterns=function(a){d=a},this.getPatterns=function(){return d}}),function(){}}),d("0")()}();
|
!function(){"use strict";var t=function(e){var n=e,r=function(){return n};return{get:r,set:function(t){n=t},clone:function(){return t(r())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(t){return{setPatterns:function(e){t.set(e)},getPatterns:function(){return t.get()}}},r=[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"***",end:"***",format:["bold","italic"]},{start:"#",format:"h1"},{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:"1. ",cmd:"InsertOrderedList"},{start:"* ",cmd:"InsertUnorderedList"},{start:"- ",cmd:"InsertUnorderedList"}],a=function(t){return t.textpattern_patterns!==undefined?t.textpattern_patterns:r},o=tinymce.util.Tools.resolve("tinymce.util.Delay"),i=tinymce.util.Tools.resolve("tinymce.util.VK"),s=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t,e){for(var n=0;n<t.length;n++)if(0===e.indexOf(t[n].start)&&(!t[n].end||e.lastIndexOf(t[n].end)===e.length-t[n].end.length))return t[n]},f=function(t,e,n,r){var a,o,i,s,l,d,f=t.sort(function(t,e){return t.start.length>e.start.length?-1:t.start.length<e.start.length?1:0});for(o=0;o<f.length;o++)if((a=f[o]).end!==undefined&&(s=a,l=n,d=r,e.substr(l-s.end.length-d,s.end.length)===s.end)&&n-r-(i=a).end.length-i.start.length>0)return a},c=function(t,e,n){if(!1!==e.collapsed){var r=e.startContainer,a=r.data,o=!0===n?1:0;if(3===r.nodeType){var i=f(t,a,e.startOffset,o);if(i!==undefined){var s=a.lastIndexOf(i.end,e.startOffset-o),l=a.lastIndexOf(i.start,s-i.end.length);if(s=a.indexOf(i.end,l+i.start.length),-1!==l){var c=document.createRange();c.setStart(r,l),c.setEnd(r,s+i.end.length);var u=d(t,c.toString());if(!(i===undefined||u!==i||r.data.length<=i.start.length+i.end.length))return{pattern:i,startOffset:l,endOffset:s}}}}}},u=function(t,e,n){var r=t.selection.getRng(!0),a=c(e,r,n);if(a)return function(t,e,n,r){var a=l.isArray(n.pattern.format)?n.pattern.format:[n.pattern.format];if(0!==l.grep(a,function(e){var n=t.formatter.get(e);return n&&n[0].inline}).length)return t.undoManager.transact(function(){var r,o,i,s;r=e,o=n.pattern,i=n.endOffset,s=n.startOffset,(r=s>0?r.splitText(s):r).splitText(i-s+o.end.length),r.deleteData(0,o.start.length),r.deleteData(r.data.length-o.end.length,o.end.length),e=r,a.forEach(function(n){t.formatter.apply(n,{},e)})}),e}(t,r.startContainer,a)},g={patternFromRng:c,applyInlineFormatSpace:function(t,e){return u(t,e,!0)},applyInlineFormatEnter:function(t,e){return u(t,e,!1)},applyBlockFormat:function(t,e){var n,r,a,o,i,f,c,u,g,h,m;if(n=t.selection,r=t.dom,n.isCollapsed()&&(c=r.getParent(n.getStart(),"p"))){for(g=new s(c,c);i=g.next();)if(3===i.nodeType){o=i;break}if(o){if(!(u=d(e,o.data)))return;if(a=(h=n.getRng(!0)).startContainer,m=h.startOffset,o===a&&(m=Math.max(0,m-u.start.length)),l.trim(o.data).length===u.start.length)return;u.format&&(f=t.formatter.get(u.format))&&f[0].block&&(o.deleteData(0,u.start.length),t.formatter.apply(u.format,{},o),h.setStart(a,m),h.collapse(!0),n.setRng(h)),u.cmd&&t.undoManager.transact(function(){o.deleteData(0,u.start.length),t.execCommand(u.cmd)})}}}},h=function(t,e,n){for(var r=0;r<t.length;r++)if(n(t[r],e))return!0},m={handleEnter:function(t,e){var n,r;(n=g.applyInlineFormatEnter(t,e))&&((r=t.dom.createRng()).setStart(n,n.data.length),r.setEnd(n,n.data.length),t.selection.setRng(r)),g.applyBlockFormat(t,e)},handleInlineKey:function(t,e){var n,r,a,o,i;(n=g.applyInlineFormatSpace(t,e))&&(i=t.dom,r=n.data.slice(-1),/[\u00a0 ]/.test(r)&&(n.deleteData(n.data.length-1,1),a=i.doc.createTextNode(r),i.insertAfter(a,n.parentNode),(o=i.createRng()).setStart(a,1),o.setEnd(a,1),t.selection.setRng(o)))},checkCharCode:function(t,e){return h(t,e,function(t,e){return t.charCodeAt(0)===e.charCode})},checkKeyCode:function(t,e){return h(t,e,function(t,e){return t===e.keyCode&&!1===i.modifierPressed(e)})}},p=function(t,e){var n=[",",".",";",":","!","?"],r=[32];t.on("keydown",function(n){13!==n.keyCode||i.modifierPressed(n)||m.handleEnter(t,e.get())},!0),t.on("keyup",function(n){m.checkKeyCode(r,n)&&m.handleInlineKey(t,e.get())}),t.on("keypress",function(r){m.checkCharCode(n,r)&&o.setEditorTimeout(t,function(){m.handleInlineKey(t,e.get())})})};e.add("textpattern",function(e){var r=t(a(e.settings));return p(e,r),n(r)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("4",tinymce.util.Tools.resolve),g("1",["4"],function(a){return a("tinymce.PluginManager")}),g("2",["4"],function(a){return a("tinymce.util.I18n")}),g("3",["4"],function(a){return a("tinymce.util.Tools")}),g("0",["1","2","3"],function(a,b,c){return a.add("toc",function(a){function d(b){return!!b&&a.schema.isValidChild("div",b)}function e(b){return b&&a.dom.is(b,"."+n.className)&&a.getBody().contains(b)}function f(){var b=this;b.disabled(a.readonly||!h()),a.on("LoadContent SetContent change",function(){b.disabled(a.readonly||!h())})}function g(a){var b,c=[];for(b=1;b<=a;b++)c.push("h"+b);return c.join(",")}function h(){return!(!n||!i(n).length)}function i(b){var d=g(b.depth),e=o(d);return e.length&&/^h[1-9]$/i.test(b.headerTag)&&(e=e.filter(function(c,d){return!a.dom.hasClass(d.parentNode,b.className)})),c.map(e,function(a){return a.id||(a.id=r()),{id:a.id,level:parseInt(a.nodeName.replace(/^H/i,""),10),title:o.text(a)}})}function j(a){var b,c=9;for(b=0;b<a.length;b++)if(a[b].level<c&&(c=a[b].level),1==c)return c;return c}function k(b,c){var d="<"+b+' contenteditable="true">',e="</"+b+">";return d+a.dom.encode(c)+e}function l(a){var b=m(a);return'<div class="'+a.className+'" contenteditable="false">'+b+"</div>"}function m(a){var c,d,e,f,g="",h=i(a),l=j(h)-1;if(!h.length)return"";for(g+=k(a.headerTag,b.translate("Table of Contents")),c=0;c<h.length;c++){if(e=h[c],f=h[c+1]&&h[c+1].level,l===e.level)g+="<li>";else for(d=l;d<e.level;d++)g+="<ul><li>";if(g+='<a href="#'+e.id+'">'+e.title+"</a>",f!==e.level&&f)for(d=e.level;d>f;d--)g+="</li></ul><li>";else g+="</li>",f||(g+="</ul>");l=e.level}return g}var n,o=a.$,p={depth:3,headerTag:"h2",className:"mce-toc"},q=function(a){var b=0;return function(){var c=(new Date).getTime().toString(32);return a+c+(b++).toString(32)}},r=q("mcetoc_");a.on("PreInit",function(){var b=a.settings,c=parseInt(b.toc_depth,10)||0;n={depth:c>=1&&c<=9?c:p.depth,headerTag:d(b.toc_header)?b.toc_header:p.headerTag,className:b.toc_class?a.dom.encode(b.toc_class):p.className}}),a.on("PreProcess",function(a){var b=o("."+n.className,a.node);b.length&&(b.removeAttr("contentEditable"),b.find("[contenteditable]").removeAttr("contentEditable"))}),a.on("SetContent",function(){var a=o("."+n.className);a.length&&(a.attr("contentEditable",!1),a.children(":first-child").attr("contentEditable",!0))});var s=function(b){return!b.length||a.dom.getParents(b[0],".mce-offscreen-selection").length>0};a.addCommand("mceInsertToc",function(){var b=o("."+n.className);s(b)?a.insertContent(l(n)):a.execCommand("mceUpdateToc")}),a.addCommand("mceUpdateToc",function(){var b=o("."+n.className);b.length&&a.undoManager.transact(function(){b.html(m(n))})}),a.addButton("toc",{tooltip:"Table of Contents",cmd:"mceInsertToc",icon:"toc",onPostRender:f}),a.addButton("tocupdate",{tooltip:"Update",cmd:"mceUpdateToc",icon:"reload"}),a.addContextToolbar(e,"tocupdate"),a.addMenuItem("toc",{text:"Table of Contents",context:"insert",cmd:"mceInsertToc",onPostRender:f})}),function(){}}),d("0")()}();
|
!function(){"use strict";var t,e,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r=tinymce.util.Tools.resolve("tinymce.util.I18n"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(t){return t.getParam("toc_class","mce-toc")},l=function(t){var e=t.getParam("toc_header","h2");return/^h[1-6]$/.test(e)?e:"h2"},a=function(t){var e=parseInt(t.getParam("toc_depth","3"),10);return e>=1&&e<=9?e:3},d=(t="mcetoc_",e=0,function(){var n=(new Date).getTime().toString(32);return t+n+(e++).toString(32)}),u=function(t){var e=c(t),n=l(t),o=function(t){var e,n=[];for(e=1;e<=t;e++)n.push("h"+e);return n.join(",")}(a(t)),r=t.$(o);return r.length&&/^h[1-9]$/i.test(n)&&(r=r.filter(function(n,o){return!t.dom.hasClass(o.parentNode,e)})),i.map(r,function(e){return{id:e.id?e.id:d(),level:parseInt(e.nodeName.replace(/^H/i,""),10),title:t.$.text(e),element:e}})},s=function(t){var e,n,i,c,a,d,s,f="",m=u(t),v=function(t){var e,n=9;for(e=0;e<t.length;e++)if(t[e].level<n&&(n=t[e].level),1===n)return n;return n}(m)-1;if(!m.length)return"";for(f+=(a=l(t),d=r.translate("Table of Contents"),s="</"+a+">","<"+a+' contenteditable="true">'+o.DOM.encode(d)+s),e=0;e<m.length;e++){if((i=m[e]).element.id=i.id,c=m[e+1]&&m[e+1].level,v===i.level)f+="<li>";else for(n=v;n<i.level;n++)f+="<ul><li>";if(f+='<a href="#'+i.id+'">'+i.title+"</a>",c!==i.level&&c)for(n=i.level;n>c;n--)f+="</li></ul><li>";else f+="</li>",c||(f+="</ul>");v=i.level}return f},f=function(t){var e=c(t),n=t.$("."+e);n.length&&t.undoManager.transact(function(){n.html(s(t))})},m={hasHeaders:function(t){return u(t).length>0},insertToc:function(t){var e,n,o,r,i=c(t),l=t.$("."+i);o=t,!(r=l).length||o.dom.getParents(r[0],".mce-offscreen-selection").length>0?t.insertContent((n=s(e=t),'<div class="'+e.dom.encode(c(e))+'" contenteditable="false">'+n+"</div>")):f(t)},updateToc:f},v=function(t){t.addCommand("mceInsertToc",function(){m.insertToc(t)}),t.addCommand("mceUpdateToc",function(){m.updateToc(t)})},h=function(t){var e=t.$,n=c(t);t.on("PreProcess",function(t){var o=e("."+n,t.node);o.length&&(o.removeAttr("contentEditable"),o.find("[contenteditable]").removeAttr("contentEditable"))}),t.on("SetContent",function(){var t=e("."+n);t.length&&(t.attr("contentEditable",!1),t.children(":first-child").attr("contentEditable",!0))})},g=function(t){return function(e){var n=e.control;t.on("LoadContent SetContent change",function(){n.disabled(t.readonly||!m.hasHeaders(t))})}},T=function(t){var e;t.addButton("toc",{tooltip:"Table of Contents",cmd:"mceInsertToc",icon:"toc",onPostRender:g(t)}),t.addButton("tocupdate",{tooltip:"Update",cmd:"mceUpdateToc",icon:"reload"}),t.addMenuItem("toc",{text:"Table of Contents",context:"insert",cmd:"mceInsertToc",onPostRender:g(t)}),t.addContextToolbar((e=t,function(t){return t&&e.dom.is(t,"."+c(e))&&e.getBody().contains(t)}),"tocupdate")};n.add("toc",function(t){v(t),T(t),h(t)})}();
|
|
@ -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<g;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;f<c;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("2",tinymce.util.Tools.resolve),g("1",["2"],function(a){return a("tinymce.PluginManager")}),g("0",["1"],function(a){return a.add("visualblocks",function(a,b){function c(){var b=this;b.active(f),a.on("VisualBlocks",function(){b.active(a.dom.hasClass(a.getBody(),"mce-visualblocks"))})}var d,e,f;window.NodeList&&(a.addCommand("mceVisualBlocks",function(){var c,g=a.dom;d||(d=g.uniqueId(),c=g.create("link",{id:d,rel:"stylesheet",href:b+"/css/visualblocks.css"}),a.getDoc().getElementsByTagName("head")[0].appendChild(c)),a.on("PreviewFormats AfterPreviewFormats",function(b){f&&g.toggleClass(a.getBody(),"mce-visualblocks","afterpreviewformats"==b.type)}),g.toggleClass(a.getBody(),"mce-visualblocks"),f=a.dom.hasClass(a.getBody(),"mce-visualblocks"),e&&e.active(g.hasClass(a.getBody(),"mce-visualblocks")),a.fire("VisualBlocks")}),a.addButton("visualblocks",{title:"Show blocks",cmd:"mceVisualBlocks",onPostRender:c}),a.addMenuItem("visualblocks",{text:"Show blocks",cmd:"mceVisualBlocks",onPostRender:c,selectable:!0,context:"view",prependToContext:!0}),a.on("init",function(){a.settings.visualblocks_default_state&&a.execCommand("mceVisualBlocks",!1,null,{skip_focus:!0})}),a.on("remove",function(){a.dom.removeClass(a.getBody(),"mce-visualblocks")}))}),function(){}}),d("0")()}();
|
!function(){"use strict";var e=function(t){var n=t,o=function(){return n};return{get:o,set:function(e){n=e},clone:function(){return e(o())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e,t){e.fire("VisualBlocks",{state:t})},o=function(e){return e.getParam("visualblocks_default_state",!1)},s=function(e){return e.settings.visualblocks_content_css},i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=i.DOM.uniqueId(),u=function(e,t){var n=c.toArray(e.getElementsByTagName("link"));if(0===c.grep(n,function(e){return e.id===l}).length){var o=i.DOM.create("link",{id:l,rel:"stylesheet",href:t});e.getElementsByTagName("head")[0].appendChild(o)}},a=function(e,t,o){var i=e.dom,c=s(e);u(e.getDoc(),c||t+"/css/visualblocks.css"),i.toggleClass(e.getBody(),"mce-visualblocks"),o.set(!o.get()),n(e,o.get())},r=function(e,t,n){e.addCommand("mceVisualBlocks",function(){a(e,t,n)})},m=function(e,t,n){e.on("PreviewFormats AfterPreviewFormats",function(t){n.get()&&e.dom.toggleClass(e.getBody(),"mce-visualblocks","afterpreviewformats"===t.type)}),e.on("init",function(){o(e)&&a(e,t,n)}),e.on("remove",function(){e.dom.removeClass(e.getBody(),"mce-visualblocks")})},f=function(e,t){return function(n){var o=n.control;o.active(t.get()),e.on("VisualBlocks",function(e){o.active(e.state)})}},d=function(e,t){e.addButton("visualblocks",{active:!1,title:"Show blocks",cmd:"mceVisualBlocks",onPostRender:f(e,t)}),e.addMenuItem("visualblocks",{text:"Show blocks",cmd:"mceVisualBlocks",onPostRender:f(e,t),selectable:!0,context:"view",prependToContext:!0})};t.add("visualblocks",function(t,n){var o=e(!1);r(t,n,o),d(t,o),m(t,n,o)})}();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-content-body a[data-mce-selected],.mce-content-body code[data-mce-selected],.mce-content-body b[data-mce-selected],.mce-content-body i[data-mce-selected],.mce-content-body em[data-mce-selected],.mce-content-body strong[data-mce-selected],.mce-content-body sup[data-mce-selected],.mce-content-body sub[data-mce-selected]{background:#bfe6ff}.mce-content-body hr{cursor:default}.mce-content-body{line-height:1.3}
|
.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2}.mce-content-body{line-height:1.3}
|
|
@ -1 +1 @@
|
||||||
body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-content-body a[data-mce-selected],.mce-content-body code[data-mce-selected],.mce-content-body b[data-mce-selected],.mce-content-body i[data-mce-selected],.mce-content-body em[data-mce-selected],.mce-content-body strong[data-mce-selected],.mce-content-body sup[data-mce-selected],.mce-content-body sub[data-mce-selected]{background:#bfe6ff}.mce-content-body hr{cursor:default}
|
body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2}
|
|
@ -0,0 +1 @@
|
||||||
|
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position:absolute;display:inline-block;background-color:green;opacity:.5}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}
|
Binary file not shown.
Binary file not shown.
|
@ -79,7 +79,7 @@
|
||||||
<glyph unicode="" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" />
|
<glyph unicode="" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" />
|
||||||
<glyph unicode="" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" />
|
<glyph unicode="" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" />
|
||||||
<glyph unicode="" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" />
|
<glyph unicode="" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" />
|
||||||
<glyph unicode="" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM384 512h128v-128h-128v128zM576 512h448v-128h-448v128zM0 320h128v-128h-128v128zM192 320h832v-128h-832v128zM192 128h128v-128h-128v128zM384 128h640v-128h-640v128z" />
|
<glyph unicode="" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM0 512h128v-128h-128v128zM192 512h832v-128h-832v128zM0 128h128v-128h-128v128zM192 128h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM192 320h128v-128h-128v128zM384 320h640v-128h-640v128z" />
|
||||||
<glyph unicode="" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" />
|
<glyph unicode="" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" />
|
||||||
<glyph unicode="" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" />
|
<glyph unicode="" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" />
|
||||||
<glyph unicode="" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" />
|
<glyph unicode="" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" />
|
||||||
|
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,2 +0,0 @@
|
||||||
User-agent: *
|
|
||||||
Disallow:
|
|
20
readme.md
20
readme.md
|
@ -1,7 +1,7 @@
|
||||||
# BookStack
|
# BookStack
|
||||||
|
|
||||||
[](https://github.com/BookStackApp/BookStack/releases/latest)
|
[](https://github.com/BookStackApp/BookStack/releases/latest)
|
||||||
[](https://github.com/BookStackApp/BookStack/blob/master/LICENSE)
|
[](https://github.com/BookStackApp/BookStack/blob/master/LICENSE)
|
||||||
[](https://travis-ci.org/BookStackApp/BookStack)
|
[](https://travis-ci.org/BookStackApp/BookStack)
|
||||||
|
|
||||||
A platform for storing and organising information and documentation. General information and documentation for BookStack can be found at https://www.bookstackapp.com/.
|
A platform for storing and organising information and documentation. General information and documentation for BookStack can be found at https://www.bookstackapp.com/.
|
||||||
|
@ -19,23 +19,25 @@ BookStack is an opinionated wiki system that provides a pleasant and simple out
|
||||||
|
|
||||||
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
|
## Development & Testing
|
||||||
|
|
||||||
All development on BookStack is currently done on the master branch. When it's time for a release the master branch is merged into release with built & minified CSS & JS then tagged at its version. Here are the current development requirements:
|
All development on BookStack is currently done on the master branch. When it's time for a release the master branch is merged into release with built & minified CSS & JS then tagged at its version. Here are the current development requirements:
|
||||||
|
|
||||||
* [Node.js](https://nodejs.org/en/) v6.9+
|
* [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
|
``` bash
|
||||||
# Build assets for development
|
# Build assets for development
|
||||||
npm run-script build
|
npm run build
|
||||||
|
|
||||||
# Build and minify assets for production
|
# Build and minify assets for production
|
||||||
npm run-script production
|
npm run production
|
||||||
|
|
||||||
# Build for dev (With sourcemaps) and watch for changes
|
# 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.
|
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.
|
||||||
|
@ -68,11 +70,13 @@ 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.
|
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.
|
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.
|
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.
|
||||||
|
|
||||||
|
@ -94,6 +98,8 @@ The BookStack source is provided under the MIT License.
|
||||||
|
|
||||||
## Attribution
|
## 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:
|
These are the great open-source projects used to help build BookStack:
|
||||||
|
|
||||||
* [Laravel](http://laravel.com/)
|
* [Laravel](http://laravel.com/)
|
||||||
|
|
|
@ -7,7 +7,8 @@ class EntitySelector {
|
||||||
this.lastClick = 0;
|
this.lastClick = 0;
|
||||||
|
|
||||||
let entityTypes = elem.hasAttribute('entity-types') ? elem.getAttribute('entity-types') : 'page,book,chapter';
|
let entityTypes = elem.hasAttribute('entity-types') ? elem.getAttribute('entity-types') : 'page,book,chapter';
|
||||||
this.searchUrl = window.baseUrl(`/ajax/search/entities?types=${encodeURIComponent(entityTypes)}`);
|
let entityPermission = elem.hasAttribute('entity-permission') ? elem.getAttribute('entity-permission') : 'view';
|
||||||
|
this.searchUrl = window.baseUrl(`/ajax/search/entities?types=${encodeURIComponent(entityTypes)}&permission=${encodeURIComponent(entityPermission)}`);
|
||||||
|
|
||||||
this.input = elem.querySelector('[entity-selector-input]');
|
this.input = elem.querySelector('[entity-selector-input]');
|
||||||
this.searchInput = elem.querySelector('[entity-selector-search]');
|
this.searchInput = elem.querySelector('[entity-selector-search]');
|
||||||
|
@ -68,7 +69,6 @@ class EntitySelector {
|
||||||
|
|
||||||
onClick(event) {
|
onClick(event) {
|
||||||
let t = event.target;
|
let t = event.target;
|
||||||
console.log('click', t);
|
|
||||||
|
|
||||||
if (t.matches('.entity-list-item *')) {
|
if (t.matches('.entity-list-item *')) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
|
@ -17,6 +17,7 @@ let componentMapping = {
|
||||||
'image-picker': require('./image-picker'),
|
'image-picker': require('./image-picker'),
|
||||||
'collapsible': require('./collapsible'),
|
'collapsible': require('./collapsible'),
|
||||||
'toggle-switch': require('./toggle-switch'),
|
'toggle-switch': require('./toggle-switch'),
|
||||||
|
'page-display': require('./page-display'),
|
||||||
};
|
};
|
||||||
|
|
||||||
window.components = {};
|
window.components = {};
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
const MarkdownIt = require("markdown-it");
|
const MarkdownIt = require("markdown-it");
|
||||||
const mdTasksLists = require('markdown-it-task-lists');
|
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 {
|
class MarkdownEditor {
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,224 @@
|
||||||
|
import Clipboard from "clipboard";
|
||||||
|
import Code from "../services/code";
|
||||||
|
|
||||||
|
class PageDisplay {
|
||||||
|
|
||||||
|
constructor(elem) {
|
||||||
|
this.elem = elem;
|
||||||
|
this.pageId = elem.getAttribute('page-display');
|
||||||
|
|
||||||
|
Code.highlight();
|
||||||
|
this.setupPointer();
|
||||||
|
this.setupStickySidebar();
|
||||||
|
this.setupNavHighlighting();
|
||||||
|
|
||||||
|
// Check the hash on load
|
||||||
|
if (window.location.hash) {
|
||||||
|
let text = window.location.hash.replace(/\%20/g, ' ').substr(1);
|
||||||
|
this.goToText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sidebar page nav click event
|
||||||
|
$('.sidebar-page-nav').on('click', 'a', event => {
|
||||||
|
goToText(event.target.getAttribute('href').substr(1));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
goToText(text) {
|
||||||
|
let idElem = document.getElementById(text);
|
||||||
|
$('.page-content [data-highlighted]').attr('data-highlighted', '').css('background-color', '');
|
||||||
|
if (idElem !== null) {
|
||||||
|
window.scrollAndHighlight(idElem);
|
||||||
|
} else {
|
||||||
|
$('.page-content').find(':contains("' + text + '")').smoothScrollTo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setupPointer() {
|
||||||
|
// Set up pointer
|
||||||
|
let $pointer = $('#pointer').detach();
|
||||||
|
let pointerShowing = false;
|
||||||
|
let $pointerInner = $pointer.children('div.pointer').first();
|
||||||
|
let isSelection = false;
|
||||||
|
let pointerModeLink = true;
|
||||||
|
let pointerSectionId = '';
|
||||||
|
|
||||||
|
// Select all contents on input click
|
||||||
|
$pointer.on('click', 'input', event => {
|
||||||
|
$(this).select();
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
$pointer.on('click focus', event => {
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pointer mode toggle
|
||||||
|
$pointer.on('click', 'span.icon', event => {
|
||||||
|
event.stopPropagation();
|
||||||
|
let $icon = $(event.currentTarget);
|
||||||
|
pointerModeLink = !pointerModeLink;
|
||||||
|
$icon.find('[data-icon="include"]').toggle(!pointerModeLink);
|
||||||
|
$icon.find('[data-icon="link"]').toggle(pointerModeLink);
|
||||||
|
updatePointerContent();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set up clipboard
|
||||||
|
let clipboard = new Clipboard($pointer[0].querySelector('button'));
|
||||||
|
|
||||||
|
// Hide pointer when clicking away
|
||||||
|
$(document.body).find('*').on('click focus', event => {
|
||||||
|
if (!pointerShowing || isSelection) return;
|
||||||
|
$pointer.detach();
|
||||||
|
pointerShowing = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
let updatePointerContent = () => {
|
||||||
|
let inputText = pointerModeLink ? window.baseUrl(`/link/${this.pageId}#${pointerSectionId}`) : `{{@${this.pageId}#${pointerSectionId}}}`;
|
||||||
|
if (pointerModeLink && inputText.indexOf('http') !== 0) inputText = window.location.protocol + "//" + window.location.host + inputText;
|
||||||
|
|
||||||
|
$pointer.find('input').val(inputText);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Show pointer when selecting a single block of tagged content
|
||||||
|
$('.page-content [id^="bkmrk"]').on('mouseup keyup', function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
let selection = window.getSelection();
|
||||||
|
if (selection.toString().length === 0) return;
|
||||||
|
|
||||||
|
// Show pointer and set link
|
||||||
|
let $elem = $(this);
|
||||||
|
pointerSectionId = $elem.attr('id');
|
||||||
|
updatePointerContent();
|
||||||
|
|
||||||
|
$elem.before($pointer);
|
||||||
|
$pointer.show();
|
||||||
|
pointerShowing = true;
|
||||||
|
|
||||||
|
// Set pointer to sit near mouse-up position
|
||||||
|
let pointerLeftOffset = (e.pageX - $elem.offset().left - ($pointerInner.width() / 2));
|
||||||
|
if (pointerLeftOffset < 0) pointerLeftOffset = 0;
|
||||||
|
let pointerLeftOffsetPercent = (pointerLeftOffset / $elem.width()) * 100;
|
||||||
|
$pointerInner.css('left', pointerLeftOffsetPercent + '%');
|
||||||
|
|
||||||
|
isSelection = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
isSelection = false;
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupStickySidebar() {
|
||||||
|
// Make the sidebar stick in view on scroll
|
||||||
|
let $window = $(window);
|
||||||
|
let $sidebar = $("#sidebar .scroll-body");
|
||||||
|
let $bookTreeParent = $sidebar.parent();
|
||||||
|
|
||||||
|
// Check the page is scrollable and the content is taller than the tree
|
||||||
|
let pageScrollable = ($(document).height() > $window.height()) && ($sidebar.height() < $('.page-content').height());
|
||||||
|
|
||||||
|
// Get current tree's width and header height
|
||||||
|
let headerHeight = $("#header").height() + $(".toolbar").height();
|
||||||
|
let isFixed = $window.scrollTop() > headerHeight;
|
||||||
|
|
||||||
|
// Fix the tree as a sidebar
|
||||||
|
function stickTree() {
|
||||||
|
$sidebar.width($bookTreeParent.width() + 15);
|
||||||
|
$sidebar.addClass("fixed");
|
||||||
|
isFixed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Un-fix the tree back into position
|
||||||
|
function unstickTree() {
|
||||||
|
$sidebar.css('width', 'auto');
|
||||||
|
$sidebar.removeClass("fixed");
|
||||||
|
isFixed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks if the tree stickiness state should change
|
||||||
|
function checkTreeStickiness(skipCheck) {
|
||||||
|
let shouldBeFixed = $window.scrollTop() > headerHeight;
|
||||||
|
if (shouldBeFixed && (!isFixed || skipCheck)) {
|
||||||
|
stickTree();
|
||||||
|
} else if (!shouldBeFixed && (isFixed || skipCheck)) {
|
||||||
|
unstickTree();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The event ran when the window scrolls
|
||||||
|
function windowScrollEvent() {
|
||||||
|
checkTreeStickiness(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the page is scrollable and the window is wide enough listen to scroll events
|
||||||
|
// and evaluate tree stickiness.
|
||||||
|
if (pageScrollable && $window.width() > 1000) {
|
||||||
|
$window.on('scroll', windowScrollEvent);
|
||||||
|
checkTreeStickiness(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle window resizing and switch between desktop/mobile views
|
||||||
|
$window.on('resize', event => {
|
||||||
|
if (pageScrollable && $window.width() > 1000) {
|
||||||
|
$window.on('scroll', windowScrollEvent);
|
||||||
|
checkTreeStickiness(true);
|
||||||
|
} else {
|
||||||
|
$window.off('scroll', windowScrollEvent);
|
||||||
|
unstickTree();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupNavHighlighting() {
|
||||||
|
// Check if support is present for IntersectionObserver
|
||||||
|
if (!'IntersectionObserver' in window ||
|
||||||
|
!'IntersectionObserverEntry' in window ||
|
||||||
|
!'intersectionRatio' in window.IntersectionObserverEntry.prototype) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let pageNav = document.querySelector('.sidebar-page-nav');
|
||||||
|
|
||||||
|
// fetch all the headings.
|
||||||
|
let headings = document.querySelector('.page-content').querySelectorAll('h1, h2, h3, h4, h5, h6');
|
||||||
|
// if headings are present, add observers.
|
||||||
|
if (headings.length > 0 && pageNav !== null) {
|
||||||
|
addNavObserver(headings);
|
||||||
|
}
|
||||||
|
|
||||||
|
function addNavObserver(headings) {
|
||||||
|
// Setup the intersection observer.
|
||||||
|
let intersectOpts = {
|
||||||
|
rootMargin: '0px 0px 0px 0px',
|
||||||
|
threshold: 1.0
|
||||||
|
};
|
||||||
|
let pageNavObserver = new IntersectionObserver(headingVisibilityChange, intersectOpts);
|
||||||
|
|
||||||
|
// observe each heading
|
||||||
|
for (let i = 0; i !== headings.length; ++i) {
|
||||||
|
pageNavObserver.observe(headings[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function headingVisibilityChange(entries, observer) {
|
||||||
|
for (let entry of entries) {
|
||||||
|
let isVisible = (entry.intersectionRatio === 1);
|
||||||
|
toggleAnchorHighlighting(entry.target.id, isVisible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleAnchorHighlighting(elementId, shouldHighlight) {
|
||||||
|
let anchorsToHighlight = pageNav.querySelectorAll('a[href="#' + elementId + '"]');
|
||||||
|
for (let i = 0; i < anchorsToHighlight.length; i++) {
|
||||||
|
// Change below to use classList.toggle when IE support is dropped.
|
||||||
|
if (shouldHighlight) {
|
||||||
|
anchorsToHighlight[i].classList.add('current-heading');
|
||||||
|
} else {
|
||||||
|
anchorsToHighlight[i].classList.remove('current-heading');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = PageDisplay;
|
|
@ -1,9 +1,535 @@
|
||||||
|
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(`<p><img src="${loadingImage}" id="${id}"></p>`);
|
||||||
|
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 = `<pre><code class="language-${lang}"></code></pre>`;
|
||||||
|
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></pre>');
|
||||||
|
$pre.append($('<code></code>').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(`<div drawio-diagram contenteditable="false"><img src="${loadingImage}" id="${id}"></div>`);
|
||||||
|
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 {
|
class WysiwygEditor {
|
||||||
|
|
||||||
constructor(elem) {
|
constructor(elem) {
|
||||||
this.elem = 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 media";
|
||||||
|
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 media | 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,
|
||||||
|
media_alt_source: false,
|
||||||
|
media_poster: 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 = `<a href="${image.url}" target="_blank">`;
|
||||||
|
html += `<img src="${image.thumbs.display}" alt="${image.name}">`;
|
||||||
|
html += '</a>';
|
||||||
|
win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
paste_preprocess: function (plugin, args) {
|
||||||
|
let content = args.content;
|
||||||
|
if (content.indexOf('<img src="file://') !== -1) {
|
||||||
|
args.content = '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
init_instance_callback: function(editor) {
|
||||||
|
loadCustomHeadContent(editor);
|
||||||
|
},
|
||||||
|
setup: function (editor) {
|
||||||
|
|
||||||
|
editor.on('init ExecCommand change input NodeChange ObjectResized', editorChange);
|
||||||
|
|
||||||
|
function editorChange() {
|
||||||
|
let content = editor.getContent();
|
||||||
|
window.$events.emit('editor-html-change', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.$events.listen('editor-html-update', html => {
|
||||||
|
editor.setContent(html);
|
||||||
|
editor.selection.select(editor.getBody(), true);
|
||||||
|
editor.selection.collapse(false);
|
||||||
|
editorChange(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
registerEditorShortcuts(editor);
|
||||||
|
|
||||||
|
let wrap;
|
||||||
|
|
||||||
|
function hasTextContent(node) {
|
||||||
|
return node && !!( node.textContent || node.innerText );
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.on('dragstart', function () {
|
||||||
|
let node = editor.selection.getNode();
|
||||||
|
|
||||||
|
if (node.nodeName !== 'IMG') return;
|
||||||
|
wrap = editor.dom.getParent(node, '.mceTemp');
|
||||||
|
|
||||||
|
if (!wrap && node.parentNode.nodeName === 'A' && !hasTextContent(node.parentNode)) {
|
||||||
|
wrap = node.parentNode;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('drop', function (event) {
|
||||||
|
let dom = editor.dom,
|
||||||
|
rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(event.clientX, event.clientY, editor.getDoc());
|
||||||
|
|
||||||
|
// Don't allow anything to be dropped in a captioned image.
|
||||||
|
if (dom.getParent(rng.startContainer, '.mceTemp')) {
|
||||||
|
event.preventDefault();
|
||||||
|
} else if (wrap) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
editor.undoManager.transact(function () {
|
||||||
|
editor.selection.setRng(rng);
|
||||||
|
editor.selection.setNode(wrap);
|
||||||
|
dom.remove(wrap);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Custom Image picker button
|
||||||
|
editor.addButton('image-insert', {
|
||||||
|
title: 'My title',
|
||||||
|
icon: 'image',
|
||||||
|
tooltip: 'Insert an image',
|
||||||
|
onclick: function () {
|
||||||
|
window.ImageManager.show(function (image) {
|
||||||
|
let html = `<a href="${image.url}" target="_blank">`;
|
||||||
|
html += `<img src="${image.thumbs.display}" alt="${image.name}">`;
|
||||||
|
html += '</a>';
|
||||||
|
editor.execCommand('mceInsertContent', false, html);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Paste image-uploads
|
||||||
|
editor.on('paste', event => editorPaste(event, editor));
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
|
// Global Polyfills
|
||||||
import "babel-polyfill"
|
import "babel-polyfill"
|
||||||
import "./dom-polyfills"
|
import "./services/dom-polyfills"
|
||||||
|
|
||||||
import jQuery from "jquery"
|
|
||||||
window.jQuery = window.$ = jQuery;
|
|
||||||
|
|
||||||
import "./pages/page-show"
|
|
||||||
import Translations from "./translations"
|
|
||||||
import vues from "./vues/vues"
|
|
||||||
import components from "./components"
|
|
||||||
|
|
||||||
import Vue from "vue"
|
|
||||||
import axios from "axios"
|
|
||||||
|
|
||||||
// Url retrieval function
|
// Url retrieval function
|
||||||
window.baseUrl = function(path) {
|
window.baseUrl = function(path) {
|
||||||
|
@ -20,114 +10,30 @@ window.baseUrl = function(path) {
|
||||||
return basePath + '/' + path;
|
return basePath + '/' + path;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Global Event System
|
// Set events and http services on window
|
||||||
class EventManager {
|
import Events from "./services/events"
|
||||||
constructor() {
|
import Http from "./services/http"
|
||||||
this.listeners = {};
|
let httpInstance = Http();
|
||||||
this.stack = [];
|
window.$http = httpInstance;
|
||||||
}
|
window.$events = new Events();
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// Translation setup
|
// Translation setup
|
||||||
// Creates a global function with name 'trans' to be used in the same way as Laravel's translation system
|
// 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);
|
let translator = new Translations(window.translations);
|
||||||
window.trans = translator.get.bind(translator);
|
window.trans = translator.get.bind(translator);
|
||||||
window.trans_choice = translator.getPlural.bind(translator);
|
window.trans_choice = translator.getPlural.bind(translator);
|
||||||
|
|
||||||
|
// Load in global UI helpers and libraries including jQuery
|
||||||
|
import "./services/global-ui"
|
||||||
|
|
||||||
|
// Set services on Vue
|
||||||
|
import Vue from "vue"
|
||||||
|
Vue.prototype.$http = httpInstance;
|
||||||
|
Vue.prototype.$events = window.$events;
|
||||||
|
|
||||||
// Load vues and components
|
// Load vues and components
|
||||||
|
import vues from "./vues/vues"
|
||||||
|
import components from "./components"
|
||||||
vues();
|
vues();
|
||||||
components();
|
components();
|
||||||
|
|
||||||
|
|
||||||
//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');
|
|
||||||
}
|
|
||||||
|
|
|
@ -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(`<p><img src="${loadingImage}" id="${id}"></p>`);
|
|
||||||
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 = `<pre><code class="language-${lang}"></code></pre>`;
|
|
||||||
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></pre>');
|
|
||||||
$pre.append($('<code></code>').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(`<div drawio-diagram contenteditable="false"><img src="${loadingImage}" id="${id}"></div>`);
|
|
||||||
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 = `<a href="${image.url}" target="_blank">`;
|
|
||||||
html += `<img src="${image.thumbs.display}" alt="${image.name}">`;
|
|
||||||
html += '</a>';
|
|
||||||
win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
paste_preprocess: function (plugin, args) {
|
|
||||||
let content = args.content;
|
|
||||||
if (content.indexOf('<img src="file://') !== -1) {
|
|
||||||
args.content = '';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
init_instance_callback: function(editor) {
|
|
||||||
loadCustomHeadContent(editor);
|
|
||||||
},
|
|
||||||
setup: function (editor) {
|
|
||||||
|
|
||||||
editor.on('init ExecCommand change input NodeChange ObjectResized', editorChange);
|
|
||||||
|
|
||||||
function editorChange() {
|
|
||||||
let content = editor.getContent();
|
|
||||||
window.$events.emit('editor-html-change', content);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.$events.listen('editor-html-update', html => {
|
|
||||||
editor.setContent(html);
|
|
||||||
editor.selection.select(editor.getBody(), true);
|
|
||||||
editor.selection.collapse(false);
|
|
||||||
editorChange(html);
|
|
||||||
});
|
|
||||||
|
|
||||||
registerEditorShortcuts(editor);
|
|
||||||
|
|
||||||
let wrap;
|
|
||||||
|
|
||||||
function hasTextContent(node) {
|
|
||||||
return node && !!( node.textContent || node.innerText );
|
|
||||||
}
|
|
||||||
|
|
||||||
editor.on('dragstart', function () {
|
|
||||||
let node = editor.selection.getNode();
|
|
||||||
|
|
||||||
if (node.nodeName !== 'IMG') return;
|
|
||||||
wrap = editor.dom.getParent(node, '.mceTemp');
|
|
||||||
|
|
||||||
if (!wrap && node.parentNode.nodeName === 'A' && !hasTextContent(node.parentNode)) {
|
|
||||||
wrap = node.parentNode;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
editor.on('drop', function (event) {
|
|
||||||
let dom = editor.dom,
|
|
||||||
rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(event.clientX, event.clientY, editor.getDoc());
|
|
||||||
|
|
||||||
// Don't allow anything to be dropped in a captioned image.
|
|
||||||
if (dom.getParent(rng.startContainer, '.mceTemp')) {
|
|
||||||
event.preventDefault();
|
|
||||||
} else if (wrap) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
editor.undoManager.transact(function () {
|
|
||||||
editor.selection.setRng(rng);
|
|
||||||
editor.selection.setNode(wrap);
|
|
||||||
dom.remove(wrap);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
wrap = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Custom Image picker button
|
|
||||||
editor.addButton('image-insert', {
|
|
||||||
title: 'My title',
|
|
||||||
icon: 'image',
|
|
||||||
tooltip: 'Insert an image',
|
|
||||||
onclick: function () {
|
|
||||||
window.ImageManager.show(function (image) {
|
|
||||||
let html = `<a href="${image.url}" target="_blank">`;
|
|
||||||
html += `<img src="${image.thumbs.display}" alt="${image.name}">`;
|
|
||||||
html += '</a>';
|
|
||||||
editor.execCommand('mceInsertContent', false, html);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Paste image-uploads
|
|
||||||
editor.on('paste', event => { editorPaste(event, editor) });
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,216 +0,0 @@
|
||||||
const Clipboard = require("clipboard");
|
|
||||||
const Code = require('../libs/code');
|
|
||||||
|
|
||||||
let setupPageShow = window.setupPageShow = function (pageId) {
|
|
||||||
|
|
||||||
Code.highlight();
|
|
||||||
|
|
||||||
if (!pageId) return;
|
|
||||||
|
|
||||||
// Set up pointer
|
|
||||||
let $pointer = $('#pointer').detach();
|
|
||||||
let pointerShowing = false;
|
|
||||||
let $pointerInner = $pointer.children('div.pointer').first();
|
|
||||||
let isSelection = false;
|
|
||||||
let pointerModeLink = true;
|
|
||||||
let pointerSectionId = '';
|
|
||||||
|
|
||||||
// Select all contents on input click
|
|
||||||
$pointer.on('click', 'input', event => {
|
|
||||||
$(this).select();
|
|
||||||
event.stopPropagation();
|
|
||||||
});
|
|
||||||
|
|
||||||
$pointer.on('click focus', event => {
|
|
||||||
event.stopPropagation();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Pointer mode toggle
|
|
||||||
$pointer.on('click', 'span.icon', event => {
|
|
||||||
event.stopPropagation();
|
|
||||||
let $icon = $(event.currentTarget);
|
|
||||||
pointerModeLink = !pointerModeLink;
|
|
||||||
$icon.find('[data-icon="include"]').toggle(!pointerModeLink);
|
|
||||||
$icon.find('[data-icon="link"]').toggle(pointerModeLink);
|
|
||||||
updatePointerContent();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Set up clipboard
|
|
||||||
let clipboard = new Clipboard($pointer[0].querySelector('button'));
|
|
||||||
|
|
||||||
// Hide pointer when clicking away
|
|
||||||
$(document.body).find('*').on('click focus', event => {
|
|
||||||
if (!pointerShowing || isSelection) return;
|
|
||||||
$pointer.detach();
|
|
||||||
pointerShowing = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
function updatePointerContent() {
|
|
||||||
let inputText = pointerModeLink ? window.baseUrl(`/link/${pageId}#${pointerSectionId}`) : `{{@${pageId}#${pointerSectionId}}}`;
|
|
||||||
if (pointerModeLink && inputText.indexOf('http') !== 0) inputText = window.location.protocol + "//" + window.location.host + inputText;
|
|
||||||
|
|
||||||
$pointer.find('input').val(inputText);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show pointer when selecting a single block of tagged content
|
|
||||||
$('.page-content [id^="bkmrk"]').on('mouseup keyup', function (e) {
|
|
||||||
e.stopPropagation();
|
|
||||||
let selection = window.getSelection();
|
|
||||||
if (selection.toString().length === 0) return;
|
|
||||||
|
|
||||||
// Show pointer and set link
|
|
||||||
let $elem = $(this);
|
|
||||||
pointerSectionId = $elem.attr('id');
|
|
||||||
updatePointerContent();
|
|
||||||
|
|
||||||
$elem.before($pointer);
|
|
||||||
$pointer.show();
|
|
||||||
pointerShowing = true;
|
|
||||||
|
|
||||||
// Set pointer to sit near mouse-up position
|
|
||||||
let pointerLeftOffset = (e.pageX - $elem.offset().left - ($pointerInner.width() / 2));
|
|
||||||
if (pointerLeftOffset < 0) pointerLeftOffset = 0;
|
|
||||||
let pointerLeftOffsetPercent = (pointerLeftOffset / $elem.width()) * 100;
|
|
||||||
$pointerInner.css('left', pointerLeftOffsetPercent + '%');
|
|
||||||
|
|
||||||
isSelection = true;
|
|
||||||
setTimeout(() => {
|
|
||||||
isSelection = false;
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Go to, and highlight if necessary, the specified text.
|
|
||||||
function goToText(text) {
|
|
||||||
let idElem = document.getElementById(text);
|
|
||||||
$('.page-content [data-highlighted]').attr('data-highlighted', '').css('background-color', '');
|
|
||||||
if (idElem !== null) {
|
|
||||||
window.scrollAndHighlight(idElem);
|
|
||||||
} else {
|
|
||||||
$('.page-content').find(':contains("' + text + '")').smoothScrollTo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the hash on load
|
|
||||||
if (window.location.hash) {
|
|
||||||
let text = window.location.hash.replace(/\%20/g, ' ').substr(1);
|
|
||||||
goToText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sidebar page nav click event
|
|
||||||
$('.sidebar-page-nav').on('click', 'a', event => {
|
|
||||||
goToText(event.target.getAttribute('href').substr(1));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Make the sidebar stick in view on scroll
|
|
||||||
let $window = $(window);
|
|
||||||
let $sidebar = $("#sidebar .scroll-body");
|
|
||||||
let $bookTreeParent = $sidebar.parent();
|
|
||||||
|
|
||||||
// Check the page is scrollable and the content is taller than the tree
|
|
||||||
let pageScrollable = ($(document).height() > $window.height()) && ($sidebar.height() < $('.page-content').height());
|
|
||||||
|
|
||||||
// Get current tree's width and header height
|
|
||||||
let headerHeight = $("#header").height() + $(".toolbar").height();
|
|
||||||
let isFixed = $window.scrollTop() > headerHeight;
|
|
||||||
|
|
||||||
// Fix the tree as a sidebar
|
|
||||||
function stickTree() {
|
|
||||||
$sidebar.width($bookTreeParent.width() + 15);
|
|
||||||
$sidebar.addClass("fixed");
|
|
||||||
isFixed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Un-fix the tree back into position
|
|
||||||
function unstickTree() {
|
|
||||||
$sidebar.css('width', 'auto');
|
|
||||||
$sidebar.removeClass("fixed");
|
|
||||||
isFixed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks if the tree stickiness state should change
|
|
||||||
function checkTreeStickiness(skipCheck) {
|
|
||||||
let shouldBeFixed = $window.scrollTop() > headerHeight;
|
|
||||||
if (shouldBeFixed && (!isFixed || skipCheck)) {
|
|
||||||
stickTree();
|
|
||||||
} else if (!shouldBeFixed && (isFixed || skipCheck)) {
|
|
||||||
unstickTree();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The event ran when the window scrolls
|
|
||||||
function windowScrollEvent() {
|
|
||||||
checkTreeStickiness(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the page is scrollable and the window is wide enough listen to scroll events
|
|
||||||
// and evaluate tree stickiness.
|
|
||||||
if (pageScrollable && $window.width() > 1000) {
|
|
||||||
$window.on('scroll', windowScrollEvent);
|
|
||||||
checkTreeStickiness(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle window resizing and switch between desktop/mobile views
|
|
||||||
$window.on('resize', event => {
|
|
||||||
if (pageScrollable && $window.width() > 1000) {
|
|
||||||
$window.on('scroll', windowScrollEvent);
|
|
||||||
checkTreeStickiness(true);
|
|
||||||
} else {
|
|
||||||
$window.off('scroll', windowScrollEvent);
|
|
||||||
unstickTree();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Check if support is present for IntersectionObserver
|
|
||||||
if ('IntersectionObserver' in window &&
|
|
||||||
'IntersectionObserverEntry' in window &&
|
|
||||||
'intersectionRatio' in window.IntersectionObserverEntry.prototype) {
|
|
||||||
addPageHighlighting();
|
|
||||||
}
|
|
||||||
|
|
||||||
function addPageHighlighting() {
|
|
||||||
let pageNav = document.querySelector('.sidebar-page-nav');
|
|
||||||
|
|
||||||
// fetch all the headings.
|
|
||||||
let headings = document.querySelector('.page-content').querySelectorAll('h1, h2, h3, h4, h5, h6');
|
|
||||||
// if headings are present, add observers.
|
|
||||||
if (headings.length > 0 && pageNav !== null) {
|
|
||||||
addNavObserver(headings);
|
|
||||||
}
|
|
||||||
|
|
||||||
function addNavObserver(headings) {
|
|
||||||
// Setup the intersection observer.
|
|
||||||
let intersectOpts = {
|
|
||||||
rootMargin: '0px 0px 0px 0px',
|
|
||||||
threshold: 1.0
|
|
||||||
};
|
|
||||||
let pageNavObserver = new IntersectionObserver(headingVisibilityChange, intersectOpts);
|
|
||||||
|
|
||||||
// observe each heading
|
|
||||||
for (let i = 0; i !== headings.length; ++i) {
|
|
||||||
pageNavObserver.observe(headings[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function headingVisibilityChange(entries, observer) {
|
|
||||||
for (let i = 0; i < entries.length; i++) {
|
|
||||||
let currentEntry = entries[i];
|
|
||||||
let isVisible = (currentEntry.intersectionRatio === 1);
|
|
||||||
toggleAnchorHighlighting(currentEntry.target.id, isVisible);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleAnchorHighlighting(elementId, shouldHighlight) {
|
|
||||||
let anchorsToHighlight = pageNav.querySelectorAll('a[href="#' + elementId + '"]');
|
|
||||||
for (let i = 0; i < anchorsToHighlight.length; i++) {
|
|
||||||
// Change below to use classList.toggle when IE support is dropped.
|
|
||||||
if (shouldHighlight) {
|
|
||||||
anchorsToHighlight[i].classList.add('current-heading');
|
|
||||||
} else {
|
|
||||||
anchorsToHighlight[i].classList.remove('current-heading');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = setupPageShow;
|
|
|
@ -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}`;
|
||||||
|
}
|
|
@ -2,10 +2,12 @@
|
||||||
* Polyfills for DOM API's
|
* Polyfills for DOM API's
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
|
||||||
if (!Element.prototype.matches) {
|
if (!Element.prototype.matches) {
|
||||||
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
|
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) {
|
if (!Element.prototype.closest) {
|
||||||
Element.prototype.closest = function (s) {
|
Element.prototype.closest = function (s) {
|
||||||
var el = this;
|
var el = this;
|
|
@ -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;
|
|
@ -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');
|
||||||
|
}
|
|
@ -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;
|
|
@ -1,4 +1,4 @@
|
||||||
const codeLib = require('../libs/code');
|
const codeLib = require('../services/code');
|
||||||
|
|
||||||
const methods = {
|
const methods = {
|
||||||
show() {
|
show() {
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
const moment = require('moment');
|
import * as Dates from "../services/dates";
|
||||||
require('moment/locale/en-gb');
|
|
||||||
moment.locale('en-gb');
|
|
||||||
|
|
||||||
let autoSaveFrequency = 30;
|
let autoSaveFrequency = 30;
|
||||||
|
|
||||||
|
@ -96,9 +94,8 @@ let methods = {
|
||||||
let url = window.baseUrl(`/ajax/page/${this.pageId}/save-draft`);
|
let url = window.baseUrl(`/ajax/page/${this.pageId}/save-draft`);
|
||||||
window.$http.put(url, data).then(response => {
|
window.$http.put(url, data).then(response => {
|
||||||
draftErroring = false;
|
draftErroring = false;
|
||||||
let updateTime = moment.utc(moment.unix(response.data.timestamp)).toDate();
|
|
||||||
if (!this.isNewDraft) this.isUpdateDraft = true;
|
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();
|
lastSave = Date.now();
|
||||||
}, errorRes => {
|
}, errorRes => {
|
||||||
if (draftErroring) return;
|
if (draftErroring) return;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const moment = require('moment');
|
import * as Dates from "../services/dates";
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
terms: '',
|
terms: '',
|
||||||
|
@ -153,7 +153,7 @@ let methods = {
|
||||||
},
|
},
|
||||||
|
|
||||||
enableDate(optionName) {
|
enableDate(optionName) {
|
||||||
this.search.dates[optionName.toLowerCase()] = moment().format('YYYY-MM-DD');
|
this.search.dates[optionName.toLowerCase()] = Dates.getCurrentDay();
|
||||||
this.dateChange(optionName);
|
this.dateChange(optionName);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue