From a7b09a2a01efcb40a0df4150b7bbe9a6fb2395a5 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 23 Apr 2017 19:50:32 +0800 Subject: [PATCH] add && remove --- src/api/article.js | 8 + src/api/remoteSearch.js | 9 + src/components/Tinymce/index.vue | 2 +- src/mock/article.js | 49 + src/mock/index.js | 21 +- src/mock/remoteSearch.js | 29 + src/router/index.js | 6 +- src/styles/element-ui.scss | 22 + src/views/example/form1.vue | 291 + src/views/example/form2.vue | 0 .../tinymce1.3/plugins/powerpaste/License.txt | 15 - .../plugins/powerpaste/agpl-3.0.txt | 661 - .../plugins/powerpaste/css/editorcss.css | 4 - .../plugins/powerpaste/flash/textboxpaste.swf | Bin 204658 -> 0 bytes .../plugins/powerpaste/img/spinner_96.gif | Bin 13707 -> 0 bytes .../plugins/powerpaste/js/wordimport.js | 381 - .../tinymce1.3/plugins/powerpaste/plugin.js | 19069 ---------------- .../plugins/powerpaste/plugin.min.js | 23 - 18 files changed, 421 insertions(+), 20169 deletions(-) create mode 100644 src/api/remoteSearch.js create mode 100644 src/mock/article.js create mode 100644 src/mock/remoteSearch.js create mode 100644 src/views/example/form1.vue create mode 100644 src/views/example/form2.vue delete mode 100644 static/tinymce1.3/plugins/powerpaste/License.txt delete mode 100644 static/tinymce1.3/plugins/powerpaste/agpl-3.0.txt delete mode 100644 static/tinymce1.3/plugins/powerpaste/css/editorcss.css delete mode 100644 static/tinymce1.3/plugins/powerpaste/flash/textboxpaste.swf delete mode 100644 static/tinymce1.3/plugins/powerpaste/img/spinner_96.gif delete mode 100644 static/tinymce1.3/plugins/powerpaste/js/wordimport.js delete mode 100644 static/tinymce1.3/plugins/powerpaste/plugin.js delete mode 100644 static/tinymce1.3/plugins/powerpaste/plugin.min.js diff --git a/src/api/article.js b/src/api/article.js index 682cc3ab..1519cb9c 100644 --- a/src/api/article.js +++ b/src/api/article.js @@ -6,3 +6,11 @@ export function getList() { method: 'get' }); } + +export function getArticle() { + return fetch({ + url: '/article/detail', + method: 'get' + }); +} + diff --git a/src/api/remoteSearch.js b/src/api/remoteSearch.js new file mode 100644 index 00000000..0e3c341d --- /dev/null +++ b/src/api/remoteSearch.js @@ -0,0 +1,9 @@ +import { fetch } from 'utils/fetch'; + +export function userSearch(name) { + return fetch({ + url: '/search/user', + method: 'get', + params: { name } + }); +} diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 3be1ea7d..7bacbde1 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -75,7 +75,7 @@ // language_url: '/static/tinymce/langs/zh_CN.js', toolbar: this.toolbar, menubar: this.menubar, - plugins: 'advlist,autolink,code,powerpaste,textcolor, colorpicker,fullscreen,link,lists,media,wordcount, imagetools,watermark', + plugins: 'advlist,autolink,code,paste,textcolor, colorpicker,fullscreen,link,lists,media,wordcount, imagetools,watermark', end_container_on_empty_block: true, powerpaste_word_import: 'clean', code_dialog_height: 450, diff --git a/src/mock/article.js b/src/mock/article.js new file mode 100644 index 00000000..029b1555 --- /dev/null +++ b/src/mock/article.js @@ -0,0 +1,49 @@ +import Mock from 'mockjs'; + + +const List = []; +const count = 20; + + +for (let i = 0; i < count; i++) { + List.push(Mock.mock({ + id: '@id', + title: '@ctitle(10, 20)', + 'status|1': ['published', 'draft'], + author: '@cname', + display_time: '@datetime', + pageviews: '@integer(300, 5000)' + })); +} + +export default { + getList: () => new Promise(resolve => { + setTimeout(() => { + resolve([200, { + data: List + }]); + }, 100); + }), + getArticle: () => new Promise(resolve => { + setTimeout(() => { + resolve([200, { + data: { + id: 120000000001, + author: { key: 'mockPan' }, + source_name: '原创作者', + category_item: [{ key: 'global', name: '全球' }], + comment_disabled: false, + content: '<p>我是测试数据我是测试数据</p><p><img class="wscnph" src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943" data-wscntype="image" data-wscnh="300" data-wscnw="400" data-mce-src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>"', + content_short: '我是测试数据', + display_time: +new Date(), + image_uri: 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3', + platforms: ['a-platform'], + source_uri: 'https://github.com/PanJiaChen/vue-element-admin', + status: 'published', + tags: [], + title: '' + } + }]); + }, 100); + }) +}; diff --git a/src/mock/index.js b/src/mock/index.js index f1312f7b..b82820c3 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -1,26 +1,19 @@ import axios from 'axios'; -import Mock from 'mockjs'; import MockAdapter from 'axios-mock-adapter'; -import article_tableAPI from './article_table' +import articleAPI from './article'; +import article_tableAPI from './article_table'; +import remoteSearchAPI from './remoteSearch'; const mock = new MockAdapter(axios); -const articleList = { - 'data|20': [{ - id: '@id', - title: '@ctitle(10, 20)', - 'status|1': ['published', 'draft'], - author: '@cname', - display_time: '@datetime', - pageviews: '@integer(300, 5000)' - }] -} -const data = JSON.stringify(Mock.mock(articleList)) -mock.onGet('/article/list').reply(200, data); +mock.onGet('/article/list').reply(articleAPI.getList); +mock.onGet('/article/detail').reply(articleAPI.getArticle); mock.onGet('/article_table/list').reply(article_tableAPI.getList); mock.onGet('/article_table/pv').reply(article_tableAPI.getPv); +mock.onGet('/search/user').reply(remoteSearchAPI.searchUser); + export default mock; diff --git a/src/mock/remoteSearch.js b/src/mock/remoteSearch.js new file mode 100644 index 00000000..b5429562 --- /dev/null +++ b/src/mock/remoteSearch.js @@ -0,0 +1,29 @@ +import Mock from 'mockjs'; + +const NameList = []; +const count = 100; + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })); +} +NameList.push({ name: 'mockPan' }) + +export default { + searchUser: config => { + const { name } = config.params; + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + if (name && lowerCaseName.indexOf(name.toLowerCase()) < 0) return false; + return true; + }); + return new Promise(resolve => { + setTimeout(() => { + resolve([200, { + items: mockNameList + }]); + }, 100); + }) + } +}; diff --git a/src/router/index.js b/src/router/index.js index 1f7d593e..0550c5b9 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -51,6 +51,8 @@ const Theme = resolve => require(['../views/theme/index'], resolve); /* example*/ const DynamicTable = resolve => require(['../views/example/dynamictable'], resolve); const Table = resolve => require(['../views/example/table'], resolve); +const Form1 = resolve => require(['../views/example/form1'], resolve); +const Form2 = resolve => require(['../views/example/form2'], resolve); /* admin*/ @@ -170,7 +172,9 @@ export default new Router({ icon: 'zonghe', children: [ { path: 'dynamictable', component: DynamicTable, name: '动态table' }, - { path: 'table', component: Table, name: '综合table' } + { path: 'table', component: Table, name: '综合table' }, + { path: 'form1', component: Form1, name: '综合form1' } + // { path: 'form2', component: Form2, name: '综合form2' } ] }, // { diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss index a6670d59..382aff13 100644 --- a/src/styles/element-ui.scss +++ b/src/styles/element-ui.scss @@ -59,3 +59,25 @@ margin: 0 auto; } + +//文章页textarea修改样式 +.article-textarea { + textarea { + padding-right: 40px; + resize: none; + border: none; + border-radius: 0px; + border-bottom: 1px solid #bfcbd9; + } +} + +//element ui upload +.upload-container { + .el-upload { + width: 100%; + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} diff --git a/src/views/example/form1.vue b/src/views/example/form1.vue new file mode 100644 index 00000000..d41cf9f2 --- /dev/null +++ b/src/views/example/form1.vue @@ -0,0 +1,291 @@ +<template> + <div class="createPost-container"> + <el-form class="form-container" :model="postForm" :rules="rules" ref="postForm"> + + <Sticky :className="'sub-navbar '+postForm.status"> + <template v-if="fetchSuccess"> + <div style="display:inline-block"> + + <el-dropdown trigger="click"> + <el-button>{{!postForm.comment_disabled?'评论已打开':'评论已关闭'}}<i class="el-icon-caret-bottom el-icon--right"></i></el-button> + <el-dropdown-menu class="no-padding no-hover" slot="dropdown"> + <el-dropdown-item> + <el-radio-group style="padding: 10px;" v-model="postForm.comment_disabled"> + <el-radio :label="true">关闭评论</el-radio> + <el-radio :label="false">打开评论</el-radio> + </el-radio-group> + </el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + </div> + + <el-dropdown trigger="click"> + <el-button> + 平台<i class="el-icon-caret-bottom el-icon--right"></i> + </el-button> + <el-dropdown-menu class="no-border" slot="dropdown"> + <el-checkbox-group v-model="postForm.platforms" style="padding: 5px 15px;"> + <el-checkbox v-for="item in platformsOptions" :label="item.key" :key="item.key"> + {{item.name}} + </el-checkbox> + </el-checkbox-group> + </el-dropdown-menu> + </el-dropdown> + + <el-dropdown trigger="click"> + <el-button> + 外链<i class="el-icon-caret-bottom el-icon--right"></i> + </el-button> + <el-dropdown-menu class="no-padding no-border" style="width:300px" slot="dropdown"> + <el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri"> + <el-input placeholder="请输入内容" v-model="postForm.source_uri"> + <template slot="prepend">填写url</template> + </el-input> + </el-form-item> + </el-dropdown-menu> + </el-dropdown> + + <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm()">发布 + </el-button> + <el-button v-loading="loading" type="warning" @click="draftForm">草稿</el-button> + + </template> + <template v-else> + <el-tag>发送异常错误,刷新页面,或者联系程序员</el-tag> + </template> + + </Sticky> + + <div class="createPost-main-container"> + <el-row> + <el-col :span="21"> + <el-form-item style="margin-bottom: 40px;" prop="title"> + <MDinput name="name" v-model="postForm.title" required :maxlength="100"> + 标题 + </MDinput> + <span v-show="postForm.title.length>=26" class='title-prompt'>app可能会显示不全</span> + </el-form-item> + + <div class="postInfo-container"> + <el-row> + <el-col :span="8"> + <el-form-item label-width="45px" label="作者:" class="postInfo-container-item"> + <multiselect v-model="postForm.author" :options="userLIstOptions" @search-change="getRemoteUserList" placeholder="搜索用户" selectLabel="选择" + deselectLabel="删除" track-by="key" :internalSearch="false" label="key"> + <span slot='noResult'>无结果</span> + </multiselect> + </el-form-item> + </el-col> + + <el-col :span="8"> + <el-tooltip class="item" effect="dark" content="将替换作者" placement="top"> + <el-form-item label-width="50px" label="来源:" class="postInfo-container-item"> + <el-input placeholder="将替换作者" style='min-width:150px;' v-model="postForm.source_name"> + </el-input> + </el-form-item> + </el-tooltip> + </el-col> + + <el-col :span="8"> + <el-form-item label-width="80px" label="发布时间:" class="postInfo-container-item"> + <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间"> + </el-date-picker> + </el-form-item> + </el-col> + </el-row> + </div> + </el-col> + </el-row> + + <el-form-item style="margin-bottom: 40px;" label-width="45px" label="摘要:"> + <el-input type="textarea" class="article-textarea" :rows="1" autosize placeholder="请输入内容" v-model="postForm.content_short"> + </el-input> + <span class="word-counter" v-show="contentShortLength">{{contentShortLength}}字</span> + </el-form-item> + + <div class="editor-container"> + <Tinymce :height=400 ref="editor" v-model="postForm.content"></Tinymce> + </div> + + <div style="margin-bottom: 20px;"> + <Upload v-model="postForm.image_uri"></Upload> + </div> + </div> + </el-form> + + </div> +</template> + +<script> + import Tinymce from 'components/Tinymce' + import Upload from 'components/Upload/singleImage3' + import MDinput from 'components/MDinput'; + import { validateURL } from 'utils/validate'; + import { getArticle } from 'api/article'; + import { userSearch } from 'api/remoteSearch'; + + export default { + name: 'articleDetail', + components: { Tinymce, MDinput, Upload }, + data() { + const validateRequire = (rule, value, callback) => { + if (value === '') { + this.$message({ + message: rule.field + '为必传项', + type: 'error' + }); + callback(null) + } else { + callback() + } + }; + const validateSourceUri = (rule, value, callback) => { + if (value) { + if (validateURL(value)) { + callback() + } else { + this.$message({ + message: '外链url填写不正确', + type: 'error' + }); + callback(null) + } + } else { + callback() + } + }; + return { + postForm: { + title: '', // 文章题目 + content: '', // 文章内容 + content_short: '', // 文章摘要 + source_uri: '', // 文章外链 + image_uri: '', // 文章图片 + source_name: '', // 文章外部作者 + display_time: undefined, // 前台展示时间 + id: undefined, + platforms: ['a-platform'] + }, + fetchSuccess: true, + loading: false, + userLIstOptions: [], + platformsOptions: [ + { key: 'a-platform', name: 'a-platform' }, + { key: 'b-platform', name: 'b-platform' }, + { key: 'c-platform', name: 'c-platform' } + ], + rules: { + image_uri: [{ validator: validateRequire }], + title: [{ validator: validateRequire }], + content: [{ validator: validateRequire }], + source_uri: [{ validator: validateSourceUri, trigger: 'blur' }] + } + } + }, + computed: { + contentShortLength() { + return this.postForm.content_short.length + } + }, + created() { + this.fetchData(); + }, + methods: { + fetchData() { + getArticle().then(response => { + this.postForm = response.data; + }).catch(err => { + this.fetchSuccess = false; + console.log(err); + }); + }, + submitForm() { + this.postForm.display_time = parseInt(this.display_time / 1000); + console.log(this.postForm) + this.$refs.postForm.validate(valid => { + if (valid) { + this.loading = true; + this.$notify({ + title: '成功', + message: '发布文章成功', + type: 'success', + duration: 2000 + }); + this.postForm.status = 'published'; + this.loading = false; + } else { + console.log('error submit!!'); + return false; + } + }); + }, + draftForm() { + if (this.postForm.content.length === 0 || this.postForm.title.length === 0) { + this.$message({ + message: '请填写必要的标题和内容', + type: 'warning' + }); + return; + } + this.$message({ + message: '保存成功', + type: 'success', + showClose: true, + duration: 1000 + }); + this.postForm.status = 'draft'; + }, + getRemoteUserList(query) { + userSearch(query).then(response => { + if (!response.items) return; + console.log(response) + this.userLIstOptions = response.items.map(v => ({ + key: v.name + })); + }) + } + } + } +</script> +<style rel="stylesheet/scss" lang="scss" scoped> + @import "src/styles/mixin.scss"; + .title-prompt{ + position: absolute; + right: 0px; + font-size: 12px; + top:10px; + color:#ff4949; + } + .createPost-container { + position: relative; + .createPost-main-container { + padding: 40px 45px 20px 50px; + .postInfo-container { + position: relative; + @include clearfix; + margin-bottom: 10px; + .postInfo-container-item { + float: left; + } + } + .editor-container { + min-height: 500px; + margin: 0 0 30px; + .editor-upload-btn-container { + text-align: right; + margin-right: 10px; + .editor-upload-btn { + display: inline-block; + } + } + } + } + .word-counter { + width: 40px; + position: absolute; + right: -10px; + top: 0px; + } + } +</style> + diff --git a/src/views/example/form2.vue b/src/views/example/form2.vue new file mode 100644 index 00000000..e69de29b diff --git a/static/tinymce1.3/plugins/powerpaste/License.txt b/static/tinymce1.3/plugins/powerpaste/License.txt deleted file mode 100644 index b639f891..00000000 --- a/static/tinymce1.3/plugins/powerpaste/License.txt +++ /dev/null @@ -1,15 +0,0 @@ -TinyMCE PowerPaste -Copyright (C) 2015 Ephox Corporation - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file diff --git a/static/tinymce1.3/plugins/powerpaste/agpl-3.0.txt b/static/tinymce1.3/plugins/powerpaste/agpl-3.0.txt deleted file mode 100644 index 2def0e88..00000000 --- a/static/tinymce1.3/plugins/powerpaste/agpl-3.0.txt +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -<http://www.gnu.org/licenses/>. \ No newline at end of file diff --git a/static/tinymce1.3/plugins/powerpaste/css/editorcss.css b/static/tinymce1.3/plugins/powerpaste/css/editorcss.css deleted file mode 100644 index 73a95afa..00000000 --- a/static/tinymce1.3/plugins/powerpaste/css/editorcss.css +++ /dev/null @@ -1,4 +0,0 @@ -.ephox-salmon-upload-image-container img -{ - opacity: 0.5 -} diff --git a/static/tinymce1.3/plugins/powerpaste/flash/textboxpaste.swf b/static/tinymce1.3/plugins/powerpaste/flash/textboxpaste.swf deleted file mode 100644 index 6a2a35a0387683578c30890c77ca72f6958ac87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204658 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%0D=oH)<tZ7Q73nm53lKfelRAu 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 diff --git a/static/tinymce1.3/plugins/powerpaste/img/spinner_96.gif b/static/tinymce1.3/plugins/powerpaste/img/spinner_96.gif deleted file mode 100644 index 24af6375eed5580d1beea62eb864f75e4f1876f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13707 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 diff --git a/static/tinymce1.3/plugins/powerpaste/js/wordimport.js b/static/tinymce1.3/plugins/powerpaste/js/wordimport.js deleted file mode 100644 index 0c05b1a7..00000000 --- a/static/tinymce1.3/plugins/powerpaste/js/wordimport.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * Word Import JavaScript Library - * Copyright (c) 2013-2015 Ephox Corp. All rights reserved. - * This software is provided "AS IS," without a warranty of any kind. - */ -function com_ephox_keurig_Keurig(){var Pb='',Qb='" for "gwt:onLoadErrorFn"',Rb='" for "gwt:onPropertyErrorFn"',Sb='"><\/script>',Tb='#',Ub='&',Vb='/',Wb='90BA12EED4B8175F02A135767FCD6360',Xb=':',Yb=':1',Zb=':2',$b=':3',_b=':4',ac=':5',bc=':6',cc=':7',dc=':8',ec=':9',fc='<script id="',gc='=',hc='?',ic='Bad handler "',jc='DOMContentLoaded',kc='SCRIPT',lc='Single-script hosted mode not yet implemented. See issue ',mc='Unexpected exception in locale detection, using default: ',nc='_',oc='__gwt_Locale',pc='__gwt_marker_com.ephox.keurig.Keurig',qc='base',rc='clear.cache.gif',sc='com.ephox.keurig.Keurig',tc='content',uc='default',vc='en',wc='gecko',xc='gecko1_8',yc='gwt.codesvr=',zc='gwt.hosted=',Ac='gwt.hybrid',Bc='gwt:onLoadErrorFn',Cc='gwt:onPropertyErrorFn',Dc='gwt:property',Ec='http://code.google.com/p/google-web-toolkit/issues/detail?id=2079',Fc='ie10',Gc='ie8',Hc='ie9',Ic='img',Jc='locale',Kc='locale=',Lc='meta',Mc='msie',Nc='name',Oc='safari',Pc='unknown',Qc='user.agent',Rc='webkit';var k=Pb,l=Qb,m=Rb,n=Sb,o=Tb,p=Ub,q=Vb,r=Wb,s=Xb,t=Yb,u=Zb,v=$b,w=_b,A=ac,B=bc,C=cc,D=dc,F=ec,G=fc,H=gc,I=hc,J=ic,K=jc,L=kc,M=lc,N=mc,O=nc,P=oc,Q=pc,R=qc,S=rc,T=sc,U=tc,V=uc,W=vc,X=wc,Y=xc,Z=yc,$=zc,_=Ac,ab=Bc,bb=Cc,cb=Dc,db=Ec,eb=Fc,fb=Gc,gb=Hc,hb=Ic,ib=Jc,jb=Kc,kb=Lc,lb=Mc,mb=Nc,nb=Oc,ob=Pc,pb=Qc,qb=Rc;var rb=window,sb=document,tb,ub,vb=k,wb={},xb=[],yb=[],zb=[],Ab=0,Bb,Cb;if(!rb.__gwt_stylesLoaded){rb.__gwt_stylesLoaded={}}if(!rb.__gwt_scriptsLoaded){rb.__gwt_scriptsLoaded={}}function Db(){var b=false;try{var c=rb.location.search;return (c.indexOf(Z)!=-1||(c.indexOf($)!=-1||rb.external&&rb.external.gwtOnLoad))&&c.indexOf(_)==-1}catch(a){}Db=function(){return b};return b} -function Eb(){if(tb&&ub){tb(Bb,T,vb,Ab)}} -function Fb(){var e,f=Q,g;sb.write(G+f+n);g=sb.getElementById(f);e=g&&g.previousSibling;while(e&&e.tagName!=L){e=e.previousSibling}function h(a){var b=a.lastIndexOf(o);if(b==-1){b=a.length}var c=a.indexOf(I);if(c==-1){c=a.length}var d=a.lastIndexOf(q,Math.min(c,b));return d>=0?a.substring(0,d+1):k} -;if(e&&e.src){vb=h(e.src)}if(vb==k){var i=sb.getElementsByTagName(R);if(i.length>0){vb=i[i.length-1].href}else{vb=h(sb.location.href)}}else if(vb.match(/^\w+:\/\//)){}else{var j=sb.createElement(hb);j.src=vb+S;vb=h(j.src)}if(g){g.parentNode.removeChild(g)}} -function Gb(){var b=document.getElementsByTagName(kb);for(var c=0,d=b.length;c<d;++c){var e=b[c],f=e.getAttribute(mb),g;if(f){if(f==cb){g=e.getAttribute(U);if(g){var h,i=g.indexOf(H);if(i>=0){f=g.substring(0,i);h=g.substring(i+1)}else{f=g;h=k}wb[f]=h}}else if(f==bb){g=e.getAttribute(U);if(g){try{Cb=eval(g)}catch(a){alert(J+g+m)}}}else if(f==ab){g=e.getAttribute(U);if(g){try{Bb=eval(g)}catch(a){alert(J+g+l)}}}}}} -function Hb(a,b){return b in xb[a]} -function Ib(a){var b=wb[a];return b==null?null:b} -function Jb(a,b){var c=zb;for(var d=0,e=a.length-1;d<e;++d){c=c[a[d]]||(c[a[d]]=[])}c[a[e]]=b} -function Kb(a){var b=yb[a](),c=xb[a];if(b in c){return b}var d=[];for(var e in c){d[c[e]]=e}if(Cb){Cb(a,d,b)}throw null} -yb[ib]=function(){var b=null;var c=V;try{if(!b){var d=location.search;var e=d.indexOf(jb);if(e>=0){var f=d.substring(e+7);var g=d.indexOf(p,e);if(g<0){g=d.length}b=d.substring(e+7,g)}}if(!b){b=Ib(ib)}if(!b){b=rb[P]}if(b){c=b}while(b&&!Hb(ib,b)){var h=b.lastIndexOf(O);if(h<0){b=null;break}b=b.substring(0,h)}}catch(a){alert(N+a)}rb[P]=c;return b||V};xb[ib]={'default':0,en:1};yb[pb]=function(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(qb)!=-1}())return nb;if(function(){return b.indexOf(lb)!=-1&&sb.documentMode>=10}())return eb;if(function(){return b.indexOf(lb)!=-1&&sb.documentMode>=9}())return gb;if(function(){return b.indexOf(lb)!=-1&&sb.documentMode>=8}())return fb;if(function(){return b.indexOf(X)!=-1}())return Y;return ob};xb[pb]={gecko1_8:0,ie10:1,ie8:2,ie9:3,safari:4};com_ephox_keurig_Keurig.onScriptLoad=function(a){com_ephox_keurig_Keurig=null;tb=a;Eb()};if(Db()){alert(M+db);return}Fb();Gb();try{var Lb;Jb([V,Y],r);Jb([V,eb],r+t);Jb([V,fb],r+u);Jb([V,gb],r+v);Jb([V,nb],r+w);Jb([W,Y],r+A);Jb([W,eb],r+B);Jb([W,fb],r+C);Jb([W,gb],r+D);Jb([W,nb],r+F);Lb=zb[Kb(ib)][Kb(pb)];var Mb=Lb.indexOf(s);if(Mb!=-1){Ab=Number(Lb.substring(Mb+1))}}catch(a){return}var Nb;function Ob(){if(!ub){ub=true;Eb();if(sb.removeEventListener){sb.removeEventListener(K,Ob,false)}if(Nb){clearInterval(Nb)}}} -if(sb.addEventListener){sb.addEventListener(K,function(){Ob()},false)}var Nb=setInterval(function(){if(/loaded|complete/.test(sb.readyState)){Ob()}},50)} -com_ephox_keurig_Keurig();(function () {var $gwt_version = "2.6.1";var $wnd = window;var $doc = $wnd.document;var $moduleName, $moduleBase;var $stats = $wnd.__gwtStatsEvent ? function(a) {$wnd.__gwtStatsEvent(a)} : null;var $strongName = '90BA12EED4B8175F02A135767FCD6360';function A(){} -function Z(){} -function Wo(){} -function ub(){} -function uk(){} -function ik(){} -function mk(){} -function qk(){} -function yk(){} -function Jk(){} -function Ng(){} -function Xg(){} -function fh(){} -function Ah(){} -function Ch(){} -function $n(){} -function xg(a){} -function _b(){Kb()} -function md(){kd()} -function pd(){kd()} -function wd(){td()} -function jf(){hf()} -function pf(){of()} -function vf(){uf()} -function Ef(){Df()} -function Of(){Nf()} -function uh(){jh()} -function db(){bb(this)} -function Sl(){Ql(this)} -function _l(){Wl(this)} -function am(){Wl(this)} -function Mm(a){this.b=a} -function Zm(a){this.b=a} -function W(a){this.b=a} -function Gc(a){this.b=a} -function Lc(a){this.b=a} -function Rn(a){this.b=a} -function tn(a){this.c=a} -function Wd(a,b){a.i=b} -function yh(a,b){a.b+=b} -function Xd(a,b){a.h=a.i=b} -function Ic(a,b){yn(a.b,b)} -function Dg(){return zg} -function Ql(a){a.b=new Ah} -function Wl(a){a.b=new Ah} -function mc(){this.b=new Do} -function Jc(){this.b=new Fn} -function Do(){this.b=new Fn} -function fg(){fg=Wo;eg=new A} -function xb(){xb=Wo;wb=new _b} -function Ec(){Cc();return sc} -function cg(){Tj().w(this)} -function cl(){cg.call(this)} -function Fk(){cg.call(this)} -function Uk(){cg.call(this)} -function Wk(){cg.call(this)} -function Zk(){cg.call(this)} -function eo(){cg.call(this)} -function oo(){cg.call(this)} -function Gk(a){dg.call(this,a)} -function Xk(a){dg.call(this,a)} -function $k(a){dg.call(this,a)} -function gl(a){Xk.call(this,a)} -function hm(a){dg.call(this,a)} -function ae(a){this.b=xl(a+Ap)} -function ic(){this.c=(Cc(),wc)} -function Qo(a,b,c){Dm(a.b,b,c)} -function Sf(a,b){a.b[a.c++]=b} -function Ud(a,b){return a.i+=b} -function Pd(a,b){return a.f[b]} -function Io(a,b){return a.e[b]} -function Am(b,a){return b.f[Pp+a]} -function dk(b,a){return b.exec(a)} -function ak(a){return new $j[a]} -function bk(){return !!$stats} -function Dn(a){return Eh(a.b,a.c)} -function rn(a){return a.b<a.c.J()} -function Qd(a,b){return a.f[b]<=32} -function Gd(a,b){return Hd(a,b,a.k)} -function Kd(a,b){return Ld(a,b,a.k)} -function Rg(a){return Vg((Tj(),a))} -function Mo(a){No.call(this,a,0)} -function cn(a,b){this.c=a;this.b=b} -function jo(a,b){this.b=a;this.c=b} -function Rl(a,b){yh(a.b,b);return a} -function Xl(a,b){yh(a.b,b);return a} -function Co(a,b){yn(a.b,b);return b} -function Ln(a,b,c){a.splice(b,c)} -function Yl(a,b){return ll(a.b.b,b)} -function Fg(a,b){return Bh(a,b,null)} -function Dh(a){return Eh(a,a.length)} -function Wh(a){return a==null?null:a} -function Cm(b,a){return Pp+a in b.f} -function ol(b,a){return b.indexOf(a)} -function Gg(a){$wnd.clearTimeout(a)} -function dg(a){this.f=a;Tj().w(this)} -function Fn(){this.b=Hh(Mj,$o,0,0,0)} -function Tl(a){Ql(this);yh(this.b,a)} -function bm(a){Wl(this);yh(this.b,a)} -function T(a,b){L();this.c=a;this.b=b} -function Nc(a,b){return b<256&&a.b[b]} -function Qh(a,b){return a.cM&&a.cM[b]} -function Jo(a,b){return ek(a.c,a.b,b)} -function Al(a){return Hh(Oj,$o,1,a,0)} -function Sg(a){return parseInt(a)||-1} -function Cg(a){return a.$H||(a.$H=++tg)} -function Ph(a,b){return a.cM&&!!a.cM[b]} -function _c(a,b){return a.b[b>=128?0:b]} -function fk(a,b){return new RegExp(a,b)} -function Vh(a){return a.tM==Wo||Ph(a,1)} -function ll(b,a){return b.charCodeAt(a)} -function ln(a,b){(a<0||a>=b)&&on(a,b)} -function Th(a,b){return a!=null&&Ph(a,b)} -function ek(c,a,b){return a.replace(c,b)} -function pl(c,a,b){return c.indexOf(a,b)} -function ql(b,a){return b.lastIndexOf(a)} -function Yn(){Yn=Wo;Xn=new $n} -function Kg(){Kg=Wo;Jg=new Ng} -function Vo(){Vo=Wo;Uo=new So} -function Ll(){Ll=Wo;Il={};Kl={}} -function ge(){ge=Wo;fe=xl('class=')} -function Ve(){Ve=Wo;Ue=xl(yp);Te=xl(zp)} -function kd(){kd=Wo;ed();jd=xl('style=')} -function Qc(){Qc=Wo;Pc=xl('<v:imagedata ')} -function Re(){Re=Wo;Qe=xl('/*');Pe=xl('*/')} -function Sc(a,b){return Sd(a,b)&&Ed(a,62)} -function wl(c,a,b){return c.substr(a,b-a)} -function Zl(a,b,c){return zh(a.b,b,c,op),a} -function $l(a,b,c,d){zh(a.b,b,c,d);return a} -function An(a,b){ln(b,a.c);return a.b[b]} -function Ho(a){a.e=dk(a.c,a.b);return !!a.e} -function Pk(a){var b=$j[a.d];a=null;return b} -function jg(a){return a==null?null:a.name} -function ig(a){return a==null?null:a.message} -function To(a,b){return a!=null?a[b]:null} -function wg(a,b,c){return a.apply(b,c);var d} -function rl(c,a,b){return c.lastIndexOf(a,b)} -function El(a){return String.fromCharCode(a)} -function So(){this.b=new ho;new ho;new ho} -function De(a){Be();this.b=xe;this.b=a?ye:xe} -function Dc(a,b,c){this.d=a;this.c=c;this.b=b} -function Vd(a,b,c){a.f=b;a.k=c;a.h=a.i=0} -function Mn(a,b,c,d){a.splice(b,c,d)} -function Tf(a,b,c,d){fm(b,c,a.b,a.c,d);a.c+=d} -function yn(a,b){Jh(a.b,a.c++,b);return true} -function Wg(){try{null.a()}catch(a){return a}} -function og(a){var b;return b=a,Vh(b)?b.cZ:Ei} -function Qk(a){return typeof a=='number'&&a>0} -function vl(b,a){return b.substr(a,b.length-a)} -function Uh(a){return a!=null&&a.tM!=Wo&&!Ph(a,1)} -function zh(a,b,c,d){a.b=wl(a.b,0,b)+d+vl(a.b,c)} -function Hl(a,b){zl(a.length,b);return Cl(a,0,b)} -function Og(a,b){!a&&(a=[]);a[a.length]=b;return a} -function Tg(a,b){a.length>=b&&a.splice(0,b);return a} -function ue(){ue=Wo;te=xl(pp);se=xl('<\/span')} -function Ne(){Ne=Wo;Me=xl('xmlns');Le=xl('<html')} -function td(){td=Wo;ed();rd=xl('\n\r{');sd=xl(' \t,')} -function L(){L=Wo;J=(Yn(),Yn(),Xn);K=new W(J)} -function hf(){hf=Wo;oe();ue();cf();gf=new Oc('<\n\r')} -function Mh(){Mh=Wo;Kh=[];Lh=[];Nh(new Ch,Kh,Lh)} -function jh(){jh=Wo;Error.stackTraceLimit=128} -function Vf(a){this.b=Hh(Jj,cp,-1,a,1);this.c=0} -function Zc(a,b){var c;c=a.f;Vd(a,b.b,b.c);b.b=c;b.c=0} -function ng(a,b){var c;return c=a,Vh(c)?c.eQ(b):c===b} -function pg(a){var b;return b=a,Vh(b)?b.hC():Cg(b)} -function P(a,b){L();return new T(new W(a),new W(b))} -function Dm(a,b,c){return !b?Fm(a,c):Em(a,b,c,~~Cg(b))} -function go(a,b){return Wh(a)===Wh(b)||a!=null&&ng(a,b)} -function Eo(a,b){return Wh(a)===Wh(b)||a!=null&&ng(a,b)} -function on(a,b){throw new $k('Index: '+a+', Size: '+b)} -function de(){de=Wo;be=new Oc(Bp);ce=new Oc(' \t\r\n')} -function uf(){uf=Wo;oe();ue();cf();ge();tf=new Oc('<c\n\r')} -function cf(){cf=Wo;af=new Oc(' >\r\n\t');bf=new Oc(Bp)} -function Ad(){Ad=Wo;yd=xl(yp);xd=xl(zp);Re();zd=new wd} -function Ol(){if(Jl==256){Il=Kl;Kl={};Jl=0}++Jl} -function bb(a){if(!ab){ab=true;Vo();Qo(Uo,ci,a);cb(a)}} -function Eg(a){$wnd.setTimeout(function(){throw a},0)} -function Hg(){return Fg(function(){sg!=0&&(sg=0);vg=-1},10)} -function tl(c,a,b){b=Bl(b);return c.replace(RegExp(a,dq),b)} -function ml(a,b){if(!Th(b,1)){return false}return String(a)==b} -function Rh(a,b){if(a!=null&&!Qh(a,b)){throw new Uk}return a} -function sn(a){if(a.b>=a.c.J()){throw new oo}return a.c.T(a.b++)} -function em(a){$k.call(this,'String index out of range: '+a)} -function il(a,b,c){this.b=Rp;this.e=a;this.c=b;this.d=c} -function zb(a,b){xb();this.b=rb(new ub,a);this.c=b;this.d=true} -function Ko(a,b){var c;this.b=b;this.c=fk((c=a.b,c.source),dq)} -function Hh(a,b,c,d,e){var f;f=Gh(e,d);Ih(a,b,c,f);return f} -function Lk(a,b,c){var d;d=new Jk;d.e=a+b;Qk(c)&&Rk(c,d);return d} -function Ih(a,b,c,d){Mh();Oh(d,Kh,Lh);d.cZ=a;d.cM=b;d.qI=c;return d} -function nl(a,b,c,d){var e;for(e=0;e<b;++e){c[d++]=a.charCodeAt(e)}} -function Ag(a,b,c){var d;d=yg();try{return wg(a,b,c)}finally{Bg(d)}} -function xn(a,b,c){(b<0||b>a.c)&&on(b,a.c);Mn(a.b,b,0,c);++a.c} -function Uf(a){for(;a.c>0;a.c--){if(a.b[a.c-1]>32){break}}} -function Fm(a,b){var c;c=a.c;a.c=b;if(!a.d){a.d=true;++a.e}return c} -function Fh(a,b){var c,d;c=a;d=Gh(0,b);Ih(c.cZ,c.cM,c.qI,d);return d} -function of(){of=Wo;le();$e();Je();Ne();Qc();nf=new Oc('<x\n\r')} -function $e(){$e=Wo;Ze=xl('<![if');Ye=xl(Cp);Xe=xl('<![endif]>')} -function le(){le=Wo;ke=xl('<!--[if');je=xl(Cp);ie=xl('<![endif]-->')} -function qg(a){return a.toString?a.toString():'[JavaScriptObject]'} -function Xh(a){return ~~Math.max(Math.min(a,2147483647),-2147483648)} -function Sh(a){if(a!=null&&(a.tM==Wo||Ph(a,1))){throw new Uk}return a} -function zl(a,b){if(b<0){throw new em(b)}if(b>a){throw new em(b)}} -function Bn(a,b,c){for(;c<a.c;++c){if(Eo(b,a.b[c])){return c}}return -1} -function Cn(a,b){var c;c=(ln(b,a.c),a.b[b]);Ln(a.b,b,1);--a.c;return c} -function Nk(a,b){var c;c=new Jk;c.e=a+b;Qk(0)&&Rk(0,c);c.c=2;return c} -function Ok(a,b){var c;c=new Jk;c.e=op+a;Qk(b)&&Rk(b,c);c.c=1;return c} -function Eh(a,b){var c,d;c=a;d=c.slice(0,b);Ih(c.cZ,c.cM,c.qI,d);return d} -function xl(a){var b,c;c=a.length;b=Hh(Jj,cp,-1,c,1);nl(a,c,b,0);return b} -function Ao(a){var b;b=a.b.c;if(b>0){return An(a.b,b-1)}else{throw new eo}} -function Bo(a){var b;b=a.b.c;if(b>0){return Cn(a.b,b-1)}else{throw new eo}} -function gb(a,b,c){var d;d=hb(a,b,c);if(d>3*c){throw new Wk}else{return d}} -function Zb(a,b){var c,d;c=Ub(a,Gb,b,wp);d=Ub(a,Jb,c,xp);return d==null?b:d} -function xm(a,b){return b==null?a.d:Th(b,1)?Cm(a,Rh(b,1)):Bm(a,b,~~pg(b))} -function ym(a,b){return b==null?a.c:Th(b,1)?Am(a,Rh(b,1)):zm(a,b,~~pg(b))} -function R(a,b){return U(a.c.b,b.c.b)&&(L(),U(Rh(a.b.b,25),Rh(b.b.b,25)))} -function Nn(a,b,c,d){Array.prototype.splice.apply(a,[b,c].concat(d))} -function Oh(a,b,c){Mh();for(var d=0,e=b.length;d<e;++d){a[b[d]]=c[d]}} -function Nh(a,b,c){var d=0,e;for(var f in a){if(e=a[f]){b[d]=f;c[d]=e;++d}}} -function Gm(e,a,b){var c,d=e.f;a=Pp+a;a in d?(c=d[a]):++e.e;d[a]=b;return c} -function Mk(a,b,c,d){var e;e=new Jk;e.e=a+b;Qk(c)&&Rk(c,e);e.c=d?8:0;return e} -function G(a,b){var c,d;d=new am(a.length*b);for(c=0;c<b;c++){yh(d.b,a)}return d.b.b} -function Bh(a,b,c){var d=$wnd.setTimeout(function(){a();c!=null&&xg(c)},b);return d} -function Go(a,b,c){Rl(b,wl(a.b,a.d,a.e.index));yh(b.b,c);a.d=a.c.lastIndex;return a} -function ho(){this.b=[];this.f={};this.d=false;this.c=null;this.e=0} -function hg(a){fg();cg.call(this);this.b=op;this.c=a;this.b=op;Tj().u(this)} -function Bg(a){a&&Mg((Kg(),Jg));--sg;if(a){if(vg!=-1){Gg(vg);vg=-1}}} -function Yj(a){if(Th(a,24)){return a}return a==null?new hg(null):Wj(a)} -function re(a){if(!Yd(a)){return false}if(a.i==a.h){return false}a.h=a.i;return true} -function Ed(a,b){var c;for(c=a.i;c<a.k;c++){if(a.f[c]==b){a.i=c;return true}}return false} -function Jd(a,b){var c;for(c=a.i;c<a.k;c++){if(Nc(b,a.f[c])){a.i=c;return true}}return false} -function Fd(a,b,c){var d;for(d=a.i;d<c;d++){if(a.f[d]==b){a.i=d;return true}}return false} -function jm(a,b){var c;while(a.N()){c=a.O();if(b==null?c==null:ng(b,c)){return a}}return null} -function Mg(a){var b,c;if(a.c){c=null;do{b=a.c;a.c=null;c=Pg(b,c)}while(a.c);a.c=c}} -function Lg(a){var b,c;if(a.b){c=null;do{b=a.b;a.b=null;c=Pg(b,c)}while(a.b);a.b=c}} -function Pb(a){var b,c;b=a.b>1?' start="'+a.b+tp:op;c=a.c;return sp+c.b+b+c.c+'><li>'} -function Rm(a){var b;b=new Fn;a.d&&yn(b,new Zm(a));wm(a,b);vm(a,b);this.b=new tn(b)} -function X(a){var b,c,d;d=new Fn;for(c=new tn(a);c.b<c.c.J();){b=Rh(sn(c),25);zn(d,b)}return d} -function rb(a,b){var c,d;d=tl(b,''',"'");a.b=new bm(d);c=true;while(c){c=tb(a)}return a.b.b.b} -function mb(a,b){var c,d,e;e=pl(a,Fl(32),b);d=pl(a,Fl(62),b);c=e<d&&e!=-1?e:d;return wl(a,b,c)} -function U(a,b){if(a==null||b==null){throw new Xk('No nulls permitted')}return ng(a,b)} -function Ck(a,b,c){c&&(a=a.replace(new RegExp('\\.\\*',dq),'[\\s\\S]*'));return new RegExp(a,b)} -function ib(a,b,c){if(a.b.b.length>0&&a.b.b.charCodeAt(0)==b){zh(a.b,0,1,op);return c}else{return 0}} -function hb(a,b,c){var d;d=0;while(a.b.b.length>0&&a.b.b.charCodeAt(0)==b){zh(a.b,0,1,op);d+=c}return d} -function zn(a,b){var c,d;c=b.K();d=c.length;if(d==0){return false}Nn(a.b,a.c,0,c);a.c+=d;return true} -function We(a){if(!Sd(a,Ue)){return false}if(!Gd(a,Te)){return false}Xd(a,a.i+Te.length);return true} -function Se(a){if(!Sd(a,Qe)){return false}a.i+=2;if(!Gd(a,Pe)){return false}Xd(a,a.i+2);return true} -function Xj(a){var b;if(Th(a,13)){b=Rh(a,13);if(b.c!==(fg(),eg)){return b.c===eg?null:b.c}}return a} -function Wb(a){var b,c;b=new tn(a.b);while(b.b<b.c.J()){c=Rh(sn(b),11);if(Xb(c)){return false}}return true} -function Td(a,b,c){var d,e,f;for(e=0,f=c.length;e<f;++e){d=c[e];if(Rd(a,b,d)){return true}}return false} -function Kk(a,b,c,d){var e;e=new Jk;e.e=a+b;Qk(c!=0?-c:0)&&Rk(c!=0?-c:0,e);e.c=4;e.b=d;return e} -function Tj(){switch(Sj){case 0:case 5:return new fh;case 4:case 9:return new uh;}return new Xg} -function zg(c){return function(){try{return Ag(c,this,arguments);var b}catch(a){throw a}}} -function Wj(b){var c=b.__gwt$exception;if(!c){c=new hg(b);try{b.__gwt$exception=c}catch(a){}}return c} -function qe(a,b){var c;c=0;while(a.length>b+c&&null!=String.fromCharCode(a[b+c]).match(/[A-Z\d]/i)){++c}return c} -function _f(a){var b,c,d;c=Hh(Nj,$o,23,a.length,0);for(d=0,b=a.length;d<b;++d){if(!a[d]){throw new cl}c[d]=a[d]}} -function Wc(){Wc=Wo;Uc=Ih(Lj,$o,12,[new pf,new Ef,new vf,new jf]);Vc=Ih(Lj,$o,12,[new pf,new Of,new jf])} -function Df(){Df=Wo;cf();Ad();Cf=new De(false);de();Af=new md;Bf=new ae(Jp);zf=new Oc('<lsovwxp')} -function Nf(){Nf=Wo;cf();Ve();Mf=new De(true);de();Jf=new pd;Kf=new ae('class');Lf=new ae(Jp);If=new Oc('<lscovwxp')} -function Je(){Je=Wo;Fe=xl('<meta');Ge=xl('name=');Ie=xl('ProgId');Ee=xl('Generator');He=xl('Originator')} -function M(a){var b;b=yb(Rh(a.c.b,1));return P(b.c.b,X(new Rn(Ih(Mj,$o,0,[Rh(a.b.b,25),Rh(b.b.b,25)]))))} -function Lb(a,b){var c;if(Wb(b)){Jh(a.b,a.c++,b)}else{c=new tn(b.b);while(c.b<c.c.J()){yn(a,new Gc(Rh(sn(c),11).b))}}} -function wm(e,a){var b=e.f;for(var c in b){if(c.charCodeAt(0)==58){var d=new cn(e,c.substring(1));a.G(d)}}} -function Od(a,b){var c;c=b;for(;c>=0;c--){if(a.f[c]==62){return false}if(a.f[c]==60){a.i=c;return true}}return false} -function Yd(a){var b,c;for(c=a.i;c<a.k;c++){b=a.f[c];if(b!=32&&b!=9&&b!=13&&b!=10){a.i=c;return true}}return false} -function Nl(a){Ll();var b=Pp+a;var c=Kl[b];if(c!=null){return c}c=Il[b];c==null&&(c=Ml(a));Ol();return Kl[b]=c} -function Hk(a){if(a>=48&&a<58){return a-48}if(a>=97&&a<97){return a-97+10}if(a>=65&&a<65){return a-65+10}return -1} -function jb(a,b,c,d){if(a.b.b.length>1&&a.b.b.charCodeAt(0)==b&&a.b.b.charCodeAt(1)==c){zh(a.b,0,2,op);return d}else{return 0}} -function Ob(a,b){var c,d,e;e=new Ko(Db,b);e.e=dk(e.c,e.b);if(e.e){d=Io(e,e.e[1]==null?2:1);c=_k(d);return c==0?1:c}else{return a}} -function Ld(a,b,c){var d,e,f,g;for(g=a.i;g<c;g++){for(e=0,f=b.length;e<f;++e){d=b[e];if(d==a.f[g]){a.i=g;return true}}}return false} -function yg(){var a;if(sg!=0){a=(new Date).getTime();if(a-ug>2000){ug=a;vg=Hg()}}if(sg++==0){Lg((Kg(),Jg));return true}return false} -function gwtOnLoad(b,c,d,e){$moduleName=c;$moduleBase=d;Sj=e;if(b)try{mp(Vj)()}catch(a){b(c)}else{mp(Vj)()}} -function No(a,b){var c,d;this.b=(c=false,d=op,(b&1)!=0&&(d+='m'),(b&2)!=0&&(d+=Dp),(b&32)!=0&&(c=true),Ck(a,d,c))} -function Oc(a){var b;this.b=Hh(Pj,ap,-1,256,2);for(b=0;b<a.length;b++){a.charCodeAt(b)<256&&(this.b[a.charCodeAt(b)]=true)}} -function Zd(a){this.j=Ih(Qj,bp,2,[]);this.f=Hh(Jj,cp,-1,a.length,1);nl(a,a.length,this.f,0);this.k=a.length;this.h=this.i=0} -function En(a,b){var c;b.length<a.c&&(b=Fh(b,a.c));for(c=0;c<a.c;++c){Jh(b,c,a.b[c])}b.length>a.c&&Jh(b,a.c,null);return b} -function Sd(a,b){var c,d;c=b.length-1;if((d=a.i+c)>=a.k){return false}do{if(b[c--]!=a.f[d--]){return false}}while(c>=0);return true} -function Rd(a,b,c){var d,e;e=b;d=c.length-1;if((e+=d)>=a.k){return false}do{if(c[d--]!=a.f[e--]){return false}}while(d>=0);return true} -function ld(a,b,c){var d;if(!Sd(b,jd)){return false}d=b.h;if(!Od(b,d)){return false}b.i=d;return Md(b)&&fd(a,b,c,d,b.e,b.d,b.b)} -function tb(a){var b,c,d,e;c=a.b.b.b.indexOf('mso-number-format:');if(c<0){return false}d=c+18;b=sb(a,d);e=d-18;e>-1&&Zl(a.b,e,b);return true} -function Bl(a){var b;b=0;while(0<=(b=a.indexOf('\\',b))){a.charCodeAt(b+1)==36?(a=wl(a,0,b)+'$'+vl(a,++b)):(a=wl(a,0,b)+vl(a,++b))}return a} -function kh(a,b){var c;c=eh(a,b);if(c.length==0){return (new Xg).A(b)}else{c[0].indexOf('anonymous@@')==0&&(c=Tg(c,1));return c}} -function zm(h,a,b){var c=h.b[b];if(c){for(var d=0,e=c.length;d<e;++d){var f=c[d];var g=f.P();if(h.M(a,g)){return f.Q()}}}return null} -function Bm(h,a,b){var c=h.b[b];if(c){for(var d=0,e=c.length;d<e;++d){var f=c[d];var g=f.P();if(h.M(a,g)){return true}}}return false} -function kc(a,b){var c;if(b.c==(Cc(),uc)||b.c==Ac){if(Ho(new Ko(gc,a))||Ho(new Ko(cc,a))){c=fb(a);if(c==b.b+1){return true}}}return false} -function Id(a,b,c,d){var e,f,g;g=a.k-d+1;for(f=a.i;f<g;f++){for(e=0;e<d;e++){if(b[c+e]!=a.f[f+e]){break}}if(e==d){a.i=f;return true}}return false} -function Hd(a,b,c){var d,e,f,g;d=b.length;g=c-b.length+1;for(f=a.i;f<g;f++){for(e=0;e<d;e++){if(b[e]!=a.f[f+e]){break}}if(e==d){a.i=f;return true}}return false} -function vm(h,a){var b=h.b;for(var c in b){var d=parseInt(c,10);if(c==d){var e=b[d];for(var f=0,g=e.length;f<g;++f){a.G(e[f])}}}} -function eh(a,b){var c,d,e,f;e=Uh(b)?Sh(b):null;f=e&&e.stack?e.stack.split('\n'):[];for(c=0,d=f.length;c<d;c++){f[c]=a.v(f[c])}return f} -function Cl(a,b,c){var d=op;for(var e=b;e<c;){var f=Math.min(e+10000,c);d+=String.fromCharCode.apply(null,a.slice(e,f));e=f}return d} -function Oe(a,b){if(!Sd(a,Me)){return false}if(!Nd(a)){return false}if(!Rd(a,a.m,Le)){return false}if(!Md(a)){return false}Xd(a,a.b);Uf(b);return true} -function me(a){if(!Sd(a,ke)){return false}Ud(a,ke.length);if(!Gd(a,je)){return false}Ud(a,je.length);if(!Gd(a,ie)){return false}Xd(a,a.i+ie.length);return true} -function hn(a,b){var c,d;for(c=0,d=a.b.length;c<d;++c){if(b==null?(ln(c,a.b.length),a.b[c])==null:ng(b,(ln(c,a.b.length),a.b[c]))){return c}}return -1} -function Uj(){switch(Sj){case 4:case 9:return new yk;case 1:case 6:return new mk;case 3:case 8:return new uk;case 2:case 7:return new qk;}return new ik} -function yl(c){if(c.length==0||c[0]>fq&&c[c.length-1]>fq){return c}var a=c.replace(/^([\u0000-\u0020]*)/,op);var b=a.replace(/[\u0000-\u0020]*$/,op);return b} -function Gh(a,b){var c=new Array(b);if(a==3){for(var d=0;d<b;++d){c[d]={l:0,m:0,h:0}}}else if(a>0&&a<3){var e=a==1?0:false;for(var d=0;d<b;++d){c[d]=e}}return c} -function sl(d,a,b){var c;if(a<256){c=al(a);c='\\x'+'00'.substring(c.length)+c}else{c=String.fromCharCode(a)}return d.replace(RegExp(c,dq),String.fromCharCode(b))} -function Rk(a,b){var c;b.d=a;if(a==2){c=String.prototype}else{if(a>0){var d=Pk(b);if(d){c=d.prototype}else{d=$j[a]=function(){};d.cZ=b;return}}else{return}}c.cZ=b} -function Fl(a){var b,c;if(a>=65536){b=55296+(~~(a-65536)>>10&1023)&65535;c=56320+(a-65536&1023)&65535;return El(b)+El(c)}else{return String.fromCharCode(a&65535)}} -function Ro(a){var b,c,d,e,f;f=ul(a,'\\.',0);e=$wnd;b=0;for(c=f.length-1;b<c;b++){if(!ml(f[b],'client')){e[f[b]]||(e[f[b]]={});e=To(e,f[b])}}d=To(e,f[b]);return d} -function sb(a,b){var c,d,e,f,g,h;e=b;f=b-18>-1;d=false;g=0;while(f){c=Yl(a.b,e);c==34&&g!=92&&(d=!d);(h=c==59&&!d,e==a.b.b.b.length-1||h)&&(f=false);++e;g=c}return e} -function oe(){oe=Wo;ne=new ad(Ih(Oj,$o,1,['font','span','b',Dp,'u','sub','sup','em','strong','samp','acronym','cite','code','dfn','kbd','tt','s','ins','del','var']))} -function el(){el=Wo;dl=Ih(Jj,cp,-1,[48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122])} -function Be(){Be=Wo;ze=xl('<link');Ae=xl('rel=');xe=Ih(Qj,bp,2,[xl(Ep),xl(Fp),xl(Gp),xl(Hp),xl(Ip)]);ye=Ih(Qj,bp,2,[xl(Ep),xl(Fp),xl(Gp),xl(Hp),xl(Ip),xl('stylesheet')])} -function al(a){var b,c,d;b=Hh(Jj,cp,-1,8,1);c=(el(),dl);d=7;if(a>=0){while(a>15){b[d--]=c[a&15];a>>=4}}else{while(d>0){b[d--]=c[a&15];a>>=4}}b[d]=c[a&15];return Cl(b,d,8)} -function yb(a){var b,c,d;c='Content before importing MS-Word lists:\r\n'+a;d=Qb(wb,a);b='Content after importing MS-Word lists:\r\n'+d;return P(d,new Rn(Ih(Oj,$o,1,[c,b])))} -function km(a){var b,c,d,e;d=new Sl;b=null;yh(d.b,Sp);c=a.I();while(c.N()){b!=null?(yh(d.b,b),d):(b=gq);e=c.O();yh(d.b,e===a?'(this Collection)':op+e)}yh(d.b,Tp);return d.b.b} -function Ub(a,b,c,d){var e,f,g,h;f=new Ko(b,c);f.e=dk(f.c,f.b);if(f.e){e=f.e[1];h=f.e[2];g=ek(f.c,f.b,sp+d+e+"><li style='list-style: none;'><"+d+h+vp);return Zb(a,g)}return c} -function _e(a,b){var c,d;if(!Sd(a,Ze)){return false}if(!Gd(a,Ye)){return false}c=a.i+Ye.length;if(!Gd(a,Xe)){return false}d=a.i;Tf(b,a.f,c,d-c);Xd(a,a.i+Xe.length);return true} -function _d(a,b,c){if(!Sd(b,a.b)){return false}if(!Od(b,b.h)){return false}if(!Qd(b,b.h-1)){return false}b.i=b.h+a.b.length-1;if(!Md(b)){return false}Uf(c);b.h=b.i=b.b;return true} -function Xc(a,b){Wc();var c,d,e,f,g;c=new Zd(a);e=new Vf(a.length);g=b==1?Vc:Uc;d=g.length-1;for(f=0;f<d;f++){Yc(c,e,g[f]);Zc(c,e)}while(Yc(c,e,g[d])){Zc(c,e)}return Hl(e.b,e.c)} -function gg(a){var b;if(a.d==null){b=a.c===eg?null:a.c;a.e=b==null?Lp:Uh(b)?jg(Sh(b)):Th(b,1)?Mp:og(b).e;a.b=a.b+Kp+(Uh(b)?ig(Sh(b)):b+op);a.d=Np+a.e+') '+(Uh(b)?Rg(Sh(b)):op)+a.b}} -function Sb(a,b){var c,d,e;e=new _l;for(c=0;c<a;c++){d=Rh(Bo(b.b),6).c;yh(e.b,'<\/');Xl(e,d.b);e.b.b+=vp;(b.b.b.c==0?(hc(),fc):Rh(Ao(b.b),6))!=(hc(),fc)&&(yh(e.b,up),e)}return e.b.b} -function Vg(b){var c=op;try{for(var d in b){if(d!='name'&&d!='message'&&d!='toString'){try{var e=d!='__gwt$exception'?b[d]:'<skipped>';c+='\n '+d+Kp+e}catch(a){}}}}catch(a){}return c} -function ck(a){return $stats({moduleName:$moduleName,sessionId:$sessionId,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date).getTime(),type:'onModuleLoadStart',className:a})} -function Qg(a){var b,c,d;d=op;a=yl(a);b=a.indexOf(Np);c=a.indexOf('function')==0?8:0;if(b==-1){b=ol(a,Fl(64));c=a.indexOf('function ')==0?9:0}b!=-1&&(d=yl(wl(a,c,b)));return d.length>0?d:Op} -function Pg(b,c){var d,e,f,g;for(e=0,f=b.length;e<f;e++){g=b[e];try{g[1]?g[0].U()&&(c=Og(c,g)):g[0].U()}catch(a){a=Yj(a);if(Th(a,24)){d=a;Eg(Th(d,13)?Rh(d,13).s():d)}else throw Xj(a)}}return c} -function Qb(a,b){var c,d,e;c=(d=new Ko(new No('<\/?u[0-9]:p>',33),b),ek(d.c,d.b,op));c=Rb(a,c);c=Jo(new Ko(Ib,c),'$1');c=(e=new Ko(new No('style *?=[\'"](;?)[\'"]',32),c),ek(e.c,e.b,op));return c} -function Tb(a,b,c){var d,e;if(b>0){for(d=0;d<b;d++){Co(c.b,a)}return G(Pb(a),b)}else{if(ml(a.c.b,(c.b.b.c==0?(hc(),fc):Rh(Ao(c.b),6)).c.b)){return '<li>'}else{e=Sb(1,c)+Pb(a);Co(c.b,a);return e}}} -function $b(a,b,c,d,e){var f,g,h;h=b;g=new _l;if(b>=c){yh(g.b,up);Xl(g,Sb(b-c,a))}f=a.b.b.c==0?(hc(),fc):Rh(Ao(a.b),6);if(b==c&&f.c!=e.c){Xl(g,Sb(b,a));h=0}Xl(g,Tb(e,c-h,a));yh(g.b,d);return g.b.b} -function Ce(a,b){if(!Sd(b,ze)){return false}Wd(b,b.h+ze.length);if(!Nd(b)){return false}if(!Hd(b,Ae,b.l)){return false}if(!Md(b)){return false}if(!Td(b,b.e,a.b)){return false}Xd(b,b.l+1);return true} -function ee(a,b){var c,d;c=a.f;d=a.h;if(c[d+1]!=58){return false}if(!Nc(be,c[d])){return false}if(!Nc(ce,c[d-1])){return false}if(!Nd(a)){return false}if(!Md(a)){return false}Xd(a,a.b);Uf(b);return true} -function Yb(a){var b,c,d,e,f,g;e=a;if(a.indexOf(pp)==0){c=a.indexOf(rp);if(c>0){d=ol(a,Fl(62))+1;b=wl(a,d,c);g=new Mo('^(?: |\\s)*$');f=new Ko(g,b);f.e=dk(f.c,f.b);!!f.e&&(e=vl(a,c+7))}}return e} -function Ml(a){var b,c,d,e;b=0;d=a.length;e=d-4;c=0;while(c<e){b=a.charCodeAt(c+3)+31*(a.charCodeAt(c+2)+31*(a.charCodeAt(c+1)+31*(a.charCodeAt(c)+31*b)))|0;c+=4}while(c<d){b=b*31+ll(a,c++)}return b|0} -function Em(j,a,b,c){var d=j.b[c];if(d){for(var e=0,f=d.length;e<f;++e){var g=d[e];var h=g.P();if(j.M(a,h)){var i=g.Q();g.R(b);return i}}}else{d=j.b[c]=[]}var g=new jo(a,b);d.push(g);++j.e;return null} -function nb(a){var b,c,d,e;c=new Mo('(class=)([^>[ \\t\\n\\x0B\\f\\r]]*)');b=new Ko(c,a);e=new Sl;while(b.e=dk(b.c,b.b),!!b.e){d=b.e[2];d=d.toLowerCase();Go(b,e,b.e[1]+d)}Rl(e,vl(b.b,b.d));return e.b.b} -function Jh(a,b,c){if(c!=null){if(a.qI>0&&!Qh(c,a.qI)){throw new Fk}else if(a.qI==-1&&(c.tM==Wo||Ph(c,1))){throw new Fk}else if(a.qI<-1&&!(c.tM!=Wo&&!Ph(c,1))&&!Qh(c,-a.qI)){throw new Fk}}return a[b]=c} -function hc(){hc=Wo;bc=new Mo('([\xB7\xA7\u2022\u2043\u25A1o-]|\xD8|·|<img[^>]*>)');gc=new Mo('[A-Z]+');cc=new Mo('[a-z]+');ec=new Mo('X?(?:IX|IV|V?I{0,3})');dc=new Mo('x?(?:ix|iv|v?i{0,3})');fc=new ic} -function _j(a,b,c){var d=$j[a];if(d&&!d.cZ){_=d.prototype}else{!d&&(d=$j[a]=function(){});_=d.prototype=b<0?{}:ak(b);_.cM=c}for(var e=3;e<arguments.length;++e){arguments[e].prototype=_}if(d.cZ){_.cZ=d.cZ;d.cZ=null}} -function Nd(a){for(a.m=a.i;a.m>=0;a.m--){if(a.f[a.m]==62){return false}if(a.f[a.m]==60){break}}if(a.m<0){return false}for(a.l=a.i;a.l<a.k;a.l++){if(a.f[a.l]==60){return false}if(a.f[a.l]==62){return true}}return false} -function fb(a){var b,c,d,e,f;f=a.toLowerCase();if(f.length==0){return 1}else if(f.length==1){c=f.charCodeAt(0);e=c+1-97}else{e=0;for(d=0;d<f.length;d++){c=ll(f,f.length-1-d);b=fb(String.fromCharCode(c))*Xh(Math.pow(26,d));e+=b}}return e} -function Ke(a){var b,c;if(!Sd(a,Fe)){return false}if(!Ed(a,62)){return false}b=a.i;Wd(a,a.h+Fe.length);if(!Hd(a,Ge,b)){return false}c=a.i+Ge.length;a.f[c]==34&&++c;if(Rd(a,c,Ie)||Rd(a,c,Ee)||Rd(a,c,He)){a.h=a.i=b+1;return true}return false} -function ef(a){var b,c;if((a.i>=a.k?0:a.f[a.i])!=64){return false}b=a.h;a.i+=1;c=a.f[b+1];if(!(null!=String.fromCharCode(c).match(/[A-Z]/i))&&c!=95){return false}if(!Ed(a,123)){return false}if(!Ed(a,125)){return false}Xd(a,a.i+1);return true} -function vd(a,b,c){var d,e,f,g;e=c;a.i=b;if(!Fd(a,46,c)){return}do{a.i+=1}while(Fd(a,46,c));d=a.i;Ld(a,sd,c)&&(e=a.i);if(e==d){return}f=a.j;g=f.length;a.j=Hh(Qj,bp,2,g+1,0);g!=0&&fm(f,0,a.j,0,g);a.j[g]=Hh(Jj,cp,-1,e-d,1);fm(a.f,d,a.j[g],0,e-d)} -function Xb(a){var b,c,d,e,f,g,h;c=a.b;g=new Ko(Hb,c);g.e=dk(g.c,g.b);if(g.e){f=g.e[2];h=new Ko(Eb,f);h.e=dk(h.c,h.b);if(h.e){e=h.e[1];b=h.e[2];d=new Ko(new Mo('^\\d\\.'),e);d.e=dk(d.c,d.b);if(!!d.e&&f.indexOf(e+b)!=-1){return true}}}return false} -function ob(b,c,d){var e,f,g;try{g=b?(Wc(),Tc):1;e=Xc(d,g);e=pb(e);b&&!c&&(e=nb(e));return L(),L(),new T(new W(e),K)}catch(a){a=Yj(a);if(Th(a,20)){f=a;return L(),P(op,new Rn(Ih(Oj,$o,1,['Failed to clean MS Office HTML.\n'+f.r()])))}else throw Xj(a)}} -function Cd(a,b){var c,d,e,f,g;if(!Sd(a,yd)){return false}g=a.i;if(!Gd(a,xd)){return false}c=a.i+xd.length;d=b.c;Tf(b,yd,0,yd.length);e=a.k;Vd(a,a.f,a.i);Xd(a,g+yd.length);f=Bd(a,b);Vd(a,a.f,e);if(f){Tf(b,xd,0,xd.length);a.h=a.i=c}else{b.c=d;a.h=a.i=g}return f} -function ad(a){var b,c,d,e,f,g,h;this.b=Hh(Rj,$o,3,128,0);for(c=0,d=a.length;c<d;++c){b=a[c];g=xl(b);e=g[0];e>=128&&(e=0);if(this.b[e]==null){this.b[e]=Ih(Qj,bp,2,[g])}else{h=this.b[e];f=h.length;this.b[e]=Hh(Qj,bp,2,f+1,0);fm(h,0,this.b[e],0,f);this.b[e][f]=g}}} -function Rc(a,b){var c,d,e,f;if(!Sc(a,Pc)){return false}d=a.i;c=a.h+Pc.length;a.i=c;a.h=a.i=c;e=xl('<img ');Tf(b,e,0,e.length);f=xl('o:title="');if(!Hd(a,f,d)){return true}Tf(b,a.f,c,a.i-c);Wd(a,a.i+f.length);if(!Fd(a,34,d)){return true}Wd(a,a.i+1);Xd(a,a.i);return true} -function Vb(a){var b,c,d,e;e=new Fn;d=null;for(c=0;c<a.c;c++){b=(ln(c,a.c),Rh(a.b[c],10));if(Th(b,8)){if(!Ho(new Ko(Fb,Rh(b,8).b))||c+1>=a.c||!Th((ln(c+1,a.c),a.b[c+1]),11)||!d){if(d){Lb(e,d);d=null}Jh(e.b,e.c++,b)}}else{!d&&(d=new Jc);Ic(d,Rh(b,11))}}!!d&&Lb(e,d);return e} -function he(a,b){var c,d;if(a.j.length==0){return false}if(!Sd(a,fe)){return false}if(!Nd(a)){return false}if(!Md(a)){return false}c=a.d-a.e;for(d=0;d<a.j.length;d++){if(a.j[d].length==c){if(Rd(a,a.e,a.j[d])){break}}}if(d==a.j.length){return false}Xd(a,a.b);Uf(b);return true} -function Bd(a,b){var c,d,e,f;d=false;f=32;c=a.i>=a.k?0:a.f[a.i];while(c!=0){e=false;switch(c){case 64:e=ef(a);break;case 47:e=Se(a);}!e&&(f==10||f==13)&&(e=ud(zd,a,b));if(e){d=true;f=b.c==0?0:b.b[b.c-1];a.i=a.h;c=a.i>=a.k?0:a.f[a.i]}else{Sf(b,f=c);c=(a.i=++a.h)>=a.k?0:a.f[a.i]}}return d} -function Mb(a,b,c,d,e){var f,g,h,i,j;i=sl(yl(e),10,32);i.lastIndexOf(rp)!=-1&&i.lastIndexOf(rp)==i.length-rp.length&&(i=wl(i,0,i.length-7));while(i.indexOf(sp)==0){h=ol(i,Fl(62));i=vl(i,h+1)}g=ol(i,Fl(60));i=vl(i,g);i=Yb(i);f=new Ko(Cb,i);i=ek(f.c,f.b,op);j=new jc('-',(hc(),fc));Xl(c,$b(a,b,d,i,j))} -function lh(a,b){var c,d,e,f,g,h,i,j,k,l;l=Hh(Nj,$o,23,b.length,0);for(f=0,g=l.length;f<g;f++){k=ul(b[f],Qp,0);i=-1;c=-1;e=Rp;if(k.length==2&&k[1]!=null){j=k[1];h=ql(j,Fl(58));d=rl(j,Fl(58),h-1);e=wl(j,0,d);if(h!=-1&&d!=-1){i=Sg(wl(j,d+1,h));c=Sg(vl(j,h+1))}}l[f]=new il(k[0],e+np+c,a.C(i<0?-1:i))}_f(l)} -function _k(a){var b,c,d,e,f;if(a==null){throw new gl(Lp)}d=a.length;e=d>0&&(a.charCodeAt(0)==45||a.charCodeAt(0)==43)?1:0;for(b=e;b<d;b++){if(Hk(a.charCodeAt(b))==-1){throw new gl(eq+a+tp)}}f=parseInt(a,10);c=f<-2147483648;if(isNaN(f)){throw new gl(eq+a+tp)}else if(c||f>2147483647){throw new gl(eq+a+tp)}return f} -function ve(a,b){var c,d,e,f;if(!Sd(a,te)){return false}f=a.h+te.length;for(;f<a.k;f++){c=a.f[f];if(c==62){break}if(c!=32&&c!=10&&c!=9&&c!=13){return false}}e=a.i=f+1;if(!Gd(a,se)){return false}d=a.i;a.i=e;if(Hd(a,te,d)){return false}Wd(a,d+se.length);if(!Ed(a,62)){return false}Tf(b,a.f,e,d-e);Xd(a,a.i+1);return true} -function ed(){ed=Wo;dd=new ad(Ih(Oj,$o,1,['font-color','horiz-align','language','list-image-','mso-','page:','separator-image','tab-stops','tab-interval','text-underline','text-effect','text-line-through','table-border-color-dark','table-border-color-light','vert-align','vnd.ms-excel.']));cd=new ad(Ih(Oj,$o,1,['mso-list']))} -function Yc(a,b,c){var d,e,f,g,h,i,j;j=a.k;e=a.f;a.h=a.i=0;f=32;d=c.p();h=0;i=0;g=false;while(i<j){for(;h<j;h++){f=e[h];if(f<256&&d[f]){break}}if(h>=j){fm(e,i,b.b,b.c,j-i);b.c+=j-i;break}(f==10||f==13)&&++h;h!=i&&(fm(e,i,b.b,b.c,h-i),b.c+=h-i);if(h==j){break}a.i=a.h=h;if(c.q(a,b,f)){g=true;i=h=a.i=a.h}else{i=h;f!=10&&f!=13&&++h}}return g} -function fd(a,b,c,d,e,f,g){var h,i,j,k,l,m;l=d;m=e;k=c.c;b.i=e;i=false;j=false;while(m<f){if(!Yd(b)||b.i>=f){break}h=a.o(b);if(h){i=true;m!=l&&Tf(c,b.f,l,m-l);if(Fd(b,59,f)){l=m=b.i+=1}else{l=f;break}}else{j=true;if(Fd(b,59,f)){m=b.i+=1}else{break}}}if(j&&!i){return false}if(j&&i){g!=l&&Tf(c,b.f,l,g-l)}else{c.c=k;Uf(c)}b.h=b.i=g;return true} -function Cc(){Cc=Wo;wc=new Dc('NO_TYPE',op,op);zc=new Dc('UNORDERED',xp,op);yc=new Dc('SQUARE',xp,' type="square"');tc=new Dc('CIRCLE',xp,' type="circle"');xc=new Dc('NUMERIC',wp,op);Bc=new Dc('UPPER_ROMAN',wp,' type="I"');vc=new Dc('LOWER_ROMAN',wp,' type="i"');Ac=new Dc('UPPER_ALPHA',wp,' type="A"');uc=new Dc('LOWER_ALPHA',wp,' type="a"');sc=Ih(Kj,$o,7,[wc,zc,yc,tc,xc,Bc,vc,Ac,uc])} -function ud(a,b,c){var d,e,f,g,h,i,j,k,l;i=b.i;if(b.f[b.i+-1]!=10&&b.f[b.i+-1]!=13){return false}d=b.i>=b.k?0:b.f[b.i];if(d==123||d==125){return false}f=b.i;if(!Kd(b,rd)){return false}e=b.i;if((b.i>=b.k?0:b.f[b.i])!=123){if(!Yd(b)){return false}if((b.i>=b.k?0:b.f[b.i])!=123){return false}}l=b.i+1;if(!Ed(b,125)){return false}j=b.i;k=j+1;g=c.c;h=fd(a,b,c,i,l,j,k);h&&c.c<=g&&vd(b,f,e);return h} -function pe(a){var b,c,d,e,f,g;d=a.h+1;b=a.f[d];if(b>127){return false}g=ne.b[b];if(g==null){return false}f=qe(a.f,d);for(c=0;c<g.length;c++){if(Rd(a,d,g[c])&&f==g[c].length){break}}if(c==g.length){return false}e=g[c];a.i=d+e.length;if(!Ed(a,62)){return false}d=a.i+1;if(a.f[d++]!=60||a.f[d++]!=47){return false}if(!Rd(a,d,e)){return false}a.i=d+e.length;if(!Ed(a,62)){return false}Xd(a,a.i+1);return true} -function df(a,b){var c,d,e,f,g,h;f=a.h;if(a.f[f+2]!=58||a.f[f]!=60){return false}if(!Nc(bf,a.f[f+1])){return false}h=f+1;a.i=f+3;if(!Jd(a,af)){return false}g=a.i-h;if(!Ed(a,62)){return false}if(Pd(a,a.i-1)==47){Xd(a,a.i+1);return true}e=a.i+1;while(Id(a,a.f,h,g)){d=a.i-1;c=a.f[d];if(c==60){return false}if(c==47&&Pd(a,--d)==60){if(!Ed(a,62)){return false}Tf(b,a.f,e,d-e);Xd(a,a.i+1);return true}++a.i}return false} -function ul(l,a,b){var c=new RegExp(a,dq);var d=[];var e=0;var f=l;var g=null;while(true){var h=c.exec(f);if(h==null||f==op||e==b-1&&b>0){d[e]=f;break}else{d[e]=f.substring(0,h.index);f=f.substring(h.index+h[0].length,f.length);c.lastIndex=0;if(g==f){d[e]=f.substring(0,1);f=f.substring(1)}g=f;e++}}if(b==0&&l.length>0){var i=d.length;while(i>0&&d[i-1]==op){--i}i<d.length&&d.splice(i,d.length-i)}var j=Al(d.length);for(var k=0;k<d.length;++k){j[k]=d[k]}return j} -function Md(a){var b,c;for(b=a.i;b<a.k;b++){if(a.f[b]==62){return false}if(a.f[b]==61){break}}if(b==a.k){return false}a.c=++b;c=a.f[b];if(c==34||c==39){a.e=++b;for(;b<a.k;b++){if(a.f[b]==62){return false}if(a.f[b]==c){break}}if(b==a.k){return false}a.d=b;a.b=b+1;a.i=a.e;return true}else{a.e=a.c;for(;b<a.k;b++){if(a.f[b]==62){break}if(a.f[b]==32){break}if(a.f[b]==9){break}if(a.f[b]==13){break}if(a.f[b]==10){break}}if(b==a.k){return false}a.d=a.b=b;return true}} -function kb(b){var c,d,e,f,g,h,i;d=0;c=new Tl(b.toLowerCase());e=false;try{d=(f=(g=0,g+=gb(c,109,1000),g+=jb(c,99,109,900),g+=ib(c,100,500),g+=jb(c,99,100,400),g),f=(h=f,h+=gb(c,99,100),h+=jb(c,120,99,90),h+=ib(c,108,50),h+=jb(c,120,108,40),h),f=(i=f,i+=gb(c,120,10),i+=jb(c,105,120,9),i+=ib(c,118,5),i+=jb(c,105,118,4),i),f+=gb(c,105,1),f)}catch(a){a=Yj(a);if(Th(a,21)){e=true}else throw Xj(a)}if(e||c.b.b.length>0){throw new Xk(b+' is not a parsable roman numeral')}return d} -function Vj(){var a,b,c;bk()&&ck('com.google.gwt.useragent.client.UserAgentAsserter');a=Rh(Uj(),15);b=a.D();c=a.F();ml(b,c)||($wnd.alert('ERROR: Possible problem with your *.gwt.xml module file.\nThe compile time user.agent value ('+b+') does not match the runtime user.agent value ('+c+'). Expect more errors.\n'),undefined);bk()&&ck('com.google.gwt.user.client.DocumentModeAsserter');gk();bk()&&ck('com.ephox.keurig.client.Keurig');Vo();new db;$wnd.gwtInited&&$wnd.gwtInited()} -function pb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,q;d=new bm(a);b=d.b.b.length;while(b>-1){b=rl(d.b.b,'<p',b);c=pl(d.b.b,'<\/p>',b);if(b>-1&&c>-1){q=wl(d.b.b,b,c);m=q.indexOf(pp);if(m>-1){l=ol(q,Fl(62));if(l+1==m){f=pl(q,Fl(62),m);n=wl(q,m,f+1);e=n.indexOf(qp);if(e>-1){h=q.lastIndexOf(rp);if(7+h==q.length){i=wl(q,0,ol(q,Fl(62))+1);k=i.indexOf(qp);if(k>-1){j=mb(q,k);o=mb(n,e);if(!ml(j,o)){g=q.length-7;$l(d,g+b,q.length+b,op);$l(d,m+b,m+n.length+b,op);$l(d,k+b,k+j.length+b,o)}}}}}}}--b}return d.b.b} -function Rb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,q,r,s,t,u,v;g=Nb(b);v=Vb(g);s=new mc;u=new _l;for(f=new tn(v);f.b<f.c.J();){e=Rh(sn(f),10);if(Th(e,8)){Xl(u,Rh(e,8).b)}else{h=new tn(Rh(e,9).b);j=0;k=new _l;i=(hc(),fc);while(h.b<h.c.J()){r=Rh(sn(h),11);q=new Ko(Hb,r.b);q.e=dk(q.c,q.b);if(q.e){c=q.e[1];m=Ob(j,c);t=q.e[2];n=new Ko(Eb,t);n.e=dk(n.c,n.b);if(n.e){d=n.e[1];l=Jo(new Ko(Bb,n.e[2]),op);o=new jc(d,i);i=o;Xl(k,$b(s,j,m,l,o))}else{Mb(s,j,k,m,t)}j=m}}yh(k.b,up);Xl(k,Sb(j,s));Xl(u,Zb(a,k.b.b))}}return u.b.b} -function fm(a,b,c,d,e){var f,g,h,i,j,k,l,m,n;if(a==null||c==null){throw new cl}m=og(a);i=og(c);if((m.c&4)==0||(i.c&4)==0){throw new Gk('Must be array types')}l=m.b;g=i.b;if(!((l.c&1)!=0?l==g:(g.c&1)==0)){throw new Gk('Array types must match')}n=a.length;j=c.length;if(b<0||d<0||e<0||b+e>n||d+e>j){throw new Zk}if(((l.c&1)==0||(l.c&4)!=0)&&m!=i){k=Rh(a,22);f=Rh(c,22);if(Wh(a)===Wh(c)&&b<d){b+=e;for(h=d+e;h-->d;){Jh(f,h,k[--b])}}else{for(h=d+e;d<h;){Jh(f,d++,k[b++])}}}else{Array.prototype.splice.apply(c,[d,e].concat(a.slice(b,b+e)))}} -function Nb(a){var b,c,d,e,f,g,h,i,j;e=new Fn;h=new Ko(Hb,a);f=0;while(h.e=dk(h.c,h.b),!!h.e){j=h.e[1];b=new Ko(Db,j);b.e=dk(b.c,b.b);if(b.e){i=!h.e||h.e.length<1?-1:h.e.index;if(i>f){d=new Gc(wl(a,f,i));Jh(e.b,e.c++,d)}g=new Lc(wl(a,!h.e||h.e.length<1?-1:h.e.index,!h.e||h.e.length<1?-1:h.e.index+h.e[0].length));Jh(e.b,e.c++,g)}else{c=(!h.e||h.e.length<1?-1:h.e.index)>f?f:!h.e||h.e.length<1?-1:h.e.index;d=new Gc(wl(a,c,!h.e||h.e.length<1?-1:h.e.index+h.e[0].length));Jh(e.b,e.c++,d)}f=!h.e||h.e.length<1?-1:h.e.index+h.e[0].length}if(f<a.length){d=new Gc(vl(a,f));Jh(e.b,e.c++,d)}return e} -function cb(h){var e=(Vo(),Ro('com.ephox.keurig.WordCleaner'));var f,g=h;$wnd.com.ephox.keurig.WordCleaner=mp(function(){var a,b=this,c=arguments;c.length==1&&g.n(c[0])?(a=c[0]):c.length==0&&(a=new Z);b.g=a;a['__gwtex_wrap']=b;return b});f=$wnd.com.ephox.keurig.WordCleaner.prototype=new Object;$wnd.com.ephox.keurig.WordCleaner.cleanDocument=mp(function(a,b){var c,d;return c=new zb(a,b),d=M(ob(c.c,c.d,c.b)),Rh(d.c.b,1)});$wnd.com.ephox.keurig.WordCleaner.yury=mp(function(a,b){var c;return c=b?(Wc(),Tc):1,Xc(a,c)});if(e)for(p in e)$wnd.com.ephox.keurig.WordCleaner[p]===undefined&&($wnd.com.ephox.keurig.WordCleaner[p]=e[p])} -function jc(a,b){hc();var c,d,e,f,g,h;f=new Ko(bc,a);f.e=dk(f.c,f.b);if(f.e){g=f.e[1];this.c=ml(g,'\xA7')?(Cc(),yc):ml(g,'o')?(Cc(),tc):(Cc(),zc)}else{e=new Ko(new Mo('\\(?(\\d+|[a-zA-Z]+)(?:\\)|\\.)?'),a);e.e=dk(e.c,e.b);if(e.e){c=e.e[1];if(kc(c,b)){this.c=Ho(new Ko(gc,c))?(Cc(),Ac):(Cc(),uc);this.b=fb(c)}else{d=new Ko(dc,c);d.e=dk(d.c,d.b);if(!!d.e&&d.e[0].length!=0){this.c=(Cc(),vc);this.b=kb(c)}else{h=new Ko(ec,c);h.e=dk(h.c,h.b);if(!!h.e&&h.e[0].length!=0){this.c=(Cc(),Bc);this.b=kb(c)}else{if(Ho(new Ko(cc,c))){this.c=(Cc(),uc);this.b=fb(c)}else if(Ho(new Ko(gc,c))){this.c=(Cc(),Ac);this.b=fb(c)}else{this.c=(Cc(),xc);this.b=_k(c)}}}}}else{this.c=(Cc(),zc)}}} -function Kb(){Kb=Wo;Ib=new No('mso\\-list:.*?([;"\'])',32);Db=new No('style=["\'].*?mso\\-list:(?:([0-9]+)|.*?level([0-9]+)).*?["\']',32);Gb=new Mo('<ol([^>]*)><li><ol([^>]*)>');Jb=new Mo('<ul([^>]*)><li><ul([^>]*)>');Eb=new No('^[ \\t\\n\\x0B\\f\\r]*(?:<[^>]*>)*?(?:<span[^>]*>[ \\t\\n\\x0B\\f\\r]*){0,3}(?: |\\s)*(?:<\/span[^>]*>[ \\t\\n\\x0B\\f\\r]*)?([\xB7\xA7\u2022\u2043\u25A1o-]|\xD8|·|<img[^>]*>|\\(?(?:\\d+|[a-zA-z]+)(?:\\)|\\.)?)(?: |\\s)*(?:<span[^>]*>[ \\t\\n\\x0B\\f\\r]*)?(?: |\\s)*(?:<\/span[^>]*>[ \\t\\n\\x0B\\f\\r]*){0,3}(.*?)$',32);Hb=new No('<p([^>]*)>(.*?)<\/p>[ \\t\\n\\x0B\\f\\r]*',32);Fb=new Mo('<p[^>]*>(?:<[^>]*>|[ \\t\\n\\x0B\\f\\r])* (?:<[^>]*>|[ \\t\\n\\x0B\\f\\r])*<\/p>');Cb=new Mo('^(?:<\/[^>]+>)*');Bb=new Mo('<a\\sname="OLE_LINK\\d">|<\/a>')} -function gk(){var a,b,c;b=$doc.compatMode;a=Ih(Oj,$o,1,[Vp]);for(c=0;c<a.length;c++){if(ml(a[c],b)){return}}a.length==1&&ml(Vp,a[0])&&ml('BackCompat',b)?"GWT no longer supports Quirks Mode (document.compatMode=' BackCompat').<br>Make sure your application's host HTML page has a Standards Mode (document.compatMode=' CSS1Compat') doctype,<br>e.g. by using <!doctype html> at the start of your application's HTML page.<br><br>To continue using this unsupported rendering mode and risk layout problems, suppress this message by adding<br>the following line to your*.gwt.xml module file:<br> <extend-configuration-property name=\"document.compatMode\" value=\""+b+'"/>':"Your *.gwt.xml module configuration prohibits the use of the current doucment rendering mode (document.compatMode=' "+b+"').<br>Modify your application's host HTML page doctype, or update your custom 'document.compatMode' configuration property settings."} -var op='',fq=' ',tp='"',Np='(',Up=')',gq=', ',Pp=':',Kp=': ',sp='<',up='<\/li>',rp='<\/span>',zp='<\/style>',pp='<span',yp='<style',Ap='=',vp='>',np='@',Qp='@@',Vp='CSS1Compat',Fp='Edit-Time-Data',Ep='File-List',eq='For input string: "',Gp='Ole-Object-Data',Hp='Original-File',Ip='Preview',Mp='String',Rp='Unknown',Sp='[',jq='[Ljava.lang.',Tp=']',Cp=']>',Op='anonymous',qq='com.ephox.functional.data.immutable.',oq='com.ephox.keurig.client.',pq='com.ephox.tord.guts.',sq='com.ephox.tord.lists.',uq='com.ephox.tord.lists.data.',rq='com.ephox.tord.wordhtmlfilter.',iq='com.google.gwt.core.client.',lq='com.google.gwt.core.client.impl.',kq='com.google.gwt.useragent.client.',qp='dir=',dq='g',bq='gecko',Wp='gecko1_8',Dp='i',$p='ie10',aq='ie8',_p='ie9',hq='java.lang.',nq='java.util.',tq='java.util.regex.',Jp='lang',Zp='msie',Lp='null',wp='ol',mq='org.timepedia.exporter.client.',Bp='ovwxp',Yp='safari',xp='ul',cq='unknown',Xp='webkit';var _,$j={},bp={3:1,16:1,22:1},cp={2:1,16:1},ip={26:1},kp={27:1},_o={4:1},lp={16:1,25:1},Zo={},ap={16:1},gp={16:1,20:1,21:1,24:1},dp={12:1},ep={16:1,20:1,24:1},fp={15:1},$o={16:1,22:1},jp={28:1},hp={17:1};_j(1,-1,Zo,A);_.eQ=function B(a){return this===a};_.gC=function C(){return this.cZ};_.hC=function D(){return Cg(this)};_.tS=function F(){return this.cZ.e+np+al(this.hC())};_.toString=function(){return this.tS()};_.tM=Wo;_j(4,1,{});_j(5,1,_o);_.eQ=function N(a){return Th(a,4)&&R(this,Rh(a,4))};_.hC=function O(){return 42};_.tS=function Q(){return 'value: '+this.c.b+', log: '+Rh(this.b.b,25)};var J,K;_j(8,5,_o,T);_j(10,4,{},W);_j(13,1,{5:1},Z);_j(14,1,{},db);_.n=function eb(a){return a!=null&&Th(a,5)};var ab=false;_j(16,1,{});_.c=false;_.d=false;_j(17,1,{},ub);_j(18,16,{},zb);var wb;_j(19,1,{},_b);var Bb,Cb,Db,Eb,Fb,Gb,Hb,Ib,Jb;_j(20,1,{6:1},ic,jc);_.b=0;var bc,cc,dc,ec,fc,gc;_j(21,1,{},mc);_j(23,1,{16:1,18:1,19:1});_.eQ=function pc(a){return this===a};_.hC=function qc(){return Cg(this)};_.tS=function rc(){return this.d};_j(22,23,{7:1,16:1,18:1,19:1},Dc);var sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc;_j(24,1,{8:1,10:1},Gc);_j(25,1,{9:1,10:1},Jc);_j(26,1,{10:1,11:1},Lc);_j(27,1,{},Oc);var Pc;var Tc=0,Uc,Vc;_j(30,1,{},ad);_j(31,1,{});_.o=function gd(a){var b,c,d;c=a.i>=a.k?0:a.f[a.i];d=_c(cd,c);if(d!=null&&Td(a,a.i,d)){return false}b=_c(dd,c);return b!=null&&Td(a,a.i,b)};var cd,dd;_j(32,31,{},md);var jd;_j(33,32,{},pd);_.o=function od(a){var b,c;b=a.i>=a.k?0:a.f[a.i];c=_c((ed(),cd),b);return c==null||!Td(a,a.i,c)};_j(34,31,{},wd);var rd,sd;var xd,yd,zd;_j(36,1,{},Zd);_.b=0;_.c=0;_.d=0;_.e=0;_.h=0;_.i=0;_.k=0;_.l=0;_.m=0;_j(37,1,{},ae);var be,ce;var fe;var ie,je,ke;var ne;var se,te;_j(44,1,{},De);var xe,ye,ze,Ae;var Ee,Fe,Ge,He,Ie;var Le,Me;var Pe,Qe;var Te,Ue;var Xe,Ye,Ze;var af,bf;_j(52,1,dp,jf);_.p=function kf(){return gf.b};_.q=function lf(a,b,c){switch(c){case 60:if(pe(a)){return true}a.i=a.h;if(ve(a,b)){return true}a.i=a.h;return df(a,b);case 13:case 10:return re(a);}return false};var gf;_j(53,1,dp,pf);_.p=function qf(){return nf.b};_.q=function rf(a,b,c){switch(c){case 60:if(Rc(a,b)){return true}a.i=a.h;if(me(a)){return true}a.i=a.h;if(_e(a,b)){return true}a.i=a.h;return Ke(a);case 120:return Oe(a,b);case 13:case 10:return re(a);}return false};var nf;_j(54,1,dp,vf);_.p=function wf(){return tf.b};_.q=function xf(a,b,c){switch(c){case 60:if(pe(a)){return true}a.i=a.h;if(ve(a,b)){return true}a.i=a.h;return df(a,b);case 13:case 10:return re(a);case 99:return he(a,b);}return false};var tf;_j(55,1,dp,Ef);_.p=function Ff(){return zf.b};_.q=function Gf(a,b,c){switch(c){case 60:if(df(a,b)){return true}a.i=a.h;if(Cd(a,b)){return true}a.i=a.h;if(Ce(Cf,a)){return true}a.i=a.h;return false;case 111:case 118:case 119:case 120:case 112:return ee(a,b);case 115:return ld(Af,a,b);case 108:return _d(Bf,a,b);}return false};var zf,Af,Bf,Cf;_j(56,1,dp,Of);_.p=function Pf(){return If.b};_.q=function Qf(a,b,c){switch(c){case 60:if(df(a,b)){return true}a.i=a.h;if(We(a)){return true}a.i=a.h;if(Ce(Mf,a)){return true}a.i=a.h;return false;case 115:return ld(Jf,a,b);case 99:return _d(Kf,a,b);case 108:return _d(Lf,a,b);case 111:case 118:case 119:case 120:case 112:return ee(a,b);}return false};var If,Jf,Kf,Lf,Mf;_j(57,1,{},Vf);_.tS=function Wf(){return Hl(this.b,this.c)};_.c=0;_j(63,1,{16:1,24:1});_.r=function ag(){return this.f};_.tS=function bg(){var a,b;a=this.cZ.e;b=this.r();return b!=null?a+Kp+b:a};_j(62,63,ep);_j(61,62,ep);_j(60,61,{13:1,16:1,20:1,24:1},hg);_.r=function kg(){gg(this);return this.d};_.s=function lg(){return this.c===eg?null:this.c};var eg;_j(67,1,{});var sg=0,tg=0,ug=0,vg=-1;_j(69,67,{},Ng);var Jg;_j(72,1,{},Xg);_.t=function Yg(){var a={};var b=[];var c=arguments.callee.caller.caller;while(c){var d=this.v(c.toString());b.push(d);var e=Pp+d;var f=a[e];if(f){var g,h;for(g=0,h=f.length;g<h;g++){if(f[g]===c){return b}}}(f||(a[e]=[])).push(c);c=c.caller}return b};_.u=function Zg(a){var b,c,d,e;d=this.A(a.c===(fg(),eg)?null:a.c);e=Hh(Nj,$o,23,d.length,0);for(b=0,c=e.length;b<c;b++){e[b]=new il(d[b],null,-1)}_f(e)};_.v=function $g(a){return Qg(a)};_.w=function _g(a){var b,c,d,e;d=Tj().t();e=Hh(Nj,$o,23,d.length,0);for(b=0,c=e.length;b<c;b++){e[b]=new il(d[b],null,-1)}_f(e)};_.A=function ah(a){return []};_j(74,72,{},fh);_.t=function gh(){return Tg(this.A(Wg()),this.B())};_.A=function hh(a){return eh(this,a)};_.B=function ih(){return 2};_j(73,74,{});_.t=function mh(){var a;a=Tg(kh(this,Wg()),3);a.length==0&&(a=Tg((new Xg).t(),1));return a};_.u=function nh(a){var b;b=kh(this,a.c===(fg(),eg)?null:a.c);lh(this,b)};_.v=function oh(a){var b,c,d,e;if(a.length==0){return Op}e=yl(a);e.indexOf('at ')==0&&(e=vl(e,3));c=e.indexOf(Sp);c!=-1&&(e=yl(wl(e,0,c))+yl(vl(e,e.indexOf(Tp,c)+1)));c=e.indexOf(Np);if(c==-1){c=e.indexOf(np);if(c==-1){d=e;e=op}else{d=yl(vl(e,c+1));e=yl(wl(e,0,c))}}else{b=e.indexOf(Up,c);d=wl(e,c+1,b);e=yl(wl(e,0,c))}c=ol(e,Fl(46));c!=-1&&(e=vl(e,c+1));return (e.length>0?e:Op)+Qp+d};_.w=function ph(a){var b;b=Tj().t();lh(this,b)};_.A=function qh(a){return kh(this,a)};_.C=function rh(a){return a};_.B=function sh(){return 3};_j(75,73,{},uh);_.C=function vh(a){return -1};_j(76,1,{});_j(77,76,{},Ah);_.b=op;_j(81,1,{},Ch);_.qI=0;var Kh,Lh;var Sj=-1;_j(95,1,fp,ik);_.D=function jk(){return Wp};_.F=function kk(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Xp)!=-1}())return Yp;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=10}())return $p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=9}())return _p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=8}())return aq;if(function(){return b.indexOf(bq)!=-1}())return Wp;return cq};_j(96,1,fp,mk);_.D=function nk(){return $p};_.F=function ok(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Xp)!=-1}())return Yp;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=10}())return $p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=9}())return _p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=8}())return aq;if(function(){return b.indexOf(bq)!=-1}())return Wp;return cq};_j(97,1,fp,qk);_.D=function rk(){return aq};_.F=function sk(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Xp)!=-1}())return Yp;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=10}())return $p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=9}())return _p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=8}())return aq;if(function(){return b.indexOf(bq)!=-1}())return Wp;return cq};_j(98,1,fp,uk);_.D=function vk(){return _p};_.F=function wk(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Xp)!=-1}())return Yp;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=10}())return $p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=9}())return _p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=8}())return aq;if(function(){return b.indexOf(bq)!=-1}())return Wp;return cq};_j(99,1,fp,yk);_.D=function zk(){return Yp};_.F=function Ak(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Xp)!=-1}())return Yp;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=10}())return $p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=9}())return _p;if(function(){return b.indexOf(Zp)!=-1&&$doc.documentMode>=8}())return aq;if(function(){return b.indexOf(bq)!=-1}())return Wp;return cq};_j(100,1,{});_.tS=function Dk(){return qg(this.b)};_j(101,61,ep,Fk,Gk);_j(103,1,{},Jk);_.tS=function Sk(){return ((this.c&2)!=0?'interface ':(this.c&1)!=0?op:'class ')+this.e};_.c=0;_.d=0;_j(104,61,ep,Uk);_j(105,61,gp,Wk,Xk);_j(106,61,ep,Zk,$k);_j(110,61,ep,cl);var dl;_j(112,105,gp,gl);_j(113,1,{16:1,23:1},il);_.tS=function jl(){return this.b+'.'+this.e+Np+(this.c!=null?this.c:'Unknown Source')+(this.d>=0?Pp+this.d:op)+Up};_.d=0;_=String.prototype;_.cM={1:1,16:1,17:1,18:1};_.eQ=function Dl(a){return ml(this,a)};_.hC=function Gl(){return Nl(this)};_.tS=_.toString;var Il,Jl=0,Kl;_j(115,1,hp,Sl,Tl);_.tS=function Ul(){return this.b.b};_j(116,1,hp,_l,am,bm);_.tS=function cm(){return this.b.b};_j(117,106,ep,em);_j(119,61,ep,hm);_j(120,1,{});_.G=function lm(a){throw new hm('Add not supported on this collection')};_.H=function mm(a){var b;b=jm(this.I(),a);return !!b};_.K=function nm(){return this.L(Hh(Mj,$o,0,this.J(),0))};_.L=function om(a){var b,c,d;d=this.J();a.length<d&&(a=Fh(a,d));c=this.I();for(b=0;b<d;++b){Jh(a,b,c.O())}a.length>d&&Jh(a,d,null);return a};_.tS=function pm(){return km(this)};_j(122,1,ip);_.eQ=function sm(a){var b,c,d,e,f;if(a===this){return true}if(!Th(a,26)){return false}e=Rh(a,26);if(this.e!=e.e){return false}for(c=new Rm((new Mm(e)).b);rn(c.b);){b=Rh(sn(c.b),27);d=b.P();f=b.Q();if(!(d==null?this.d:Th(d,1)?Cm(this,Rh(d,1)):Bm(this,d,~~pg(d)))){return false}if(!Eo(f,d==null?this.c:Th(d,1)?Am(this,Rh(d,1)):zm(this,d,~~pg(d)))){return false}}return true};_.hC=function tm(){var a,b,c;c=0;for(b=new Rm((new Mm(this)).b);rn(b.b);){a=Rh(sn(b.b),27);c+=a.hC();c=~~c}return c};_.tS=function um(){var a,b,c,d;d='{';a=false;for(c=new Rm((new Mm(this)).b);rn(c.b);){b=Rh(sn(c.b),27);a?(d+=gq):(a=true);d+=op+b.P();d+=Ap;d+=op+b.Q()}return d+'}'};_j(121,122,ip);_.M=function Hm(a,b){return Wh(a)===Wh(b)||a!=null&&ng(a,b)};_.d=false;_.e=0;_j(124,120,jp);_.eQ=function Km(a){var b,c,d;if(a===this){return true}if(!Th(a,28)){return false}c=Rh(a,28);if(c.b.e!=this.J()){return false}for(b=new Rm(c.b);rn(b.b);){d=Rh(sn(b.b),27);if(!this.H(d)){return false}}return true};_.hC=function Lm(){var a,b,c;a=0;for(b=this.I();b.N();){c=b.O();if(c!=null){a+=pg(c);a=~~a}}return a};_j(123,124,jp,Mm);_.H=function Nm(a){var b,c,d;if(Th(a,27)){b=Rh(a,27);c=b.P();if(xm(this.b,c)){d=ym(this.b,c);return go(b.Q(),d)}}return false};_.I=function Om(){return new Rm(this.b)};_.J=function Pm(){return this.b.e};_j(125,1,{},Rm);_.N=function Sm(){return rn(this.b)};_.O=function Tm(){return Rh(sn(this.b),27)};_j(127,1,kp);_.eQ=function Wm(a){var b;if(Th(a,27)){b=Rh(a,27);if(Eo(this.P(),b.P())&&Eo(this.Q(),b.Q())){return true}}return false};_.hC=function Xm(){var a,b;a=0;b=0;this.P()!=null&&(a=pg(this.P()));this.Q()!=null&&(b=pg(this.Q()));return a^b};_.tS=function Ym(){return this.P()+Ap+this.Q()};_j(126,127,kp,Zm);_.P=function $m(){return null};_.Q=function _m(){return this.b.c};_.R=function an(a){return Fm(this.b,a)};_j(128,127,kp,cn);_.P=function dn(){return this.b};_.Q=function en(){return Am(this.c,this.b)};_.R=function fn(a){return Gm(this.c,this.b,a)};_j(129,120,{25:1});_.S=function jn(a,b){throw new hm('Add not supported on this list')};_.G=function kn(a){this.S(this.J(),a);return true};_.eQ=function mn(a){var b,c,d,e,f;if(a===this){return true}if(!Th(a,25)){return false}f=Rh(a,25);if(this.J()!=f.J()){return false}d=this.I();e=f.I();while(d.b<d.c.J()){b=sn(d);c=sn(e);if(!(b==null?c==null:ng(b,c))){return false}}return true};_.hC=function nn(){var a,b,c;b=1;a=this.I();while(a.b<a.c.J()){c=sn(a);b=31*b+(c==null?0:pg(c));b=~~b}return b};_.I=function pn(){return new tn(this)};_j(130,1,{},tn);_.N=function un(){return rn(this)};_.O=function vn(){return sn(this)};_.b=0;_j(131,129,lp,Fn);_.S=function Gn(a,b){xn(this,a,b)};_.G=function Hn(a){return yn(this,a)};_.H=function In(a){return Bn(this,a,0)!=-1};_.T=function Jn(a){return An(this,a)};_.J=function Kn(){return this.c};_.K=function On(){return Dn(this)};_.L=function Pn(a){return En(this,a)};_.c=0;_j(132,129,lp,Rn);_.H=function Sn(a){return hn(this,a)!=-1};_.T=function Tn(a){return ln(a,this.b.length),this.b[a]};_.J=function Un(){return this.b.length};_.K=function Vn(){return Dh(this.b)};_.L=function Wn(a){var b,c;c=this.b.length;a.length<c&&(a=Fh(a,c));for(b=0;b<c;++b){Jh(a,b,this.b[b])}a.length>c&&Jh(a,c,null);return a};var Xn;_j(134,129,lp,$n);_.H=function _n(a){return false};_.T=function ao(a){throw new Zk};_.J=function bo(){return 0};_j(135,61,ep,eo);_j(136,121,{16:1,26:1},ho);_j(137,127,kp,jo);_.P=function ko(){return this.b};_.Q=function lo(){return this.c};_.R=function mo(a){var b;b=this.c;this.c=a;return b};_j(138,61,ep,oo);_j(140,129,lp);_.S=function ro(a,b){xn(this.b,a,b)};_.G=function so(a){return yn(this.b,a)};_.H=function to(a){return Bn(this.b,a,0)!=-1};_.T=function uo(a){return An(this.b,a)};_.I=function vo(){return new tn(this.b)};_.J=function wo(){return this.b.c};_.K=function xo(){return Dn(this.b)};_.L=function yo(a){return En(this.b,a)};_.tS=function zo(){return km(this.b)};_j(139,140,lp,Do);_j(142,1,{},Ko);_.b=null;_.d=0;_j(143,100,{},Mo,No);_j(145,1,{});_j(144,145,{},So);var Uo;var mp=Dg();var bj=Lk(hq,'Object',1),Fi=Lk(iq,'Scheduler',67),Ei=Lk(iq,'JavaScriptObject$',64),Mj=Kk(jq,'Object;',150,bj),Ij=Ok('boolean',' Z'),Pj=Kk(op,'[Z',152,Ij),ij=Lk(hq,'Throwable',63),Yi=Lk(hq,'Exception',62),cj=Lk(hq,'RuntimeException',61),dj=Lk(hq,'StackTraceElement',113),Nj=Kk(jq,'StackTraceElement;',153,dj),Ni=Lk('com.google.gwt.lang.','SeedUtil',88),Xi=Lk(hq,'Enum',23),Yh=Ok('char',' C'),Jj=Kk(op,'[C',154,Yh),Wi=Lk(hq,'Class',103),hj=Lk(hq,Mp,2),Oj=Kk(jq,'String;',151,hj),Vi=Lk(hq,'ClassCastException',104),Di=Lk(iq,'JavaScriptException',60),fj=Lk(hq,'StringBuilder',116),Ui=Lk(hq,'ArrayStoreException',101),Oi=Lk(kq,'UserAgentImplGecko1_8',95),Si=Lk(kq,'UserAgentImplSafari',99),Pi=Lk(kq,'UserAgentImplIe10',96),Ri=Lk(kq,'UserAgentImplIe9',98),Qi=Lk(kq,'UserAgentImplIe8',97),_i=Lk(hq,'NullPointerException',110),Zi=Lk(hq,'IllegalArgumentException',105),Mi=Lk(lq,'StringBufferImpl',76),Hj=Lk(mq,'ExporterBaseImpl',145),Gj=Lk(mq,'ExporterBaseActual',144),Ki=Lk(lq,'StackTraceCreator$Collector',72),Ji=Lk(lq,'StackTraceCreator$CollectorMoz',74),Ii=Lk(lq,'StackTraceCreator$CollectorChrome',73),Hi=Lk(lq,'StackTraceCreator$CollectorChromeNoSourceMap',75),Li=Lk(lq,'StringBufferImplAppend',77),Gi=Lk(lq,'SchedulerImpl',69),tj=Lk(nq,'AbstractMap',122),pj=Lk(nq,'AbstractHashMap',121),kj=Lk(nq,'AbstractCollection',120),uj=Lk(nq,'AbstractSet',124),mj=Lk(nq,'AbstractHashMap$EntrySet',123),lj=Lk(nq,'AbstractHashMap$EntrySetIterator',125),sj=Lk(nq,'AbstractMapEntry',127),nj=Lk(nq,'AbstractHashMap$MapEntryNull',126),oj=Lk(nq,'AbstractHashMap$MapEntryString',128),zj=Lk(nq,'HashMap',136),bi=Lk(oq,'WordCleaner_ExporterImpl',14),ci=Lk(oq,'WordCleaner',13),Aj=Lk(nq,'MapEntryImpl',137),ej=Lk(hq,'StringBuffer',115),rj=Lk(nq,'AbstractList',129),vj=Lk(nq,'ArrayList',131),qj=Lk(nq,'AbstractList$IteratorImpl',130),di=Lk(pq,'OfficeImportFunction',16),fi=Lk(pq,'WordImportFunction',18),_h=Lk(qq,'Logged',5),$h=Lk(qq,'Logged$6',8),Zh=Lk('com.ephox.functional.closures.','Thunk',4),wi=Nk(rq,'ReplacementRuleSet'),Lj=Kk('[Lcom.ephox.tord.wordhtmlfilter.','ReplacementRuleSet;',155,wi),jj=Lk(hq,'UnsupportedOperationException',119),yi=Lk(rq,'StepOne',53),Ai=Lk(rq,'StepTwoFilterStyles',55),zi=Lk(rq,'StepThree',54),xi=Lk(rq,'StepLast',52),Bi=Lk(rq,'StepTwoRemoveStyles',56),Qj=Kk(op,'[[C',156,Jj),ti=Lk(rq,'ReadBuffer',36),Ci=Lk(rq,'WriteBuffer',57),ei=Lk(pq,'Scrub',17),gi=Lk(sq,'ListImporter',19),Ti=Lk('com.googlecode.gwtx.java.util.impl.client.','PatternImpl',100),Fj=Lk(tq,'Pattern',143),Ej=Lk(tq,'Matcher',142),xj=Lk(nq,'Collections$EmptyList',134),ai=Lk('com.ephox.functional.factory.','Thunks$1',10),wj=Lk(nq,'Arrays$ArrayList',132),ni=Lk(rq,'CharMap',27),vi=Lk(rq,'RemoveLink',44),pi=Lk(rq,'ModifySingleStyle',31),ri=Lk(rq,'ModifyStyleAttribute',32),ui=Lk(rq,'RemoveAttributeByName',37),qi=Lk(rq,'ModifyStyleAttributeOnlyUsingMustKeepList',33),$i=Lk(hq,'IndexOutOfBoundsException',106),Bj=Lk(nq,'NoSuchElementException',138),gj=Lk(hq,'StringIndexOutOfBoundsException',117),Rj=Kk(op,'[[[C',157,Qj),oi=Lk(rq,'IndexedStrings',30),si=Lk(rq,'ModifyStyleDefinition',34),hi=Lk(sq,'ListInfoStack',21),ii=Lk(sq,'ListInfo',20),mi=Lk(uq,'ListItemData',26),ki=Lk(uq,'ContentData',24),li=Lk(uq,'ListAggregationData',25),aj=Lk(hq,'NumberFormatException',112),ji=Mk(sq,'ListTagAndType',22,Ec),Kj=Kk('[Lcom.ephox.tord.lists.','ListTagAndType;',158,ji),Dj=Lk(nq,'Vector',140),Cj=Lk(nq,'Stack',139),yj=Lk(nq,'EmptyStackException',135);if (com_ephox_keurig_Keurig) com_ephox_keurig_Keurig.onScriptLoad(gwtOnLoad);})(); diff --git a/static/tinymce1.3/plugins/powerpaste/plugin.js b/static/tinymce1.3/plugins/powerpaste/plugin.js deleted file mode 100644 index c9305569..00000000 --- a/static/tinymce1.3/plugins/powerpaste/plugin.js +++ /dev/null @@ -1,19069 +0,0 @@ -// import '../stable/plugins.min.js' -/* Ephox PowerPaste plugin - * - * Copyright 2010-2015 Ephox Corporation. All rights reserved. - * - * Version: 2.1.0.0 - */ -(function () { - - if (this.ephox) - var old = this.ephox.bolt; - -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} - -var register = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var dependencies = defs[id].dependencies; - var definition = defs[id].definition; - var instances = []; - for (var i = 0; i < dependencies.length; ++i) - instances.push(dem(dependencies[i])); - defs[id].instance = definition.apply(null, instances); - if (defs[id].instance === undefined) - throw 'required module [' + id + '] could not be defined (definition function returned undefined)'; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'invalid module definition, module id must be defined and be a string'; - if (dependencies === undefined) - throw 'invalid module definition, dependencies must be specified'; - if (definition === undefined) - throw 'invalid module definition, definition function must be specified'; - defs[id] = { - dependencies: dependencies, - definition: definition, - instance: undefined - }; -}; - -var dem = function (id) { - if (defs[id] === undefined) - throw 'required module [' + id + '] is not defined'; - if (defs[id].instance === undefined) - instantiate(id); - return defs[id].instance; -}; - -var req = function (ids, callback) { - var instances = []; - for (var i = 0; i < ids.length; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = this.ephox || {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - - -// This is here to give hints to minification -// ephox.bolt.module.api.define -var eeephox_def_eeephox = def; -// ephox.bolt.module.api.require -var eeephox_req_eeephox = req; -// ephox.bolt.module.api.demand -var eeephox_dem_eeephox = dem; - -/*jsc -["ephox.powerpaste.util.NodeUtil","ephox.powerpaste.i18n.I18n","ephox.powerpaste.alien.Once","ephox.powerpaste.PowerPastePlugin","ephox.powerpaste.settings.Defaults","ephox.powerpaste.styles.Styles","ephox.powerpaste.legacy.data.tokens.Helper","ephox.powerpaste.legacy.data.tokens.Tokenizer","ephox.powerpaste.legacy.data.tokens.Serializer","ephox.powerpaste.legacy.data.tokens.Filter","ephox.powerpaste.legacy.data.tokens.Attributes","ephox.powerpaste.legacy.data.tokens.Token","ephox.powerpaste.legacy.data.Insert","ephox.powerpaste.legacy.wordimport.WordOnlyFilters","ephox.powerpaste.legacy.wordimport.WordImport","ephox.powerpaste.legacy.wordimport.CommonFilters","ephox.powerpaste.legacy.filters.list.Emitter","ephox.powerpaste.legacy.filters.list.Lists","ephox.powerpaste.legacy.filters.list.ListTypes","ephox.powerpaste.legacy.filters.list.ListStates","ephox.powerpaste.legacy.filters.list.CommentHeuristics","ephox.powerpaste.legacy.filters.StripImages","ephox.powerpaste.legacy.filters.FilterInlineStyles","ephox.powerpaste.legacy.filters.StripBookmarks","ephox.powerpaste.legacy.filters.StripScripts","ephox.powerpaste.legacy.filters.StripLangAttribute","ephox.powerpaste.legacy.filters.Text","ephox.powerpaste.legacy.filters.StripTocLinks","ephox.powerpaste.legacy.filters.StripNoAttributeA","ephox.powerpaste.legacy.filters.InferListTags","ephox.powerpaste.legacy.filters.StripOPTags","ephox.powerpaste.legacy.filters.StripFormattingAttributes","ephox.powerpaste.legacy.filters.StripEmptyStyleAttributes","ephox.powerpaste.legacy.filters.StripEmptyInlineElements","ephox.powerpaste.legacy.filters.StripNamespaceDeclarations","ephox.powerpaste.legacy.filters.StripClassAttributes","ephox.powerpaste.legacy.filters.StripMetaAndLinkElements","ephox.powerpaste.legacy.filters.StripVMLAttributes","ephox.powerpaste.legacy.tinymce.Clipboard","ephox.powerpaste.legacy.tinymce.Settings","ephox.powerpaste.legacy.tinymce.Util","ephox.powerpaste.legacy.tinymce.BrowserFilters","ephox.powerpaste.tinymce.ModernPowerDrop","ephox.powerpaste.tinymce.ModernTinyDialog","ephox.powerpaste.tinymce.ModernPowerPaste","ephox.powerpaste.tinymce.ErrorDialog","ephox.powerpaste.tinymce.LegacyPowerPaste","ephox.powerpaste.tinymce.LegacyTinyDialog","ephox.powerpaste.tinymce.UndoRewriter","ephox.powerpaste.tinymce.TinyPowerPaste","ephox.powerpaste.imageupload.UploaderFactory","ephox.powerpaste.imageupload.TinyUploader","ephox.powerpaste.imageupload.EphoxUploader","ephox.powerpaste.imageupload.UploadError","global!document","global!tinymce","ephox.compass.Arr","ephox.peanut.Fun","ephox.perhaps.Option","ephox.salmon.api.Ephemera","ephox.sugar.api.Element","ephox.sugar.api.Elements","ephox.sugar.api.InsertAll","ephox.sugar.api.SelectorFilter","ephox.salmon.api.BlobCache","ephox.salmon.api.ImageTracker","ephox.salmon.api.UploadUtils","ephox.salmon.api.Uploaders","ephox.sugar.api.Attr","global!setTimeout","ephox.hermes.api.ImageAsset","ephox.hermes.api.ImageExtract","ephox.cement.api.Cement","ephox.sugar.api.Insert","ephox.sugar.api.Remove","ephox.sugar.api.SelectorExists","ephox.sugar.api.SelectorFind","ephox.porkbun.Event","ephox.porkbun.Events","ephox.sugar.api.DomEvent","global!Array","global!String","ephox.salmon.style.Styles","ephox.classify.Type","ephox.compass.Obj","global!Error","global!console","ephox.sugar.api.Traverse","ephox.sugar.api.PredicateFilter","ephox.sugar.api.Selectors","ephox.sugar.impl.ClosestOrAncestor","ephox.numerosity.api.URL","ephox.scullion.Struct","ephox.highway.Merger","ephox.scullion.ADT","ephox.perhaps.Result","ephox.salmon.ui.UploadUi","ephox.salmon.services.UploadCommon","ephox.salmon.services.UploadDirect","ephox.salmon.services.UploadFunction","ephox.hermes.utils.ImageExtract","ephox.cement.flash.Flash","ephox.cement.smartpaste.MergeSettings","ephox.cement.smartpaste.PasteBroker","ephox.limbo.api.RtfImage","ephox.plumber.tap.function.BlockTap","ephox.porkbun.SourceEvent","ephox.sloth.api.Paste","ephox.sugar.impl.FilteredEvent","ephox.flour.style.Resolver","ephox.scullion.Immutable","ephox.scullion.Immutable2","ephox.scullion.MixedBag","ephox.sugar.alien.Recurse","ephox.sugar.api.Compare","ephox.sugar.api.Body","ephox.bud.NodeTypes","ephox.numerosity.core.Global","ephox.sugar.api.Class","ephox.numerosity.api.FormData","ephox.violin.Strings","ephox.jax.plain.Ajax","ephox.numerosity.api.JSON","ephox.yuri.api.Resolver","ephox.epithet.Id","ephox.fred.PlatformDetection","ephox.numerosity.api.FileReader","ephox.bowerbird.api.Rtf","ephox.cement.flash.Correlation","ephox.cement.flash.FlashDialog","ephox.sugar.api.Css","ephox.sugar.api.Node","ephox.sugar.api.PredicateFind","ephox.sugar.api.Replication","ephox.cement.style.Styles","ephox.cement.smartpaste.Inspection","ephox.cement.smartpaste.PasteHandlers","ephox.perhaps.Options","global!RegExp","ephox.plumber.tap.control.BlockControl","ephox.plumber.tap.wrap.Tapped","ephox.scullion.BagUtils","global!Object","ephox.peanut.Thunk","ephox.epithet.Resolve","ephox.sugar.alien.Toggler","ephox -jsc*/ -ephox.bolt.module.api.define("global!document", [], function () { return document; }); -(function (define, require, demand) { -define( - 'ephox.powerpaste.util.NodeUtil', - [ - 'global!document' - ], - function(document){ - var nodeToString = function ( node ) { - var tmpNode = document.createElement( "div" ); - tmpNode.appendChild( node.cloneNode( true ) ); - var str = tmpNode.innerHTML; - tmpNode = node = null; // prevent memory leaks in IE - return str; - }; - - return { - nodeToString: nodeToString - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!tinymce", [], function () { return tinymce; }); -(function (define, require, demand) { -define('ephox.powerpaste.i18n.I18n', - - [ - 'global!tinymce' - ], - - function(tinymce) { - var missingFlash = function() { - return "Your browser security settings may be preventing images from being imported."; - }; - - var flashClipboard = function() { - return tinymce.Env.mac && tinymce.Env.webkit ? missingFlash() + " <a href=\"https://support.ephox.com/entries/59328357-Safari-6-1-and-7-Flash-Sandboxing\" style=\"text-decoration: underline\">More information on paste for Safari</a>" : - missingFlash(); - }; - - var english = { - "cement.dialog.paste.title": "Paste Formatting Options", - "cement.dialog.paste.instructions": "Choose to keep or remove formatting in the pasted content.", - "cement.dialog.paste.merge": "Keep Formatting", - "cement.dialog.paste.clean": "Remove Formatting", - "cement.dialog.flash.title": "Local Image Import", - "cement.dialog.flash.trigger-paste": "Trigger paste again from the keyboard to paste content with images.", - "cement.dialog.flash.missing": "Adobe Flash is required to import images from Microsoft Office. Install the <a href=\"http://get.adobe.com/flashplayer/\" target=\"_blank\">Adobe Flash Player</a>.", - "cement.dialog.flash.press-escape": "Press <span class=\"ephox-polish-help-kbd\">ESC</span> to ignore local images and continue editing.", - "loading.wait" : "Please wait...", - "flash.clipboard.no.rtf": flashClipboard(), - "safari.imagepaste": "Safari does not support direct paste of images. <a href=\"https://support.ephox.com/entries/88543243-Safari-Direct-paste-of-images-does-not-work\" style=\"text-decoration: underline\">More information on image pasting for Safari</a>", - "error.code.images.not.found": "The images service was not found: (", - "error.imageupload": "Image failed to upload: (", - "error.full.stop": ").", - "errors.local.images.disallowed": "Local image paste has been disabled. Local images have been removed from pasted content." - }; - - var getEnglishText = function(key) { - return english[key]; - }; - - var translate = function (key) { - //This function acts as a shim between tiny's translation engine, which uses raw strings - //and cement's, which works off string pointers - return tinymce.translate(getEnglishText(key)); - }; - - return { - translate: translate - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.alien.Once', - - [ - - ], - - function () { - // Maybe belongs in peanut.Fun? - return function (f) { - var called = false; - return function () { - if (!called) { - called = true; - f.apply(null, arguments); - } - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!Array", [], function () { return Array; }); -ephox.bolt.module.api.define("global!String", [], function () { return String; }); -(function (define, require, demand) { -define( - 'ephox.compass.Arr', - - [ - 'global!Array', - 'global!String' - ], - - function (Array, String) { - var eqC = function(x) { - return function(y) { - return x === y; - }; - }; - - var isTrue = eqC(true); - - var contains = function(xs, x) { - return exists(xs, eqC(x)); - }; - - var chunk = function (array, size) { - var r = []; - for (var i = 0; i < array.length; i += size) { - var s = array.slice(i, i + size); - r.push(s); - } - return r; - }; - - var map = function(xs, f) { - var r = []; - for (var i = 0; i < xs.length; i++) { - var x = xs[i]; - r.push(f(x, i, xs)); - } - return r; - }; - - var each = function(xs, f) { - for (var i = 0; i < xs.length; i++) { - var x = xs[i]; - f(x, i, xs); - } - }; - - var partition = function(xs, pred) { - var pass = []; - var fail = []; - for (var i = 0; i < xs.length; i++) { - var x = xs[i]; - var arr = pred(x, i, xs) ? pass : fail; - arr.push(x); - } - return { pass: pass, fail: fail }; - }; - - var filter = function(xs, pred) { - var r = []; - for (var i = 0; i < xs.length; i++) { - var x = xs[i]; - if (pred(x, i, xs)) { - r.push(x); - } - } - return r; - }; - - /* - * Groups an array into contiguous arrays of like elements. Whether an element is like or not depends on f. - * - * f is a function that derives a value from an element - e.g. true or false, or a string. - * Elements are like if this function generates the same value for them (according to ===). - * - * - * Order of the elements is preserved. Arr.flatten() on the result will return the original list, as with Haskell groupBy function. - * For a good explanation, see the group function (which is a special case of groupBy) - * http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-List.html#v:group - */ - var groupBy = function (xs, f) { - if (xs.length === 0) { - return []; - } else { - var wasType = f(xs[0]); // initial case for matching - var r = []; - var group = []; - - each(xs, function (x) { - var type = f(x); - if (type !== wasType) { - r.push(group); - group = []; - } - wasType = type; - group.push(x); - }); - if (group.length !== 0) { - r.push(group); - } - return r; - } - }; - - var indexOf = function(xs, x) { - if (arguments.length !== 2) - throw 'Expected 2 arguments to indexOf'; - return findIndex(xs, eqC(x)); - }; - - var foldr = function (xs, f, acc) { - return foldl(reverse(xs), f, acc); - }; - - var foldl = function (xs, f, acc) { - each(xs, function (x) { - acc = f(acc, x); - }); - return acc; - }; - - var find = function(xs, pred) { - if (arguments.length !== 2) - throw 'Expected 2 arguments to find'; - for (var i = 0; i < xs.length; i++) { - var x = xs[i]; - if (pred(x, i, xs)) { - return x; - } - } - return undefined; - }; - - var findOr = function (xs, f, default_) { - var r = find(xs, f); - return r !== undefined ? r : default_; - }; - - var findOrDie = function (xs, f, message) { - var r = find(xs, f); - if (r === undefined) - throw message || 'Could not find element in array: ' + String(xs); - return r; - }; - - var findIndex = function (xs, pred) { - var fn = pred || isTrue; - - for (var i = 0; i < xs.length; ++i) - if (fn(xs[i]) === true) - return i; - - return -1; - }; - - var flatten = function (xs) { - var r = []; - for (var i = 0; i < xs.length; ++i) - r = r.concat(xs[i]); - return r; - }; - - var bind = function (xs, f) { - var output = map(xs, f); - return flatten(output); - }; - - var forall = function (xs, pred) { - var fn = pred || isTrue; - for (var i = 0; i < xs.length; ++i) - if (fn(xs[i], i) !== true) - return false; - return true; - }; - - var exists = function (xs, pred) { - var fn = pred || isTrue; - for (var i = 0; i < xs.length; ++i) - if (fn(xs[i]) === true) - return true; - return false; - }; - - var equal = function (a1, a2) { - return a1.length === a2.length && forall(a1, function (x, i) { - return x === a2[i]; - }); - }; - - var reverse = function (xs) { - var r = Array.prototype.slice.call(xs, 0); - r.reverse(); - return r; - }; - - var difference = function (a1, a2) { - return filter(a1, function (x) { - return !contains(a2, x); - }); - }; - - var mapToObject = function(xs, f) { - var r = {}; - each(xs, function(x, i) { - r[String(x)] = f(x, i); - }); - return r; - }; - - return { - map: map, - each: each, - partition: partition, - filter: filter, - groupBy: groupBy, - indexOf: indexOf, - foldr: foldr, - foldl: foldl, - find: find, - findIndex: findIndex, - findOr: findOr, - findOrDie: findOrDie, - flatten: flatten, - bind: bind, - forall: forall, - exists: exists, - contains: contains, - equal: equal, - reverse: reverse, - chunk: chunk, - difference: difference, - mapToObject: mapToObject - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.peanut.Fun', - - [ - 'global!Array' - ], - - function (Array) { - var noop = function () { }; - - var compose = function (fa, fb) { - return function () { - return fa(fb.apply(null, arguments)); - }; - }; - - var constant = function (value) { - return function () { - return value; - }; - }; - - var identity = function (x) { - return x; - }; - - var tripleEquals = function(a, b) { - return a === b; - }; - - var curry = function (f) { - var slice = Array.prototype.slice; - var args = slice.call(arguments, 1); - return function () { - var all = args.concat(slice.call(arguments, 0)); - return f.apply(null, all); - }; - }; - - var not = function (f) { - return function () { - return !f.apply(null, arguments); - }; - }; - - var die = function (msg) { - return function () { - throw msg; - }; - }; - - var apply = function (f) { - return f(); - }; - - return { - noop: noop, - compose: compose, - constant: constant, - identity: identity, - tripleEquals: tripleEquals, - curry: curry, - not: not, - die: die, - apply: apply - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.perhaps.Option', - - [ - 'ephox.peanut.Fun' - ], - - function (Fun) { - - /** some :: a -> Option a */ - var some = function (value) { - return option(function (n, s) { - return s(value); - }); - }; - - /** none :: () -> Option a */ - var none = function () { - return option(function (n, s) { - return n(); - }); - }; - - /** from :: undefined|null|a -> Option a */ - var from = function (value) { - return value === null || value === undefined ? none() : some(value); - }; - - /** option :: (() -> t, a -> t) -> Option a */ - var option = function (fold) { - - /** is :: this Option a -> a -> Boolean */ - var is = function (v) { - return fold(Fun.constant(false), function (o) { - return o === v; - }); - }; - - /** isSome :: this Option a -> () -> Boolean */ - var isSome = function () { - return fold(Fun.constant(false), Fun.constant(true)); - }; - - /** isNone :: this Option a -> () -> Boolean */ - var isNone = Fun.not(isSome); - - /** getOr :: this Option a -> a -> a */ - var getOr = function (value) { - return fold(Fun.constant(value), Fun.identity); - }; - - /** getOrThunk :: this Option a -> (() -> a) -> a */ - var getOrThunk = function (f) { - return fold(f, Fun.identity); - }; - - /** getOrDie :: this Option a -> String -> a */ - var getOrDie = function (msg) { - return fold(Fun.die(msg || 'error: getOrDie called on none.'), Fun.identity); - }; - - /** or :: this Option a -> Option a -> Option a - * if some: return self - * if none: return opt - */ - var or = function (opt) { - return fold(Fun.constant(opt), some); - }; - - /** orThunk :: this Option a -> (() -> Option a) -> Option a - * Same as "or", but uses a thunk instead of a value - */ - var orThunk = function (f) { - return fold(f, some); - }; - - /** map :: this Option a -> (a -> b) -> Option b - * "fmap" operation on the Option Functor. - */ - var map = function (f) { - return bind(function (value) { - return some(f(value)); - }); - }; - - /** ap :: this Option a -> Option (a -> b) -> Option b) - * "apply" operation on the Option Apply/Applicative. - * Equivalent to <*> in Haskell/PureScript. - */ - var ap = function(ofab) { - return fold(none, function(a) { - return ofab.fold(none, function(fab) { - return some(fab(a)); - }); - }); - }; - - /** each :: this Option a -> (a -> b) -> Option b */ - var each = map; - - /** bind :: this Option a -> (a -> Option b) -> Option b - * "bind"/"flatMap" operation on the Option Bind/Monad. - * Equivalent to >>= in Haskell/PureScript; flatMap in Scala. - */ - var bind = function (f) { - return fold(none, f); - }; - - /** flatten :: {this Option (Option a))} -> () -> Option a - * "flatten"/"join" operation on the Option Monad. - */ - var flatten = function () { - return fold(none, Fun.identity); - }; - - /** exists :: this Option a -> (a -> Boolean) -> Boolean */ - var exists = function (f) { - return fold(Fun.constant(false), f); - }; - - /** forall :: this Option a -> (a -> Boolean) -> Boolean */ - var forall = function (f) { - return fold(Fun.constant(true), f); - }; - - /** filter :: this Option a -> (a -> Boolean) -> Option a */ - var filter = function (f) { - return fold(none, function (v) { - return f(v) ? some(v) : none(); - }); - }; - - /** equals :: this Option a -> Option a -> Boolean */ - var equals = function (o) { - return fold(o.isNone, o.is); - }; - - /** equals_ :: this Option a -> (Option a, a -> Boolean) -> Boolean */ - var equals_ = function (o, elementEq) { - return fold(o.isNone, function(x) { - return o.fold( - Fun.constant(false), - Fun.curry(elementEq, x) - ); - }); - }; - - /** toArray :: this Option a -> () -> [a] */ - var toArray = function () { - return fold(Fun.constant([]), function (val) { - return [ val ]; - }); - }; - - var toString = function() { - return fold(Fun.constant("none()"), function(a) { return "some(" + a + ")"; }); - }; - - return { - is: is, - isSome: isSome, - isNone: isNone, - getOr: getOr, - getOrThunk: getOrThunk, - getOrDie: getOrDie, - or: or, - orThunk: orThunk, - fold: fold, - map: map, - each: each, - bind: bind, - ap: ap, - flatten: flatten, - exists: exists, - forall: forall, - equals: equals, - equals_: equals_, - filter: filter, - toArray: toArray, - toString: toString - }; - }; - - /** equals :: (Option a, Option a) -> Boolean */ - var equals = function(a, b) { - return a.equals(b); - }; - - /** equals_ :: (Option a, Option a, (a -> a) -> Boolean */ - var equals_ = function(a, b, elementEq) { - return a.equals_(b, elementEq); - }; - - return { - some: some, - none: none, - from: from, - equals: equals, - equals_: equals_ - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.imageupload.TinyUploader', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun' - ], - - function (Arr, Fun) { - return function (editor) { - - var uploadImages = function() { - editor.uploadImages(); - }; - - var prepareImages = function (assets) { - Arr.each(assets, function (a) { - a.fold(function (id, blob, objurl, data) { - Arr.each(editor.dom.select('img[src="' + objurl + '"]'), function (img) { - editor.dom.setAttrib(img, 'src', data.result); - }); - }, Fun.noop); - }); - }; - - var getLocalURL = function (id, blob, objurl, data) { - return data.result; - }; - - return { - uploadImages: uploadImages, - prepareImages: prepareImages, - getLocalURL: getLocalURL - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.ErrorDialog', - [ - - ], - function() { - return { - showDialog: function(editor, errorText){ - - var close = function() { - win.close(); - }; - - var controls = [{ - text: 'Ok', - onclick: close - }]; - - var winSettings = { - title: "Error", - spacing: 10, - padding: 10, - items: [{ - type: 'container', - html: errorText - }], - buttons: controls - }; - - //We could have done something similar through the use of windowmanager.alert - //But it appears that alert doesn't allow us to use html. - //So we create a custom dialog, again, and use .open instead. - win = editor.windowManager.open(winSettings); - } - }; -}); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.imageupload.UploadError', - - [ - 'ephox.powerpaste.alien.Once', - 'ephox.powerpaste.i18n.I18n', - 'ephox.powerpaste.tinymce.ErrorDialog' - ], - - function (Once, I18n, ErrorDialog) { - return function (editor, url) { - var serviceNotFound = function () { return I18n.translate('error.code.images.not.found') + url + I18n.translate('error.full.stop');}; - - var genericError = function () { return I18n.translate('error.imageupload') + url + I18n.translate('error.full.stop');}; - - var showDialog = function (err) { - var status = err.status(); - - // TODO: status === 0 seems to consistently be a CORS failure. Might be nice to have a better message. - var notFound = status === 0 || (status >= 400 || status < 500); - - // TODO: Services give us more details than this. The response should include details (TBIO-1256). - // 500+ falls through to generic error for now. - var error = notFound ? serviceNotFound : genericError; - ErrorDialog.showDialog(editor, error()); - }; - - var instance = function () { - // this ensures we only show one banner per upload request, even on multiple failures - return Once(showDialog); - }; - - return { - instance: instance - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.flour.style.Resolver', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - var create = function (projectNamespace) { - var namespace = cssNamespace(projectNamespace); - - var resolve = function (cssClasses) { - var classes = cssClasses.split(' '); - - var resolved = Arr.map(classes, function (cls) { - return cssClass(namespace, cls); - }); - - return resolved.join(' '); - }; - - return { - resolve: resolve - }; - }; - - // JavaScript namespaces are of the form "ephox.project" - // CSS namespaces are of the form "ephox-project" - var cssNamespace = function (namespace) { - return namespace.replace(/\./g, '-'); - }; - - // CSS namespaced classes are of the form "css-namespace-class" - var cssClass = function (namespace, cls) { - return namespace + '-' + cls; - }; - - return { - create: create, - cssNamespace: cssNamespace, - cssClass: cssClass - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.style.Styles', - - [ - 'ephox.flour.style.Resolver' - ], - - function (Resolver) { - var styles = Resolver.create('ephox-salmon'); - - return { - resolve: styles.resolve - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.classify.Type', - - [ - 'global!Array', - 'global!String' - ], - - function (Array, String) { - var typeOf = function(x) { - if (x === null) return 'null'; - var t = typeof x; - if (t === 'object' && Array.prototype.isPrototypeOf(x)) return 'array'; - if (t === 'object' && String.prototype.isPrototypeOf(x)) return 'string'; - return t; - }; - - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - - return { - isString: isType('string'), - isObject: isType('object'), - isArray: isType('array'), - isNull: isType('null'), - isBoolean: isType('boolean'), - isUndefined: isType('undefined'), - isFunction: isType('function'), - isNumber: isType('number') - }; - } -); - - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.compass.Obj', - - [ - ], - - function () { - var each = function (obj, f) { - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - var x = obj[i]; - f(x, i, obj); - } - } - }; - - var objectMap = function (obj, f) { - return tupleMap(obj, function (x, i, obj) { - return { - k: i, - v: f(x, i, obj) - }; - }); - }; - - var tupleMap = function (obj, f) { - var r = {}; - each(obj, function (x, i) { - var tuple = f(x, i, obj); - r[tuple.k] = tuple.v; - }); - return r; - }; - - var bifilter = function (obj, pred) { - var t = {}; - var f = {}; - each(obj, function(x, i) { - var branch = pred(x, i) ? t : f; - branch[i] = x; - }); - return { - t: t, - f: f - }; - }; - - var mapToArray = function (obj, f) { - var r = []; - each(obj, function(value, name) { - r.push(f(value, name)); - }); - return r; - }; - - var find = function (obj, pred) { - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - var x = obj[i]; - if (pred(x, i, obj)) - return x; - } - } - return undefined; - }; - - var keys = function (obj) { - return mapToArray(obj, function (v, k) { - return k; - }); - }; - - var values = function (obj) { - return mapToArray(obj, function (v, k) { - return v; - }); - }; - - var size = function (obj) { - return values(obj).length; - }; - - return { - bifilter: bifilter, - each: each, - map: objectMap, - mapToArray: mapToArray, - tupleMap: tupleMap, - find: find, - keys: keys, - values: values, - size: size - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!Error", [], function () { return Error; }); -ephox.bolt.module.api.define("global!console", [], function () { if (typeof console === "undefined") console = { log: function () {} }; return console; }); -(function (define, require, demand) { -define( - 'ephox.sugar.api.Attr', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'global!Error', - 'global!console' - ], - - /* - * Direct attribute manipulation has been around since IE8, but - * was apparently unstable until IE10. - */ - function (Type, Arr, Obj, Error, console) { - var rawSet = function (dom, key, value) { - /* - * JQuery coerced everything to a string, and silently did nothing on text node/null/undefined. - * - * We fail on those invalid cases, only allowing numbers and booleans. - */ - if (Type.isString(value) || Type.isBoolean(value) || Type.isNumber(value)) { - dom.setAttribute(key, value + ''); - } else { - console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); - throw new Error('Attribute value was not simple'); - } - }; - - var set = function (element, key, value) { - rawSet(element.dom(), key, value); - }; - - var setAll = function (element, attrs) { - var dom = element.dom(); - Obj.each(attrs, function (v, k) { - rawSet(dom, k, v); - }); - }; - - var get = function (element, key) { - var v = element.dom().getAttribute(key); - - // undefined is the more appropriate value for JS, and this matches JQuery - return v === null ? undefined : v; - }; - - var has = function (element, key) { - var dom = element.dom(); - - // return false for non-element nodes, no point in throwing an error - return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; - }; - - var remove = function (element, key) { - element.dom().removeAttribute(key); - }; - - var hasNone = function (element) { - var attrs = element.dom().attributes; - return attrs === undefined || attrs === null || attrs.length === 0; - }; - - var clone = function (element) { - return Arr.foldl(element.dom().attributes, function (acc, attr) { - acc[attr.name] = attr.value; - return acc; - }, {}); - }; - - return { - clone: clone, - set: set, - setAll: setAll, - get: get, - has: has, - remove: remove, - hasNone: hasNone - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.Immutable2', - - [ - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.peanut.Fun' - ], - - function (Arr, Obj, Fun) { - - var $a = function(args) { - return Array.prototype.slice.call(args); - }; - - var product = function(fields, eqs) { - - var nu = function(/* values */) { - var values = $a(arguments); - if (fields.length !== values.length) - throw 'Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'; - - var struct = {}; - Arr.each(fields, function (name, i) { - struct[name] = Fun.constant(values[i]); - }); - return struct; - }; - - var eq = function(a, b) { - for (var i = 0; i < fields.length; i++) { - var qqq = (eqs && eqs[i]) || Fun.tripleEquals; - var x = fields[i]; - if (!qqq(a[x](), b[x]())) { - return false; - } - } - return true; - }; - - var evaluate = function(o) { - return Obj.map(o, function(f) { - return f(); - }); - }; - - return { - nu: nu, - eq: eq, - evaluate: evaluate - }; - }; - - return { - product: product - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.Immutable', - - [ - 'ephox.scullion.Immutable2' - ], - - function (Immutable2) { - return function (/* fields */) { - return Immutable2.product(arguments).nu; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.BagUtils', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr' - ], - - function (Type, Arr) { - var sort = function (arr) { - return arr.slice(0).sort(); - }; - - var reqMessage = function (required, keys) { - throw 'All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.'; - }; - - var unsuppMessage = function (unsupported) { - throw 'Unsupported keys for object: ' + sort(unsupported).join(', '); - }; - - var validateStrArr = function (label, array) { - if (!Type.isArray(array)) throw 'The ' + label + ' fields must be an array. Was: ' + array + '.'; - Arr.each(array, function (a) { - if (!Type.isString(a)) throw 'The value ' + a + ' in the ' + label + ' fields was not a string.'; - }); - }; - - var invalidTypeMessage = function (incorrect, type) { - throw 'All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.'; - }; - - var checkDupes = function (everything) { - var sorted = sort(everything); - var dupe = Arr.find(sorted, function (s, i) { - return i < sorted.length -1 && s === sorted[i + 1]; - }); - - if (dupe !== undefined && dupe !== null) throw 'The field: ' + dupe + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].'; - }; - - return { - sort: sort, - reqMessage: reqMessage, - unsuppMessage: unsuppMessage, - validateStrArr: validateStrArr, - invalidTypeMessage: invalidTypeMessage, - checkDupes: checkDupes - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!Object", [], function () { return Object; }); -(function (define, require, demand) { -define( - 'ephox.scullion.MixedBag', - - [ - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.scullion.BagUtils', - 'global!Object' - ], - - function (Arr, Obj, Fun, Option, BagUtils, Object) { - - return function (required, optional) { - var everything = required.concat(optional); - if (everything.length === 0) throw 'You must specify at least one required or optional field.'; - - BagUtils.validateStrArr('required', required); - BagUtils.validateStrArr('optional', optional); - - BagUtils.checkDupes(everything); - - return function (obj) { - var keys = Obj.keys(obj); - - // Ensure all required keys are present. - var allReqd = Arr.forall(required, function (req) { - return Arr.contains(keys, req); - }); - - if (! allReqd) BagUtils.reqMessage(required, keys); - - var unsupported = Arr.filter(keys, function (key) { - return !Arr.contains(everything, key); - }); - - if (unsupported.length > 0) BagUtils.unsuppMessage(unsupported); - - var r = {}; - Arr.each(required, function (req) { - r[req] = Fun.constant(obj[req]); - }); - - Arr.each(optional, function (opt) { - r[opt] = Fun.constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]): Option.none()); - }); - - return r; - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.Struct', - - [ - 'ephox.scullion.Immutable', - 'ephox.scullion.Immutable2', - 'ephox.scullion.MixedBag' - ], - - function (Immutable, Immutable2, MixedBag) { - return { - immutable: Immutable, - immutable2: Immutable2, - immutableBag: MixedBag - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.alien.Recurse', - - [ - - ], - - function () { - /** - * Applies f repeatedly until it completes (by returning Option.none()). - * - * Normally would just use recursion, but JavaScript lacks tail call optimisation. - * - * This is what recursion looks like when manually unravelled :) - */ - var toArray = function (target, f) { - var r = []; - - var recurse = function (e) { - r.push(e); - return f(e); - }; - - var cur = f(target); - do { - cur = cur.bind(recurse); - } while (cur.isSome()); - - return r; - }; - - return { - toArray: toArray - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.bud.NodeTypes', - - [ - - ], - - function () { - return { - ATTRIBUTE: 2, - CDATA_SECTION: 4, - COMMENT: 8, - DOCUMENT: 9, - DOCUMENT_TYPE: 10, - DOCUMENT_FRAGMENT: 11, - ELEMENT: 1, - TEXT: 3, - PROCESSING_INSTRUCTION: 7, - ENTITY_REFERENCE: 5, - ENTITY: 6, - NOTATION: 12 - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Element', - - [ - 'ephox.peanut.Fun', - 'global!Error', - 'global!console', - 'global!document' - ], - - function (Fun, Error, console, document) { - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); - div.innerHTML = html; - if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw 'HTML must have a single root node'; - } - return fromDom(div.childNodes[0]); - }; - - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); - return fromDom(node); - }; - - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); - return fromDom(node); - }; - - var fromDom = function (node) { - if (node === null || node === undefined) throw new Error('Node cannot be not null or undefined'); - return { - dom: Fun.constant(node) - }; - }; - - return { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Selectors', - - [ - 'ephox.bud.NodeTypes', - 'ephox.compass.Arr', - 'ephox.perhaps.Option', - 'ephox.sugar.api.Element', - 'global!Error', - 'global!document' - ], - - function (NodeTypes, Arr, Option, Element, Error, document) { - /* - * There's a lot of code here; the aim is to allow the browser to optimise constant comparisons, - * instead of doing object lookup feature detection on every call - */ - var STANDARD = 0; - var MSSTANDARD = 1; - var WEBKITSTANDARD = 2; - var FIREFOXSTANDARD = 3; - - var selectorType = (function () { - var test = document.createElement('span'); - // As of Chrome 34 / Safari 7.1 / FireFox 34, everyone except IE has the unprefixed function. - // Still check for the others, but do it last. - return test.matches !== undefined ? STANDARD : - test.msMatchesSelector !== undefined ? MSSTANDARD : - test.webkitMatchesSelector !== undefined ? WEBKITSTANDARD : - test.mozMatchesSelector !== undefined ? FIREFOXSTANDARD : - -1; - })(); - - - var ELEMENT = NodeTypes.ELEMENT; - var DOCUMENT = NodeTypes.DOCUMENT; - - var is = function (element, selector) { - var elem = element.dom(); - if (elem.nodeType !== ELEMENT) return false; // documents have querySelector but not matches - - // As of Chrome 34 / Safari 7.1 / FireFox 34, everyone except IE has the unprefixed function. - // Still check for the others, but do it last. - else if (selectorType === STANDARD) return elem.matches(selector); - else if (selectorType === MSSTANDARD) return elem.msMatchesSelector(selector); - else if (selectorType === WEBKITSTANDARD) return elem.webkitMatchesSelector(selector); - else if (selectorType === FIREFOXSTANDARD) return elem.mozMatchesSelector(selector); - else throw new Error('Browser lacks native selectors'); // unfortunately we can't throw this on startup :( - }; - - var bypassSelector = function (dom) { - // Only elements and documents support querySelector - return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT || - // IE fix for complex queries on empty nodes: http://jsfiddle.net/spyder/fv9ptr5L/ - dom.childElementCount === 0; - }; - - var all = function (selector, scope) { - var base = scope === undefined ? document : scope.dom(); - return bypassSelector(base) ? [] : Arr.map(base.querySelectorAll(selector), Element.fromDom); - }; - - var one = function (selector, scope) { - var base = scope === undefined ? document : scope.dom(); - return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom); - }; - - return { - all: all, - is: is, - one: one - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Compare', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Selectors' - ], - - function (Arr, Fun, Selectors) { - var eq = function (e1, e2) { - return e1.dom() === e2.dom(); - }; - - var member = function (element, elements) { - return Arr.exists(elements, Fun.curry(eq, element)); - }; - - return { - eq: eq, - member: member, - - // Only used by DomUniverse. Remove (or should Selectors.is move here?) - is: Selectors.is - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Traverse', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.scullion.Struct', - 'ephox.sugar.alien.Recurse', - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Element' - ], - - function (Type, Arr, Fun, Option, Struct, Recurse, Compare, Element) { - // The document associated with the current element - var owner = function (element) { - return Element.fromDom(element.dom().ownerDocument); - }; - - var documentElement = function (element) { - // TODO: Avoid unnecessary wrap/unwrap here - var doc = owner(element); - return Element.fromDom(doc.dom().documentElement); - }; - - // The window element associated with the element - var defaultView = function (element) { - var el = element.dom(); - var defaultView = el.ownerDocument.defaultView; - return Element.fromDom(defaultView); - }; - - var parent = function (element) { - var dom = element.dom(); - return Option.from(dom.parentNode).map(Element.fromDom); - }; - - var findIndex = function (element) { - return parent(element).bind(function (p) { - // TODO: Refactor out children so we can avoid the constant unwrapping - var kin = children(p); - var index = Arr.findIndex(kin, function (elem) { - return Compare.eq(element, elem); - }); - - return index > -1 ? Option.some(index) : Option.none(); - }); - }; - - var parents = function (element, isRoot) { - var stop = Type.isFunction(isRoot) ? isRoot : Fun.constant(false); - return internalParents(element, stop); - }; - - var internalParents = function (element, stop) { - return parent(element).fold(function () { - return []; - }, function (v) { - var ret = [ v ]; - return stop(v) ? ret : ret.concat(internalParents(v, stop)); - }); - }; - - var siblings = function (element) { - // TODO: Refactor out children so we can just not add self instead of filtering afterwards - var filterSelf = function (elements) { - return Arr.filter(elements, function (x) { - return !Compare.eq(element, x); - }); - }; - - return parent(element).map(children).map(filterSelf).getOr([]); - }; - - var offsetParent = function (element) { - var dom = element.dom(); - return Option.from(dom.offsetParent).map(Element.fromDom); - }; - - var prevSibling = function (element) { - var dom = element.dom(); - return Option.from(dom.previousSibling).map(Element.fromDom); - }; - - var nextSibling = function (element) { - var dom = element.dom(); - return Option.from(dom.nextSibling).map(Element.fromDom); - }; - - var prevSiblings = function (element) { - // This one needs to be reversed, so they're still in DOM order - return Arr.reverse(Recurse.toArray(element, prevSibling)); - }; - - var nextSiblings = function (element) { - return Recurse.toArray(element, nextSibling); - }; - - var children = function (element) { - var dom = element.dom(); - return Arr.map(dom.childNodes, Element.fromDom); - }; - - var child = function (element, index) { - var children = element.dom().childNodes; - return Option.from(children[index]).map(Element.fromDom); - }; - - var firstChild = function (element) { - return child(element, 0); - }; - - var lastChild = function (element) { - return child(element, element.dom().childNodes.length - 1); - }; - - var spot = Struct.immutable('element', 'offset'); - var leaf = function (element, offset) { - var cs = children(element); - return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset); - }; - - return { - owner: owner, - defaultView: defaultView, - documentElement: documentElement, - parent: parent, - findIndex: findIndex, - parents: parents, - siblings: siblings, - prevSibling: prevSibling, - offsetParent: offsetParent, - prevSiblings: prevSiblings, - nextSibling: nextSibling, - nextSiblings: nextSiblings, - children: children, - child: child, - firstChild: firstChild, - lastChild: lastChild, - leaf: leaf - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Insert', - - [ - 'ephox.sugar.api.Traverse' - ], - - function (Traverse) { - var before = function (marker, element) { - var parent = Traverse.parent(marker); - parent.each(function (v) { - v.dom().insertBefore(element.dom(), marker.dom()); - }); - }; - - var after = function (marker, element) { - var sibling = Traverse.nextSibling(marker); - sibling.fold(function () { - var parent = Traverse.parent(marker); - parent.each(function (v) { - append(v, element); - }); - }, function (v) { - before(v, element); - }); - }; - - var prepend = function (parent, element) { - var firstChild = Traverse.firstChild(parent); - firstChild.fold(function () { - append(parent, element); - }, function (v) { - parent.dom().insertBefore(element.dom(), v.dom()); - }); - }; - - var append = function (parent, element) { - parent.dom().appendChild(element.dom()); - }; - - var appendAt = function (parent, element, index) { - Traverse.child(parent, index).fold(function () { - append(parent, element); - }, function (v) { - before(v, element); - }); - }; - - var wrap = function (element, wrapper) { - before(element, wrapper); - append(wrapper, element); - }; - - return { - before: before, - after: after, - prepend: prepend, - append: append, - appendAt: appendAt, - wrap: wrap - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.InsertAll', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Insert' - ], - - function (Arr, Insert) { - var before = function (marker, elements) { - Arr.each(elements, function (x) { - Insert.before(marker, x); - }); - }; - - var after = function (marker, elements) { - Arr.each(elements, function (x, i) { - var e = i === 0 ? marker : elements[i - 1]; - Insert.after(e, x); - }); - }; - - var prepend = function (parent, elements) { - Arr.each(elements.slice().reverse(), function (x) { - Insert.prepend(parent, x); - }); - }; - - var append = function (parent, elements) { - Arr.each(elements, function (x) { - Insert.append(parent, x); - }); - }; - - return { - before: before, - after: after, - prepend: prepend, - append: append - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Remove', - - [ - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Traverse' - ], - - function (InsertAll, Traverse) { - var empty = function (element) { - // requires IE 9 - element.dom().textContent = ''; - }; - - var remove = function (element) { - var dom = element.dom(); - if (dom.parentNode !== null) - dom.parentNode.removeChild(dom); - }; - - var unwrap = function (wrapper) { - var children = Traverse.children(wrapper); - if (children.length > 0) - InsertAll.before(wrapper, children); - remove(wrapper); - }; - - return { - empty: empty, - remove: remove, - unwrap: unwrap - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.peanut.Thunk', - - [ - ], - - function () { - - var cached = function (f) { - var called = false; - var r; - return function() { - if (!called) { - called = true; - r = f.apply(null, arguments); - } - return r; - }; - }; - - return { - cached: cached - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Node', - - [ - 'ephox.bud.NodeTypes' - ], - - function (NodeTypes) { - var name = function (element) { - var r = element.dom().nodeName; - return r.toLowerCase(); - }; - - var type = function (element) { - return element.dom().nodeType; - }; - - var value = function (element) { - return element.dom().nodeValue; - }; - - var isType = function (t) { - return function (element) { - return type(element) === t; - }; - }; - - var isComment = function (element) { - return type(element) === NodeTypes.COMMENT || name(element) === '#comment'; - }; - - var isElement = isType(NodeTypes.ELEMENT); - var isText = isType(NodeTypes.TEXT); - var isDocument = isType(NodeTypes.DOCUMENT); - - return { - name: name, - type: type, - value: value, - isElement: isElement, - isText: isText, - isDocument: isDocument, - isComment: isComment - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Body', - - [ - 'ephox.peanut.Thunk', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Node', - 'global!document' - ], - - function (Thunk, Element, Node, document) { - - // Node.contains() is very, very, very good performance - // http://jsperf.com/closest-vs-contains/5 - var inBody = function (element) { - // Technically this is only required on IE, where contains() returns false for text nodes. - // But it's cheap enough to run everywhere and Sugar doesn't have platform detection (yet). - var dom = Node.isText(element) ? element.dom().parentNode : element.dom(); - - // use ownerDocument.body to ensure this works inside iframes. - // Normally contains is bad because an element "contains" itself, but here we want that. - return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); - }; - - var body = Thunk.cached(function () { - var body = document.body; - if (body === null || body === undefined) throw 'Body is not available yet'; - return Element.fromDom(body); - }); - - return { - body: body, - inBody: inBody - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.PredicateFilter', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Body', - 'ephox.sugar.api.Traverse' - ], - - function (Arr, Body, Traverse) { - // maybe TraverseWith, similar to traverse but with a predicate? - - var all = function (predicate) { - return descendants(Body.body(), predicate); - }; - - var ancestors = function (scope, predicate, isRoot) { - return Arr.filter(Traverse.parents(scope, isRoot), predicate); - }; - - var siblings = function (scope, predicate) { - return Arr.filter(Traverse.siblings(scope), predicate); - }; - - var children = function (scope, predicate) { - return Arr.filter(Traverse.children(scope), predicate); - }; - - var descendants = function (scope, predicate) { - var result = []; - - // Recurse.toArray() might help here - Arr.each(Traverse.children(scope), function (x) { - if (predicate(x)) { - result = result.concat([ x ]); - } - result = result.concat(descendants(x, predicate)); - }); - return result; - }; - - return { - all: all, - ancestors: ancestors, - siblings: siblings, - children: children, - descendants: descendants - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.SelectorFilter', - - [ - 'ephox.sugar.api.PredicateFilter', - 'ephox.sugar.api.Selectors' - ], - - function (PredicateFilter, Selectors) { - var all = function (selector) { - return Selectors.all(selector); - }; - - // For all of the following: - // - // jQuery does siblings of firstChild. IE9+ supports scope.dom().children (similar to Traverse.children but elements only). - // Traverse should also do this (but probably not by default). - // - - var ancestors = function (scope, selector, isRoot) { - // It may surprise you to learn this is exactly what JQuery does - // TODO: Avoid all this wrapping and unwrapping - return PredicateFilter.ancestors(scope, function (e) { - return Selectors.is(e, selector); - }, isRoot); - }; - - var siblings = function (scope, selector) { - // It may surprise you to learn this is exactly what JQuery does - // TODO: Avoid all the wrapping and unwrapping - return PredicateFilter.siblings(scope, function (e) { - return Selectors.is(e, selector); - }); - }; - - var children = function (scope, selector) { - // It may surprise you to learn this is exactly what JQuery does - // TODO: Avoid all the wrapping and unwrapping - return PredicateFilter.children(scope, function (e) { - return Selectors.is(e, selector); - }); - }; - - var descendants = function (scope, selector) { - return Selectors.all(selector, scope); - }; - - return { - all: all, - ancestors: ancestors, - siblings: siblings, - children: children, - descendants: descendants - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.impl.ClosestOrAncestor', - - [ - 'ephox.classify.Type', - 'ephox.perhaps.Option' - ], - - function (Type, Option) { - return function (is, ancestor, scope, a, isRoot) { - return is(scope, a) ? - Option.some(scope) : - Type.isFunction(isRoot) && isRoot(scope) ? - Option.none() : - ancestor(scope, a, isRoot); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.SelectorFind', - - [ - 'ephox.perhaps.Option', - 'ephox.sugar.api.SelectorFilter', - 'ephox.sugar.api.Selectors', - 'ephox.sugar.impl.ClosestOrAncestor' - ], - - function (Option, SelectorFilter, Selectors, ClosestOrAncestor) { - // It's ridiculous to spend all that time finding everything and then just get the first. - // Two suggestions: - // * An internal SelectorFilter module that doesn't Element.fromDom() everything - // * Re-implement using Selectors.one() instead of Selectors.all() - - var first = function (selector) { - return Option.from(SelectorFilter.all(selector)[0]); - }; - - var ancestor = function (scope, selector, isRoot) { - return Option.from(SelectorFilter.ancestors(scope, selector, isRoot)[0]); - }; - - var sibling = function (scope, selector) { - return Option.from(SelectorFilter.siblings(scope, selector)[0]); - }; - - var child = function (scope, selector) { - return Option.from(SelectorFilter.children(scope, selector)[0]); - }; - - var descendant = function (scope, selector) { - return Option.from(SelectorFilter.descendants(scope, selector)[0]); - }; - - var closest = function (scope, selector, isRoot) { - return ClosestOrAncestor(Selectors.is, ancestor, scope, selector, isRoot); - }; - - return { - first: first, - ancestor: ancestor, - sibling: sibling, - child: child, - descendant: descendant, - closest: closest - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.api.Ephemera', - - [ - 'ephox.peanut.Fun', - 'ephox.salmon.style.Styles', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFind' - ], - - function (Fun, Styles, Attr, Remove, SelectorFind) { - var uploadContainer = Styles.resolve('upload-image-container'); - var blobId = 'data-' + Styles.resolve('image-blob'); - - var cleanup = function (element) { - SelectorFind.child(element, 'img').each(cleanImg); - Remove.unwrap(element); - }; - - var cleanImg = function (element) { - Attr.remove(element, 'class'); - }; - - return { - uploadContainer: Fun.constant(uploadContainer), - blobId: Fun.constant(blobId), - cleanup: cleanup - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Elements', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Traverse', - 'global!document' - ], - - function (Arr, Element, Traverse, document) { - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); - div.innerHTML = html; - return Traverse.children(Element.fromDom(div)); - }; - - var fromTags = function (tags, scope) { - return Arr.map(tags, function (x) { - return Element.fromTag(x, scope); - }); - }; - - var fromText = function (texts, scope) { - return Arr.map(texts, function (x) { - return Element.fromText(x, scope); - }); - }; - - var fromDom = function (nodes) { - return Arr.map(nodes, Element.fromDom); - }; - - return { - fromHtml: fromHtml, - fromTags: fromTags, - fromText: fromText, - fromDom: fromDom - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define('ephox.powerpaste.tinymce.UndoRewriter', - [ - 'ephox.compass.Arr', - 'ephox.salmon.api.Ephemera', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Elements', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.SelectorFilter' - ], - function(Arr, UiEphemera, Element, Elements, InsertAll, SelectorFilter) { - var unwrapHistory = function(editor) { - //Start undomanager hack - for (var i = 0; i < editor.undoManager.data.length; i ++) { - //get the content of every undomanager back stack level - var content = editor.undoManager.data[i].content; - var temp = Element.fromTag('div'); - InsertAll.append(temp, Elements.fromHtml(content)); - //Find uploaded image containers - var uploadContainers = SelectorFilter.descendants(temp, '.' + UiEphemera.uploadContainer()); - //Strip the containers - Arr.each(uploadContainers, UiEphemera.cleanup); - editor.undoManager.data[i].content = temp.dom().innerHTML; - } - }; - - var resrcHistory = function(editor, b, result) { - for (var i = 0; i < editor.undoManager.data.length; i ++) { - editor.undoManager.data[i].content = editor.undoManager.data[i].content.split(b.objurl()).join(result.location); - } - }; - - return { - unwrapHistory: unwrapHistory, - resrcHistory: resrcHistory - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.epithet.Global', - - [ - ], - - function () { - return Function('return this;')(); - } -); - - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.epithet.Resolve', - - [ - 'ephox.epithet.Global' - ], - - function (Global) { - var path = function (parts, scope) { - var o = scope || Global; - for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) - o = o[parts[i]]; - return o; - }; - - var resolve = function (p, scope) { - var parts = p.split('.'); - return path(parts, scope); - }; - - return { - path: path, - resolve: resolve - }; - } -); - - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.core.Global', - - [ - 'ephox.epithet.Resolve' - ], - - function (Resolve) { - var unsafe = function (name, scope) { - return Resolve.resolve(name, scope); - }; - - var getOrDie = function (name, scope) { - var actual = unsafe(name, scope); - - // In theory, TBIO should refuse to load below IE10. But we'll enforce it here too. - if (actual === undefined) throw name + ' not available on this browser'; - return actual; - }; - - return { - getOrDie: getOrDie - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.URL', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE10 and above per - * https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL - * - * Also Safari 6.1+ - * Safari 6.0 has 'webkitURL' instead, but doesn't support flexbox so we - * aren't supporting it anyway - */ - var url = function () { - return Global.getOrDie('URL'); - }; - - var createObjectURL = function (blob) { - return url().createObjectURL(blob); - }; - - var revokeObjectURL = function (u) { - url().revokeObjectURL(u); - }; - - return { - createObjectURL: createObjectURL, - revokeObjectURL: revokeObjectURL - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.api.BlobCache', - - [ - 'ephox.compass.Obj', - 'ephox.numerosity.api.URL', - 'ephox.perhaps.Option', - 'ephox.scullion.Struct' - ], - - function (Obj, URL, Option, Struct) { - var blobInfo = Struct.immutable('id', 'blob', 'objurl', 'data'); - - return function () { - var blobCache = {}; - - var add = function (id, blob, objurl, data) { - var info = blobInfo(id, blob, objurl, data); - blobCache[id] = info; - return info; - }; - - var get = function (id) { - return Option.from(blobCache[id]); - }; - - var release = function (info) { - URL.revokeObjectURL(info.objurl()); - }; - - var lookupByData = function (data) { - return Option.from(Obj.find(blobCache, function (c) { - return c.data().result === data; - })); - }; - - var remove = function (id) { - var o = blobCache[id]; - delete blobCache[id]; - if (o !== undefined) release(o); - }; - - var destroy = function () { - Obj.each(blobCache, release); - blobCache = {}; - }; - - return { - add: add, - get: get, - remove: remove, - lookupByData: lookupByData, - destroy: destroy - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.porkbun.Event', - - [ - 'ephox.compass.Arr', - 'ephox.scullion.Struct' - ], - function (Arr, Struct) { - - /** :: ([String]) -> Event */ - return function (fields) { - var struct = Struct.immutable.apply(null, fields); - - var handlers = []; - - var bind = function (handler) { - if (handler === undefined) { - throw 'Event bind error: undefined handler'; - } - handlers.push(handler); - }; - - var unbind = function(handler) { - var index = Arr.indexOf(handlers, handler); - if (index !== -1) { - handlers.splice(index, 1); - } - }; - - var trigger = function (/* values */) { - // scullion does Array prototype slice, we don't need to as well - var event = struct.apply(null, arguments); - Arr.each(handlers, function (handler) { - handler(event); - }); - }; - - return { - bind: bind, - unbind: unbind, - trigger: trigger - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.porkbun.Events', - - [ - 'ephox.compass.Obj' - ], - - function (Obj) { - - /** :: {name : Event} -> Events */ - var create = function (typeDefs) { - var registry = Obj.map(typeDefs, function (event) { - return { - bind: event.bind, - unbind: event.unbind - }; - }); - - var trigger = Obj.map(typeDefs, function (event) { - return event.trigger; - }); - - return { - registry: registry, - trigger: trigger - }; - }; - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.api.ImageTracker', - - [ - 'ephox.compass.Arr', - 'ephox.salmon.style.Styles', - 'ephox.salmon.api.Ephemera', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.SelectorFilter' - ], - - function (Arr, Styles, Ephemera, Event, Events, Attr, SelectorFilter) { - var uploadAttr = 'data-' + Styles.resolve('image-upload'); - - var findById = function (body, id) { - return SelectorFilter.descendants(body, 'img[' + uploadAttr + '="' + id + '"]'); - }; - - var findAll = function (body) { - // Find all images that are registered in the blob tracker, but aren't uploading - return SelectorFilter.descendants(body, 'img:not([' + uploadAttr + '])[' + Ephemera.blobId() + ']'); - }; - - return function () { - var imgStack = []; - var response = []; - - var events = Events.create({ - complete: Event(['response']) - }); - - var register = function (img, id) { - Attr.set(img, uploadAttr, id); - imgStack.push(id); - }; - - var deregister = function (id) { - imgStack = Arr.filter(imgStack, function (val, index) { - return val !== id; - }); - if (inProgress() === false) finished(); - }; - - var result = function (bool, element) { - response.push({ - 'success': bool, - 'element': element.dom() - }); - }; - - var report = function (id, images, success) { - Arr.each(images, function (img) { - Attr.remove(img, uploadAttr); - result(success, img); - }); - deregister(id); - }; - - var finished = function () { - events.trigger.complete(response); - response = []; - }; - - var inProgress = function () { - return imgStack.length > 0; - }; - - var isActive = function (id) { - return Arr.contains(imgStack, id); - }; - - return { - findById: findById, - findAll: findAll, - register: register, - report: report, - inProgress: inProgress, - isActive: isActive, - events: events.registry - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.highway.Merger', - - [ - 'ephox.classify.Type' - ], - - function (Type) { - - var shallow = function (old, nu) { - return nu; - }; - - var deep = function (old, nu) { - var bothObjects = Type.isObject(old) && Type.isObject(nu); - return bothObjects ? deepMerge(old, nu) : nu; - }; - - var baseMerge = function (merger) { - return function() { - var objects = Array.prototype.slice.call(arguments, 0); - if (objects.length === 0) throw "Can't merge zero objects"; - - var ret = {}; - for (var i = 0; i < objects.length; i++) { - var curObject = objects[i]; - // FIX Merger 14/02/2012 Replace with the functional iterators / maps - for (var key in curObject) if (Object.prototype.hasOwnProperty.call(curObject, key)) { - ret[key] = merger(ret[key], curObject[key]); - } - } - return ret; - }; - }; - - var deepMerge = baseMerge(deep); - var merge = baseMerge(shallow); - - return { - deepMerge: deepMerge, - merge: merge - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.ADT', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.peanut.Fun', - 'global!Array' - ], - - function (Type, Arr, Obj, Fun, Array) { - /* - * Generates a church encoded ADT. No, I'm not going to explain what that is here. - * - * The aim of this file is to replace the extreme ADT syntax we have been using - * (50 lines of code for a simple variant with 4 cases). Specifying the ADT - * can now be done in one line per case, and proper validation is included. - * - * For syntax and use, look at the test code. - */ - var generate = function (cases) { - // validation - if (!Type.isArray(cases)) { - throw 'cases must be an array'; - } - if (cases.length === 0) { - throw 'there must be at least one case'; - } - // adt is mutated to add the individual cases - var adt = {}; - Arr.each(cases, function (acase, count) { - var keys = Obj.keys(acase); - - // validation - if (keys.length !== 1) { - throw 'one and only one name per case'; - } - - var key = keys[0]; - var value = acase[key]; - - // validation - if (adt[key] !== undefined) { - throw 'duplicate key detected:' + key; - } else if (key === 'cata') { - throw 'cannot have a case named cata (sorry)'; - } else if (!Type.isArray(value)) { - // this implicitly checks if acase is an object - throw 'case arguments must be an array'; - } - // - // constructor for key - // - adt[key] = function () { - var args = Array.prototype.slice.call(arguments); - // validation - if (args.length !== value.length) { - throw 'Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + args.length; - } - - - // - // the fold function for key - // - return { - fold: function (/* arguments */) { - // runtime validation - if (arguments.length !== cases.length) { - throw 'Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length; - } - var target = arguments[count]; - return target.apply(null, args); - } - }; - }; - }); - - return adt; - }; - return { - generate: generate - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.hermes.api.ImageAsset', - - [ - 'ephox.highway.Merger', - 'ephox.scullion.ADT' - ], - - function (Merger, ADT) { - /* - * An arbitrary common data structure for handling both local image files - * and images from web urls. - */ - var adt = ADT.generate([ - { 'blob': // Local image. W3C blob object (or File). - [ // NOTE File is just a subclass of Blob - 'id', // unique ID - 'blob', // the entire blob object - 'objurl', // an object URL - THIS MUST BE RELEASED WHEN DONE - 'data' // FileReader instance - already complete - loaded using readAsDataURL(). - // we're storing this rather than result in the hope it will - // keep the string native rather than convert to JS - ] - }, - { 'url': ['id', 'url', 'raw'] } // Remote image. JS image object/element loaded via url - - ]); - - var cata = function (subject, onFile, onImage) { - return subject.fold(onFile, onImage); - }; - - return Merger.merge(adt, { - cata: cata - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.perhaps.Result', - - [ - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - function (Fun, Option) { - var value = function (r) { - return result(function (e, v) { - return v(r); - }); - }; - - var error = function (message) { - return result(function (e, v) { - return e(message); - }); - }; - - var result = function (fold) { - - var is = function (v) { - return fold(Fun.constant(false), function (o) { - return o === v; - }); - }; - - var isValue = function () { - return fold(Fun.constant(false), Fun.constant(true)); - }; - - var isError = Fun.not(isValue); - - var getOr = function (a) { - return fold(Fun.constant(a), Fun.identity); - }; - - var getOrThunk = function (f) { - return fold(f, Fun.identity); - }; - - var getOrDie = function () { - return fold(function (m) { - Fun.die(m)(); - }, Fun.identity); - }; - - var or = function (opt) { - return fold(Fun.constant(opt), value); - }; - - var orThunk = function (f) { - return fold(f, value); - }; - - var map = function (f) { - return bind(function (a) { - return value(f(a)); - }); - }; - - var each = map; - - var bind = function (f) { - return fold(error, f); - }; - - var exists = function (f) { - return fold(Fun.constant(false), f); - }; - - var forall = function (f) { - return fold(Fun.constant(true), f); - }; - - var toOption = function () { - return fold(Option.none, Option.some); - }; - - return { - is: is, - isValue: isValue, - isError: isError, - getOr: getOr, - getOrThunk: getOrThunk, - getOrDie: getOrDie, - or: or, - orThunk: orThunk, - fold: fold, - map: map, - each: each, - bind: bind, - exists: exists, - forall: forall, - toOption: toOption - }; - }; - - return { - value: value, - error: error - }; - - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.alien.Toggler', - - [ - ], - - function () { - return function (turnOff, turnOn, initial) { - var active = initial || false; - - var on = function () { - turnOn(); - active = true; - }; - - var off = function () { - turnOff(); - active = false; - }; - - var toggle = function () { - var f = active ? off : on; - f(); - }; - - var isOn = function () { - return active; - }; - - return { - on: on, - off: off, - toggle: toggle, - isOn: isOn - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Class', - - [ - 'ephox.sugar.alien.Toggler', - 'ephox.sugar.api.Attr' - ], - - function (Toggler, Attr) { - /* - * ClassList is IE10 minimum: - * https://developer.mozilla.org/en-US/docs/Web/API/Element.classList - * - * Note that IE doesn't support the second argument to toggle (at all). - * If it did, the toggler could be better. - */ - - var add = function (element, clazz) { - element.dom().classList.add(clazz); - }; - - var remove = function (element, clazz) { - var classList = element.dom().classList; - classList.remove(clazz); - - // classList is a "live list", so this is up to date already - if (classList.length === 0) { - // No more classes left, remove the class attribute as well - Attr.remove(element, 'class'); - } - }; - - var toggle = function (element, clazz) { - return element.dom().classList.toggle(clazz); - }; - - var toggler = function (element, clazz) { - var classList = element.dom().classList; - var off = function () { - classList.remove(clazz); - }; - var on = function () { - classList.add(clazz); - }; - return Toggler(off, on, has(element, clazz)); - }; - - var has = function (element, clazz) { - var classList = element.dom().classList; - // Cereal has a nasty habit of calling this with a text node >.< - return classList !== undefined && classList.contains(clazz); - }; - - // set deleted, risks bad performance. Be deterministic. - - return { - add: add, - remove: remove, - toggle: toggle, - toggler: toggler, - has: has - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.ui.UploadUi', - - [ - 'ephox.salmon.api.Ephemera', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFind', - 'ephox.sugar.api.Traverse' - ], - - function (Ephemera, Class, Element, Insert, InsertAll, Remove, SelectorFind, Traverse) { - var removeUi = function (image) { - SelectorFind.ancestor(image, '.' + Ephemera.uploadContainer()).each(function (wrapper) { - var children = Traverse.children(wrapper); - InsertAll.before(wrapper, children); - Remove.remove(wrapper); - }); - }; - - var addUi = function (image) { - var block = Element.fromTag('div'); - Class.add(block, Ephemera.uploadContainer()); - Insert.before(image, block); - Insert.append(block, image); - }; - - return { - removeUi: removeUi, - addUi: addUi - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.api.UploadUtils', - - [ - 'ephox.compass.Arr', - 'ephox.hermes.api.ImageAsset', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.perhaps.Result', - 'ephox.salmon.api.Ephemera', - 'ephox.salmon.ui.UploadUi', - 'ephox.scullion.ADT', - 'ephox.scullion.Struct', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.SelectorFind', - 'global!console' - ], - - function (Arr, ImageAsset, Fun, Option, Result, UiEphemera, UploadUi, Adt, Struct, Attr, SelectorFind, console) { - var imageBlob = Struct.immutable('image', 'blobInfo'); - - var uploadResult = Adt.generate([ - { 'failure': [ 'error' ] }, - { 'success': [ 'result', 'images', 'blob' ] } - ]); - - /* Register any not already active id in the image tracker and return Some if it isn't already active */ - var prepareForUpload = function (imageTracker, id, image) { - // If this ID is already active, don't actually trigger the upload a second time - var alreadyActive = imageTracker.isActive(id); - - // Register the id so ImageTracker can find it - imageTracker.register(image, id); - - // Add the spinner wrapper. - UploadUi.addUi(image); - - // separate the actual upload call so we don't have the img element in closure - return !alreadyActive ? Option.some(id) : Option.none(); - }; - - /* With each uploaded image, remove the uploading UI, update its src, and remove from the blob cache. - * Return the blob info identified by the id - */ - var updateImages = function (blobCache, images, id, result) { - Arr.each(images, function (img) { - Attr.set(img, 'src', result.location); - Attr.remove(img, UiEphemera.blobId()); - }); - - return removeFromCache(blobCache, id, images); - }; - - /* Upload a particular image, finding it afterwards and updating its source */ - var handleUpload = function (uploadManager, imageTracker, blobCache, container, id, blob, callback) { - var internalError = function () { - console.error('Internal error with blob cache', id); - // anything over 500 is a generic error - callback(uploadResult.failure({status: Fun.constant(666)})); - }; - - uploadManager.upload(blob, id, function (response) { - var freshImgs = imageTracker.findById(container, id); - - // remove the image UI no matter what happened - Arr.each(freshImgs, UploadUi.removeUi); - - response.fold(function (err) { - callback(uploadResult.failure(err)); - }, function (result) { - updateImages(blobCache, freshImgs, id, result).fold(internalError, function (blobInfo) { - callback(uploadResult.success(result, freshImgs, blobInfo)); - }); - }); - - imageTracker.report(id, freshImgs, response.isValue()); - }); - }; - - var addToCache = function (blobCache, id, blob, objurl, data, image) { - var blobInfo = blobCache.lookupByData(data.result).getOrThunk(function () { return blobCache.add(id, blob, objurl, data); }); - Attr.set(image, UiEphemera.blobId(), blobInfo.id()); - return Result.value(imageBlob(image, blobInfo)); - }; - - - var findInCache = function (blobCache, image) { - var id = Attr.get(image, UiEphemera.blobId()); - return blobCache.get(id).fold(function () { - return Result.error(id); - }, function (blobInfo) { - return Result.value(imageBlob(image, blobInfo)); - }); - }; - - var removeFromCache = function (blobCache, id, images) { - return blobCache.get(id).fold(function () { - return Result.error('Internal error with blob cache'); - }, function (blobInfo) { - blobCache.remove(id); - return Result.value(blobInfo); - }); - }; - - /* Find all of the assets in the container, and return the (blobInfo, img) pairs */ - var registerAssets = function (blobCache, container, assets) { - return Arr.bind(assets, function (asset) { - return ImageAsset.cata(asset, function (id, blob, objurl, data) { - var freshImg = SelectorFind.descendant(container, 'img[src="' + objurl + '"]'); - return freshImg.fold(function () { - return [ Result.error('Image that was just inserted could not be found: ' + objurl) ]; - }, function (img) { - return [ addToCache(blobCache, id, blob, objurl, data, img) ]; - }); - }, Fun.constant([])); - }); - }; - - var findBlobs = function(imageTracker, blobCache, container) { - var images = imageTracker.findAll(container); - if (imageTracker.inProgress()) return []; - return Arr.map(images, function (image) { - return findInCache(blobCache, image); - }); - }; - - return { - prepareForUpload: prepareForUpload, - handleUpload: handleUpload, - registerAssets: registerAssets, - findBlobs: findBlobs - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.FormData', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE10 and above per - * https://developer.mozilla.org/en-US/docs/Web/API/FormData - */ - return function () { - var f = Global.getOrDie('FormData'); - return new f(); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!Math", [], function () { return Math; }); -ephox.bolt.module.api.define("global!isFinite", [], function () { return isFinite; }); -ephox.bolt.module.api.define("global!isNaN", [], function () { return isNaN; }); -ephox.bolt.module.api.define("global!parseFloat", [], function () { return parseFloat; }); -(function (define, require, demand) { -define( - 'ephox.violin.util.Validate', - - [ - 'global!Math', - 'global!isFinite', - 'global!isNaN', - 'global!parseFloat' - ], - - function(Math, isFinite, isNaN, parseFloat) { - var vType = function(expectedType) { - return function(name, value) { - var t = typeof value; - if (t !== expectedType) throw name + ' was not a ' + expectedType + '. Was: ' + value + ' (' + t + ')'; - }; - }; - - var vString = vType('string'); - - var vChar = function(name, value) { - vString(name, value); - var length = value.length; - if (length !== 1) throw name + ' was not a single char. Was: ' + value; - }; - - var vNumber = vType('number'); - - var vInt = function(name, value) { - vNumber(name, value); - if (value !== Math.abs(value)) throw name + ' was not an integer. Was: ' + value; - }; - - var pNum = function(value) { - return !isNaN(parseFloat(value)) && isFinite(value); - }; - - var vNat = function(name, value) { - vInt(name, value); - if (value < 0) throw name + ' was not a natural number. Was: ' + value; - }; - - return { - vString: vString, - vChar: vChar, - vInt: vInt, - vNat: vNat, - pNum: pNum - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -/** - * "violin" - stringed instrument, or rather, an instrument for dealing with strings. - */ -define( - "ephox.violin.Strings", - - [ - 'ephox.violin.util.Validate' - ], - - function (Validate) { - //common method - var checkRange = function(str, substr, start) { - if (substr === "") return true; - if (str.length < substr.length) return false; - var x = str.substr(start, start + substr.length); - return x === substr; - }; - - /** Given a string and object, perform template-replacements on the string, as specified by the object. - * Any template fields of the form ${name} are replaced by the string or number specified as obj["name"] - * Based on Douglas Crockford's 'supplant' method for template-replace of strings. Uses different template format. - */ - var supplant = function(str, obj) { - var isStringOrNumber = function(a) { - var t = typeof a; - return t === "string" || t === "number"; - }; - - return str.replace(/\${([^{}]*)}/g, - function (a, b) { - var value = obj[b]; - return isStringOrNumber(value) ? value : a; - } - ); - }; - - var ignoringCase = function(fn) { - var map = function(a, fn) { - var r = []; - for (var i = 0; i < a.length; i++) r.push(fn(a[i])); - return r; - }; - - return function() { - var args = map(arguments, function(x) { - return typeof x === "string" ? x.toLowerCase() : x; - }); - return fn.apply(this, args); - }; - }; - - /** Does 'str' start with 'prefix'? - * Note: all strings start with the empty string. - * More formally, for all strings x, startsWith(x, ""). - * This is so that for all strings x and y, startsWith(y + x, y) - */ - var startsWith = function(str, prefix) { - return checkRange(str, prefix, 0); - }; - - var startsWithIgnoringCase = /* str, prefix */ ignoringCase(startsWith); - - /** Does 'str' end with 'suffix'? - * Note: all strings end with the empty string. - * More formally, for all strings x, endsWith(x, ""). - * This is so that for all strings x and y, endsWith(x + y, y) - */ - var endsWith = function(str, suffix) { - return checkRange(str, suffix, str.length - suffix.length); - }; - - var endsWithIgnoringCase = /* str, suffix */ ignoringCase(endsWith); - - /** Return the first 'count' letters from 'str'. - * e.g. first("abcde", 2) === "ab" - */ - var first = function(str, count) { - return str.substr(0, count); - }; - - /** Return the last 'count' letters from 'str'. - * e.g. last("abcde", 2) === "de" - */ - var last = function(str, count) { - return str.substr(str.length - count, str.length); - }; - - var removeAppendage = function(checkFn, chopFn) { - return function(str, appendage) { - return checkFn(str, appendage) ? chopFn(str, str.length - appendage.length) : str; - }; - }; - - var removeLeading = /* str, prefix */ removeAppendage(startsWith, last); - var removeTrailing = /* str, suffix */ removeAppendage(endsWith, first); - - var append = function(a, b) { - return a + b; - }; - - var prepend = function(a, b) { - return b + a; - }; - - var ensureAppendage = function(checkFn, concatter) { - return function(str, appendage) { - return checkFn(str, appendage) ? str : concatter(str, appendage); - }; - }; - - var ensureLeading = /* str, prefix */ ensureAppendage(startsWith, prepend); - var ensureTrailing = /* str, suffix */ ensureAppendage(endsWith, append); - - /** removes all leading and trailing spaces */ - var trim = function(str) { - return str.replace(/^\s+|\s+$/g, ''); - }; - - var lTrim = function(str) { - return str.replace(/^\s+/g, ''); - }; - - var rTrim = function(str) { - return str.replace(/\s+$/g, ''); - }; - - /** Does 'str' contain 'substr'? - * Note: all strings contain the empty string. - */ - var contains = function(str, substr) { - return str.indexOf(substr) != -1; - }; - - var containsIgnoringCase = /* str, substr */ ignoringCase(contains); - - var htmlEncodeDoubleQuotes = function(str) { - return str.replace(/\"/gm, """); - }; - - var equals = function(a, b) { - return a === b; - }; - var equalsIgnoringCase = /* a, b */ ignoringCase(equals); - - var head = function(str) { - if (str === "") throw "head on empty string"; - return str.substr(0, 1); - }; - - var toe = function(str) { - if (str === "") throw "toe on empty string"; - return str.substr(str.length - 1, str.length); - }; - - var tail = function(str) { - if (str === "") throw "tail on empty string"; - return str.substr(1, str.length - 1); - }; - - var torso = function(str) { - if (str === "") throw "torso on empty string"; - return str.substr(0, str.length - 1); - }; - - var capitalize = function(str) { - if (str === "") return str; - return head(str).toUpperCase() + tail(str); - }; - - var repeat = function(str, num) { - Validate.vString('str', str); - Validate.vNat('num', num); - var r = ''; - for (var i = 0; i < num; i++) { - r += str; - } - return r; - }; - - var pad = function(combiner) { - return function(str, c, width) { - Validate.vString('str', str); - Validate.vChar('c', c); - Validate.vNat('width', width); - var l = str.length; - return l >= width ? str : combiner(str, repeat(c, width - l)); - }; - }; - - var padLeft = pad(function(s, padding) { return padding + s; }); - var padRight = pad(function(s, padding) { return s + padding; }); - - return { - supplant: supplant, - startsWith: startsWith, - startsWithIgnoringCase: startsWithIgnoringCase, - endsWith: endsWith, - endsWithIgnoringCase: endsWithIgnoringCase, - first: first, - last: last, - removeLeading: removeLeading, - removeTrailing: removeTrailing, - ensureLeading: ensureLeading, - ensureTrailing: ensureTrailing, - trim: trim, - lTrim: lTrim, - rTrim: rTrim, - contains: contains, - containsIgnoringCase: containsIgnoringCase, - htmlEncodeDoubleQuotes: htmlEncodeDoubleQuotes, - equals: equals, - equalsIgnoringCase: equalsIgnoringCase, - head: head, - repead: repeat, - padLeft: padLeft, - padRight: padRight, - toe: toe, - tail: tail, - torso: torso, - capitalize: capitalize - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.services.UploadCommon', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.numerosity.api.FormData', - 'ephox.scullion.Struct', - 'ephox.violin.Strings' - ], - - function (Type, Arr, FormData, Struct, Strings) { - var failureObject = Struct.immutable('message', 'status', 'contents'); - - var known = [ 'jpg', 'png', 'gif', 'jpeg' ]; // I welcome more suggestions - - var buildFilename = function (file, identifier) { - if (Type.isString(file.type) && Strings.startsWith(file.type, 'image/')) { - var filetype = file.type.substr('image/'.length); - - // If it's a known extension, use it, otherwise just don't provide an extension - return Arr.contains(known, filetype) ? identifier + '.' + filetype : identifier; - } else { - // things that aren't image/xxx can just have the default filename with no extension - return identifier; - } - }; - - var getFilename = function (file, identifier) { - // file.name is the default, but if it's a blob the default name is 'blob' - // TBIO-3151: On IE11 internet sites the filename ends in '.tmp' and we don't want to upload that. - var useFilename = Type.isString(file.name) && !Strings.endsWith(file.name, '.tmp'); - return useFilename ? file.name : buildFilename(file, identifier); - }; - - var buildExtra = function (fieldName, file, filename) { - var formData = FormData(); - formData.append(fieldName, file, filename); - - return { - data: formData, - // override Jax, which sets this to application/json (triggering pre-flight) - contentType: false, - // stop JQuery processing the data - processData: false - }; - }; - - return { - failureObject: failureObject, - getFilename: getFilename, - buildExtra: buildExtra - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.XMLHttpRequest', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE8 and above per - * https://developer.mozilla.org/en/docs/XMLHttpRequest - */ - return function () { - var f = Global.getOrDie('XMLHttpRequest'); - return new f(); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.jax.base.Ajax', - - [ - 'ephox.classify.Type', - 'ephox.compass.Obj', - 'ephox.highway.Merger', - 'ephox.numerosity.api.XMLHttpRequest', - 'ephox.perhaps.Result', - 'ephox.violin.Strings', - 'global!console' - ], - - function (Type, Obj, Merger, XMLHttpRequest, Result, Strings, console) { - var accepts = { - '*': '*/*', - text: 'text/plain', - html: 'text/html', - xml: 'application/xml, text/xml', - json: 'application/json, text/javascript' - }; - - /* - * - * This could be done better, but that would involve an API change. Or move some of it to numerosity. - * Start by replicating JQuery API, and unravel later. - * - */ - - var ajax = function (url, success, error, extra) { - var base = { - url: url, - contentType: 'application/json', - processData: false, - type: 'GET' - }; - - var options = Merger.merge(base, extra); - // This would be nice, but IE doesn't support responseType 'json' - might be an excuse to bring in platform detection - /* - if (Type.isString(options.responseType)) - request.responseType = options.responseType; - */ - - var request = XMLHttpRequest(); - - request.open(options.type.toUpperCase(), options.url, true); // enforced async! enforced type as String! - - if (Type.isString(options.contentType)) { // set to string here, but overridden for form posting by TBIO-1255 - request.setRequestHeader('Content-Type', options.contentType); - } - - // I'm not 100% sure why JQuery does this, but eh why not - var odt = options.dataType; - var a = Type.isString(odt) && odt !== '*' ? - accepts[odt] + ', ' + accepts['*'] + '; q=0.01' : - accepts['*']; - - request.setRequestHeader('Accept', a); - - if (options.xhrFields !== undefined && options.xhrFields.withCredentials === true) { - request.withCredentials = true; // IE10 minimum - } - - // Do this last, so the extra headers can override the above - if (Type.isObject(options.headers)) Obj.each(options.headers, function (v, k) { - if (!Type.isString(k) && !Type.isString(v)) console.error('Request header data was not a string: ', k ,' -> ', v); - else request.setRequestHeader(k, v); - }); - - var onSuccess = function (data, status, jqxhr) { - success(data); - }; - - var onError = function (jqxhr) { - error('Could not load url "' + url + '": ' + jqxhr.status + ' ' + jqxhr.statusText, jqxhr.status, jqxhr.responseText); - }; - - var parseJson = function (jqxhr) { - // If we do this inside the try block, an error in the success callback will be caught - // by the "response was not JSON" catch block. - try { - return Result.value(JSON.parse(jqxhr.response)); - } catch (e) { - return Result.error({ - status: jqxhr.status, - statusText: 'Response was not JSON', - responseText: jqxhr.responseText - }); - } - }; - - var validateData = function (request) { - var data = options.dataType === 'json' ? parseJson(request) : Result.value(request.response); - data.fold(onError, function (xhrData) { - onSuccess(xhrData, request.statusText, request); - }); - }; - - var onLoad = function () { - if (request.status === 0) { - // Local files and Cors errors return status 0. - // The only way we can decifer a local request is request url starts with 'file:' and allow local files to succeed. - if (Strings.startsWith(options.url, 'file:')) validateData(request); - else error('Unknown HTTP error (possible cross-domain request)', request.status, request.responseText); - - } else if ( request.status < 100 || request.status >= 400) { - // Technically only network errors trigger onerror; HTTP errors trigger onload. - // In practice only IE does this. But we need to handle it. - onError(request); - } else { - validateData(request); - } - }; - - request.onerror = onError; - request.onload = onLoad; - // I suspect refactoring this at all will break stuff - if (options.data === undefined) { - request.send(); - } else { - request.send(options.data); - } - }; - - return { - ajax: ajax - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.JSON', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE8 and above per - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON - */ - var json = function () { - return Global.getOrDie('JSON'); - }; - - var parse = function (obj) { - return json().parse(obj); - }; - - var stringify = function (obj) { - return json().stringify(obj); - }; - - return { - parse: parse, - stringify: stringify - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.jax.plain.Ajax', - - [ - 'ephox.highway.Merger', - 'ephox.jax.base.Ajax', - 'ephox.numerosity.api.JSON' - ], - - function (Merger, Ajax, JSON) { - var get = function (url, success, error, extra) { - Ajax.ajax(url, success, error, Merger.merge({ - dataType: 'text', - type: 'GET' - }, extra)); - }; - - var post = function (url, data, success, error, extra) { - Ajax.ajax(url, success, error, Merger.merge({ - dataType: 'text', - data: JSON.stringify(data), - type: 'POST' - }, extra)); - }; - - return { - get: get, - post: post - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -// An implementation of the algorithm specified in section 5.3 of RFC 3986. -// See http://tools.ietf.org/html/rfc3986#section-5.3 -define( - 'ephox.yuri.resolve.Recompose', - - [ - ], - - function () { - var recompose = function (transformed) { - var result = ''; - - if (transformed.protocol !== '') { - result += transformed.protocol; - result += ':'; - } - - if (transformed.authority !== '') { - result += '//'; - result += transformed.authority; - } - - result += transformed.path; - - if (transformed.query !== '') { - result += '?'; - result += transformed.query; - } - - if (transformed.anchor !== '') { - result += '#'; - result += transformed.anchor; - } - - return result; - }; - - return { - recompose: recompose - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -// Based on parseUri 1.2.2 -// (c) Steven Levithan <stevenlevithan.com> -// MIT License -// http://blog.stevenlevithan.com/archives/parseuri -// -// Forked by Ephox on 2011-02-07. Source modified. -define( - 'ephox.yuri.api.Parser', - - [ - 'ephox.highway.Merger' - ], - - function (Merger) { - var defaultOptions = { - strictMode: false, - key: [ 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor' ], - q: { - name: 'queryKey', - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - var parseUri = function (str, options) { - var o = options, - m = o.parser[o.strictMode ? 'strict' : 'loose'].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ''; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; - }; - - var parse = function (str, options) { - var augmentedOptions = Merger.merge(defaultOptions, options); - return parseUri(str, augmentedOptions); - }; - - return { - parse: parse - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -// An implementation of the algorithm specified in section 5.2.4 of RFC 3986. -// See http://tools.ietf.org/html/rfc3986#section-5.2.4 -define( - 'ephox.yuri.normalize.Dots', - - [ - 'ephox.violin.Strings' - ], - - function (Strings) { - var removeLastSegment = function (path) { - return Strings.removeTrailing(path, lastSegment(path)); - }; - - var firstSegment = function (path) { - return path.match(/(^\/?.*?)(\/|$)/)[1]; - }; - - var lastSegment = function (path) { - return path.substring(path.lastIndexOf('/')); - }; - - var remove = function (path) { - // 1. - var input = path; - var output = ''; - - // 2. - while (input !== '') { - // 2. A - if (Strings.startsWith(input, '../')) { - input = Strings.removeLeading(input, '../'); - } else if (Strings.startsWith(input, './')) { - input = Strings.removeLeading(input, './'); - // 2. B - } else if (Strings.startsWith(input, '/./')) { - input = '/' + Strings.removeLeading(input, '/./'); - } else if (input === '/.') { - input = '/'; - // 2. C - } else if (Strings.startsWith(input, '/../')) { - input = '/' + Strings.removeLeading(input, '/../'); - output = removeLastSegment(output); - } else if (input === '/..') { - input = '/'; - output = removeLastSegment(output); - // 2. D - } else if (input === '.' || input === '..') { - input = ''; - // 2. E - } else { - var first = firstSegment(input); - input = Strings.removeLeading(input, first); - output += first; - } - } - - // 3. - return output; - }; - - return { - remove: remove - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -// An implementation of the algorithm specified in section 5.2.3 of RFC 3986. -// See http://tools.ietf.org/html/rfc3986#section-5.2.3 -define( - 'ephox.yuri.resolve.Merge', - - [ - 'ephox.violin.Strings' - ], - - function (Strings) { - var merge = function (base, rel, baseAuthority) { - if (baseAuthority !== '' && base === '') - return '/' + rel; - - var last = base.substring(base.lastIndexOf('/') + 1); - return Strings.removeTrailing(base, last) + rel; - }; - - return { - merge: merge - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -// An implementation of the algorithm specified in section 5.2.2 of RFC 3986. -// See http://tools.ietf.org/html/rfc3986#section-5.2.2 -define( - 'ephox.yuri.resolve.Transform', - - [ - 'ephox.violin.Strings', - 'ephox.yuri.api.Parser', - 'ephox.yuri.normalize.Dots', - 'ephox.yuri.resolve.Merge' - ], - - function (Strings, Parser, Dots, Merge) { - var transform = function (base, relative) { - var options = { strictMode: true }; - - var b = Parser.parse(base, options); - var rel = Parser.parse(relative, options); - - var ret = {}; - - if (rel.protocol !== '') { - ret.protocol = rel.protocol; - ret.authority = rel.authority; - ret.path = Dots.remove(rel.path); - ret.query = rel.query; - } else { - if (rel.authority !== '') { - ret.authority = rel.authority; - ret.path = Dots.remove(rel.path); - ret.query = rel.query; - } else { - if (rel.path === '') { - ret.path = b.path; - if (rel.query !== '') { - ret.query = rel.query; - } else { - ret.query = b.query; - } - } else { - if (Strings.startsWith(rel.path, '/')) { - ret.path = Dots.remove(rel.path); - } else { - ret.path = Merge.merge(b.path, rel.path, base.authority); - ret.path = Dots.remove(ret.path); - } - ret.query = rel.query; - } - ret.authority = b.authority; - } - ret.protocol = b.protocol; - } - - ret.anchor = rel.anchor; - - return ret; - }; - - return { - transform: transform - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.yuri.api.Resolver', - - [ - 'ephox.yuri.resolve.Recompose', - 'ephox.yuri.resolve.Transform' - ], - - function (Recompose, Transform) { - var resolve = function (base, relative) { - var transformed = Transform.transform(base, relative); - return Recompose.recompose(transformed); - }; - - return { - resolve: resolve - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.services.UploadDirect', - - [ - 'ephox.classify.Type', - 'ephox.highway.Merger', - 'ephox.jax.plain.Ajax', - 'ephox.numerosity.api.JSON', - 'ephox.perhaps.Result', - 'ephox.salmon.services.UploadCommon', - 'ephox.violin.Strings', - 'ephox.yuri.api.Resolver' - ], - - function (Type, Merger, Ajax, JSON, Result, UploadCommon, Strings, Resolver) { - return function (settings) { - - /* - * If a base is not provided by the config, use the directory where the - * POST acceptor lives - */ - var resolveBase = function () { - var fullBase = settings.url; - // The base is the string up to the last slash, unless that slash is at the start of the string. - var lastSlash = fullBase.lastIndexOf('/'); - var base = lastSlash > 0 ? fullBase.substr(0, lastSlash) : fullBase; - - var _responseBase = settings.basePath === undefined ? base : settings.basePath; - return Strings.endsWith(_responseBase, '/') ? _responseBase : _responseBase + '/'; - }; - - // pre-calculate, don't need to do this on every upload - var responseBase = resolveBase(); - - - /* - * ELJ upload handler result location consists of: - * - * - If the response looks like a URL, use that as the filename - * - Otherwise use the source filename - * - take the filename, and resolve it relative to the base provided by the config - */ - var calculateLocation = function (response, filename) { - var splits = response.split(/\s+/); - - // If the response text is a simple string with no whitespace, it's a URL - var serverFilename = (splits.length === 1 && splits[0] !== '') ? splits[0] : filename; - - // Resolve the settings base url to the response - return Resolver.resolve(responseBase, serverFilename); - }; - - // ELJ style direct uploader, form field name 'image' - var upload = function (blobInfo, identifier, callback) { - var file = blobInfo.blob(); - var failure = function (message, status, contents) { - callback(Result.error(UploadCommon.failureObject(message, status, contents))); - }; - - var filename = UploadCommon.getFilename(file, identifier); - - var useCreds = settings.credentials !== true ? {} : { - xhrFields: { - withCredentials: true - } - }; - - var extra = Merger.merge(useCreds, UploadCommon.buildExtra('image', file, filename)); - - var success = function (_response) { - var response; - // This is difficult to refactor; response is either a json parse failure, a json object, or a string. - try { - var json = JSON.parse(_response); - // we have JSON, make sure it's valid - if (!Type.isString(json.location)) { - failure('JSON response did not contain a string location', 500, _response); - return; - } else { - // we now support adding a base URL ELJ style, so we have to unwrap the JSON into a string - response = json.location; - } - } catch (e) { - // not JSON, assume it's an ELJ style url response - response = _response; - } - - var loc = calculateLocation(response, filename); - - callback(Result.value({ - // convert ELJ style response to TBIO expected response - location: loc - })); - }; - - Ajax.post(settings.url, {}, success, failure, extra); - }; - - return { - upload: upload - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!setTimeout", [], function () { return setTimeout; }); -(function (define, require, demand) { -define( - 'ephox.salmon.services.UploadFunction', - - [ - 'ephox.classify.Type', - 'ephox.perhaps.Result', - 'ephox.salmon.services.UploadCommon', - 'ephox.scullion.Struct', - 'global!console', - 'global!setTimeout' - ], - - function (Type, Result, UploadCommon, Struct, console, setTimeout) { - var imageObjectApi = Struct.immutable('id', 'filename', 'blob', 'base64'); - - // Customer handler function - return function (handler) { - - var upload = function (blobInfo, identifier, callback) { - var failure = function (message) { - // SimpleError handles the variety of callback message types, so just pass it straight through - callback(Result.error(message)); - }; - - var success = function (result) { - if (!Type.isString(result)) { - console.error('Image upload result was not a string'); - failure(''); - } else { - callback(Result.value({ - // convert to TBIO expected response - location: result - })); - } - }; - - var filename = UploadCommon.getFilename(blobInfo.blob(), identifier); - - var api = imageObjectApi(identifier, filename, blobInfo.blob(), blobInfo.data().result); - - // wrap the custom handler in a setTimeout so that if it throws an error, that doesn't break the core editor - setTimeout(function () { - handler(api, success, failure); - }, 0); - }; - - return { - upload: upload - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.salmon.api.Uploaders', - - [ - 'ephox.salmon.services.UploadCommon', - 'ephox.salmon.services.UploadDirect', - 'ephox.salmon.services.UploadFunction' - ], - - function (UploadCommon, UploadDirect, UploadFunction) { - var direct = function (settings) { - return UploadDirect(settings); - }; - - var custom = function (handler) { - return UploadFunction(handler); - }; - - var failureObject = function (message, status, contents) { - return UploadCommon.failureObject(message, status, contents); - }; - - var getFilename = function (file, identifier) { - return UploadCommon.getFilename(file, identifier); - }; - - var buildExtra = function (fieldName, file, filename) { - return UploadCommon.buildExtra(fieldName, file, filename); - }; - - return { - direct: direct, - custom: custom, - failureObject: failureObject, - getFilename: getFilename, - buildExtra: buildExtra - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.imageupload.EphoxUploader', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.powerpaste.imageupload.TinyUploader', - 'ephox.powerpaste.imageupload.UploadError', - 'ephox.powerpaste.tinymce.UndoRewriter', - 'ephox.salmon.api.BlobCache', - 'ephox.salmon.api.ImageTracker', - 'ephox.salmon.api.UploadUtils', - 'ephox.salmon.api.Uploaders', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element' - ], - - function (Arr, Fun, Option, TinyUploader, UploadError, UndoRewriter, BlobCache, ImageTracker, UploadUtils, Uploaders, Attr, Element) { - var enabled = function (editor, settings) { - // Use polish dependencies. - var blobCache = BlobCache(); - var imageTracker = ImageTracker(); - var errorHandler = UploadError(); - var errors = UploadError(editor, settings.url); - - // UploadDirect will need an error handler that is tiny specific. - var uploadManager = Uploaders.direct(settings); - - var getBody = function () { - return Element.fromDom(editor.getBody()); - }; - - var updateImage = function (result, images, b) { - Arr.each(images, function (img) { - Attr.set(img, 'data-mce-src', result.location); - }); - - // undo hack. - UndoRewriter.resrcHistory(editor, b, result); - }; - - imageTracker.events.complete.bind(function (event) { - //Other undo hack. - UndoRewriter.unwrapHistory(editor); - }); - - var uploadImage = function(id, blob, showError) { - UploadUtils.handleUpload(uploadManager, imageTracker, blobCache, getBody(), id, blob, function (upResult) { - upResult.fold(function (err) { - // show error dialog - showError(err); - }, updateImage); - }); - }; - - var prepareForUpload = function (info, showError) { - UploadUtils.prepareForUpload(imageTracker, info.blobInfo().id(), info.image()).each(function (id) { - uploadImage(id, info.blobInfo(), showError); - }); - }; - - var uploadAssets = function (assets) { - var showError = errors.instance(); - var candidates = UploadUtils.registerAssets(blobCache, getBody(), assets); - Arr.each(candidates, function (candidate) { - candidate.fold(function (err) { - // a blob we do not know about. - console.error(err); - }, function(info) { - prepareForUpload(info, showError); - }); - }); - }; - - // Need to fill this in. - var reconstitute = function () { - var showError = errors.instance(); - var imageBlobs = UploadUtils.findBlobs(imageTracker, blobCache, getBody()); - Arr.each(imageBlobs, function (imageBlob) { - imageBlob.fold(function (id) { - // Report the failure. - imageTracker.report(id, Option.none(), false); - }, function(info) { - prepareForUpload(info, showError); - }); - }); - }; - - var uploadImages = function (assets) { - reconstitute(); - - uploadAssets(assets); - }; - - var getLocalURL = function (id, blob, objurl, data) { - return objurl; - }; - - return { - uploadImages: uploadImages, - prepareImages: Fun.noop, //Images are already in Ephox uploader's required format (blobs) - getLocalURL: getLocalURL - }; - }; - - - var disabled = function(editor) { - - var tinyUploader = TinyUploader(editor); - - return { - uploadImages: Fun.noop, - prepareImages: tinyUploader.prepareImages, //Convert images back to base64 so they aren't unusable - getLocalURL: tinyUploader.getLocalURL //As above - }; - }; - - return function (editor, settings) { - return settings ? enabled(editor, settings) : disabled(editor); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.imageupload.UploaderFactory', - - [ - 'ephox.powerpaste.imageupload.EphoxUploader', - 'ephox.powerpaste.imageupload.TinyUploader' - ], - function (EphoxUploader, TinyUploader) { - return function (editor) { - //We'll only need to use ephox's uploader if Tiny's 4.0-4.1 and we have an images_upload_url setting - var ephoxUploadSettings = !editor.uploadImages && editor.settings.images_upload_url ? - { - url: editor.settings.images_upload_url, - basePath: editor.settings.images_upload_base_path, - credentials: editor.settings.images_upload_credentials - } : null; - return !editor.uploadImages ? EphoxUploader(editor, ephoxUploadSettings) : TinyUploader(editor); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.tinymce.Util', - - [ - ], - - function () { - var bind = function(func, t) { - return function() { - return func.apply(t, arguments); - }; - }; - - // Useful utilities that may exist in libraries but aren't as common. - // Currently we're providing our own implementation for these but want to track them. - var ephoxGetComputedStyle = function(node) { - if (node.ownerDocument.defaultView) { - return node.ownerDocument.defaultView.getComputedStyle(node, null); - } - return node.currentStyle || {}; - }; - - var log = function(msg) { - if (typeof(console) !== 'undefined' && console.log) { - console.log(msg); - } - }; - - var compose = function(funs) { - var args = Array.prototype.slice.call(funs).reverse(); - return function(input) { - var r = input; - for (var i = 0; i < args.length; i++) { - var fun = args[i]; - r = fun(r); - } - return r; - }; - }; - - var extend = function(obj) { - tinymce.each(Array.prototype.slice.call(arguments, 1), function(element){ - for (var prop in element) { - obj[prop] = element[prop]; - } - }); - return obj; - }; - - return { - each: tinymce.each, - trim: tinymce.trim, - bind: bind, - extend: extend, - ephoxGetComputedStyle: ephoxGetComputedStyle, - log: log, - compose: compose - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -/** - * Source code in this file has been taken under a commercial license from tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js - * Copyright 2009, Moxiecode Systems AB - */ -define( - 'ephox.powerpaste.legacy.tinymce.Clipboard', - - [ - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Util) { - var each = tinymce.each; - // Note that there is only ever one instance of this module - it's not created specifically for each editor. - - // Private function that does the actual work of grabbing the clipboard content. - // This can then be shared between the onpaste and onKeyDown listeners. - var grabContent = function(ed, callback, e) { - var n, or, rng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY; - - // Check if browser supports direct plaintext access - if (e.clipboardData && e.clipboardData.getData('text/html')) { - e.preventDefault(); - var data = e.clipboardData.getData('text/html'); - var matched = data.match(/<html[\s\S]+<\/html>/i); - // some browsers such as firefox don't wrap the content in a html tag - var content = matched === null ? data : matched[0]; - return callback(content); - } - - if (dom.get('_mcePaste')) - return; - - // Create container to paste into - n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF<br _mce_bogus="1">'); - - // If contentEditable mode we need to find out the position of the closest element - if (body != ed.getDoc().body) - posY = dom.getPos(ed.selection.getStart(), body).y; - else - posY = body.scrollTop; - - // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles - dom.setStyles(n, { - position : 'absolute', - left : -10000, - top : posY, - width : 1, - height : 1, - overflow : 'hidden' - }); - - if (tinymce.isIE) { - // Select the container - rng = dom.doc.body.createTextRange(); - rng.moveToElementText(n); - rng.execCommand('Paste'); - - // Remove container - dom.remove(n); - - // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due - // to IE security settings so we pass the junk though better than nothing right - if (n.innerHTML === '\uFEFF') { - ed.execCommand('mcePasteWord'); - e.preventDefault(); - return; - } - - // Process contents - callback(n.innerHTML); - - // Block the real paste event - return tinymce.dom.Event.cancel(e); - } else { - var block = function(e) { - e.preventDefault(); - }; - - // Block mousedown and click to prevent selection change - dom.bind(ed.getDoc(), 'mousedown', block); - dom.bind(ed.getDoc(), 'keydown', block); - - // If pasting inside the same element and the contents is only one block - // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element - if (tinymce.isGecko) { - rng = ed.selection.getRng(true); - if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) { - nodes = dom.select('p,h1,h2,h3,h4,h5,h6,pre', n); - - if (nodes.length == 1) - dom.remove(nodes.reverse(), true); - } - } - - or = ed.selection.getRng(); - - // Move caret into hidden div - n = n.firstChild; - rng = ed.getDoc().createRange(); - rng.setStart(n, 0); - rng.setEnd(n, 1); - sel.setRng(rng); - - // Wait a while and grab the pasted contents - window.setTimeout(function() { - var h = '', nl = dom.select('div.mcePaste'); - - // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string - Util.each(nl, function(n) { - var child = n.firstChild; - - // WebKit inserts a DIV container with lots of odd styles - if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { - dom.remove(child, 1); - } - - // WebKit duplicates the divs so we need to remove them - Util.each(dom.select('div.mcePaste', n), function(n) { - dom.remove(n, 1); - }); - - // Remove apply style spans - Util.each(dom.select('span.Apple-style-span', n), function(n) { - dom.remove(n, 1); - }); - - // Remove bogus br elements - Util.each(dom.select('br[_mce_bogus]', n), function(n) { - dom.remove(n); - }); - - h += n.innerHTML; - }); - - // Remove the nodes - Util.each(nl, function(n) { - dom.remove(n); - }); - - // Restore the old selection - if (or) - sel.setRng(or); - - callback(h); - - // Unblock events ones we got the contents - dom.unbind(ed.getDoc(), 'mousedown', block); - dom.unbind(ed.getDoc(), 'keydown', block); - }, 0); - } - }; - - /** Creates the function to attach to the onpaste event so that the pasted content can be intercepted. - * - * The returned function should capture the pasted content and pass it as the argument to the provided callback function. - * - * @param ed the editor this function is for. - * @param callback the function to call with the clipboard content as the argument - */ - var getOnPasteFunction = function(ed, callback) { - return function(e) { - grabContent(ed, callback, e); - }; - }; - - /** Creates the function to attach to the onKeyDown event so that the pasted content can be intercepted. If no onKeyDown function is required in the current browser - * this should return null. - * - * The returned function should capture the pasted content and pass it as the argument to the provided callback function. - * - * @param ed the editor this function is for. - * @param callback the function to call with the clipboard content as the argument - */ - var getOnKeyDownFunction = function(ed, callback) { - return function(e) { - // Is it's Opera or older FF use key handler - if (tinymce.isOpera || navigator.userAgent.indexOf('Firefox/2') > 0) { - if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) - grabContent(ed, callback, e); - } - }; - }; - - return { - getOnPasteFunction: getOnPasteFunction, - getOnKeyDownFunction: getOnKeyDownFunction - }; - }); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.Insert', - - [ - - ], - - function () { - var insert = function(fragment, editor) { - var document = editor.getDoc(), marker, markerId = "ephoxInsertMarker", selection = editor.selection, dom = editor.dom; - selection.setContent('<span id="' + markerId + '"> </span>'); - marker = dom.get(markerId); - var leadingText = document.createDocumentFragment(); - while (fragment.firstChild && !dom.isBlock(fragment.firstChild)) { - leadingText.appendChild(fragment.firstChild); - } - var trailingText = document.createDocumentFragment(); - while (fragment.lastChild && !dom.isBlock(fragment.lastChild)) { - trailingText.appendChild(fragment.lastChild); - } - - marker.parentNode.insertBefore(leadingText, marker); - dom.insertAfter(trailingText, marker); - - if (fragment.firstChild) { - if (dom.isBlock(fragment.firstChild)) { - while (!dom.isBlock(marker.parentNode) && marker.parentNode !== dom.getRoot()) { - marker = dom.split(marker.parentNode, marker); - } - if (!dom.is(marker.parentNode, 'td,th') && marker.parentNode !== dom.getRoot()) { - marker = dom.split(marker.parentNode, marker); - } - } - - dom.replace(fragment, marker); - } else { - dom.remove(marker); - } - }; - - return { - insert: insert - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.tinymce.Settings', - - [ - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Util) { - var settings_clean = { - strip_class_attributes: 'all', - retain_style_properties: 'none' - }; - - var settings_inline = { - strip_class_attributes: 'none', - retain_style_properties: 'valid' - }; - - var getImportSettings = function(pasteType, defaultSettings) { - if (pasteType && typeof(pasteType) != 'string') { - return pasteType; - } - - switch (pasteType) { - case 'clean': return settings_clean; - case 'merge': return settings_inline; - default: return defaultSettings; - } - }; - - var getSettingsFor = function(pasteWordAs, pasteHtmlAs, base64Images) { - var s = getImportSettings(pasteWordAs, pasteHtmlAs); - s = Util.extend(s, {base_64_images: base64Images}); - return s; - }; - - var create = function(pasteWordAs, pasteHtmlAs, base64Images) { - var wordSettings = getSettingsFor(pasteWordAs, settings_clean, base64Images); - var htmlSettings = getSettingsFor(pasteHtmlAs, settings_inline, base64Images); - - var activeSettings = htmlSettings; - - var setWordContent = function(wordContent) { - activeSettings = wordContent ? wordSettings : htmlSettings; - }; - - var get = function(name) { - return activeSettings[name]; - }; - return { - setWordContent: setWordContent, - get: get - }; - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Attributes', - - [ - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Util) { - var isAttrSpecified = function(attr) { - return attr.specified !== false || (attr.nodeName === 'name' && attr.value !== ''); - }; - - var combineFilters = function(filter1, filter2) { - if (!filter1 || !filter2) { - return filter1 || filter2; - } - return function(name, value) { - return filter2(name, filter1(name, value)); - }; - }; - - var manager = function(node) { - var attributeCount = 0; - var attributes; - var getCachedAttributes = function() { - return attributes; - }; - - var getAttributeMutableFunction; - var getAttributes = function() { - return getAttributeMutableFunction(); - }; - - getAttributeMutableFunction = function() { - attributes = {}; - attributeCount = 0; - // Load from native. - Util.each(node.attributes, function(attr) { - var name = attr.nodeName, value = attr.value; - if (isAttrSpecified(attr)) { - if (value !== null && value !== undefined) { - attributes[name] = value; - attributeCount++; - } - } - }); - if (attributes.style === undefined && node.style.cssText) { - attributes.style = node.style.cssText; - attributeCount++; - } - getAttributeMutableFunction = getCachedAttributes; - return attributes; - }; - - var getAttributeCount = function() { - getAttributeMutableFunction(); - return attributeCount; - }; - - var unappliedFilter; - var unfilteredGetAttributes; - - var filter = function(f) { - if (!unappliedFilter) { - unfilteredGetAttributes = getAttributeMutableFunction; - } - - unappliedFilter = combineFilters(unappliedFilter, f); - // Defer applying the filter until we absolutely have to. - getAttributeMutableFunction = function() { - getAttributeMutableFunction = unfilteredGetAttributes; - eachAttribute(function(name, value) { - var newValue = unappliedFilter(name, value); - if (newValue === null) { - node.removeAttribute(name); - delete attributes[name]; - attributeCount--; - } else if (newValue !== value) { - if (name === 'class') { - node.className = newValue; - } else { - node.setAttribute(name, newValue); - } - attributes[name] = newValue; - } - }); - getAttributeMutableFunction = getCachedAttributes; - return attributes; - }; - }; - - var get = function(name) { - return getAttributeMutableFunction()[name]; - }; - - var eachAttribute = function(callback) { - Util.each(getAttributeMutableFunction(), function(value, name) { - callback(name, value); - }); - }; - - return { - get: get, - each: eachAttribute, - filter: filter, - getAttributes: getAttributes, - getAttributeCount: getAttributeCount - }; - }; - return { - manager: manager - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Token', - - [ - 'ephox.powerpaste.legacy.data.tokens.Attributes', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Attributes, Util, TokenTypes) { - var START_ELEMENT_TYPE = 'startElement'; - var END_ELEMENT_TYPE = 'endElement'; - var TEXT_TYPE = 'text'; - var COMMENT_TYPE = 'comment'; - - var attributeManager = Attributes.manager; - - /** - * Converts a style name from the CSS version (e.g. text-align) to the - * DOM property equivalent (textAlign). - * - * @param name the style name to convert. - * @returns the style name in DOM form. - */ - var convertStyleName = function(name) { - return name.replace(/-(.)/g, function(regex, capture) { - return capture.toUpperCase(); - }); - }; - - /** - * Converts a style name from the DOM version (e.g. textAlign) to the - * CSS equivalent (text-align). This is the reverse of convertStyleName. - * - * @param name the style name to convert. - * @returns the style name in CSS form. - */ - var convertStyleNameBack = function(name) { - return name.replace(/([A-Z])/g, function(regex, capture) { - return '-' + capture.toLowerCase(); - }); - }; - - // This is shared across all instances because if we ever see an mso- style in the normal iteration - // we can be certain they are included and don't need the extra check. - var seenMsoStyle = false; - var eachNativeStyle = function(node, syntheticStyles, callback) { - var i, len = node.style.length, name, value, styles; - styles = syntheticStyles || node.getAttribute("style"); - if (styles === undefined || styles === null || !styles.split) { - styles = node.style.cssText; - } - Util.each(styles.split(';'), function(declaration) { - var idx = declaration.indexOf(':'); - if (idx > 0) { - name = Util.trim(declaration.substring(0, idx)); - if (name.toUpperCase() === name) { - name = name.toLowerCase(); - } - name = convertStyleNameBack(name); - value = Util.trim(declaration.substring(idx + 1)); - if (!seenMsoStyle) seenMsoStyle = name.indexOf('mso-') === 0; - callback(name, value); - } - }); - if (!seenMsoStyle) { - // IE9 preserves unknown styles but provides no way to iterate them. - // To deal with that, we look for the specific custom styles we care about. - value = node.style['mso-list']; - if (value) { - callback('mso-list', value); - } - } - }; - - var token = function(node, endNode, syntheticStyles) { - var tokenType; - var tagName; - var tokenText; - var attributeStore; - var tokenStyles; - switch (node.nodeType) { - case 1: - if (endNode) { - tokenType = END_ELEMENT_TYPE; - } else { - tokenType = START_ELEMENT_TYPE; - attributeStore = attributeManager(node); - - tokenStyles = {}; - eachNativeStyle(node, syntheticStyles, function(name, value) { - tokenStyles[name] = value; - }); - } - if (node.scopeName !== "HTML" && node.scopeName && node.tagName && node.tagName.indexOf(':') <= 0) { - tagName = (node.scopeName + ":" + node.tagName).toUpperCase(); - } else { - tagName = node.tagName; - } - - break; - case 3: - tokenType = TEXT_TYPE; - tokenText = node.nodeValue; - break; - case 8: - tokenType = COMMENT_TYPE; - tokenText = node.nodeValue; - break; - default: - Util.log("WARNING: Unsupported node type encountered: " + node.nodeType); - break; - } - - var getNode = function() { - // Make sure all filters are applied. - if (attributeStore) attributeStore.getAttributes(); - return node; - }; - - var tag = function() { - return tagName; - }; - - var type = function() { - return tokenType; - }; - - var text = function() { - return tokenText; - }; - - var toString = function() { - return "Type: " + tokenType + ", Tag: " + tagName + " Text: " + tokenText; - }; - - var getAttribute = function(name) { - return attributeStore.get(name.toLowerCase()); - }; - - var filterAttributes = function(filter) { - if (tokenType === START_ELEMENT_TYPE) { - attributeStore.filter(filter); - } - }; - - var filterStyles = function(filter) { - if (type() === START_ELEMENT_TYPE) { - var css = ""; - Util.each(tokenStyles, function(value, name) { - var newValue = filter(name, value); - if (newValue === null) { - if (node.style.removeProperty) { - node.style.removeProperty(convertStyleName(name)); - } else { - node.style.removeAttribute(convertStyleName(name)); - } - delete tokenStyles[name]; - } else { - css += name + ': ' + newValue + '; '; - tokenStyles[name] = newValue; - } - }); - css = css ? css : null; - filterAttributes(function(name, value) { - if (name === 'style') { - return css; - } - return value; - }); - node.style.cssText = css; - } - }; - - var getAttributeCount = function() { - return attributeStore.getAttributeCount(); - }; - - var attributes = function(callback) { - attributeStore.each(callback); - }; - - var getStyle = function(name) { - return tokenStyles[name]; - }; - - var styles = function(callback) { - Util.each(tokenStyles, function(value, name) { - callback(name, value); - }); - }; - - var getComputedStyle = function() { - return Util.ephoxGetComputedStyle(node); - }; - - var isWhitespace = function() { - return tokenType === TEXT_TYPE && /^[\s\u00A0]*$/.test(tokenText); - }; - - return { - getNode: getNode, - tag: tag, - type: type, - text: text, - toString: toString, - getAttribute: getAttribute, - filterAttributes: filterAttributes, - filterStyles: filterStyles, - getAttributeCount: getAttributeCount, - attributes: attributes, - getStyle: getStyle, - styles: styles, - getComputedStyle: getComputedStyle, - isWhitespace: isWhitespace - }; - }; - - var createStartElement = function(tag, attributes, styles, document) { - var node = document.createElement(tag), css = ""; - Util.each(attributes, function(value, name) { - node.setAttribute(name, value); - }); - Util.each(styles, function(value, name) { - css += name + ":" + value + ";"; - node.style[convertStyleName(name)] = value; - }); - return token(node, false, css !== "" ? css : null); - }; - - var createEndElement = function(tag, document) { - return token(document.createElement(tag), true); - }; - - var createComment = function(text, document) { - return token(document.createComment(text), false); - }; - - var createText = function(text, document) { - return token(document.createTextNode(text)); - }; - - var FINISHED = createEndElement('HTML', window.document); - - return { - START_ELEMENT_TYPE: START_ELEMENT_TYPE, - END_ELEMENT_TYPE: END_ELEMENT_TYPE, - TEXT_TYPE: TEXT_TYPE, - COMMENT_TYPE: COMMENT_TYPE, - FINISHED: FINISHED, - token: token, - createStartElement: createStartElement, - createEndElement: createEndElement, - createComment: createComment, - createText: createText - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Serializer', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Token) { - var create = function(document) { - var currentNode = document.createDocumentFragment(); - var initialNode = currentNode; - - var push = function(node) { - append(node); - currentNode = node; - }; - - var pop = function() { - currentNode = currentNode.parentNode; - }; - - var append = function(node) { - currentNode.appendChild(node); - }; - - var receive = function(token) { - - var startElement = function(token) { - var node = token.getNode().cloneNode(false); - push(node); - }; - - var text = function(token, serializer) { - // IE7 will crash if you clone a text node that's a URL. - // IE8 throws an invalid argument error. - // So while cloning may be faster, we have to create a new node here. - var node = document.createTextNode(token.text()); - append(node); - }; - - switch (token.type()) { - case Token.START_ELEMENT_TYPE: - startElement(token); - break; - case Token.TEXT_TYPE: - text(token); - break; - case Token.END_ELEMENT_TYPE: - pop(); - break; - case Token.COMMENT_TYPE: - // Ignore. - break; - default: - throw { message: 'Unsupported token type: ' + token.type() }; - } - }; - - return { - dom: initialNode, - receive: receive - }; - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Tokenizer', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Token) { - var tokenize = function(html, document) { - var container; - document = document || window.document; - container = document.createElement('div'); - document.body.appendChild(container); - container.style.position = 'absolute'; - container.style.left = '-10000px'; - container.innerHTML = html; - - nextNode = container.firstChild || Token.FINISHED; - - var nodeStack = []; - endNode = false; - - var getTokenForNode = function(node, endTag) { - if (node === Token.FINISHED) { - return node; - } else if (node) { - return Token.token(node, endTag); - } else { - return undefined; - } - }; - - var next = function() { - var currentNode = nextNode; - var currentEndNode = endNode; - if (!endNode && nextNode.firstChild) { - nodeStack.push(nextNode); - nextNode = nextNode.firstChild; - } else if (!endNode && nextNode.nodeType === 1) { - // Empty element. - endNode = true; - } else if (nextNode.nextSibling) { - nextNode = nextNode.nextSibling; - endNode = false; - } else { - nextNode = nodeStack.pop(); - endNode = true; - } - - if (currentNode !== Token.FINISHED && !nextNode) { - document.body.removeChild(container); - nextNode = Token.FINISHED; - } - - return getTokenForNode(currentNode, currentEndNode); - }; - - var hasNext = function() { - return nextNode !== undefined; - }; - - return { - hasNext: hasNext, - next: next - }; - }; - - return { - tokenize: tokenize - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Filter', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Token, Util) { - - var createFilter = function(actualReceiver, clientReset) { - var filter = function(nextFilter, settings, document) { - var deferred; - var receivedTokens, emittedTokens, inTransaction = false; - - var resetState = function() { - if (clientReset) clientReset(api); - inTransaction = false; - receivedTokens = []; - emittedTokens = []; - }; - - var emitTokens = function(tokens) { - Util.each(tokens, function(tok) { - nextFilter.receive(tok); - }); - }; - - var emit = function(token) { - if (inTransaction) { - emittedTokens.push(token); - } else { - nextFilter.receive(token); - } - }; - - var receive = function(token) { - if (clientReset) receivedTokens.push(token); - actualReceiver(api, token); - if (token === Token.FINISHED) { - commit(); - } - }; - - var startTransaction = function() { - inTransaction = true; - }; - - var rollback = function() { - emitTokens(receivedTokens); - resetState(); - }; - - var commit = function() { - emitDeferred(); - emitTokens(emittedTokens); - resetState(); - }; - - var defer = function(token) { - deferred = deferred || []; - deferred.push(token); - }; - - var hasDeferred = function() { - return deferred && deferred.length > 0; - }; - - var emitDeferred = function() { - Util.each(deferred, function(token) { - emit(token); - }); - dropDeferred(); - }; - - var dropDeferred = function() { - deferred = []; - }; - - var api = { - document: document || window.document, - settings: settings || {}, - emit: emit, - receive: receive, - startTransaction: startTransaction, - rollback: rollback, - commit: commit, - defer: defer, - hasDeferred: hasDeferred, - emitDeferred: emitDeferred, - dropDeferred: dropDeferred - }; - - resetState(); - return api; - }; - return filter; - }; - - var createAttributeFilter = function(filter) { - return createFilter(function(api, token) { - token.filterAttributes(Util.bind(filter, api)); - api.emit(token); - }); - }; - - return { - createFilter: createFilter, - createAttributeFilter: createAttributeFilter - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.Text', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Token) { - var lineBreakElements = /^(P|H[1-6]|T[DH]|LI|DIV|BLOCKQUOTE|PRE|ADDRESS|FIELDSET|DD|DT|CENTER)$/; - var causesLinebreak = function(token) { - return lineBreakElements.test(token.tag()); - }; - var removeFilter = function() { - return null; - }; - - var inP = false; - - return Filter.createFilter(function(api, token) { - var ensureInP = function() { - if (!inP) { - api.emit(Token.createStartElement('P', {}, {}, api.document)); - inP = true; - } - }; - switch (token.type()) { - case Token.TEXT_TYPE: - ensureInP(); - api.emit(token); - break; - case Token.END_ELEMENT_TYPE: - if (inP && (causesLinebreak(token) || token === Token.FINISHED)) { - api.emit(Token.createEndElement('P', api.document)); - inP = false; - } else if (token.tag() === 'BR') { - api.emit(token); - } - break; - case Token.START_ELEMENT_TYPE: - if (token.tag() === 'BR') { - token.filterAttributes(removeFilter); - token.filterStyles(removeFilter); - api.emit(token); - } else if (token.tag() === 'IMG' && token.getAttribute('alt')) { - ensureInP(); - api.emit(Token.createText(token.getAttribute('alt'), api.document)); - } - break; - } - if (token === Token.FINISHED) { - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.data.tokens.Helper', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Token) { - var checkSupportsCustomStyles = function() { - // Firefox 4 preserves these styles in the DOM, but strips them when pasting. - // Since we can't trigger a paste there's no way to detect this situation apart from sniffing. - if (navigator.userAgent.indexOf('Gecko') > 0 && navigator.userAgent.indexOf('WebKit') < 0) return false; - var div = document.createElement('div'); - try { - div.innerHTML = '<p style="mso-list: Ignore;"> </p>'; - } catch (ex) { - // Can't set innerHTML if we're in XHTML mode so just assume we don't get custom styles. - return false; - } - return Token.token(div.firstChild).getStyle('mso-list') === 'Ignore'; - }; - - var supportsCustomStyles = checkSupportsCustomStyles(); - - var spanOrA = function(token) { - return token.tag() === 'A' || token.tag() === 'SPAN'; - }; - - var hasMsoListStyle = function(token) { - var style = token.getStyle('mso-list'); - return style && style !== 'skip'; - }; - - var hasNoAttributes = function(token, allowStyle) { - if (token.type() === Token.START_ELEMENT_TYPE) { - return token.getAttributeCount() === 0 || - (allowStyle && token.getAttributeCount() === 1 && - (token.getAttribute('style') !== null && token.getAttribute('style') !== undefined)); - } else { - return token.type() === Token.END_ELEMENT_TYPE; - } - }; - - return { - hasNoAttributes: hasNoAttributes, - supportsCustomStyles: supportsCustomStyles, - spanOrA: spanOrA, - hasMsoListStyle: hasMsoListStyle - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.list.ListTypes', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Token, Util) { - var orderedListTypes = [ - { regex: /^\(?[dc][\.\)]$/, type: { tag: 'OL', type: 'lower-alpha' } }, - { regex: /^\(?[DC][\.\)]$/, type: { tag: 'OL', type: 'upper-alpha' } }, - { regex: /^\(?M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})[\.\)]$/, type: { tag: 'OL', type: 'upper-roman' } }, - { regex: /^\(?m*(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})[\.\)]$/, type: { tag: 'OL', type: 'lower-roman' } }, - { regex: /^\(?[0-9]+[\.\)]$/, type: { tag: 'OL' } }, - { regex: /^([0-9]+\.)*[0-9]+\.?$/, type: { tag: 'OL', variant: 'outline' } }, - { regex: /^\(?[a-z]+[\.\)]$/, type: { tag: 'OL', type: 'lower-alpha' } }, - { regex: /^\(?[A-Z]+[\.\)]$/, type: { tag: 'OL', type: 'upper-alpha' } } - ]; - - var ulChars = { - '\u2022': { tag: 'UL', type: 'disc' }, - '\u00B7': { tag: 'UL', type: 'disc' }, - '\u00A7': { tag: 'UL', type: 'square' } - }; - - var ulNonSymbolChars = { - 'o': { tag: 'UL', type: 'circle' }, - '-': { tag: 'UL', type: 'disc' }, - '\u25CF': { tag: 'UL', type: 'disc' } - }; - - var createVariant = function(type, variant) { - var newType = { tag: type.tag, type: type.type, variant: variant }; - if (type.start){ - newType.start = type.start; - } - if (!type.type) delete newType.type; - return newType; - }; - - var guessListType = function(bulletInfo, preferredType, originalToken) { - var listType = null, text, symbolFont, variant; - if (bulletInfo) { - text = bulletInfo.text; - symbolFont = bulletInfo.symbolFont; - } - text = Util.trim(text); - - listType = ulNonSymbolChars[text]; - if (!listType) { - if (symbolFont) { - listType = ulChars[text]; - if (!listType) { - listType = { tag: 'UL', variant: text }; - } else { - listType = createVariant(listType, text); - } - } else { - - Util.each(orderedListTypes, function(def) { - if (def.regex.test(text)) { - if (preferredType && eqListType(def.type, preferredType, true)) { - listType = def.type; - listType.start=parseInt(text); - return false; - } - if (!listType) listType = def.type; - listType.start=parseInt(text); - } - }); - if (listType && !listType.variant) { - if (text.charAt(0) === '(') variant = '()'; - else if (text.charAt(text.length - 1) === ')') variant = ')'; - else variant = '.'; - listType = createVariant(listType, variant); - } - } - } else { - listType = createVariant(listType, text); - } - - if (listType && listType.tag === 'OL' && - originalToken && (originalToken.tag() !== 'P' || /^MsoHeading/.test(originalToken.getAttribute('class')))) { - // Don't convert numbered headings but do convert bulleted headings. - listType = null; - } - - return listType; - }; - - var eqListType = function(t1, t2, ignoreVariant) { - return t1 === t2 || - (t1 && t2 && t1.tag === t2.tag && t1.type === t2.type && - (ignoreVariant || t1.variant === t2.variant)); - }; - - var checkFont = function(token, symbolFont) { - if (token.type() == Token.START_ELEMENT_TYPE) { - font = token.getStyle('font-family'); - if (font) { - symbolFont = (font === 'Wingdings' || font === 'Symbol'); - } else if (/^(P|H[1-6]|DIV)$/.test(token.tag())) { - symbolFont = false; - } - } - return symbolFont; - }; - - return { - guessListType: guessListType, - eqListType: eqListType, - checkFont: checkFont - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.list.CommentHeuristics', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.filters.list.ListTypes', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Token, ListTypes, Util) { - var isListWithoutCommentsOrStyles = function(token, state) { - var indent, cls, node, symbolFont = false, value, listType; - var checkFont = function(n) { - var font = n.style.fontFamily; - if (font) { - symbolFont = (font === 'Wingdings' || font === 'Symbol'); - } - }; - if (token.type() === Token.START_ELEMENT_TYPE && state.openedTag && token.tag() === 'SPAN') { - node = state.openedTag.getNode(); - checkFont(node); - if (node.childNodes.length > 1 && node.firstChild.tagName === 'A' && node.firstChild.textContent === '') { - node = node.childNodes[1]; - } - while (node.firstChild && (node.firstChild.tagName === 'SPAN' || node.firstChild.tagName === 'A')) { - node = node.firstChild; - checkFont(node); - } - node = node.firstChild; - if (node && node.nodeType === 3) { - value = node.value; - if (!Util.trim(value)) { - // This handles the case where there's a SPAN with nbsps before the bullet such as with roman numerals. - node = node.parentNode.nextSibling; - value = node ? node.value : ''; - } - // Real lists have the bullet with NBSPs either side surrounded in a SPAN. If there's anything else, it's not a list. - if (!node || Util.trim(node.parentNode.textContent) != value) { - return false; - } - listType = ListTypes.guessListType({ text: value, symbolFont: symbolFont }, null, state.originalToken); - if (listType) { - // Don't convert numbered headings to lists. - return node.nextSibling && node.nextSibling.tagName === 'SPAN' && /^[\u00A0\s]/.test(node.nextSibling.firstChild.value) && - (state.openedTag.tag() === 'P' || listType.tag === 'UL'); - } - } else { - return node && node.tagName === 'IMG'; - } - } - return false; - }; - - - var getLeftOffset = function(node, paragraph) { - var parent, child, offset = 0; - parent = node.parentNode; - while (parent !== null && parent !== undefined && parent !== paragraph.parentNode) { - offset += parent.offsetLeft; - parent = parent.offsetParent; - } - return offset; - }; - - /** A simplified memoize function which only supports one or two function parameters. - * - * @param fn - * @param param the funtion p - * @returns - */ - var memoize2 = function(fn) { - var cache = {}; - return function(param1, param2) { - var result, key = param1 + "," + param2; - if (cache.hasOwnProperty(key)) { - return cache[key]; - } - result = fn.call(null, param1, param2); - cache[key] = result; - return result; - }; - }; - - var findStylesInner = function(selector) { - var dotIndex = selector.indexOf('.'); - if (dotIndex >= 0 && Util.trim(selector.substring(dotIndex + 1)) === className) { - match = results[2]; - return false; - } - }; - - var findStyles = memoize2(function(css, className) { - var results, matcher = /([^{]+){([^}]+)}/g, match, el, computedStyle; - matcher.lastIndex = 0; // Firefox Mac reuses the same regex so we need to reset it. - while ((results = matcher.exec(css)) !== null && !match) { - Util.each(results[1].split(','), findStylesInner(selector) - ); - } - if (match) { - el = document.createElement('p'); - el.setAttribute("style", match); - computedStyle = Util.ephoxGetComputedStyle(el); - return computedStyle ? "" + computedStyle.marginLeft : false; - } - return false; - }); - - var indentGuesser = function() { - var listIndentAdjust; - var listIndentAmount; - var guessIndentLevel = function(currentToken, token, styles, bulletInfo) { - var indentAmount, itemIndent, el, level = 1; - - if (bulletInfo && /^([0-9]+\.)+[0-9]+\.?$/.test(bulletInfo.text)) { - // Outline list type so we can just count the number of sections. - return bulletInfo.text.replace(/([0-9]+|\.$)/g, '').length + 1; - } - indentAmount = listIndentAmount || parseInt(findStyles(styles, token.getAttribute('class'))); - - itemIndent = getLeftOffset(currentToken.getNode(), token.getNode()); - if (!indentAmount) { - indentAmount = 48; - } else { - // We might get a 0 item indent if the list CSS code wasn't pasted as happens on Windows. - if (listIndentAdjust) { - itemIndent += listIndentAdjust; - } else if (itemIndent === 0) { - listIndentAdjust = indentAmount; - itemIndent += indentAmount; - } - } - listIndentAmount = indentAmount = Math.min(itemIndent, indentAmount); - level = Math.max(1, Math.floor(itemIndent / indentAmount)) || 1; - return level; - }; - return { - guessIndentLevel: guessIndentLevel - }; - }; - - var styles = function() { - var inStyle = false; - var styles = ""; - var check = function(token) { - if (inStyle && token.type() === Token.TEXT_TYPE) { - styles += token.text(); - return true; - } else if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'STYLE') { - inStyle = true; - return true; - } else if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === 'STYLE') { - inStyle = false; - return true; - } - return false; - }; - return { - check: check - }; - }; - - return { - isListWithoutCommentsOrStyles: isListWithoutCommentsOrStyles, - indentGuesser: indentGuesser, - styles: styles - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.list.Emitter', - - [ - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.filters.list.ListTypes' - ], - - function (Token, ListTypes) { - var impliedULatLevel = [ 'disc', 'circle', 'square' ]; - - var removeImpliedListType = function(type, level) { - if (type.tag === 'UL') { - if (impliedULatLevel[level - 1] === type.type) { - type = { tag: 'UL' }; - } - } - return type; - }; - - return function(api, document) { - var listTypes = []; - var itemTags = []; - var currentLevel = 0; - var currentListType; - - var openList = function(type, useType) { - var style = {}, attributes={}; - currentLevel++; - if (useType) { - if (type.type) { - style = { 'list-style-type': type.type }; - } - } - if (type.start && type.start>1) { - attributes={start:type.start}; - } - listTypes.push(type); - api.emit(Token.createStartElement(type.tag, attributes, style, document)); - currentListType = type; - }; - - var closeList = function() { - api.emit(Token.createEndElement(listTypes.pop().tag, document)); - currentLevel--; - currentListType = listTypes[listTypes.length - 1]; - }; - - var closeAllLists = function() { - while (currentLevel > 0) { - closeItem(); - closeList(); - } - api.commit(); - }; - - var closeItem = function() { - var tag = itemTags ? itemTags.pop() : 'P'; - if (tag != 'P') { - api.emit(Token.createEndElement(tag, document)); - } - api.emit(Token.createEndElement('LI', document)); - }; - - var openLI = function(paragraphToken, type, skippedPara) { - var style = {}; - if (!paragraphToken) { - style['list-style-type'] = 'none'; - } else { - var leftMargin = paragraphToken.getStyle('margin-left'); - if (leftMargin !== undefined) { - style['margin-left'] = leftMargin; - } - } - if (currentListType && !ListTypes.eqListType(currentListType, type)) { - closeList(); - if (skippedPara) { - api.emit(Token.createStartElement('P', {}, {}, document)); - api.emit(Token.createText('\u00A0', document)); - api.emit(Token.createEndElement('P', document)); - } - openList(type, true); - } - api.emit(Token.createStartElement('LI', {}, style, document)); - if (paragraphToken && paragraphToken.tag() != 'P') { - itemTags.push(paragraphToken.tag()); - paragraphToken.filterStyles(function() { return null; }); - api.emit(paragraphToken); - } else { - itemTags.push('P'); - } - }; - - var openItem = function(level, paragraphToken, type, skippedPara) { - var style = {}, token; - if (!type) return; - if (!currentLevel) currentLevel = 0; - while (currentLevel > level) { - closeItem(); - closeList(); - } - type = removeImpliedListType(type, level); - if (currentLevel == level) { - closeItem(); - openLI(paragraphToken, type, skippedPara); - } else { - // If there's a heading item we opened in the list we need to close it before creating the indented list - if (level > 1 && itemTags.length > 0 && itemTags[itemTags.length - 1] !== 'P') { - api.emit(Token.createEndElement(itemTags[itemTags.length - 1], document)); - itemTags[itemTags.length - 1] = 'P'; - } - while (currentLevel < level) { - openList(type, currentLevel == level - 1); - openLI(currentLevel == level ? paragraphToken : undefined, type); - } - } - }; - var getCurrentLevel = function() { - return currentLevel; - }; - var getCurrentListType = function() { - return currentListType; - }; - return { - openList: openList, - closelist: closeList, - closeAllLists: closeAllLists, - closeItem: closeItem, - openLI: openLI, - openItem: openItem, - getCurrentListType: getCurrentListType, - getCurrentLevel: getCurrentLevel - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.list.ListStates', - - [ - 'ephox.powerpaste.legacy.data.tokens.Helper', - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.filters.list.CommentHeuristics', - 'ephox.powerpaste.legacy.filters.list.ListTypes', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Helper, Token, CommentHeuristics, ListTypes, Util) { - var unexpectedToken = function(api, token) { - Util.log("Unexpected token in list conversion: " + token.toString()); - api.rollback(); - }; - - var preferredListType = function(currentType, currentLevel, newLevel) { - if (currentLevel == newLevel) { - return currentType; - } - return null; - }; - - var afterListState = function(api, state, token) { - if (token.type() === Token.TEXT_TYPE && Util.trim(token.text()) === '') { - // Drop whitespace that's potentially between list items. - api.defer(token); - } else if (!state.skippedPara && token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'P' && !Helper.hasMsoListStyle(token)) { - state.openedTag = token; - api.defer(token); - state.nextFilter = skipEmptyParaState; - } else { - noListState(api, state, token); - } - }; - - var skipEmptyParaState = function(api, state, token) { - if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'SPAN' && state.spanCount.length === 0 && - (Helper.supportsCustomStyles || !CommentHeuristics.isListWithoutCommentsOrStyles(token, state)) && !Helper.hasMsoListStyle(token)) { - api.defer(token); - state.spanCount.push(token); - } else if (token.type() === Token.END_ELEMENT_TYPE) { - if (token.tag() === 'SPAN') { - api.defer(token); - state.spanCount.pop(); - } else if (token.tag() === 'P') { - api.defer(token); - state.skippedPara = true; - state.openedTag = null; - state.nextFilter = afterListState; - } else { - // Not an empty paragraph. - state.nextFilter = noListState; - state.nextFilter(api, state, token); - } - } else if (token.isWhitespace()) { - api.defer(token); - } else { - state.nextFilter = noListState; - state.nextFilter(api, state, token); - } - }; - - var msoListSkipState = function(api, state, token) { - if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === state.originalToken.tag()) { - state.nextFilter = afterListState; - } else if (token === Token.FINISHED) { - state.emitter.closeAllLists(); - api.emit(token); - } - // Else drop. - }; - - var noListState = function(api, state, token) { - var closeOutLists = function() { - state.emitter.closeAllLists(); - api.emitDeferred(); - state.openedTag = null; - api.emit(token); - state.nextFilter = noListState; - }; - if (token.type() === Token.START_ELEMENT_TYPE && Helper.hasMsoListStyle(token) && token.tag() !== 'LI') { - var msoList = token.getStyle('mso-list'); - if (false && msoList === 'skip') { - state.nextFilter = msoListSkipState; - state.originalToken = token; - } else { - var lvl = / level([0-9]+)/.exec(token.getStyle('mso-list')); - - if (lvl && lvl[1]) { - state.itemLevel = parseInt(lvl[1], 10) + state.styleLevelAdjust; - // Tokens between lists should be dropped (they're just whitespace anyway) - // however, tokens before a list should be emitted if we find an mso-list style - // since this is the very first token of the list. - if (state.nextFilter === noListState) { - api.emitDeferred(); - } else { - api.dropDeferred(); - } - state.nextFilter = listStartState; - api.startTransaction(); - state.originalToken = token; - state.commentMode = false; - } else { - closeOutLists(); - } - } - } else if (!Helper.supportsCustomStyles && - ((token.type() === Token.COMMENT_TYPE && token.text() === '[if !supportLists]') || - (CommentHeuristics.isListWithoutCommentsOrStyles(token, api)))) { - if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'SPAN') { - state.spanCount.push(token); - } - state.nextFilter = listStartState; - api.startTransaction(); - state.originalToken = state.openedTag; - state.commentMode = true; - state.openedTag = null; - api.dropDeferred(); - } else if (token.type() === Token.END_ELEMENT_TYPE && Helper.spanOrA(token)) { - api.defer(token); - state.spanCount.pop(); - } else if (token.type() === Token.START_ELEMENT_TYPE) { - // Might be the start of an item, store it and see if we get a comment next. - if (Helper.spanOrA(token)) { - api.defer(token); - state.spanCount.push(token); - } else { - if (state.openedTag) { - state.emitter.closeAllLists(); - api.emitDeferred(); - } - state.openedTag = token; - api.defer(token); - } - } else { - closeOutLists(); - } - }; - - var afterNoBulletListState = function(api, state, token) { - if (token.type() === Token.END_ELEMENT_TYPE && state.originalToken.tag() === token.tag()) { - state.nextFilter = afterListState; - state.styleLevelAdjust = -1; - } - api.emit(token); - }; - - var listStartState = function(api, state, token) { - if (token.type() == Token.START_ELEMENT_TYPE && token.getStyle('mso-list') === 'Ignore') { - state.nextFilter = findListTypeState; - } if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'SPAN') { - state.spanCount.push(token); - if (state.commentMode && token.getAttribute("style") === "" || token.getAttribute("style") === null) { - state.nextFilter = findListTypeState; - } - // Otherwise drop. - } else if (token.tag() === 'A') { - if (token.type() === Token.START_ELEMENT_TYPE) { - state.spanCount.push(token); - } else { - state.spanCount.pop(); - } - } else if (token.type() === Token.TEXT_TYPE) { - if (state.commentMode) { - state.nextFilter = findListTypeState; - state.nextFilter(api, state, token); - } else { - // List type without a bullet, we should treat it as a paragraph. - var start = state.originalToken; - var spans = state.spanCount; - state.emitter.closeAllLists(); - api.emit(start); - Util.each(spans, Util.bind(api.emit, api)); - api.emit(token); - api.commit(); - state.originalToken = start; - state.nextFilter = afterNoBulletListState; - } - } else if (!state.commentMode && token.type() === Token.COMMENT_TYPE) { - // Drop. We seem to be getting custom styles and comments. - } else { - unexpectedToken(api, token); - } - }; - - var findListTypeState = function(api, state, token) { - if (token.type() === Token.TEXT_TYPE) { - if (token.isWhitespace()) { - // Ignore whitespace node, it's padding before the actual list type. - } else { - state.nextFilter = beforeSpacerState; - state.bulletInfo = { text: token.text(), symbolFont: state.symbolFont }; - } - } else if (Helper.spanOrA(token)) { - // Drop open and close span tags. - if (token.type() === Token.START_ELEMENT_TYPE) { - state.spanCount.push(token); - } else { - state.spanCount.pop(); - } - } else if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'IMG') { - // Custom list image type. We can't access the image so use a normal bullet instead. - // EditLive! may want this to come through as a CSS reference. - state.nextFilter = beforeSpacerState; - state.bulletInfo = { text: '\u2202', symbolFont: true }; - } else { - unexpectedToken(api, token); - } - }; - - var beforeSpacerState = function(api, state, token) { - if (token.type() === Token.START_ELEMENT_TYPE && Helper.spanOrA(token)) { - state.spanCount.push(token); - state.nextFilter = spacerState; - } else if (token.type() === Token.END_ELEMENT_TYPE && Helper.spanOrA(token)) { - state.spanCount.pop(); - state.nextFilter = closeSpansState; - } else if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === 'IMG') { - // Drop - } else { - unexpectedToken(api, token); - } - }; - - var spacerState = function(api, state, token) { - if (token.type() === Token.END_ELEMENT_TYPE) { - if (Helper.spanOrA(token)) { - state.spanCount.pop(); - } - state.nextFilter = closeSpansState; - } - // Drop all other tokens. - }; - - var closeSpansState = function(api, state, token) { - var moveToItemContentState = function(includeToken) { - state.nextFilter = itemContentState; - if (state.commentMode) state.itemLevel = state.indentGuesser.guessIndentLevel(token, state.originalToken, state.styles.styles, state.bulletInfo); - state.listType = ListTypes.guessListType(state.bulletInfo, preferredListType(state.emitter.getCurrentListType(), state.emitter.getCurrentLevel(), state.itemLevel), state.originalToken); - if (state.listType) { - state.emitter.openItem(state.itemLevel, state.originalToken, state.listType, state.skippedPara); - api.emitDeferred(); - while (state.spanCount.length > 0) { - api.emit(state.spanCount.shift()); - } - if (includeToken) { - api.emit(token); - } - } else { - Util.log("Unknown list type: " + state.bulletInfo.text + " Symbol font? " + state.bulletInfo.symbolFont); - api.rollback(); - } - }; - - if (token.type() === Token.TEXT_TYPE || token.type() === Token.START_ELEMENT_TYPE) { - moveToItemContentState(true); - } else if (token.type() === Token.COMMENT_TYPE) { - moveToItemContentState(token.text() !== '[endif]'); - } else if (token.type() === Token.END_ELEMENT_TYPE) { - if (Helper.spanOrA(token)) { - state.spanCount.pop(); - } - } else { - unexpectedToken(api, token); - } - }; - - var itemContentState = function(api, state, token) { - if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === state.originalToken.tag()) { - state.nextFilter = afterListState; - state.skippedPara = false; - } else { - api.emit(token); - } - }; - - var initial = noListState; - return { - initial: initial - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.list.Lists', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Helper', - 'ephox.powerpaste.legacy.data.tokens.Token', - 'ephox.powerpaste.legacy.filters.list.CommentHeuristics', - 'ephox.powerpaste.legacy.filters.list.Emitter', - 'ephox.powerpaste.legacy.filters.list.ListStates', - 'ephox.powerpaste.legacy.filters.list.ListTypes', - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Filter, Helper, Token, CommentHeuristics, Emitter, ListStates, ListTypes, Util) { - - var activeState = {}; - - var resetActiveState = function(api) { - //It would be nice if this was creating a fresh object, but listStartState() expects state mutation when api.commit() is called - activeState.nextFilter = ListStates.initial; - activeState.itemLevel = 0; - activeState.originalToken = null; - activeState.commentMode = false; - activeState.openedTag = null; - activeState.symbolFont = false; - activeState.listType = null; - activeState.indentGuesser = CommentHeuristics.indentGuesser(); - activeState.emitter = Emitter(api, api.document); - activeState.styles = CommentHeuristics.styles(); - activeState.spanCount = []; - activeState.skippedPara = false; - activeState.styleLevelAdjust = 0; - activeState.bulletInfo = undefined; - }; - - resetActiveState({}); - - var resetState = function(api) { - resetActiveState(api); - }; - - var receive = function(api, token) { - if (activeState.styles.check(token)) { - return; - } - activeState.symbolFont = ListTypes.checkFont(token, activeState.symbolFont); - activeState.nextFilter(api, activeState, token); - }; - - return Filter.createFilter(receive, resetState); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -/** - * Source code in this file has been taken under a commercial license from tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js - * Copyright 2009, Moxiecode Systems AB - */ -define( - 'ephox.powerpaste.legacy.tinymce.BrowserFilters', - - [ - 'ephox.powerpaste.legacy.tinymce.Util' - ], - - function (Util) { - var trailingSpaceCharacter = function(content) { - var h = content; - // Strip a trailing non-breaking, zero-width space which Firefox tends to insert. - var hasCrazySpace = h.charCodeAt(h.length - 1) === 65279; - return hasCrazySpace ? - h.substring(0, h.length - 1) : - content; - }; - - // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser - var removeBrNextToBlock = function(content) { - return (/<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/).test(content) ? - content.replace(/(?:<br> [\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br> [\s\r\n]+|<br>)*/g, '$1') : - content; - }; - - // Replace multiple BR elements with uppercase BR to keep them intact when collapseBr runs - var capitaliseMultipleBr = function(content) { - return content.replace(/<br><br>/g, '<BR><BR>'); - }; - - // Replace single br elements with space since they are word wrapping - var removeSingleBr = function(content) { - return content.replace(/<br>/g, ' '); - }; - - // Collapse double brs into a single BR - var collapseBr = function(content) { - return content.replace(/<BR><BR>/g, '<br>'); - }; - - var baseFilters = [trailingSpaceCharacter]; - - var filters = (tinymce.isIE && document.documentMode >= 9) ? - [collapseBr, removeSingleBr, capitaliseMultipleBr, removeBrNextToBlock].concat(baseFilters) : - baseFilters; - - var allFilters = Util.compose(filters); - - return { - all: allFilters, - textOnly: trailingSpaceCharacter - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.FilterInlineStyles', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - var removeStyles = /^(mso-.*|tab-stops|tab-interval|language|text-underline|text-effect|text-line-through|font-color|horiz-align|list-image-[0-9]+|separator-image|table-border-color-(dark|light)|vert-align|vnd\..*)$/; - - var filterFunction = function(styleFilter) { - return function(name, value) { - var preserve = false; - switch (styleFilter) { - case 'all': - case '*': - preserve = true; - break; - case 'valid': - preserve = !removeStyles.test(name); - break; - case undefined: - case 'none': - preserve = name === 'list-style-type'; - break; - default: - preserve = (',' + styleFilter + ',').indexOf(',' + name + ',') >= 0; - break; - } - return preserve ? value : null; - }; - }; - - return Filter.createFilter(function(api, token) { - var styleFilter = api.settings.get('retain_style_properties'); - token.filterStyles(filterFunction(styleFilter)); - api.emit(token); - }); - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.InferListTags', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Token) { - return Filter.createFilter(function(api, token) { - if (api.seenList) { - // As soon as we see a UL or OL tag we know we're getting complete lists. - api.emit(token); - } else if (api.inferring) { - if (token.tag() === 'LI') { - if (token.type() === Token.START_ELEMENT_TYPE) { - api.inferring++; - } else { - api.inferring--; - if (!api.inferring) { - api.needsClosing = true; - } - } - } - api.emit(token); - } else { - if (token.tag() === 'OL' || token.tag() === 'UL') { - api.seenList = true; - } else if (token.tag() === 'LI') { - api.inferring = 1; - if (!api.needsClosing) { - api.emit(Token.createStartElement('UL', {}, {}, api.document)); - } - } - if (api.needsClosing && !api.inferring && !token.isWhitespace()) { - api.needsClosing = false; - api.emit(Token.createEndElement('UL', api.document)); - } - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripBookmarks', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - if (name === 'name' || name === 'id') { - return null; - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripClassAttributes', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - var classFilter; - if (name === 'class') { - classFilter = this.settings.get('strip_class_attributes'); - switch (classFilter) { - case 'mso': - return value.indexOf('Mso') === 0 ? null : value; - case 'none': - return value; - default: - return null; - } - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripEmptyInlineElements', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Helper', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Helper, Token) { - var deferred = []; - var open = []; - var hasContent = false; - - var removeMatchingSpan = function(len, pos) { - var j, token, opened = 1; - for (j = pos + 1; j < len; j++) { - token = deferred[j]; - if (token && token.tag() === 'SPAN') { - if (token.type() === Token.START_ELEMENT_TYPE) { - opened++; - } else if (token.type() === Token.END_ELEMENT_TYPE) { - opened--; - if (opened === 0) { - // Save reallocating a shorter array, just null it out. - deferred[j] = null; - return; - } - } - } - } - }; - - var flushDeferred = function(api) { - if (hasContent) { - var tok, len = deferred.length, i; - for (i = 0; i < len; i++) { - tok = deferred[i]; - if (!tok) continue; - if (tok.type() === Token.START_ELEMENT_TYPE && tok.tag() === 'SPAN' && Helper.hasNoAttributes(tok)) { - // Omit token and find the last end span and remove it too. - removeMatchingSpan(len, i); - } else { - api.emit(tok); - } - } - } - deferred = []; - open = []; - hasContent = false; - }; - - var internalDefer = function(api, token) { - deferred.push(token); - open = open || []; - if (token.type() === Token.START_ELEMENT_TYPE) { - open.push(token); - } else if (token.type() === Token.END_ELEMENT_TYPE) { - open.pop(); - if (open.length === 0) { - // Didn't find anything to keep so dump everything. - flushDeferred(api, token); - return; - } - } - }; - - return Filter.createFilter(function(api, token) { - var inlineTags = ',FONT,EM,STRONG,SAMP,ACRONYM,CITE,CODE,DFN,KBD,TT,B,I,U,S,SUB,SUP,INS,DEL,VAR,SPAN,'; - - deferred = deferred || []; - - var alwaysKeep = function(token) { - return !(inlineTags.indexOf(',' + token.tag() + ',') >= 0 && Helper.hasNoAttributes(token, true)); - }; - - if (deferred.length === 0) { - if (token.type() === Token.START_ELEMENT_TYPE) { - if (alwaysKeep(token)) { - api.emit(token); - } else { - internalDefer(api, token); - } - } else { - api.emit(token); - } - } else { - if (!hasContent) hasContent = alwaysKeep(token); - internalDefer(api, token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripEmptyStyleAttributes', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - if (name === 'style' && value === '') { - return null; - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripLangAttribute', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - return name === 'lang' ? null : value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( -'ephox.powerpaste.legacy.filters.StripImages', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Token) { - return Filter.createFilter(function(api, token) { - if (token.tag() === 'IMG') { - if (token.type() === Token.END_ELEMENT_TYPE && api.skipEnd) { - api.skipEnd = false; - return; - } else if (token.type() === Token.START_ELEMENT_TYPE) { - if (/^file:/.test(token.getAttribute('src'))) { - api.skipEnd = true; - return; - } else if (api.settings.get('base_64_images') && /^data:image\/.*;base64/.test(token.getAttribute('src'))) { - api.skipEnd = true; - return; - } - } - } - api.emit(token); - }); - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripMetaAndLinkElements', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createFilter(function(api, token) { - if (token.tag() !== 'META' && token.tag() !== 'LINK') { - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripNoAttributeA', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Helper', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Helper, Token) { - var keepA = function(token) { - return !Helper.hasNoAttributes(token) && !/^OLE_LINK/.test(token.getAttribute('name')); - }; - - var stack = []; - - return Filter.createFilter(function(api, token) { - var open; - if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'A') { - stack.push(token); - if (keepA(token)) { - api.defer(token); - } - } else if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === 'A') { - open = stack.pop(); - if (keepA(open)) { - api.defer(token); - } - if (stack.length === 0) { - api.emitDeferred(); - } - } else if (api.hasDeferred()) { - api.defer(token); - } else { - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripScripts', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter', - 'ephox.powerpaste.legacy.data.tokens.Token' - ], - - function (Filter, Token) { - var script = false; - return Filter.createFilter(function(api, token) { - if (token.tag() === 'SCRIPT') { - script = token.type() === Token.START_ELEMENT_TYPE; - } else if (!script) { - token.filterAttributes(function(name, value) { - if (/^on/.test(name) || name === 'language') return null; - return value; - }); - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.wordimport.CommonFilters', - - [ - 'ephox.powerpaste.legacy.filters.FilterInlineStyles', - 'ephox.powerpaste.legacy.filters.InferListTags', - 'ephox.powerpaste.legacy.filters.StripBookmarks', - 'ephox.powerpaste.legacy.filters.StripClassAttributes', - 'ephox.powerpaste.legacy.filters.StripEmptyInlineElements', - 'ephox.powerpaste.legacy.filters.StripEmptyStyleAttributes', - 'ephox.powerpaste.legacy.filters.StripLangAttribute', - 'ephox.powerpaste.legacy.filters.StripImages', - 'ephox.powerpaste.legacy.filters.StripMetaAndLinkElements', - 'ephox.powerpaste.legacy.filters.StripNoAttributeA', - 'ephox.powerpaste.legacy.filters.StripScripts' - ], - - function (FilterInlineStyles, InferListTags, StripBookmarks, StripClassAttributes, StripEmptyInlineElements, StripEmptyStyleAttributes, StripLangAttribute, StripImages, StripMetaAndLinkElements, StripNoAttributeA, StripScripts) { - return [ - StripScripts, - StripBookmarks, - StripImages, - FilterInlineStyles, - StripLangAttribute, - StripEmptyStyleAttributes, - StripClassAttributes, - StripNoAttributeA, - StripEmptyInlineElements, - StripMetaAndLinkElements, - InferListTags - ]; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripFormattingAttributes', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createFilter(function(api, token) { - token.filterAttributes(function(name, value) { - if (name === 'align') return null; - if ((token.tag() === 'UL' || token.tag() === 'OL') && - name === 'type') return null; - return value; - }); - api.emit(token); - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripNamespaceDeclarations', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - if (/^xmlns(:|$)/.test(name)) { - return null; - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripOPTags', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createFilter(function(api, token) { - if (!token.tag || !/^([OVWXP]|U[0-9]+|ST[0-9]+):/.test(token.tag())) { - api.emit(token); - } - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripTocLinks', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - if (name === 'href' && (value.indexOf('#_Toc') >= 0 || value.indexOf('#_mso') >= 0)) { - return null; - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.filters.StripVMLAttributes', - - [ - 'ephox.powerpaste.legacy.data.tokens.Filter' - ], - - function (Filter) { - return Filter.createAttributeFilter(function(name, value) { - if (/^v:/.test(name)) { - return null; - } - return value; - }); - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.wordimport.WordOnlyFilters', - - [ - 'ephox.powerpaste.legacy.filters.StripFormattingAttributes', - 'ephox.powerpaste.legacy.filters.StripNamespaceDeclarations', - 'ephox.powerpaste.legacy.filters.StripOPTags', - 'ephox.powerpaste.legacy.filters.StripTocLinks', - 'ephox.powerpaste.legacy.filters.StripVMLAttributes', - 'ephox.powerpaste.legacy.filters.list.Lists' - ], - - function (StripFormattingAttributes, StripNamespaceDeclarations, StripOPTags, StripTocLinks, StripVMLAttributes, Lists) { - return [ - StripOPTags, - Lists, - StripTocLinks, - StripVMLAttributes, - StripNamespaceDeclarations, - StripFormattingAttributes - ]; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.legacy.wordimport.WordImport', - - [ - 'ephox.powerpaste.legacy.data.tokens.Serializer', - 'ephox.powerpaste.legacy.data.tokens.Tokenizer', - 'ephox.powerpaste.legacy.filters.Text', - 'ephox.powerpaste.legacy.filters.list.Lists', - 'ephox.powerpaste.legacy.tinymce.BrowserFilters', - 'ephox.powerpaste.legacy.wordimport.CommonFilters', - 'ephox.powerpaste.legacy.wordimport.WordOnlyFilters' - ], - - function (Serializer, Tokenizer, Text, Lists, BrowserFilters, CommonFilters, WordOnlyFilters) { - var buildPipeline = function(filters, sink, settings, document) { - var i, filter = sink; - for (i = filters.length - 1; i >= 0; i--) { - //This is calling the function defined by Filter.createFilter(). - //The best description I can come up with is "function composition using CPS". - //Filters are run in reverse order to the loop, which is reversed so the arrays below define the order. - //And then the sink comes last (which means it's injected on the first pass of the loop). - filter = filters[i](filter, settings, document); - } - return filter; - }; - - var runPipeline = function(content, settings, document, requiredFilters) { - var serializer = Serializer.create(document); - var tokenizer = Tokenizer.tokenize(content, document); - pipeline = buildPipeline(requiredFilters, serializer, settings, document); - while (tokenizer.hasNext()) { - pipeline.receive(tokenizer.next()); - } - return serializer.dom; - }; - - /** - * Accepts a string of content to filter and returns a filtered DOM structure. - * - * @param inputContent the content to filter - * @param settings the settings object - * @param document the target document that the content will be inserted into - * @return a DOM fragment with the filtered content. - */ - var filter = function(inputContent, settings, document) { - var content = BrowserFilters.all(inputContent); - - var detectedAsWordContent = isWordContent(content); - settings.setWordContent(detectedAsWordContent); - - var requiredFilters = CommonFilters; - if (detectedAsWordContent) { - requiredFilters = WordOnlyFilters.concat(CommonFilters); - } - return runPipeline(content, settings, document, requiredFilters); - }; - - var filterPlainText = function(inputContent, settings, document) { - var content = BrowserFilters.textOnly(inputContent); - - return runPipeline(content, settings, document, [Text]); - }; - - var isWordContent = function(content) { - return content.indexOf('<o:p>') >= 0 || // IE, Safari, Opera - content.indexOf('p.MsoNormal, li.MsoNormal, div.MsoNormal') >= 0 || // Firefox Mac - content.indexOf('MsoListParagraphCxSpFirst') >= 0 || // Windows list only selection - content.indexOf('<w:WordDocument>') >= 0; // Firefox Windows - }; - - return { - filter: filter, - filterPlainText: filterPlainText, - isWordContent: isWordContent - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.LegacyTinyDialog', - [ - 'ephox.powerpaste.legacy.data.Insert', - 'ephox.powerpaste.legacy.tinymce.Settings', - 'ephox.powerpaste.legacy.wordimport.WordImport', - 'global!setTimeout' - ], - function(Insert, Settings, WordImport, setTimeout){ - return function(editor, translate) { - var showDialog = function(content){ - - var filterAndInsert = function(importSetting) { - var data = {content: content}; - - // run pre-filters - editor.fire('PastePreProcess', data); - - // run main filter, always strip images - var settings = Settings.create(importSetting || editor.settings.powerpaste_word_import, importSetting || editor.settings.powerpaste_html_import, true); - var fragment = WordImport.filter(data.content, settings, editor.getDoc()); - - // run post-filters - editor.fire('PastePostProcess', fragment); - //Set undo step - editor.undoManager.transact(function() { - // insert the DocumentFragment object into the editor - Insert.insert(fragment, editor); - }); - }; - - //introduce the prompt option - var cleanOrMerge = function(setting) { - return setting === 'clean' || setting === 'merge'; - }; - - var openDialog =function() { - var win; - - var clean = function() { - win.close(); - filterAndInsert('clean'); - }; - var merge = function() { - win.close(); - filterAndInsert('merge'); - }; - - var controls = [{ - text: translate('cement.dialog.paste.clean'), - onclick: clean - }, - { - text: translate('cement.dialog.paste.merge'), - onclick: merge - }]; - - var winSettings = { - title: translate('cement.dialog.paste.title'), - spacing: 10, - padding: 10, - items: [{ - type: 'container', - html: translate('cement.dialog.paste.instructions') - }], - buttons: controls - }; - - win = editor.windowManager.open(winSettings); - - //IE appears to require that we blur the iframe - setTimeout(function() { - if (win) { - win.getEl().focus(); - } - }, 1); - }; - - if (WordImport.isWordContent(content) && !cleanOrMerge(editor.settings.powerpaste_word_import)) { - openDialog(); - } else if (!cleanOrMerge(editor.settings.powerpaste_html_import)) { - openDialog(); - } else { - filterAndInsert(); - } - - }; - - return { - showDialog: showDialog - }; - - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.LegacyPowerPaste', - [ - 'ephox.powerpaste.i18n.I18n', - 'ephox.powerpaste.legacy.tinymce.Clipboard', - 'ephox.powerpaste.tinymce.LegacyTinyDialog' - ], - function (I18n, Clipboard, LegacyTinyDialog) { - return function (editor, settings) { - var t = this, onPaste, onKeyDown; - - var tinyDialog = LegacyTinyDialog(editor, I18n.translate); - - var handlerAdapter = function(handler) { - return function(e) { - handler(e); - }; - }; - - // Register the getClipboardContent function onpaste and with the magical keyboard shortcuts for browsers that don't support that (Opera & FF2). - onPaste = Clipboard.getOnPasteFunction(editor, tinyDialog.showDialog); - editor.on('paste', handlerAdapter(onPaste)); - - onKeyDown = Clipboard.getOnKeyDownFunction(editor, tinyDialog.showDialog); - editor.on('keydown', handlerAdapter(onKeyDown)); - - editor.addCommand('mceInsertClipboardContent', function(ui, data) { - tinyDialog.showDialog(data.content || data); - }); - - if (editor.settings.paste_preprocess) { - editor.on('PastePreProcess', function(e) { - editor.settings.paste_preprocess.call(t, t, e); - }); - } - - }; - - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.epithet.Id', - - [ - ], - - function () { - - /** - * Generate a unique identifier. - * - * The unique portion of the identifier only contains an underscore - * and digits, so that it may safely be used within HTML attributes. - * - * The chance of generating a non-unique identifier has been minimized - * by combining the current time, a random number and a one-up counter. - * - * @param {string} prefix Prepended to the identifier - * @return {string} Unique identifier - */ - var unique = 0; - - var generate = function (prefix) { - var date = new Date(); - var time = date.getTime(); - var random = Math.floor(Math.random() * 1000000000); - - unique++; - - return prefix + "_" + random + unique + String(time); - }; - - return { - generate: generate - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.DeviceType', - - [ - 'ephox.peanut.Fun' - ], - - function (Fun) { - return function(osObj, browserObj, userAgent) { - var isiPad = osObj.isiOS() && ( userAgent.search(/iPad/i) !== -1 ); - var isiPhone = osObj.isiOS() && !isiPad; - var isAndroid3 = osObj.isAndroid() && ( osObj.version.major === 3 ); - var isAndroid4 = osObj.isAndroid() && ( osObj.version.major === 4 ); - var isTablet = isiPad || isAndroid3 || ( isAndroid4 && userAgent.search(/mobile/i) === -1 ); - var isTouch = ( osObj.isiOS() || osObj.isAndroid() ); - var isPhone = isTouch && !isTablet; - - return { - isiPad : Fun.constant(isiPad), - isiPhone: Fun.constant(isiPhone), - isTablet: Fun.constant(isTablet), - isPhone: Fun.constant(isPhone), - isTouch: Fun.constant(isTouch), - isAndroid: osObj.isAndroid, - isiOS: osObj.isiOS - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.Platform', - - [ - ], - - function () { - var create = function(browserName, browserVersion, osName) { - return { - browser: { - current: browserName, - version: browserVersion - }, - os: { - current: osName - } - }; - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.GetterHelper', - - [ - ], - - function () { - var getter = function(value) { - return function() { - return value; - }; - }; - - // Adapter between settings like IsMSIE and functions like EditLiveJava.browser.isIE() - var attachGetters = function(scope, current, options) { - for (var i = 0; i < options.length; i++) { - scope['is' + options[i].name] = getter(options[i].name === current); - } - }; - - return { - getter: getter, - attachGetters: attachGetters - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.Result', - - [ - 'ephox.fred.core.GetterHelper' - ], - - function (GetterHelper) { - var create = function(options, current, version) { - //------------------------------------------------------------------------- - var attachGetters = GetterHelper.attachGetters; - //------------------------------------------------------------------------- - - var result = {}; - result.current = current; - result.version = version; - attachGetters(result, result.current, options); - return result; - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.SearchInfo', - - [ - 'ephox.violin.Strings' - ], - - function (V) { - var contains = V.contains; - var checkContains = function(x) { - return function(uastring) { - return contains(uastring, x); - }; - }; - - var chromeFrameChecker = function() { - try { - var i = new ActiveXObject('ChromeTab.ChromeFrame'); - return !!i; - } catch(e) { - return false; - } - }; - - var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; - - var create = function(isChromeFrameEnabled) { - var browsers = [ - { - name : 'Spartan', - versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], - search: function(uastring) { - var monstrosity = contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); - return monstrosity; - } - }, - { - name : 'ChromeFrame', - versionRegexes: [/.*?chromeframe\/([0-9]+)\.([0-9]+).*/, normalVersionRegex], - search: function(uastring) { - return contains(uastring, 'chromeframe') ? isChromeFrameEnabled() : false; - } - }, - { - name : 'Chrome', - versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex], - search : function(uastring) { - return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); - } - }, - { - name : 'IE', - versionRegexes: [/.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/], - search: function(uastring) { - var containsIE = (contains(uastring, 'msie') || contains(uastring, 'trident')); - var containsChromeFrame = contains(uastring, 'chromeframe'); - return containsChromeFrame ? containsIE && !isChromeFrameEnabled() : containsIE; - } - }, - { - name : 'Opera', - versionRegexes: [normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/], - search : checkContains('opera') - }, - { - name : 'Firefox', - versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], - search : checkContains('firefox') - }, - { - name : 'Safari', - versionRegexes: [normalVersionRegex], - search : checkContains('safari') - }, - { - name : 'Envjs', - versionRegexes: [/.*?envjs\/\ ?([0-9]+)\.([0-9]+).*/], - search : checkContains('envjs') - } - ]; - - var oses = [ - { - name : 'Windows', - search : checkContains('win'), - versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] - }, - { - name : 'iOS', - search : function(uastring) { - return contains(uastring, 'iphone') || contains(uastring, 'ipad'); - }, - versionRegexes: [/.*?version\/\ ?([0-9]+)\.([0-9]+).*/] - }, - { - name : 'Android', - search : checkContains('android'), - versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] - }, - { - name : 'OSX', - search : checkContains('os x'), - versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/] - }, - { - name : 'Linux', - search : checkContains('linux') - }, - { name : 'Solaris', - search : checkContains('sunos') - }, - { - name : 'FreeBSD', - search : checkContains('freebsd') - } - ]; - - - return { - browsers: browsers, - oses: oses - }; - }; - - return { - create: create, - chromeFrameChecker: chromeFrameChecker - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.SpecTester', - - [ - ], - - function () { - var meetsSpec = function(spec, browserVersion) { - var t = typeof spec; - if (t === 'boolean') { - return !! spec; - } else if (t === 'object') { - var min = spec.minimum; - return browserVersion.major > min.major || (browserVersion.major === min.major && browserVersion.minor >= min.minor); - } - - throw('invalid spec'); - }; - - return { - meetsSpec: meetsSpec - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.Fn', - - [ - ], - - function () { - var findOneInArrayOr = function(array, theDefault, predicate) { - for (var i = 0; i < array.length; i++) { - var x = array[i]; - if (predicate(x, i, array)) return x; - } - return theDefault; - }; - - return { - findOneInArrayOr: findOneInArrayOr - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.UaStringDetector', - - [ - 'ephox.fred.core.Fn' - ], - - function (Fn) { - var detect = function(scope, userAgent) { - //------------------------------------------------------------------------- - var findOneInArrayOr = Fn.findOneInArrayOr; - //------------------------------------------------------------------------- - - var agent = String(userAgent).toLowerCase(); - return findOneInArrayOr(scope, {name: undefined}, function(x) { - return x.search(agent); - }); - }; - - return { - detect: detect - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.core.VersionDetector', - - [ - ], - - function () { - var detectVersion = function(currentBrowser, agent) { - function firstMatch(regexes, s) { - for (var i = 0; i < regexes.length; i++) { - var x = regexes[i]; - if (x.test(s)) return x; - } - return undefined; - } - - function find(regexes, agent) { - var r = firstMatch(regexes, agent); - if (!r) return { major : 0, minor : 0 }; - var group = function(i) { - return Number(agent.replace(r, '$' + i)); - }; - return { - major : group(1), - minor : group(2) - }; - } - - var cleanedAgent = String(agent).toLowerCase(); - var versionRegexes = currentBrowser.versionRegexes; - - if (!versionRegexes) return { major : 0, minor : 0 }; - return find(versionRegexes, cleanedAgent); - }; - - return { - detectVersion: detectVersion - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fred.PlatformDetection', - - [ - 'ephox.fred.core.DeviceType', - 'ephox.fred.core.Platform', - 'ephox.fred.core.Result', - 'ephox.fred.core.SearchInfo', - 'ephox.fred.core.SpecTester', - 'ephox.fred.core.UaStringDetector', - 'ephox.fred.core.VersionDetector' - ], - - function (DeviceType, Platform, Result, SearchInfo, SpecTester, UaStringDetector, VersionDetector) { - //------------------------------------------------------------------------- - var detectVersion = VersionDetector.detectVersion; - var makeResult = Result.create; - var meetsSpec = SpecTester.meetsSpec; - var detectFromUaString = UaStringDetector.detect; - //------------------------------------------------------------------------- - - var isSupported = function(supportMatrix, os, browser, browserVersion) { - if (!!(supportMatrix[os])) { - if (!!(supportMatrix[os][browser])) { - return meetsSpec(supportMatrix[os][browser], browserVersion); - } else { - return !!(supportMatrix[os]["All"]); - } - } else { - return false; - } - }; - - var isSupportedPlatform = function(matrix, platform) { - var browser = platform.browser; - var os = platform.os; - return isSupported(matrix, os.current, browser.current, browser.version); - }; - - var doDetect = function(userAgent, chromeFrameChecker) { - var si = SearchInfo.create(chromeFrameChecker); - - var browsers = si.browsers; - var oses = si.oses; - - var os = detectFromUaString(oses, userAgent); - var osName = os.name; - var osVersion = detectVersion(os, userAgent); - - var browser = detectFromUaString(browsers, userAgent); - var browserName = browser.name; - var browserVersion = detectVersion(browser, userAgent); - - - var osObj = makeResult(oses, osName, osVersion); - var browserObj = makeResult(browsers, browserName, browserVersion); - - var deviceType = DeviceType(osObj, browserObj, userAgent); - - var supported = function(supportMatrix) { - return isSupported(supportMatrix, osName, browserName, browserVersion); - }; - - return { - browser : browserObj, - os : osObj, - deviceType: deviceType, - isSupported : supported - }; - }; - - var detect = function() { - return doDetect(navigator.userAgent, SearchInfo.chromeFrameChecker); - }; - - return { - Platform: Platform, - detect: detect, - doDetect: doDetect, - isSupported: isSupported, - isSupportedPlatform: isSupportedPlatform - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.FileReader', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE10 and above per - * https://developer.mozilla.org/en-US/docs/Web/API/FileReader - */ - return function () { - var f = Global.getOrDie('FileReader'); - return new f(); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.hermes.utils.ImageExtract', - - [ - 'ephox.compass.Arr', - 'ephox.epithet.Id', - 'ephox.fred.PlatformDetection', - 'ephox.hermes.api.ImageAsset', - 'ephox.numerosity.api.FileReader', - 'ephox.numerosity.api.URL', - 'ephox.scullion.Struct' - ], - - function (Arr, Id, PlatformDetection, ImageAsset, FileReader, URL, Struct) { - var blobStruct = Struct.immutable('id', 'obj', 'objurl'); - - var blob = function (obj) { - return blobStruct(Id.generate('image'), obj, URL.createObjectURL(obj)); - }; - - var platform = PlatformDetection.detect(); - - /** - * Converts a list of blobs into a list of ImageAssets. This is - * asynchronous. The assets are passed to the callback - * @param blobs the list of blobs - * @param callback the callback function for the {ephox.hermes.asset.ImageAsset[]} - */ - var fromBlobs = function (blobs, callback) { - // edge case: where a drop of a non-file takes place - if (blobs.length === 0) { - callback([]); - return; - } - - var processed = []; - - var addAsset = function (asset) { - processed.push(asset); - if (processed.length === blobs.length) callback(processed); - }; - - var readBlob = function (blobData, f) { - var fr = FileReader(); - fr.onload = function(e) { - f(blobData, e.target); - }; - fr.readAsDataURL(blobData); - }; - - Arr.each(blobs, function (b) { - var uuid = b.id(); - var blobData = b.obj(); - var objurl = b.objurl(); - readBlob(blobData, function (b, data) { - var asset = ImageAsset.blob(uuid, b, objurl, data); - addAsset(asset); - }); - }); - }; - - /** - * Converts a list of files into a list of ImageAssets. This is - * asynchronous. The assets are passed to the callback - * @param files the list of files - * @param callback the callback function for the {ephox.hermes.asset.ImageAsset[]} - */ - var toAssets = function (files, callback) { - var blobs = Arr.map(files, function (file) { - return blob(file); - }); - - fromBlobs(blobs, callback); - }; - - var toFiles = function (event) { - return event.raw().target.files || event.raw().dataTransfer.files; - }; - - // The following functions are browser-specific ways of determining - // whether a drag event contains files from the FILE SYSTEM and - // NOT files being dragged from the host page - var isFilesIe = function (types) { - return types.length === 1 && Arr.contains(types, 'Files'); - }; - - var isFilesFF = function (types) { - return !Arr.contains(types, 'text/_moz_htmlcontext'); - }; - - var isFilesWebkit = function (types) { - return Arr.contains(types, 'Files'); - }; - - var isFilesOthers = function (types) { - // just assume we have files. It will just show a different - // drop container and the browser will do nothing - return true; - }; - - var fileDetection = function(){ - if( platform.browser.isChrome() - || platform.browser.isSafari() - || platform.browser.isOpera() ) { - return isFilesWebkit; - }else if( platform.browser.isFirefox() ) { - return isFilesFF; - }else if( platform.browser.isIE() ) { - return isFilesIe; - } - return isFilesOthers; - }; - - var isFiles = fileDetection(); - - /** - * Maps raw global!Image objects to internal image assets, - * suitable for adding to a gallery or the editor socket. - * @param [global!Image] images to process - * @return {ephox.hermes.asset.ImageAsset[]} mapped image assets - */ - var fromImages = function (images) { - return Arr.map(images, function (img) { - var uuid = Id.generate('image'); - return ImageAsset.url(uuid, img.src, img); - }); - }; - - return { - blob: blob, - toAssets: toAssets, - toFiles: toFiles, - isFiles: isFiles, - fromImages: fromImages, - fromBlobs: fromBlobs - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.hermes.api.ImageExtract', - - [ - 'ephox.hermes.utils.ImageExtract' - ], - - function (ImageExtract) { - /** - * Converts a list of files into a list of ImageAssets. This is - * asynchronous. The assets are passed to the callback - * @param files the list of files - * @param callback the callback function for the {ephox.hermes.asset.ImageAsset[]} - */ - var toAssets = function (files, callback) { - return ImageExtract.toAssets(files, callback); - }; - - /** - * Converts a list of blobs into a list of ImageAssets. This is - * asynchronous. The assets are passed to the callback - * @param blobs the list of blobs - * @param callback the callback function for the {ephox.hermes.asset.ImageAsset[]} - */ - var fromBlobs = function (blobs, callback) { - return ImageExtract.fromBlobs(blobs, callback); - }; - - return { - toAssets: toAssets, - fromBlobs: fromBlobs, - blob: ImageExtract.blob - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.ModernPowerDrop', - [ - 'ephox.compass.Arr', - 'ephox.hermes.api.ImageAsset', - 'ephox.hermes.api.ImageExtract', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'global!tinymce' - ], - function (Arr, ImageAsset, ImageExtract, Attr, Element, tinymce) { - return function (editor, url, settings, uploader) { - - var draggingInternally, imageRegex = /^image\/(jpe?g|png|gif|bmp)$/i; - - editor.on('dragstart dragend', function(e) { - draggingInternally = e.type === 'dragstart'; - }); - - editor.on('dragover dragend dragleave', function(e) { - e.preventDefault(); - }); - - var extractImages = function (event) { - - //TODO: make this more explicit why it's been done - var files = event.target.files || event.dataTransfer.files; - - return Arr.filter(files, function (file) { - //If the file type tests as an image - return imageRegex.test(file.type); - }); - - }; - - var stringifyImages = function (assets) { - - return Arr.map(assets, function (asset) { - - var image = Element.fromTag('img'); - - var src = ImageAsset.cata(asset, - //If we're using PP's uploader, return the blob url, otherwise the data url - uploader.getLocalURL, - function (id, url, raw) { return url; } - ); - - Attr.set(image, 'src', src); - - return image.dom().outerHTML; - - }).join(''); - - }; - - var processImages = function (images) { - - ImageExtract.toAssets(images, function (assets) { - - var stringHTML = stringifyImages(assets); - - //Content insertion - editor.insertContent(stringHTML, {merge: editor.settings.paste_merge_formats !== false}); - - uploader.uploadImages(assets); - - }); - - }; - - editor.on('drop', function (e) { - - //If we're not dragging from within tiny - if (!draggingInternally) { - - //If RangeUtils are exposed (4.2) - if (tinymce.dom.RangeUtils && tinymce.dom.RangeUtils.getCaretRangeFromPoint) { - - var rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc()); - - //Set selection to where the mouse is pointing - if (rng) editor.selection.setRng(rng); - - } - - var images = extractImages(e); - - if (images.length > 0) processImages(images); - - e.preventDefault(); - - } - - }); - - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.Blob', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * IE10 and above per - * https://developer.mozilla.org/en-US/docs/Web/API/Blob - */ - return function (parts, properties) { - var f = Global.getOrDie('Blob'); - return new f(parts, properties); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.numerosity.api.Uint8Array', - - [ - 'ephox.numerosity.core.Global' - ], - - function (Global) { - /* - * https://developer.mozilla.org/en-US/docs/Web/API/Uint8Array - * - * IE10 and above per - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays - */ - return function (arr) { - var f = Global.getOrDie('Uint8Array'); - return new f(arr); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!parseInt", [], function () { return parseInt; }); -(function (define, require, demand) { -define( - 'ephox.bowerbird.codes.HexToBlob', - - [ - 'ephox.numerosity.api.Blob', - 'ephox.numerosity.api.Uint8Array', - 'global!Array', - 'global!Math', - 'global!String', - 'global!parseInt' - ], - - function (Blob, Uint8Array, Array, Math, String, parseInt) { - // This function is an unholy combination of two Stack Overflow posts: - // http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript - // http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript - - // This all hinges on each hex digit being two characters. - // Bytes are only 0-255 (hex 0-FF) though, so that's a pretty safe assumption. - var toBytes = function (hex) { - // Pre-allocating the array speeds things up - var parts = new Array(hex.length / 2); - for (var i = 0; i < hex.length; i += 2) { - var h = hex.substr(i, 2); - - var index = Math.floor(i / 2); // Chrome works with indexes like 1.5, but I don't trust JS - parts[index] = parseInt(h, 16); - } - return parts; - }; - - var convert = function (input, contentType) { - if (input.length === 0) throw 'Zero length content passed to Hex conversion'; - - var byteNumbers = toBytes(input); - var byteArray = Uint8Array(byteNumbers); - return Blob([byteArray], {type: contentType}); - }; - - return { - convert: convert - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.bowerbird.core.Species', - - [ - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - function (Fun, Option) { - var PICT_SIG = '{\\pict{'; - var PICT_ID_REF = 'i'; - var SHP_SIG = '{\\shp{'; - var SHP_ID_REF = 's'; - - var getIndex = function (match, str, idx) { - return str.indexOf(match, idx); - }; - - var common = function (start, end, bower, regex, idRef) { - if (start === -1 || end === -1) return Option.none(); - else return Option.some({ - start: Fun.constant(start), - end: Fun.constant(end), - bower: bower, // I wish we had types - regex: Fun.constant(regex), - idRef: Fun.constant(idRef) - }); - }; - - var extractBower = function (str, start, end) { - return function () { - return str.substring(start, end); - }; - }; - - var endBracket = function (str, idx) { - var nesting = 0; - var max = str.length; - var open, close; - do { - open = str.indexOf('{', idx); - close = str.indexOf('}', idx); - if (close > open && open !== -1) { - // is open bracket { - idx = open + 1; - ++nesting; - } else if ((open > close || open < 0) && close !== -1) { - // is closed bracket } - idx = close + 1; - --nesting; - } - if (idx > max || close === -1) return -1; - } while (nesting > 0); - return idx; - }; - - var pict = function (str, idx, start) { - var end = start === -1 ? start : endBracket(str, start); - var bower = extractBower(str, start, end); - var hexRegex = /([a-hA-H0-9]+)\}$/; - return common(start, end, bower, hexRegex, PICT_ID_REF); - }; - - var shp = function (str, idx, start) { - var end = start === -1 ? start : endBracket(str, start); - var bower = extractBower(str, start, end); - // On windows or ie there is this unique object which is 32bits long that we don't want to capture - // {\*\blipuid 2c98da434043a6e60b0c2f43b22569bc} - // there are ideas for optimising the capture which will make this regex redundant see TBIO-3070 - var hexRegex = /([a-hA-H0-9]{64,})(?:\}.*)/; - return common(start, end, bower, hexRegex, SHP_ID_REF); - }; - - // Can identify 2 types of embedded RTF images, pict & shp, if we find more this needs to become generic. - // It's complex because this is now a parser and either can come first. - var identify = function (str, idx) { - var pictStart = getIndex(PICT_SIG, str, idx); - var shpStart = getIndex(SHP_SIG, str, idx); - - if (pictStart === -1 && shpStart === -1) return Option.none(); - else if (pictStart === -1) return shp(str, idx, shpStart); - else if (shpStart === -1) return pict(str, idx, pictStart); - else if (pictStart < shpStart) return pict(str, idx, pictStart); - else if (shpStart < pictStart) return shp(str, idx, shpStart); - else return Option.none(); // this should never happen, but just in case - }; - - return { - identify: identify, - endBracket: endBracket - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.bowerbird.core.Rtf', - - [ - 'ephox.bowerbird.codes.HexToBlob', - 'ephox.bowerbird.core.Species', - 'ephox.perhaps.Option' - ], - - function (HexToBlob, Species, Option) { - - var nextBower = function (s, currentIndex) { - // the next nest of info that contains all the data about an image - return Species.identify(s, currentIndex); - }; - - var extractContentType = function (pict) { - // - // The following picture types are ignored at the moment: - // \emfblip, \macpict, \pmmetafileN, \wmetafileN, \dibitmapN, \wbitmapN. - // - if (pict.indexOf('\\pngblip') >= 0) return Option.some('image/png'); - else if (pict.indexOf('\\jpegblip') >= 0) return Option.some('image/jpeg'); - else return Option.none(); - }; - - var isValidHex = function (s) { - return s.length % 2 === 0; - }; - - var removeCrLf = function (s) { - return s.replace(/\r/g, '').replace(/\n/g, ''); - }; - - var extractOnlyGroup = function (s, regex) { - var result = s.match(regex); - return result !== null ? Option.some(result[1]) : Option.none(); - }; - - var extractHex = function (bower, regex) { - return extractOnlyGroup(bower, regex).filter(isValidHex); - }; - - var extractId = function (pict) { - var re = /\\shplid(\d+)/; - return extractOnlyGroup(pict, re); - }; - - var imageFromData = function (data) { - // extract a nest of data - var bower = data.bower(); - var regex = data.regex(); - return extractId(bower).bind(function (id) { - return extractContentType(bower).bind(function (contentType) { - return extractHex(bower, regex).map(function (hex) { - return { - 'id': data.idRef() + id, - 'contentType': contentType, - 'blob' : HexToBlob.convert(hex, contentType) - }; - }); - }); - }); - }; - - var extractBowers = function (rtf) { - var images = []; - var length = function () { - return rtf.length; // break - }; - - var addImage = function (data) { - var image = imageFromData(data); - image.each(function (image) { - images.push(image); - }); - return data.end() + 1; - }; - - var currentIndex = 0; - while (currentIndex < rtf.length) { - currentIndex = nextBower(rtf, currentIndex).fold(length, addImage); - } - return images; - }; - - var images = function (rtf) { - return extractBowers(removeCrLf(rtf)); - }; - - return { - nextBower: nextBower, - extractId: extractId, - extractContentType: extractContentType, - extractHex: extractHex, - images: images - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.bowerbird.api.Rtf', - - [ - 'ephox.bowerbird.core.Rtf' - ], - - function (Rtf) { - var images = function (rtf) { - return Rtf.images(rtf); - }; - - return { - images: images - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.flash.Correlation', - - [ - 'ephox.compass.Arr', - 'ephox.hermes.api.ImageExtract', - 'ephox.perhaps.Option', - 'ephox.scullion.Struct', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Class' - ], - - function (Arr, ImageExtract, Option, Struct, Attr, Class) { - var rtfData = Struct.immutable('id', 'url'); - - var byCode = function (image, unique, _index) { - var candidate = Arr.find(unique, function (u) { - return Attr.get(image, 'data-image-id') === u.id(); - }); - - return Option.from(candidate); - }; - - var byPosition = function (image, unique, index) { - return Option.from(unique[index]); - }; - - var converters = { - local: byPosition, - code: byCode - }; - - var convert = function (images, imageData, callback) { - var unique = []; - - // create the blob struct from the RTF data, and keep a record of unique ID -> url - var blobs = Arr.bind(imageData, function (i) { - var isUnique = !Arr.exists(unique, function (d) { return d.id() === i.id; }); - - if (isUnique) { - var blob = ImageExtract.blob(i.blob); - - unique.push(rtfData(i.id, blob.objurl())); - - return [blob]; - } else { - return []; - } - }); - - // load the blob data before updating the document and then firing the callback - ImageExtract.fromBlobs(blobs, function (assets) { - - Arr.each(images, function (image, i) { - // TODO: Standardise the names of these data attributes. Probably namespaced. - var type = Attr.get(image, 'data-image-type'); - var converter = converters[type] !== undefined ? converters[type] : Option.none; - converter(image, unique, i).each(function (candidate) { - Attr.set(image, 'src', candidate.url()); - }); - Class.remove(image, 'rtf-data-image'); - Attr.remove(image, 'data-image-type'); - Attr.remove(image, 'data-image-id'); - }); - - callback(assets); - }); - }; - - return { - convert: convert - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.style.Styles', - - [ - 'ephox.flour.style.Resolver' - ], - - function (Resolver) { - var styles = Resolver.create('ephox-cement'); - - return { - resolve: styles.resolve - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.flash.HelpCopy', - - [ - 'ephox.cement.style.Styles', - 'ephox.fred.PlatformDetection', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.InsertAll' - ], - - function (Styles, PlatformDetection, Class, Element, InsertAll) { - - var modifierKey = function () { - var platform = PlatformDetection.detect(); - var mac = platform.os.isOSX(); - return mac ? ['\u2318'] : ['Ctrl']; - }; - - var pressEscape = function (translations) { - return Element.fromHtml( - '<p>' + translations('cement.dialog.flash.press-escape') + '</p>' - ); - }; - - var paste = function (translations) { - var container = Element.fromTag('div'); - Class.add(container, Styles.resolve('flashbin-helpcopy')); - - var key = modifierKey(); - - var instructions = Element.fromHtml( - '<p>' + translations('cement.dialog.flash.trigger-paste') + '</p>'); - var kbd = Element.fromHtml( - '<div>' + - '<span class="ephox-polish-help-kbd">' + - key + - '</span>' + - ' + ' + - '<span class="ephox-polish-help-kbd">V</span>' + - '</div>' - ); - - Class.add(kbd, Styles.resolve('flashbin-helpcopy-kbd')); - - InsertAll.append(container, [ instructions, kbd, pressEscape(translations) ]); - - return container; - }; - - var noflash = function (translations) { - var container = Element.fromTag('div'); - Class.add(container, Styles.resolve('flashbin-helpcopy')); - - var instructions = Element.fromHtml( - '<p>' + translations('cement.dialog.flash.missing') + '</p>' - ); - - InsertAll.append(container, [ instructions, pressEscape(translations) ]); - - return container; - }; - - var indicator = function (translations) { - var loading = Element.fromTag('div'); - Class.add(loading, Styles.resolve('flashbin-loading')); - - var spinner = Element.fromTag('div'); - Class.add(spinner, Styles.resolve('flashbin-loading-spinner')); - - var loadNote = Element.fromTag('p'); - loadNote.dom().innerHTML = translations('loading.wait'); - - InsertAll.append(loading, [spinner, loadNote]); - - return loading; - }; - - return { - paste: paste, - noflash: noflash, - indicator: indicator - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!window", [], function () { return window; }); -(function (define, require, demand) { -define( - 'ephox.sugar.api.Css', - - [ - 'ephox.classify.Type', - 'ephox.compass.Obj', - 'ephox.perhaps.Option', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Body', - 'ephox.sugar.api.Element', - 'ephox.violin.Strings', - 'global!Error', - 'global!console', - 'global!window' - ], - - function (Type, Obj, Option, Attr, Body, Element, Strings, Error, console, window) { - var internalSet = function (dom, property, value) { - // This is going to hurt. Apologies. - // JQuery coerces numbers to pixels for certain property names, and other times lets numbers through. - // we're going to be explicit; strings only. - if (!Type.isString(value)) { - console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); - throw new Error('CSS value must be a string: ' + value); - } - - // removed: support for dom().style[property] where prop is camel case instead of normal property name - dom.style.setProperty(property, value); - }; - - var set = function (element, property, value) { - var dom = element.dom(); - internalSet(dom, property, value); - }; - - var setAll = function (element, css) { - var dom = element.dom(); - - Obj.each(css, function (v, k) { - internalSet(dom, k, v); - }); - }; - - /* - * NOTE: For certain properties, this returns the "used value" which is subtly different to the "computed value" (despite calling getComputedStyle). - * Blame CSS 2.0. - * - * https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - */ - var get = function (element, property) { - var dom = element.dom(); - /* - * IE9 and above per - * https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle - * - * Not in numerosity, because it doesn't memoize and looking this up dynamically in performance critical code would be horrendous. - * - * JQuery has some magic here for IE popups, but we don't really need that. - * It also uses element.ownerDocument.defaultView to handle iframes but that hasn't been required since FF 3.6. - */ - var styles = window.getComputedStyle(dom); - var r = styles.getPropertyValue(property); - - // jquery-ism: If r is an empty string, check that the element is not in a document. If it isn't, return the raw value. - // Turns out we do this a lot. - var v = (r === '' && !Body.inBody(element)) ? getUnsafeProperty(dom, property) : r; - - // undefined is the more appropriate value for JS. JQuery coerces to an empty string, but screw that! - return v === null ? undefined : v; - }; - - var getUnsafeProperty = function (dom, property) { - // removed: support for dom().style[property] where prop is camel case instead of normal property name - return dom.style.getPropertyValue(property); - }; - - /* - * Gets the raw value from the style attribute. Useful for retrieving "used values" from the DOM: - * https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * - * Returns NONE if the property isn't set, or the value is an empty string. - */ - var getRaw = function (element, property) { - var dom = element.dom(); - var raw = getUnsafeProperty(dom, property); - - return Option.from(raw).filter(function (r) { return r.length > 0; }); - }; - - var isValidValue = function (tag, property, value) { - var element = Element.fromTag(tag); - set(element, property, value); - var style = getRaw(element, property); - return style.isSome(); - }; - - var remove = function (element, property) { - var dom = element.dom(); - /* - * IE9 and above - MDN doesn't have details, but here's a couple of random internet claims - * - * http://help.dottoro.com/ljopsjck.php - * http://stackoverflow.com/a/7901886/7546 - */ - dom.style.removeProperty(property); - - if (Attr.has(element, 'style') && Strings.trim(Attr.get(element, 'style')) === '') { - // No more styles left, remove the style attribute as well - Attr.remove(element, 'style'); - } - }; - - var preserve = function (element, f) { - var oldStyles = Attr.get(element, 'style'); - var result = f(element); - var restore = oldStyles === undefined ? Attr.remove : Attr.set; - restore(element, 'style', oldStyles); - return result; - }; - - var copy = function (source, target) { - target.dom().style.cssText = source.dom().style.cssText; - }; - - var reflow = function (e) { - /* NOTE: - * do not rely on this return value. - * It's here so the closure compiler doesn't optimise the property access away. - */ - return e.dom().offsetWidth; - }; - - return { - copy: copy, - set: set, - preserve: preserve, - setAll: setAll, - remove: remove, - get: get, - getRaw: getRaw, - isValidValue: isValidValue, - reflow: reflow - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!navigator", [], function () { return navigator; }); -(function (define, require, demand) { -define( - 'ephox.cement.flash.FlashInfo', - - [ - 'ephox.cement.flash.HelpCopy', - 'ephox.cement.style.Styles', - 'ephox.fred.PlatformDetection', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'global!navigator' - ], - - function (HelpCopy, Styles, PlatformDetection, Fun, Class, Css, Element, Insert, InsertAll, navigator) { - var platform = PlatformDetection.detect(); - - // separated out to constrain the scope of the JSHint override - var ieFlash = function () { - /* global ActiveXObject */ - return new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); - }; - - var hasFlash = function () { - try { - var flashObj = platform.browser.isIE() ? ieFlash() : navigator.plugins['Shockwave Flash']; - return flashObj !== undefined; - } catch (err) { - return false; - } - }; - - var noflash = function (container, _bin, reflow, translations) { - var help = HelpCopy.noflash(translations); - Insert.append(container, help); - - return { - reset: Fun.noop - }; - }; - - var flash = function (container, bin, reflow, translations) { - var help = HelpCopy.paste(translations); - var indicator = HelpCopy.indicator(translations); - - InsertAll.append(container, [ indicator, help, bin.element() ]); - - var indicatorHide = function () { - /* - X-browser magic that makes the flash blocker/s info display nicely with the cement spinner - */ - Css.setAll(indicator, { - 'height': '0', - 'padding': '0' - }); - }; - - var reset = function () { - Css.set(help, 'display', 'block'); - Css.set(indicator, 'display', 'none'); - reflow(); - }; - - var busy = function () { - Css.set(help, 'display', 'none'); - Css.set(indicator, 'display', 'block'); - Css.remove(indicator, 'height'); - Css.remove(indicator, 'padding'); - reflow(); - }; - - bin.events.spin.bind(busy); - bin.events.reset.bind(reset); - bin.events.hide.bind(indicatorHide); - - return { - reset: reset - }; - }; - - return function (bin, reflow, cementConfig) { - console.log(bin, reflow, cementConfig) - var container = Element.fromTag('div'); - var style = 'flashbin-wrapper-' + (platform.os.isOSX() ? 'cmd' : 'ctrl'); - - Class.add(container, Styles.resolve(style)); - - var loader = hasFlash() ? flash : noflash; - var info = loader(container, bin, reflow, cementConfig.translations); - - return { - element: Fun.constant(container), - reset: info.reset - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!clearInterval", [], function () { return clearInterval; }); -ephox.bolt.module.api.define("global!setInterval", [], function () { return setInterval; }); -(function (define, require, demand) { -define( - 'ephox.cement.alien.WaitForFlash', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'global!clearInterval', - 'global!setInterval' - ], - - function (Type, Arr, clearInterval, setInterval) { - return function (obj, flashFunctions, callback) { - var functionsReady = function (dom) { - // Plugin objects register functions on their DOM node *after* they load, until then they are undefined. - return Arr.forall(flashFunctions, function (name) { - return Type.isFunction(dom[name]); - }); - }; - - var search = function () { - // Sometimes we never get the onload callback, but PercentLoaded reaches 100 indicating it is actually running. - // If that happens, once the functions are available we are good to go. - var dom = obj.dom(); - if (Type.isFunction(dom.PercentLoaded) && dom.PercentLoaded() === 100 && functionsReady(dom)) { - stop(); - callback(); - } - }; - - var waiting = true; - var reference = setInterval(search, 500); - - var stop = function () { - if (waiting) { - clearInterval(reference); - waiting = false; - } - }; - return { - stop: stop - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.epithet.Namespace', - - [ - 'ephox.epithet.Global' - ], - - function (Global) { - var step = function (o, part) { - if (o[part] === undefined || o[part] === null) - o[part] = {}; - return o[part]; - }; - - var namespace = function (name, target) { - var o = target || Global; - var parts = name.split('.'); - for (var i = 0; i < parts.length; ++i) - o = step(o, parts[i]); - return o; - }; - - return { - namespace: namespace - }; - } -); - - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.oilspill.callback.Globaliser', - - [ - 'ephox.epithet.Namespace' - ], - - function (Namespace) { - var install = function (namespace) { - var manager = Namespace.namespace(namespace); - manager.callbacks = {}; - - var count = 0; - var next = function () { - var ref = 'callback_' + count; - count++; - return ref; - }; - - var global = function (ref) { - return namespace + '.callbacks.' + ref; - }; - - var register = function (callback, permanent) { - var ref = next(); - manager.callbacks[ref] = function () { - if (!permanent) unregister(ref); - callback.apply(null, arguments); - }; - return global(ref); - }; - - var ephemeral = function (callback) { - return register(callback, false); - }; - - var permanent = function (callback) { - return register(callback, true); - }; - - var unregister = function (spec) { - var ref = spec.substring(spec.lastIndexOf('.') + 1); - if (manager.callbacks[ref] !== undefined) - delete manager.callbacks[ref]; - }; - - manager.ephemeral = ephemeral; - manager.permanent = permanent; - manager.unregister = unregister; - - return manager; - }; - - return { - install: install - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.PredicateFind', - - [ - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.sugar.api.Body', - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Element', - 'ephox.sugar.impl.ClosestOrAncestor' - ], - - function (Type, Arr, Fun, Option, Body, Compare, Element, ClosestOrAncestor) { - var first = function (predicate) { - return descendant(Body.body(), predicate); - }; - - var ancestor = function (scope, predicate, isRoot) { - var element = scope.dom(); - var stop = Type.isFunction(isRoot) ? isRoot : Fun.constant(false); - - while (element.parentNode) { - element = element.parentNode; - var el = Element.fromDom(element); - - if (predicate(el)) return Option.some(el); - else if (stop(el)) break; - } - return Option.none(); - }; - - var closest = function (scope, predicate, isRoot) { - // This is required to avoid ClosestOrAncestor passing the predicate to itself - var is = function (scope) { - return predicate(scope); - }; - return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot); - }; - - var sibling = function (scope, predicate) { - var element = scope.dom(); - if (!element.parentNode) return Option.none(); - - return child(Element.fromDom(element.parentNode), function (x) { - return !Compare.eq(scope, x) && predicate(x); - }); - }; - - var child = function (scope, predicate) { - var result = Arr.find(scope.dom().childNodes, - Fun.compose(predicate, Element.fromDom)); - return Option.from(result).map(Element.fromDom); - }; - - var descendant = function (scope, predicate) { - var descend = function (element) { - for (var i = 0; i < element.childNodes.length; i++) { - if (predicate(Element.fromDom(element.childNodes[i]))) - return Option.some(Element.fromDom(element.childNodes[i])); - - var res = descend(element.childNodes[i]); - if (res.isSome()) - return res; - } - - return Option.none(); - }; - - return descend(scope.dom()); - }; - - return { - first: first, - ancestor: ancestor, - closest: closest, - sibling: sibling, - child: child, - descendant: descendant - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.PredicateExists', - - [ - 'ephox.sugar.api.PredicateFind' - ], - - function (PredicateFind) { - var any = function (predicate) { - return PredicateFind.first(predicate).isSome(); - }; - - var ancestor = function (scope, predicate, isRoot) { - return PredicateFind.ancestor(scope, predicate, isRoot).isSome(); - }; - - var closest = function (scope, predicate, isRoot) { - return PredicateFind.closest(scope, predicate, isRoot).isSome(); - }; - - var sibling = function (scope, predicate) { - return PredicateFind.sibling(scope, predicate).isSome(); - }; - - var child = function (scope, predicate) { - return PredicateFind.child(scope, predicate).isSome(); - }; - - var descendant = function (scope, predicate) { - return PredicateFind.descendant(scope, predicate).isSome(); - }; - - return { - any: any, - ancestor: ancestor, - closest: closest, - sibling: sibling, - child: child, - descendant: descendant - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Focus', - - [ - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.PredicateExists', - 'ephox.sugar.api.Traverse', - 'global!document' - ], - - function (Fun, Option, Compare, Element, PredicateExists, Traverse, document) { - var focus = function (element) { - element.dom().focus(); - }; - - var blur = function (element) { - element.dom().blur(); - }; - - var hasFocus = function (element) { - var doc = Traverse.owner(element).dom(); - return element.dom() === doc.activeElement; - }; - - var active = function (_doc) { - var doc = _doc !== undefined ? _doc.dom() : document; - return Option.from(doc.activeElement).map(Element.fromDom); - }; - - var focusInside = function (element) { - // Only call focus if the focus is not already inside it. - var doc = Traverse.owner(element); - var inside = active(doc).filter(function (a) { - return PredicateExists.closest(a, Fun.curry(Compare.eq, element)); - }); - - inside.fold(function () { - focus(element); - }, Fun.noop); - }; - - /** - * Return the descendant element that has focus. - * Use instead of SelectorFind.descendant(container, ':focus') - * because the :focus selector relies on keyboard focus. - */ - var search = function (element) { - return active(Traverse.owner(element)).filter(function (e) { - return element.dom().contains(e.dom()); - }); - }; - - return { - hasFocus: hasFocus, - focus: focus, - blur: blur, - active: active, - search: search, - focusInside: focusInside - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!clearTimeout", [], function () { return clearTimeout; }); -ephox.bolt.module.api.define("global!unescape", [], function () { return unescape; }); -(function (define, require, demand) { -define( - 'ephox.cement.flash.Flashbin', - - [ - 'ephox.cement.alien.WaitForFlash', - 'ephox.cement.style.Styles', - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.epithet.Id', - 'ephox.fred.PlatformDetection', - 'ephox.oilspill.callback.Globaliser', - 'ephox.perhaps.Option', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Focus', - 'ephox.sugar.api.Insert', - 'global!clearTimeout', - 'global!console', - 'global!setTimeout', - 'global!unescape', - 'global!window' - ], - - function (WaitForFlash, Styles, Arr, Obj, Id, PlatformDetection, Globaliser, Option, Event, Events, Class, Css, Element, Focus, Insert, clearTimeout, console, setTimeout, unescape, window) { - var globaliser = Globaliser.install('ephox.flash'); - var platform = PlatformDetection.detect(); - var unbinders = Option.none(); - - return function (swfLoc) { - var events = Events.create({ - response: Event(['rtf']), - spin: Event([]), - cancel: Event([]), - error: Event(['message']), - reset: Event([]), - hide: Event([]) - }); - - var hasLoaded = false; - - var target = Element.fromTag('div'); - Class.add(target, Styles.resolve('flashbin-target')); - - var process = function (rtfData) { - // The setTimeout here is to detach it from the event stack/queue, so that the UI is updated - // during this block. - setTimeout(function () { - events.trigger.response(unescape(rtfData)); - }, 0); - }; - - var loadComplete = function () { - waiting.stop(); - if (hasLoaded) return; - hasLoaded = true; - try { - var dom = bin.dom(); - Obj.each(flashFunctionMapping, function (v, k) { - var f = dom[k]; - f.call(dom, v); // plugin requires 'this' to be set correctly - }); - events.trigger.reset(); - clearOverTime(); - focus(); - } catch (e) { - console.log('Flash dialog - Error during onLoad ', e); - } - }; - - var onloadCallback = globaliser.permanent(loadComplete); - - var flashFunctionMapping = { - 'setSpinCallback': globaliser.permanent(events.trigger.spin), - 'setPasteCallback': globaliser.permanent(process), - 'setEscapeCallback': globaliser.permanent(events.trigger.cancel), - 'setErrorCallback': globaliser.permanent(events.trigger.error) - }; - - var createObject = function () { - var swf = swfLoc.replace(/^https?:\/\//, '//'); - var flashVars = 'onLoad=' + onloadCallback; - - // - // NOTE: the wmode (window mode) of "opaque" here has been suggested as on various forums as - // required to get the swf to focus on Firefox. e.g. - // http://stackoverflow.com/questions/7921690/how-do-i-make-my-flash-object-get-focus-on-load - // This setting did not seem to cause problems on our other supported browsers. - // Please do not return this setting to "transparent" without serious testing. - // - var commonParams = - ' <param name="allowscriptaccess" value="always">' + - ' <param name="wmode" value="opaque">' + - ' <param name="FlashVars" value="' + flashVars + '">'; - - if (platform.browser.isIE() && platform.browser.version.major === 10) { - var id = Id.generate('flash-bin'); - return Element.fromHtml( - '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="' + id + '">' + - '<param name="movie" value="' + swf + '">' + - commonParams + - '</object>'); - } else { - return Element.fromHtml( - '<object type="application/x-shockwave-flash" data="' + swf + '">' + - commonParams + - '</object>'); - } - }; - - var bin = createObject(); - - var binStealth = function () { - Css.setAll(bin, { - 'width' : '2px', - 'height': '2px' - }); - }; - - binStealth(); - var waiting = WaitForFlash(bin, Obj.keys(flashFunctionMapping), loadComplete); - - Insert.append(target, bin); - - var element = function () { - return target; - }; - - var focus = function () { - if (platform.browser.isFirefox()) { - // On Firefox, pasting into flash also fires a paste event wherever the window selection is - window.getSelection().removeAllRanges(); - } - Focus.focus(bin); - }; - - var timerHandle = null; - - var overTime = function () { - Class.add(target, Styles.resolve('flash-activate')); - Css.remove(bin, 'height'); - Css.remove(bin, 'width'); - events.trigger.hide(); - }; - - var clearOverTime = function () { - clearTimeout(timerHandle); - Class.remove(target, Styles.resolve('flash-activate')); - binStealth(); - }; - - var activate = function () { - // TODO: improvement create a custom poll event for .swf has loaded, then fire overtime. - timerHandle = setTimeout(overTime, 3000); - events.trigger.spin(); - Css.set(target, 'display', 'block'); - focus(); - }; - - var deactivate = function () { - Css.set(target, 'display', 'none'); - unbinders.each(function (unbinders) { - Arr.each(unbinders, function (unbinder) { - unbinder.unbind(); - }); - }); - }; - - var destroy = function () { - deactivate(); - Arr.each(Obj.values(flashFunctionMapping), function (s) { - globaliser.unregister(s); - }); - globaliser.unregister(onloadCallback); - waiting.stop(); // in case the user cancels - }; - - return { - focus: focus, - element: element, - activate: activate, - deactivate: deactivate, - destroy: destroy, - events: events.registry - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.impl.FilteredEvent', - - [ - 'ephox.peanut.Fun', - 'ephox.sugar.api.Element' - ], - - function (Fun, Element) { - - var mkEvent = function (target, x, y, stop, prevent, kill, raw) { - // switched from a struct to manual Fun.constant() because we are passing functions now, not just values - return { - 'target': Fun.constant(target), - 'x': Fun.constant(x), - 'y': Fun.constant(y), - 'stop': stop, - 'prevent': prevent, - 'kill': kill, - 'raw': Fun.constant(raw) - }; - }; - - var handle = function (filter, handler) { - return function (rawEvent) { - if (!filter(rawEvent)) return; - - // IE9 minimum - var target = Element.fromDom(rawEvent.target); - - var stop = function () { - rawEvent.stopPropagation(); - }; - - var prevent = function () { - rawEvent.preventDefault(); - }; - - var kill = Fun.compose(prevent, stop); // more of a sequence than a compose, but same effect - - // FIX: Don't just expose the raw event. Need to identify what needs standardisation. - var evt = mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); - handler(evt); - }; - }; - - var binder = function (element, event, filter, handler, useCapture) { - var wrapped = handle(filter, handler); - // IE9 minimum - element.dom().addEventListener(event, wrapped, useCapture); - - return { - unbind: Fun.curry(unbind, element, event, wrapped, useCapture) - }; - }; - - var bind = function (element, event, filter, handler) { - return binder(element, event, filter, handler, false); - }; - - var capture = function (element, event, filter, handler) { - return binder(element, event, filter, handler, true); - }; - - var unbind = function (element, event, handler, useCapture) { - // IE9 minimum - element.dom().removeEventListener(event, handler, useCapture); - }; - - return { - bind: bind, - capture: capture - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.DomEvent', - - [ - 'ephox.peanut.Fun', - 'ephox.sugar.impl.FilteredEvent' - ], - - function (Fun, FilteredEvent) { - var filter = Fun.constant(true); // no filter on plain DomEvents - - var bind = function (element, event, handler) { - return FilteredEvent.bind(element, event, filter, handler); - }; - - var capture = function (element, event, handler) { - return FilteredEvent.capture(element, event, filter, handler); - }; - - return { - bind: bind, - capture: capture - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.flash.FlashDialog', - - [ - 'ephox.cement.flash.FlashInfo', - 'ephox.cement.flash.Flashbin', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.DomEvent', - 'ephox.sugar.api.Element', - 'global!window' - ], - - function (FlashInfo, Flashbin, Event, Events, DomEvent, Element, window) { - - return function (createDialog, settings) { - var translations = settings.translations; - - var events = Events.create({ - response: Event(['rtf', 'hide']), - cancel: Event([]), - error: Event(['message']) - }); - - var open = function () { - var bin = Flashbin(settings.swf); - bin.deactivate(); - - var win = Element.fromDom(window); - var clickEvent = DomEvent.bind(win, 'mouseup', bin.focus); - - var hide = function () { - destroy(); - }; - - var cancel = function () { - hide(); - events.trigger.cancel(); - }; - - bin.events.cancel.bind(cancel); - bin.events.response.bind(function (event) { - // Don't hide immediately - keep the please wait going until the images are converted - events.trigger.response(event.rtf(), hide); - }); - - bin.events.error.bind(function (event) { - hide(); - events.trigger.error(event.message()); - }); - - var dialog = createDialog(); - dialog.setTitle( translations('cement.dialog.flash.title')); - - var information = FlashInfo(bin, dialog.reflow, settings); - information.reset(); - dialog.setContent(information.element()); - - dialog.events.close.bind(cancel); - dialog.show(); - - bin.activate(); - - var destroy = function () { - clickEvent.unbind(); - dialog.destroy(); - bin.destroy(); - }; - }; - - return { - open: open, - events: events.registry - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Replication', - - [ - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Attr, Element, Insert, InsertAll, Remove, Traverse) { - var clone = function (original, deep) { - return Element.fromDom(original.dom().cloneNode(deep)); - }; - - /** Shallow clone - just the tag, no children */ - var shallow = function (original) { - return clone(original, false); - }; - - /** Deep clone - everything copied including children */ - var deep = function (original) { - return clone(original, true); - }; - - /** Shallow clone, with a new tag */ - var shallowAs = function (original, tag) { - var nu = Element.fromTag(tag); - - var attributes = Attr.clone(original); - Attr.setAll(nu, attributes); - - return nu; - }; - - /** Deep clone, with a new tag */ - var copy = function (original, tag) { - var nu = shallowAs(original, tag); - - // NOTE - // previously this used serialisation: - // nu.dom().innerHTML = original.dom().innerHTML; - // - // Clone should be equivalent (and faster), but if TD <-> TH toggle breaks, put it back. - - var cloneChildren = Traverse.children(deep(original)); - InsertAll.append(nu, cloneChildren); - - return nu; - }; - - /** Change the tag name, but keep all children */ - var mutate = function (original, tag) { - var nu = shallowAs(original, tag); - - Insert.before(original, nu); - var children = Traverse.children(original); - InsertAll.append(nu, children); - Remove.remove(original); - return nu; - }; - - return { - shallow: shallow, - shallowAs: shallowAs, - deep: deep, - copy: copy, - mutate: mutate - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.api.RtfImage', - - [ - 'ephox.perhaps.Option', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.PredicateFind', - 'ephox.sugar.api.Replication', - 'ephox.sugar.api.SelectorFilter', - 'ephox.violin.Strings' - ], - - function (Option, Attr, Class, Css, Element, Node, PredicateFind, Replication, SelectorFilter, Strings) { - var searchIn = function (comment, selector) { - var innards = Node.value(comment); - var container = Element.fromTag('div'); - var substr = innards.indexOf(']>'); - container.dom().innerHTML = innards.substr(substr + ']>'.length); - // Note: It doesn't look like sizzle can pick up namespaced tags with selectors. - return PredicateFind.descendant(container, function (elem) { - return Node.name(elem) === selector; - }); - }; - - var scour = function (target) { - return Node.isComment(target) ? searchIn(target, 'v:shape') : Option.none(); - }; - - var vshape = function (original) { - return scour(original).map(function (image) { - // NOTE: If we discover more than 2 possible attributes, de-dupe with HtmlPaste somehow - var spid = Attr.get(image, 'o:spid'); - var vShapeId = spid === undefined ? Attr.get(image, 'id') : spid; - - var result = Element.fromTag('img'); - Class.add(result, 'rtf-data-image'); - Attr.set(result, 'data-image-id', vShapeId.substr('_x0000_'.length)); - Attr.set(result, 'data-image-type', 'code'); - Css.setAll(result, { - width: Css.get(image, 'width'), - height: Css.get(image, 'height') - }); - - return result; - }); - }; - - var local = function (original) { - if (Node.name(original) === 'img') { - var src = Attr.get(original, 'src'); - if (src !== undefined && src !== null && Strings.startsWith(src, 'file://')) { - var result = Replication.shallow(original); - var parts = src.split(/[\/\\]/); - var last = parts[parts.length - 1]; - Attr.set(result, 'data-image-id', last); - Attr.remove(result, 'src'); - Attr.set(result, 'data-image-type', 'local'); - Class.add(result, 'rtf-data-image'); - return Option.some(result); - } else { - return Option.none(); - } - } else { - return Option.none(); - } - }; - - var exists = function (container) { - return find(container).length > 0; - }; - - var find = function (container) { - return SelectorFilter.descendants(container, '.rtf-data-image'); - }; - - return { - local: local, - vshape: vshape, - find: find, - exists: exists, - scour: scour - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.flash.Flash', - - [ - 'ephox.bowerbird.api.Rtf', - 'ephox.cement.flash.Correlation', - 'ephox.cement.flash.FlashDialog', - 'ephox.compass.Arr', - 'ephox.limbo.api.RtfImage', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Rtf, Correlation, FlashDialog, Arr, RtfImage, Event, Events, Remove, Traverse) { - return function (createDialog, cementConfig) { - var events = Events.create({ - error: Event(['message']), - insert: Event(['elements', 'assets']) - }); - - var gordon = function (content, baseAssets) { - var response = function (event) { - var hideDialog = event.hide(); - var imageData = Rtf.images(event.rtf()); - var images = RtfImage.find(content); - - Correlation.convert(images, imageData, function (assets) { - events.trigger.insert(Traverse.children(content), assets.concat(baseAssets)); - - // when images are pasted, the flash dialog doesn't automatically hide - hideDialog(); - }); - }; - - var cancelImages = function () { - var images = RtfImage.find(content); - Arr.each(images, Remove.remove); - events.trigger.insert(Traverse.children(content), baseAssets); - }; - - if (cementConfig.allowLocalImages) { - var flash = FlashDialog(createDialog, cementConfig); - flash.events.response.bind(response); - flash.events.cancel.bind(cancelImages); - flash.events.error.bind(function (event) { events.trigger.error(event.message()); }); - flash.open(); - } else { - cancelImages(); - events.trigger.error('errors.local.images.disallowed'); - } - }; - - return { - events: events.registry, - gordon: gordon - }; - - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.smartpaste.MergeSettings', - - [ - 'ephox.cement.style.Styles', - 'ephox.highway.Merger', - 'ephox.peanut.Fun', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert' - ], - - function (Styles, Merger, Fun, Event, Events, Class, Element, Insert) { - return function (createDialog, settings) { - var translations = settings.translations; - - var result = function (value, settings, callback) { - callback(Merger.merge(settings, { - mergeOfficeStyles: value, - mergeHtmlStyles: value - })); - }; - - var events = Events.create({ - open: Event([]), - cancel: Event([]), - close: Event([]) - }); - - var showDialog = function (settings, callback) { - var clean = function () { - hide(); - result(false, settings, callback); - }; - - var merge = function () { - hide(); - result(true, settings, callback); - }; - - var content = Element.fromTag('div'); - - Class.add(content, Styles.resolve('styles-dialog-content')); - - var instructions = Element.fromTag('p'); - var text = Element.fromText(translations('cement.dialog.paste.instructions')); - Insert.append(instructions, text); - Insert.append(content, instructions); - - var cleanButton = { - text: translations('cement.dialog.paste.clean'), - tabindex: 0, - className: Styles.resolve('clean-styles'), - click: clean - }; - var mergeButton = { - text: translations('cement.dialog.paste.merge'), - tabindex: 1, - className: Styles.resolve('merge-styles'), - click: merge - }; - - var dialog = createDialog(true); - dialog.setTitle(translations('cement.dialog.paste.title')); - dialog.setContent(content); - dialog.setButtons([cleanButton, mergeButton]); - dialog.show(); - - var hide = function () { - events.trigger.close(); - dialog.destroy(); - }; - - var cancel = function () { - events.trigger.cancel(); - hide(); - }; - - dialog.events.close.bind(cancel); - - events.trigger.open(); - }; - - var get = function (officePaste, callback) { - var input = officePaste ? 'officeStyles' : 'htmlStyles'; - - var settingToUse = settings[input]; - - if (settingToUse === 'clean') { - result(false, settings, callback); - } else if (settingToUse === 'merge') { - result(true, settings, callback); - } else { - // everything else is prompt - showDialog(settings, callback); - } - }; - - return { - events: events.registry, - get: get, - destroy: Fun.noop - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.smartpaste.Inspection', - - [ - - ], - - function () { - var isValidData = function (data) { - // IE doesn't even have data. Spartan has data, but no types. - return data !== undefined && data.types !== undefined && data.types !== null; - }; - - return { - isValidData: isValidData - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.html.Transform', - - [ - 'ephox.classify.Type', - 'ephox.sugar.api.Attr' - ], - - function (Type, Attr) { - var rotateImage = function (img, vshapeAttrs) { - // MS Word tends to store rotated images as raw with a rotation applied - var style = vshapeAttrs.style; - if (Attr.has(img, 'width') && Attr.has(img, 'height') && Type.isString(style)) { - var rotation = style.match(/rotation:([^;]*)/); - if (rotation !== null && (rotation[1] === '90' || rotation[1] === '-90')) { - // We can't actually rotate the binary data, so just swap the width and height. - // When we decide to rotate the data, we can't do it here. - Attr.setAll(img, { - width: Attr.get(img, 'height'), - height: Attr.get(img, 'width') - }); - } - } - }; - - return { - rotateImage: rotateImage - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Comments', - - [ - 'ephox.fred.PlatformDetection', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Element', - 'global!document' - ], - - function (PlatformDetection, Fun, Element, document) { - - var regularGetNodes = function (texas) { - var ret = []; - while (texas.nextNode() !== null) ret.push(Element.fromDom(texas.currentNode)); - return ret; - }; - - var ieGetNodes = function (texas) { - // IE throws an error on nextNode() when there are zero nodes available, and any attempts I made to detect this - // just resulted in throwing away valid cases - try { - return regularGetNodes(texas); - } catch (e) { - return []; - } - }; - - // I hate needing platform detection in Sugar, but the alternative is to always try/catch which will swallow coding errors as well - var browser = PlatformDetection.detect().browser; - var getNodes = browser.isIE() || browser.isSpartan() ? ieGetNodes : regularGetNodes; - - // Weird, but oh well - var noFilter = Fun.constant(Fun.constant(true)); - - var find = function (node, filterOpt) { - - var vmlFilter = filterOpt.fold(noFilter, function (filter) { - return function (comment) { - return filter(comment.nodeValue); - }; - }); - - // the standard wants an object, IE wants a function. But everything is an object, so let's be sneaky - // http://www.bennadel.com/blog/2607-finding-html-comment-nodes-in-the-dom-using-treewalker.htm - vmlFilter.acceptNode = vmlFilter; - - // TODO: Add NodeFilter to numerosity (requires IE9 so can't be a global import) - var texas = document.createTreeWalker(node.dom(), NodeFilter.SHOW_COMMENT, vmlFilter, false); - - return getNodes(texas); - }; - return { - find: find - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.alien.Comments', - - [ - 'ephox.perhaps.Option', - 'ephox.sugar.api.Comments', - 'ephox.violin.Strings', - 'global!document' - ], - - function (Option, Comments, Strings, document) { - - var find = function (node) { - // TODO: Should this be in lingo? - return Comments.find(node, Option.some(function (value) { - return Strings.startsWith(value, '[if gte vml 1]'); // faster than contains on huge MS office comments - })); - }; - return { - find: find - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.perhaps.Options', - - [ - 'ephox.perhaps.Option' - ], - - function (Option) { - var cat = function (arr) { - var r = []; - var push = function (x) { - r.push(x); - }; - for (var i = 0; i < arr.length; i++) { - arr[i].each(push); - } - return r; - }; - - var findMap = function (arr, f) { - for (var i = 0; i < arr.length; i++) { - var r = f(arr[i], i); - if (r.isSome()) { - return r; - } - } - return Option.none(); - }; - - /** - if all elements in arr are 'some', their inner values are passed as arguments to f - f must have arity arr.length - */ - var liftN = function(arr, f) { - var r = []; - for (var i = 0; i < arr.length; i++) { - var x = arr[i]; - if (x.isSome()) { - r.push(x.getOrDie()); - } else { - return Option.none(); - } - }; - return Option.some(f.apply(null, r)); - }; - - return { - cat: cat, - findMap: findMap, - liftN: liftN - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.images.ImageReference', - - [ - 'ephox.cement.alien.Comments', - 'ephox.compass.Arr', - 'ephox.limbo.api.RtfImage', - 'ephox.perhaps.Option', - 'ephox.perhaps.Options', - 'ephox.scullion.Struct', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Elements', - 'ephox.sugar.api.SelectorFilter', - 'global!console' - ], - - function (Comments, Arr, RtfImage, Option, Options, Struct, Attr, Elements, SelectorFilter, console) { - var imgData = Struct.immutable('img', 'vshape'); - - var getImageAttrs = function (image) { - var imgAttrs = getAttrs(image); - imgAttrs._rawElement = image.dom(); - return imgAttrs; - }; - - var getVshapeAttrs = function (vshape) { - var vsAttr = getAttrs(vshape); - vsAttr._rawElement = vshape.dom(); - return vsAttr; - }; - - var getAttrs = function (element) { - return Attr.clone(element); - }; - - var extract = function (raw) { - var nodes = Elements.fromHtml(raw); - var images = Arr.bind(nodes, function (n) { - return SelectorFilter.descendants(n, 'img'); - }); - - var comments = Arr.bind(nodes, Comments.find); - var vshapes = Options.cat(Arr.map(comments, RtfImage.scour)); - - var list = Arr.map(images, function (image) { - return traverse(image, vshapes); - }); - return Options.cat(list); - }; - - var traverse = function (element, vshapes) { - var vshapeTarget = Attr.get(element, 'v:shapes'); - - var vshapeOpt = Option.from(Arr.find(vshapes, function (vshape) { - return Attr.get(vshape, 'id') === vshapeTarget; - })); - - if (vshapeOpt.isNone()) console.log('WARNING: unable to find data for image', element.dom()); - - return vshapeOpt.map(function (vshape) { - return pack(element, vshape); - }); - }; - - var pack = function (img, vshape) { - return imgData( - getImageAttrs(img), - getVshapeAttrs(vshape) - ); - }; - - return { - extract: extract - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.photon.Reader', - - [ - 'ephox.perhaps.Option', - 'ephox.sugar.api.Element' - ], - - function (Option, Element) { - - var iframeDoc = function (element) { - var dom = element.dom(); - try { - var idoc = dom.contentWindow ? dom.contentWindow.document : dom.contentDocument; - return idoc !== undefined && idoc !== null ? Option.some(Element.fromDom(idoc)) : Option.none(); - } catch (err) { - // ASSUMPTION: Permission errors result in an unusable iframe. - console.log('Error reading iframe: ', dom); - console.log('Error was: ' + err); - return Option.none(); - } - }; - - var doc = function (element) { - var optDoc = iframeDoc(element); - return optDoc.fold(function () { - return element; - }, function (v) { - return v; - }); - }; - - return { - doc: doc - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.photon.Writer', - - [ - 'ephox.photon.Reader', - 'ephox.sugar.api.Body' - ], - - function (Reader, Body) { - - var write = function (element, content) { - if (!Body.inBody(element)) throw 'Internal error: attempted to write to an iframe that is not in the DOM'; - - var doc = Reader.doc(element); - var dom = doc.dom(); - dom.open(); - dom.writeln(content); - dom.close(); - }; - - return { - write: write - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Ready', - - [ - 'ephox.sugar.api.DomEvent', - 'ephox.sugar.api.Element', - 'global!document' - ], - - function (DomEvent, Element, document) { - var execute = function (f) { - /* - * We only use this in one place, so creating one listener per ready request is more optimal than managing - * a single event with a queue of functions. - */ - - /* The general spec describes three states: loading, complete, and interactive. - * https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness - * - * loading: the document is not ready (still loading) - * interactive: the document is ready, but sub-resources are still loading - * complete: the document is completely ready. - * - * Note, IE and w3 schools talk about: uninitialized and loaded. We may have to handle them in the future. - */ - if (document.readyState === 'complete' || document.readyState === 'interactive') f(); - else { - // Note that this fires when DOM manipulation is allowed, but before all resources are - // available. This is the best practice but might be a bit weird. - var listener = DomEvent.bind(Element.fromDom(document), 'DOMContentLoaded', function () { // IE9 minimum - f(); - listener.unbind(); - }); - } - }; - - return { - execute: execute - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.keurig.loader.GWTLoader', - - [ - 'ephox.fred.PlatformDetection', - 'ephox.oilspill.callback.Globaliser', - 'ephox.peanut.Fun', - 'ephox.peanut.Thunk', - 'ephox.perhaps.Option', - 'ephox.photon.Writer', - 'ephox.sugar.api.Body', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.DomEvent', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Ready', - 'ephox.sugar.api.Remove' - ], - - function (PlatformDetection, Globaliser, Fun, Thunk, Option, Writer, Body, Css, DomEvent, Element, Insert, Ready, Remove) { - var globaliser = Globaliser.install('ephox.keurig.init'); - var cleanFunction = Option.none(); - - // IE11 can't handle loading GWT in an iframe, not with the collapse into a single JS file instead of 5 HTML files. - // It seems to load ok in WordTest.html, though, which does it directly - worth thinking about if we ever need GWT in IE. - var load = PlatformDetection.detect().browser.isIE() ? Fun.noop : Thunk.cached(function (baseUrl) { - var container = Element.fromTag('div'); - if (baseUrl === undefined) throw 'baseUrl was undefined'; - - var iframe = Element.fromTag('iframe'); - - Css.setAll(container, { - display: 'none' - }); - - var frameLoad = DomEvent.bind(iframe, 'load', function () { - // called when gwt moudle has finished loading. - var gwtInitCallback = function (cleanDocument) { - cleanFunction = Option.some(cleanDocument); - if (!PlatformDetection.detect().browser.isSafari()) { - // Safari can't handle executing JS in an iframe that has been removed from the page - Remove.remove(container); - } - }; - - var gwtInitRef = globaliser.ephemeral(gwtInitCallback); - var gwtjs = baseUrl + '/wordimport.js'; - - Writer.write(iframe, - '<script type="text/javascript" src="' + gwtjs + '"></script>' + - '<script type="text/javascript">' + - 'function gwtInited () {' + - 'parent.window.' + gwtInitRef + '(com.ephox.keurig.WordCleaner.cleanDocument);' + - '};' + - '</script>'); - frameLoad.unbind(); - }); - - Ready.execute(function () { - Insert.append(Body.body(), container); - Insert.append(container, iframe); - }); - }); - - var cleanDocument = function (wordHTML, merge) { - return cleanFunction.map(function (f) { - // TODO: This should probably do something with the log instead of throwing it away in the Java side - return f(wordHTML, merge); - }); - }; - - var ready = function () { - return cleanFunction.isSome(); - }; - - return { - load: load, - cleanDocument: cleanDocument, - ready: ready - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.keurig.api.WordCleaner', - - [ - 'ephox.keurig.loader.GWTLoader' - ], - - function (GWTLoader) { - return function (baseUrl) { - if (!GWTLoader.ready()) GWTLoader.load(baseUrl); - - return { - cleanDocument: GWTLoader.cleanDocument - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.photon.Sandbox', - - [ - 'ephox.peanut.Fun', - 'ephox.photon.Writer', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.DomEvent', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Remove', - 'global!setTimeout' - ], - - function (Fun, Writer, Css, DomEvent, Element, Insert, Remove, setTimeout) { - return function (uiContainer) { - /** - * Creates a sandbox to play in. - * - * Asynchronously creates an iframe, runs the synchronous function `f` on the DOM, and then passes the result to the callback. - * - * This is done so that the sandbox can guarantee the iframe has been removed from the page, and available for garbage collection, before the callback is executed. - * - * html: - * source to load into the iframe - * f: (document -> body -> A) - * function that operates on the iframe DOM, passed both document reference and body element - * callback: (A -> Unit) - * function that receives the output of `f` when the iframe has been cleaned up - */ - var play = function (html, f, callback) { - var outputContainer = Element.fromTag('div'); - var iframe = Element.fromTag('iframe'); - - Css.setAll(outputContainer, { - display: 'none' - }); - - var load = DomEvent.bind(iframe, 'load', function () { - Writer.write(iframe, html); - - var rawDoc = iframe.dom().contentWindow.document; - if (rawDoc === undefined) throw "sandbox iframe load event did not fire correctly"; - var doc = Element.fromDom(rawDoc); - - var rawBody = rawDoc.body; - if (rawBody === undefined) throw "sandbox iframe does not have a body"; - var body = Element.fromDom(rawBody); - - // cache - var result = f(doc, body); - - // unbind and remove everything - load.unbind(); - Remove.remove(outputContainer); - - // setTimeout should allow the garbage collector to cleanup if necessary - setTimeout(Fun.curry(callback, result), 0); - }); - Insert.append(outputContainer, iframe); - Insert.append(uiContainer, outputContainer); - }; - - return { - play: play - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.impl.NodeValue', - - [ - 'ephox.perhaps.Option', - 'global!Error' - ], - - function (Option, Error) { - return function (is, name) { - var get = function (element) { - if (!is(element)) throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); - return getOption(element).getOr(''); - }; - - var getOption = function (element) { - try { - return is(element) ? Option.some(element.dom().nodeValue) : Option.none(); - } catch (e) { - return Option.none(); // Prevent IE10 from throwing exception when setting parent innerHTML clobbers (TBIO-451). - } - }; - - var set = function (element, value) { - if (!is(element)) throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); - element.dom().nodeValue = value; - }; - - return { - get: get, - getOption: getOption, - set: set - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Comment', - - [ - 'ephox.sugar.api.Node', - 'ephox.sugar.impl.NodeValue' - ], - - function (Node, NodeValue) { - var api = NodeValue(Node.isComment, 'comment'); - - var get = function (element) { - return api.get(element); - }; - - var getOption = function (element) { - return api.getOption(element); - }; - - var set = function (element, value) { - api.set(element, value); - }; - - return { - get: get, - getOption: getOption, - set: set - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Html', - - [ - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert' - ], - - function ( Element, Insert) { - var get = function (element) { - return element.dom().innerHTML; - }; - - var set = function (element, content) { - element.dom().innerHTML = content; - }; - - var getOuter = function (element) { - var container = Element.fromTag('div'); - var clone = Element.fromDom(element.dom().cloneNode(true)); - Insert.append(container, clone); - return get(container); - }; - - return { - get: get, - set: set, - getOuter: getOuter - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.vogue.css.Set', - - [ - 'ephox.sugar.api.Insert' - ], - - function (Insert) { - - var setCss = function (style, css, element) { - if (style.dom().styleSheet) - style.dom().styleSheet.cssText = css; // IE - else - Insert.append(style, element); - }; - - return { - setCss: setCss - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.vogue.util.Regex', - - [ - ], - - function () { - var escape = function (text) { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - }; - - return { - escape: escape - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -ephox.bolt.module.api.define("global!RegExp", [], function () { return RegExp; }); -(function (define, require, demand) { -define( - 'ephox.vogue.css.Url', - - [ - 'ephox.compass.Obj', - 'ephox.vogue.util.Regex', - 'global!RegExp' - ], - - function (Obj, Regex, RegExp) { - var replace = function (css, urlPrefix, replacement) { - var r = new RegExp('url\\(\\s*[\'"]?' + Regex.escape(urlPrefix) + '(.*?)[\'"]?\\s*\\)', 'g'); - return css.replace(r, 'url("' + replacement + '$1")'); - }; - - var replaceMany = function (css, replacements) { - var current = css; - Obj.each(replacements, function (value, key) { - current = replace(current, key, value); - }); - return current; - }; - - return { - replace: replace, - replaceMany: replaceMany - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.vogue.api.DocStyle', - - [ - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.SelectorFind', - 'ephox.vogue.css.Set', - 'ephox.vogue.css.Url', - 'global!Array' - ], - - function (Attr, Element, Insert, SelectorFind, Set, Url, Array) { - - var styletag = function (doc) { - var style = Element.fromTag('style', doc.dom()); - Attr.set(style, 'type', 'text/css'); - return style; - }; - - var setCss = function (style, css, doc) { - Set.setCss(style, css, Element.fromText(css, doc.dom())); - }; - - var inject = function (css, replacements, doc) { - var style = styletag(doc); - var replacedCss = replacements === undefined ? css : Url.replaceMany(css, replacements); - setCss(style, replacedCss, doc); - var head = SelectorFind.descendant(doc, 'head').getOrDie(); - Insert.append(head, style); - }; - - var stylesheets = function (doc) { - var domStyleSheets = doc.dom().styleSheets; - return Array.prototype.slice.call(domStyleSheets); - }; - - return { - stylesheets: stylesheets, - inject: inject - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.vogue.css.Rules', - - [ - 'ephox.compass.Arr', - 'ephox.scullion.Struct' - ], - - function (Arr, Struct) { - var ruleStruct = Struct.immutable('selector', 'style'); - - var extract = function (stylesheet) { - var domRules = stylesheet.cssRules; - return Arr.map(domRules, function (rule) { - var selector = rule.selectorText; - var style = rule.style.cssText; - if (style === undefined) { - // This should be picked up in testing, and perhaps delete the check eventually - throw "WARNING: Browser does not support cssText property"; - } - return ruleStruct(selector, style); - }); - }; - - var extractAll = function (stylesheets) { - return Arr.bind(stylesheets, extract); - }; - - return { - extract: extract, - extractAll: extractAll - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.vogue.api.Rules', - - [ - 'ephox.vogue.css.Rules' - ], - - function (Rules) { - var extract = function (stylesheet) { - return Rules.extract(stylesheet); - }; - - var extractAll = function (stylesheets) { - return Rules.extractAll(stylesheets); - }; - - return { - extract: extract, - extractAll: extractAll - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.html.HtmlPaste', - - [ - 'ephox.cement.html.Transform', - 'ephox.cement.images.ImageReference', - 'ephox.classify.Type', - 'ephox.compass.Arr', - 'ephox.keurig.api.WordCleaner', - 'ephox.peanut.Fun', - 'ephox.photon.Sandbox', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Comment', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Elements', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFilter', - 'ephox.sugar.api.Traverse', - 'ephox.vogue.api.DocStyle', - 'ephox.vogue.api.Rules', - 'global!document' - ], - - function (Transform, ImageReference, Type, Arr, WordCleaner, Fun, Sandbox, Event, Events, Attr, Class, Comment, Element, Elements, Html, Remove, SelectorFilter, Traverse, DocStyle, Rules, document) { - var flagAttribute = 'data-textbox-image'; - - var emptyString = function (s) { - return s === undefined || s === null || s.length === 0; - }; - - var stripImageSources = function (html) { - var count = 1; - return html.replace(/(<img[^>]*)src=".*?"/g, function (match, p1, offset) { - // the actual contents are irrelevant, it just needs to be unique - return p1 + flagAttribute + '="' + count++ + '"'; - }); - }; - - var removeFragmentComments = function (body) { - var bodyChildren = Traverse.children(body); - Arr.each(bodyChildren, function (c) { - Comment.getOption(c).each(function (commentText) { - if (commentText === 'StartFragment' || commentText === 'EndFragment') { - Remove.remove(c); - } - }); - }); - }; - - var insertRtfCorrelation = function (sourceImageList, tordImages) { - Arr.each(tordImages, function (img) { - var imageCounter = Attr.get(img, flagAttribute); - Arr.each(sourceImageList, function (imgData) { - var imgAttrs = imgData.img(); - var vshapeAttrs = imgData.vshape(); - if (imgAttrs[flagAttribute] == imageCounter) { - // NOTE: If we discover more than 2 possible attributes, de-dupe with RtfImage somehow - var spid = vshapeAttrs['o:spid']; - var vshapeId = spid === undefined ? vshapeAttrs.id : spid; - - Transform.rotateImage(img, vshapeAttrs); - - Class.add(img, 'rtf-data-image'); - Attr.set(img, 'data-image-id', vshapeId.substr('_x0000_'.length)); - Attr.set(img, 'data-image-type', 'code'); - Attr.remove(img, flagAttribute); - } - }); - }); - }; - - var mergeInlineStyles = function (body, stylesheets) { - var rules = Rules.extractAll(stylesheets); - Arr.each(rules, function (rule) { - - var matchingElements = SelectorFilter.descendants(body, rule.selector()); - - Arr.each(matchingElements, function (element) { - Attr.remove(element, 'class'); - Attr.set(element, 'style', rule.style()); - }); - }); - }; - - var tordPostProcessor = function (sourceImageList, mergeStyles) { - var sandbox = Sandbox(Element.fromDom(document.body)); - return function (dump, callback) { - // loading dump into the sandbox *will* perform some built-in browser cleanup operations, - // we are hoping this is a suitable replacement for the use of HTML Tidy in ELJ. - sandbox.play(dump, function (iframeDoc, body) { - var images = SelectorFilter.descendants(body, 'img'); - - // post-tord DOM filters - removeFragmentComments(body); - insertRtfCorrelation(sourceImageList, images); - if (mergeStyles) { - mergeInlineStyles(body, DocStyle.stylesheets(iframeDoc)); - } - - return Html.get(body); - }, callback); - }; - }; - - var cleanEnd = function (raw) { - // Trim any weirdness that exists after the closing HTML tag. - var i = raw.indexOf('</html>'); - return (i > -1) ? raw.substr(0, i + '</html>'.length) : raw; - }; - - return function (mergeSettings, pasteSettings) { - var cleaner = WordCleaner(pasteSettings.baseUrl); - - var events = Events.create({ - paste: Event(['elements', 'assets']), - error: Event(['message']) - }); - - var handler = function (raw) { - var html = cleanEnd(raw); - // This will only be called if we have word styles, so force true - mergeSettings.get(true, function (settings) { - var mergeStyles = settings.mergeOfficeStyles; - - // remove local file references, so that loading the HTML into a DOM does not trigger console warnings - var safeHtml = stripImageSources(html); - - var sourceImageList = ImageReference.extract(safeHtml); - - var postProcess = tordPostProcessor(sourceImageList, mergeStyles); - - cleaner.cleanDocument(safeHtml, mergeStyles).fold(function () { - events.trigger.error('errors.paste.word.notready'); - }, function (dump) { - if (emptyString(dump)) events.trigger.paste([], []); - else { - // postProcess is basically String -> Future (String) - postProcess(dump, function (tordHtml) { - var elements = Elements.fromHtml(tordHtml); - events.trigger.paste(elements, []); - }); - } - - }); - }); - return true; - }; - - return { - handler: handler, - isSupported: Fun.constant(true), - events: events.registry - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.images.ImagePaste', - - [ - 'ephox.compass.Arr', - 'ephox.fred.PlatformDetection', - 'ephox.hermes.api.ImageAsset', - 'ephox.hermes.api.ImageExtract', - 'ephox.peanut.Fun', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'global!console' - ], - - function (Arr, PlatformDetection, ImageAsset, ImageExtract, Fun, Event, Events, Attr, Element, console) { - return function (pasteSettings) { - var platform = PlatformDetection.detect(); - var CAPTUTED_EVENT = true; - - //IE & FF handle image paste conversion into base64 data URIs automatically - var isSupported = !platform.browser.isIE() && !platform.browser.isFirefox(); - - var events = Events.create({ - paste: Event(['elements', 'assets']), - error: Event(['message']) - }); - - var readImages = function (assets) { - return Arr.bind(assets, function (asset) { - return ImageAsset.cata(asset, - function (id, file, objurl, data) { - // create an image and inject it at the current selection - var image = Element.fromTag('img'); - Attr.set(image, 'src', objurl); - return image; - }, - function (id, url, raw) { - // TODO: Is this the best way? - console.log('Internal error: Paste operation produced an image URL instead of a Data URI: ', url); - } - ); - }); - }; - - var actualHandler = function (clipboardItems) { - var images = Arr.filter(clipboardItems, function (item) { - return item.kind === 'file' && /image/.test(item.type); - }); - - var files = Arr.map(images, function (image) { - return image.getAsFile(); - }); - - ImageExtract.toAssets(files, function (assets) { - // perform the insert (SmartPaste handles undo and focus trickery) - var elements = readImages(assets); - events.trigger.paste(elements, assets); - }); - //prevent other content from coming through - return CAPTUTED_EVENT; - }; - - var safariHandler = function () { - events.trigger.error('safari.imagepaste'); - // prevent default paste - return CAPTUTED_EVENT; - }; - - var imageDisabled = function () { - events.trigger.error('errors.local.images.disallowed'); - return CAPTUTED_EVENT; - }; - - var imageHandler = platform.browser.isSafari() ? safariHandler : actualHandler; - - var handler = pasteSettings.allowLocalImages ? imageHandler : imageDisabled; - - return { - handler: handler, - isSupported: Fun.constant(isSupported), - events: events.registry - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.api.CementConstants', - - [ - 'ephox.cement.style.Styles', - 'ephox.peanut.Fun' - ], - - function (Styles, Fun) { - - /* - The filter history may not quite work as I would hope. The problem it is likely to - have is that it might be the content's selection as well, which means that we are - changing what is about to used as serialisation ... likely leading to issues. I think - it just only sets valid selections, so it will probably be ok .. but the cursor will - be jarring. - - The paste bin class is added when the paste event is being triggered in the setTimeout. - That may be too late for it not to end up in the undo history, but currently it seems - like it will possibly work. Adding the class directly to the element would be more reliable, - but I haven't thought of a clean enough way to do that yet. - */ - var bin = Styles.resolve('smartpaste-eph-bin'); - - return { - binStyle: Fun.constant(bin) - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.knoch.core.Bounce', - - [ - 'global!Array' - ], - - function (Array) { - - var bounce = function(f) { - return function() { - var args = Array.prototype.slice.call(arguments); - var me = this; - setTimeout(function() { - f.apply(me, args); - }, 0); - }; - }; - - return { - bounce: bounce - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.knoch.core.FutureOps', - - [ - ], - - function () { - - return function (nu, get) { - - /** map :: this Future a -> (a -> b) -> Future b */ - var map = function(fab) { - return nu(function(callback) { - get(function(a) { - callback(fab(a)); - }); - }); - }; - - /** bind :: this Future a -> (a -> Future b) -> Future b */ - var bind = function(aFutureB) { - return nu(function(callback) { - get(function(a) { - aFutureB(a).get(callback); - }); - }); - }; - - /** anonBind :: this Future a -> Future b -> Future b - * Returns a future, which evaluates the first future, ignores the result, then evaluates the second. - */ - var anonBind = function(futureB) { - return nu(function(callback) { - get(function(a) { - futureB.get(callback); - }); - }); - }; - - return { - get: get, - map: map, - bind: bind, - anonBind: anonBind - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.knoch.future.Future', - - [ - 'ephox.compass.Arr', - 'ephox.knoch.core.Bounce', - 'ephox.knoch.core.FutureOps' - ], - - /** A future value that is evaluated on demand. The base function is re-evaluated each time 'get' is called. */ - function (Arr, Bounce, FutureOps) { - - // baseFn is a function(callback) { ... } - var nu = function(baseFn) { - - var get = function(callback) { - baseFn(Bounce.bounce(callback)); - }; - - return FutureOps(nu, get); - }; - - /** [Future a] -> Future [a] */ - var par = function(futures) { - return nu(function(callback) { - var r = []; - var count = 0; - - var cb = function(i) { - return function(value) { - r[i] = value; - count++; - if (count >= futures.length) { - callback(r); - } - }; - }; - - if (futures.length === 0) { - callback([]); - } else { - Arr.each(futures, function(future, i) { - future.get(cb(i)); - }); - } - }); - }; - - /** [a] -> (a -> Future b) -> Future [b] */ - var mapM = function(as, fn) { - return par(Arr.map(as, fn)); - }; - - /** (Future a, Future b) -> ((a, b) -> c) -> Future C - * Executes the two futures in "parallel" with respect to browser JS threading. - */ - var lift2 = function(fa, fb, abc) { - return nu(function(callback) { - var completeA = false; - var completeB = false; - var valueA = undefined; - var valueB = undefined; - - var done = function() { - if (completeA && completeB) { - var c = abc(valueA, valueB); - callback(c); - } - }; - - fa.get(function(a) { - valueA = a; - completeA = true; - done(); - }); - - fb.get(function(b) { - valueB = b; - completeB = true; - done(); - }); - }); - }; - - return { - nu: nu, - par: par, - mapM: mapM, - lift2: lift2 - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.knoch.future.CachedFuture', - - [ - 'ephox.compass.Arr', - 'ephox.highway.Merger', - 'ephox.knoch.core.Bounce', - 'ephox.knoch.core.FutureOps', - 'ephox.knoch.future.Future', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - /** - * A future value. - * The base function is evaluated eagerly, and only evaluated once. - * Each call to 'get' queues a callback, which is invoked when the value is available. - */ - function (Arr, Merger, Bounce, FutureOps, Future, Fun, Option) { - - // f is a function(callback) { ... } - var nu = function (baseFn) { - - var data = Option.none(); - var callbacks = []; - - var get = function (callback) { - isSet() ? call(callback) : callbacks.push(callback); - }; - - var set = function (x) { - data = Option.some(x); - run(callbacks); - callbacks = []; - }; - - var isSet = function() { - return data.isSome(); - }; - - var run = function (cbs) { - Arr.each(cbs, call); - }; - - var call = function(cb) { - data.each(function(x) { - Bounce.bounce(cb)(x); - }); - }; - - Future.nu(baseFn).get(set); - - var ops = FutureOps(nu, get); - - return Merger.merge(ops, { - isSet: isSet - }); - }; - - return { - nu: nu - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.pastiche.IeBlob', - - [ - 'ephox.compass.Arr', - 'ephox.epithet.Resolve', - 'ephox.hermes.api.ImageExtract', - 'ephox.knoch.future.CachedFuture', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - function (Arr, Resolve, ImageExtract, CachedFuture, Fun, Option) { - var convertURL = function (raw) { - return raw.convertURL !== undefined ? raw.convertURL // Use standard if available. - : raw.msConvertURL !== undefined ? raw.msConvertURL - : undefined; - }; - - var convert = function (raw) { - // IE11 defines data on the window, but requires the event to convert... /headdesk - var files = Resolve.resolve('window.clipboardData.files'); - - var convert = convertURL(raw); - - if (files !== undefined && convert !== undefined && files.length > 0) { - var blobs = Arr.map(files, function (file) { - var blob = ImageExtract.blob(file); - convert.apply(raw, [file, 'specified', blob.objurl()]); - - return blob; - }); - - // do the async operation in a future - var future = CachedFuture.nu(function (callback) { - ImageExtract.fromBlobs(blobs, callback); - }); - - // initiate the conversion immediately - future.get(Fun.noop); - - return Option.some(future); - } else { - return Option.none(); - } - }; - - return { - convert: convert - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.api.Situ', - - [ - ], - - function () { - var on = function (element, offset) { - return folder(function (b, o, a) { - return o(element, offset); - }); - }; - - var before = function (element) { - return folder(function (b, o, a) { - return b(element); - }); - }; - - var after = function (element) { - return folder(function (b, o, a) { - return a(element); - }); - }; - - - var folder = function(fold) { - return { - fold: fold - }; - }; - - return { - on: on, - before: before, - after: after - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.api.SelectionRange', - - [ - 'ephox.fussy.api.Situ', - 'ephox.scullion.Struct', - 'ephox.sugar.api.Element' - ], - - function (Situ, Struct, Element) { - var read = Struct.immutable('start', 'soffset', 'finish', 'foffset'); - var general = Struct.immutable('start', 'soffset', 'finish', 'foffset'); - var write = Struct.immutable('start', 'finish'); - - var writeFromNative = function (range) { - var start = Element.fromDom(range.startContainer); - var finish = Element.fromDom(range.endContainer); - return write( - Situ.on(start, range.startOffset), - Situ.on(finish, range.endOffset) - ); - }; - - return { - read: read, - general: general, - write: write, - writeFromNative: writeFromNative - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.api.Supported', - - [ - ], - - function () { - var run = function (win, w3c) { - // this is scaffolding for what was an alternate selection model. - // We now only have one but the concept could be useful later. - if (win.getSelection) return w3c(win, win.getSelection()); - else throw 'No selection model supported.'; - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.DocumentPosition', - - [ - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Traverse' - ], - - function (Compare, Traverse ) { - var after = function (start, soffset, finish, foffset) { - var doc = Traverse.owner(start); - - // TODO: Find a sensible place to put the native range creation code. - var rng = doc.dom().createRange(); - rng.setStart(start.dom(), soffset); - rng.setEnd(finish.dom(), foffset); - - var same = Compare.eq(start, finish) && soffset === foffset; - return rng.collapsed && !same; - }; - - return { - after: after - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.wwwc.Directions', - - [ - 'ephox.fussy.api.SelectionRange', - 'ephox.sugar.api.DocumentPosition', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Traverse' - ], - - function (SelectionRange, DocumentPosition, Element, Traverse) { - var isReversed = function (model) { - return DocumentPosition.after(Element.fromDom(model.anchorNode), model.anchorOffset, Element.fromDom(model.focusNode), model.focusOffset); - }; - - var flipGet = function (model, range) { - var start = Element.fromDom(range.startContainer); - var finish = Element.fromDom(range.endContainer); - return isReversed(model) ? - SelectionRange.read(finish, range.endOffset, start, range.startOffset) : - SelectionRange.read(start, range.startOffset, finish, range.endOffset); - }; - - var isRtlGet = function (model) { - return isReversed(model); - }; - - var flipSet = function (start, startOffset, end, endOffset) { - return function (model) { - if (model.extend) { - model.collapse(start.dom(), startOffset); - model.extend(end.dom(), endOffset); - } else { - // this is IE... we can’t have a backwards range, so reverse it. - var range = Traverse.owner(start).dom().createRange(); - range.setStart(end.dom(), endOffset); - range.setEnd(start.dom(), startOffset); - model.removeAllRanges(); - model.addRange(range); - } - }; - }; - - var isRtlSet = function (start, startOffset, end, endOffset) { - return DocumentPosition.after(start, startOffset, end, endOffset); - }; - - var read = function () { - return { - flip: flipGet, - isRtl: isRtlGet - }; - }; - - var write = function () { - return { - flip: flipSet, - isRtl: isRtlSet - }; - }; - - return { - read: read, - write: write - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.wwwc.DomRange', - - [ - 'ephox.fussy.api.SelectionRange', - 'ephox.fussy.wwwc.Directions', - 'ephox.perhaps.Option', - 'ephox.sugar.api.DocumentPosition', - 'ephox.sugar.api.Element' - ], - - function (SelectionRange, Directions, Option, DocumentPosition, Element) { - - /* - * The approach here is to create a range using the selection. If it collapses, - * and the inverse of the selection does not collapse ... then it is a backwards - * selection. - */ - var reversed = function (win, selection) { - // Calculate the range going from start -> finish - var startToFinish = toNativeFrom(win, selection.start(), selection.finish()); - // If it is collapsed, there is a chance that it only collapsed because it was RTL - if (startToFinish.collapsed === true) { - // Check that the inverted selection isn't collapsed. - // If the inverted selection is not collapsed ... it is a backwards selection, otherwise it is just collapsed anyway - var finishToStart = toNativeFrom(win, selection.finish(), selection.start()); - return finishToStart.collapsed === true ? Option.none() : Option.some(SelectionRange.general( - Element.fromDom(finishToStart.endContainer), - finishToStart.endOffset, - Element.fromDom(finishToStart.startContainer), - finishToStart.startOffset - )); - } else { - return Option.none(); - } - }; - - var forceRange = function (win, selection) { - var range = toNativeFrom(win, selection.start(), selection.finish()); - return range.collapsed === true ? toNativeFrom(win, selection.finish(), selection.start()) : range; - }; - - var toNativeFrom = function (win, start, finish) { - var range = create(win); - - start.fold(function (e) { - range.setStartBefore(e.dom()); - }, function (e, o) { - range.setStart(e.dom(), o); - }, function (e) { - range.setStartAfter(e.dom()); - }); - - finish.fold(function (e) { - range.setEndBefore(e.dom()); - }, function (e, o) { - range.setEnd(e.dom(), o); - }, function (e) { - range.setEndAfter(e.dom()); - }); - - return range; - }; - - var toNative = function (win, selection) { - return toNativeFrom(win, selection.start(), selection.finish()); - }; - - var toExactNative = function (win, s, so, e, eo) { - var backwards = DocumentPosition.after(s, so, e, eo); - var range = win.document.createRange(); - if (backwards) { - range.setStart(e.dom(), eo); - range.setEnd(s.dom(), so); - } else { - range.setStart(s.dom(), so); - range.setEnd(e.dom(), eo); - } - return range; - }; - - var forwards = function (win, selection) { - var range = toNative(win, selection); - - return function (model) { - model.addRange(range); - }; - }; - - var build = function (win, selection) { - var backwards = reversed(win, selection); - return backwards.fold(function () { - return forwards(win, selection); - }, function (range) { - return Directions.write().flip(range.start(), range.soffset(), range.finish(), range.foffset()); - }); - }; - - var create = function (win) { - return win.document.createRange(); - }; - - return { - create: create, - build: build, - toNative: toNative, - forceRange: forceRange, - toExactNative: toExactNative - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.search.Within', - - [ - 'ephox.compass.Arr', - 'ephox.fussy.wwwc.DomRange', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.SelectorFilter', - 'ephox.sugar.api.Selectors' - ], - - function (Arr, DomRange, Element, Node, SelectorFilter, Selectors) { - // Adapted from: http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element - var inRange = function (tempRange, range, element) { - tempRange.selectNodeContents(element.dom()); - return tempRange.compareBoundaryPoints(range.END_TO_START, range) < 1 && tempRange.compareBoundaryPoints(range.START_TO_END, range) > -1; - }; - - var withinContainer = function (win, container, range, selector) { - var tempRange = win.document.createRange(); - var self = Selectors.is(container, selector) ? [ container ] : []; - var elements = self.concat(SelectorFilter.descendants(container, selector)); - return Arr.filter(elements, function (elem) { - return inRange(tempRange, range, elem); - }); - }; - - var find = function (win, raw, selector) { - // Reverse the selection if it is RTL when doing the comparison - var range = DomRange.forceRange(win, raw); - var container = Element.fromDom(range.commonAncestorContainer); - // Note, this might need to change when we have to start looking for non elements. - return Node.isElement(container) ? withinContainer(win, container, range, selector) : []; - }; - - return { - find: find - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.wwwc.Prefilter', - - [ - 'ephox.fussy.api.SelectionRange', - 'ephox.fussy.api.Situ', - 'ephox.sugar.api.Node' - ], - - function (SelectionRange, Situ, Node) { - var beforeBr = function (element, offset) { - return Node.name(element) === 'br' ? Situ.before(element) : Situ.on(element, offset); - }; - - var preprocess = function (selection) { - var start = selection.start().fold(Situ.before, beforeBr, Situ.after); - var finish = selection.finish().fold(Situ.before, beforeBr, Situ.after); - return SelectionRange.write(start, finish); - }; - - return { - preprocess: preprocess - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Fragment', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Element', - 'global!document' - ], - - function (Arr, Element, document) { - var fromElements = function (elements, scope) { - var doc = scope || document; - var fragment = doc.createDocumentFragment(); - Arr.each(elements, function (element) { - fragment.appendChild(element.dom()); - }); - return Element.fromDom(fragment); - }; - - return { - fromElements: fromElements - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.wwwc.WwwcModel', - - [ - 'ephox.fussy.api.SelectionRange', - 'ephox.fussy.wwwc.Directions', - 'ephox.fussy.wwwc.DomRange', - 'ephox.fussy.wwwc.Prefilter', - 'ephox.perhaps.Option', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Fragment' - ], - - function (SelectionRange, Directions, DomRange, Prefilter, Option, Element, Fragment) { - var set = function (raw) { - return function (win, model) { - var selection = Prefilter.preprocess(raw); - var modifier = DomRange.build(win, selection); - if (model !== undefined && model !== null) { - model.removeAllRanges(); - modifier(model); - } - }; - }; - - var selectElementContents = function (element) { - return function (win, model) { - var rng = DomRange.create(win); - rng.selectNodeContents(element.dom()); - model.removeAllRanges(); - model.addRange(rng); - }; - }; - - var normaliseRange = function (win, model) { - // In a multiple rangeset we take the first and the last item in the range, and create a new range model - var first = model.getRangeAt(0); - var last = model.getRangeAt(model.rangeCount - 1); - var range = win.document.createRange(); - range.setStart(first.startContainer, first.startOffset); - range.setEnd(last.endContainer, last.endOffset); - return range; - }; - - var fromNative = function (model, range) { - var start = Element.fromDom(range.startContainer); - var finish = Element.fromDom(range.endContainer); - - return Directions.read().isRtl(model) ? - Directions.read().flip(model, range) : - SelectionRange.read(start, range.startOffset, finish, range.endOffset); - }; - - var getNative = function (win, model) { - return model !== undefined && model !== null && model.rangeCount > 0 ? Option.from(normaliseRange(win, model)) : Option.none(); - }; - - var get = function (win, model) { - var range = getNative(win, model); - return range.map(function (r) { - return fromNative(model, r); - }); - }; - - var replace = function (elements) { - return function (win, model) { - var selection = getNative(win, model); - selection.each(function (range) { - doReplaceRange(win, range, elements); - }); - }; - }; - - var doReplaceRange = function (win, range, elements) { - // Note: this document fragment approach may not work on IE9. - var fragment = Fragment.fromElements(elements, win.document); - range.deleteContents(); - range.insertNode(fragment.dom()); - }; - - var replaceRange = function (raw, elements) { - return function (win, model) { - var selection = Prefilter.preprocess(raw); - // NOTE: This selection has to be LTR, or the range will collapse. - var range = DomRange.toNative(win, selection); - doReplaceRange(win, range, elements); - }; - }; - - var deleteRange = function (s, so, e, eo) { - return function (win, model) { - var rng = DomRange.toExactNative(win, s, so, e, eo); - rng.deleteContents(); - }; - }; - - var cloneFragment = function (s, so, e, eo) { - return function (win, model) { - var rng = DomRange.toExactNative(win, s, so, e, eo); - var fragment = rng.cloneContents(); - return Element.fromDom(fragment); - }; - }; - - var rectangleAt = function (s, so, e, eo) { - return function (win, model) { - var rng = DomRange.toExactNative(win, s, so, e, eo); - var rects = rng.getClientRects(); - // ASSUMPTION: The first rectangle is the start of the selection - var bounds = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); - return bounds.width > 0 || bounds.height > 0 ? Option.some(bounds) : Option.none(); - }; - }; - - var clearSelection = function (win, model) { - win.getSelection().removeAllRanges(); - }; - - return { - get: get, - set: set, - selectElementContents: selectElementContents, - replace: replace, - replaceRange: replaceRange, - deleteRange: deleteRange, - cloneFragment: cloneFragment, - rectangleAt: rectangleAt, - clearSelection: clearSelection - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.fussy.api.WindowSelection', - - [ - 'ephox.fussy.api.SelectionRange', - 'ephox.fussy.api.Situ', - 'ephox.fussy.api.Supported', - 'ephox.fussy.search.Within', - 'ephox.fussy.wwwc.DomRange', - 'ephox.fussy.wwwc.WwwcModel', - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Element' - ], - - function (SelectionRange, Situ, Supported, Within, DomRange, WwwcModel, Compare, Element) { - var get = function (win) { - return Supported.run(win, WwwcModel.get); - }; - - var set = function (win, raw) { - Supported.run(win, WwwcModel.set(raw)); - }; - - var setExact = function (win, s, so, e, eo) { - var raw = SelectionRange.write( - Situ.on(s, so), - Situ.on(e, eo) - ); - set(win, raw); - }; - - var selectElementContents = function (win, element) { - Supported.run(win, WwwcModel.selectElementContents(element)); - }; - - var replace = function (win, elements) { - Supported.run(win, WwwcModel.replace(elements)); - }; - - var replaceRange = function (win, raw, elements) { - Supported.run(win, WwwcModel.replaceRange(raw, elements)); - }; - - var deleteRange = function (win, s, so, e, eo) { - Supported.run(win, WwwcModel.deleteRange(s, so, e, eo)); - }; - - var cloneFragment = function (win, s, so, e, eo) { - return Supported.run(win, WwwcModel.cloneFragment(s, so, e, eo)); - }; - - var isCollapsed = function (s, so, e, eo) { - return Compare.eq(s, e) && so === eo; - }; - - var rectangleAt = function (win, s, so, e, eo) { - return Supported.run(win, WwwcModel.rectangleAt(s, so, e, eo)); - }; - - var findWithin = function (win, raw, selector) { - // Note, we don't need the getSelection() model for this. - return Within.find(win, raw, selector); - }; - - var findWithinExact = function (win, s, so, e, eo, selector) { - var raw = SelectionRange.write( - Situ.on(s, so), - Situ.on(e, eo) - ); - // Note, we don't need the getSelection() model for this. - return findWithin(win, raw, selector); - }; - - var deriveExact = function (win, raw) { - var rng = DomRange.forceRange(win, raw); - return SelectionRange.general(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset); - }; - - var clearAll = function (win) { - Supported.run(win, WwwcModel.clearSelection); - }; - - return { - get: get, - set: set, - setExact: setExact, - selectElementContents: selectElementContents, - replace: replace, - replaceRange: replaceRange, - deleteRange: deleteRange, - isCollapsed: isCollapsed, - cloneFragment: cloneFragment, - rectangleAt: rectangleAt, - findWithin: findWithin, - findWithinExact: findWithinExact, - deriveExact: deriveExact, - clearAll: clearAll - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.api.HtmlPatterns', - - [ - - ], - - function () { - return { - validStyles: function () { - return /^(mso-.*|tab-stops|tab-interval|language|text-underline|text-effect|text-line-through|font-color|horiz-align|list-image-[0-9]+|separator-image|table-border-color-(dark|light)|vert-align|vnd\..*)$/; - }, - specialInline: function () { - return /^(font|em|strong|samp|acronym|cite|code|dfn|kbd|tt|b|i|u|s|sub|sup|ins|del|var|span)$/; - } - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.violin.StringMatch', - - [ - - ], - - function () { - var starts = function (value) { - return folder(function (s, p, c, e, a, n) { - return s(value); - }); - }; - - var pattern = function (regex) { - return folder(function (s, p, c, e, a, n) { - return p(regex); - }); - }; - - var contains = function (value) { - return folder(function (s, p, c, e, a, n) { - return c(value); - }); - }; - - var exact = function (value) { - return folder(function (s, p, c, e, a, n) { - return e(value); - }); - }; - - var all = function () { - return folder(function (s, p, c, e, a, n) { - return a(); - }); - }; - - var not = function (sm) { - return folder(function (s, p, c, e, a, n) { - return n(sm); - }); - }; - - var folder = function (fold) { - var matches = function (str) { - return fold(function (value) { - return str.toLowerCase().indexOf(value.toLowerCase()) === 0; - }, function (regex) { - return regex.test(str.toLowerCase()); - }, function (value) { - return str.toLowerCase().indexOf(value.toLowerCase()) >= 0; - }, function (value) { - return str.toLowerCase() === value.toLowerCase(); - }, function () { - return true; - }, function (other) { - return !other.matches(str); - }); - }; - - return { - fold: fold, - matches: matches - }; - }; - - var cata = function (subject, s, p, c, e, a, n) { - return subject.fold(s, p, c, e, a, n); - }; - - return { - starts: starts, - pattern: pattern, - contains: contains, - exact: exact, - all: all, - not: not, - cata: cata - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.api.RuleMatch', - - [ - 'ephox.peanut.Fun', - 'ephox.sugar.api.Node', - 'ephox.violin.StringMatch' - ], - - function (Fun, Node, StringMatch) { - var keyval = function (element, value, key, rule) { - var ruleName = rule.name; - var ruleCondition = rule.condition !== undefined ? rule.condition : Fun.constant(true); - var ruleValue = rule.value !== undefined ? rule.value : StringMatch.all(); - return ruleName.matches(key) && ruleValue.matches(value) && ruleCondition(element); - }; - - var name = function (element, rule) { - var tag = Node.name(element); - var ruleName = rule.name; - var ruleCondition = rule.condition !== undefined ? rule.condition : Fun.constant(true); - return ruleName.matches(tag) && ruleCondition(element); - }; - - return { - keyval: keyval, - name: name - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.cleanup.AttributeAccess', - - [ - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Attr' - ], - - function (Arr, Obj, Fun, Attr) { - var filter = function (element, predicate) { - var r = {}; - Arr.each(element.dom().attributes, function (a) { - if (!predicate(a.value, a.name)) r[a.name] = a.value; - }); - return r; - }; - - var update = function (element, names, keepers) { - Arr.each(names, function (name) { - Attr.remove(element, name); - }); - - Obj.each(keepers, function (v, k) { - Attr.set(element, k, v); - }); - }; - - var clobber = function (element, supported, _unsupported) { - var names = Arr.map(element.dom().attributes, function (attribute) { - return attribute.name; - }); - - if (Obj.size(supported) !== names.length) update(element, names, supported); - }; - - return { - filter: filter, - clobber: clobber, - // There are no hidden attributes that I know about. - scan: Fun.constant({}) - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.cleanup.StyleAccess', - - [ - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Css', - 'ephox.violin.Strings' - ], - - function (Arr, Obj, Attr, Css, Strings) { - var separate = function (style) { - var css = {}; - var bits = style !== undefined && style !== null ? style.split(';') : []; - Arr.each(bits, function (bit) { - var parts = bit.split(':'); - if (parts.length === 2) { - css[Strings.trim(parts[0])] = Strings.trim(parts[1]); - } - }); - return css; - }; - - var get = function (element, property) { - return element.dom().style.getPropertyValue(property); - }; - - var filter = function (element, predicate) { - var r = {}; - Arr.each(element.dom().style, function (property) { - var value = get(element, property); - if (!predicate(value, property)) r[property] = value; - }); - return r; - }; - - var set = function (element, property, value) { - Css.set(element, property, value); - }; - - // Find the style for any special styles. - var scan = function (element, special, predicate) { - var style = element.dom().getAttribute('style'); - var css = separate(style); - - var before = {}; - Arr.each(special, function (property) { - var value = css[property]; - if (value !== undefined && !predicate(value, property)) before[property] = value; - }); - - return before; - }; - - var serialise = function (unsupported) { - var preserved = Obj.keys(unsupported); - return Arr.map(preserved, function (pre) { - return pre + ': ' + unsupported[pre]; - }).join('; '); - }; - - var clobber = function (element, supported, unsupported) { - Attr.set(element, 'style', ''); - - var numSupported = Obj.size(supported); - var numUnsupported = Obj.size(unsupported); - - if (numSupported === 0 && numUnsupported === 0) Attr.remove(element, 'style'); - else if (numSupported === 0) Attr.set(element, 'style', serialise(unsupported)); - else { - Obj.each(supported, function (v, k) { - set(element, k, v); - }); - - var base = Attr.get(element, 'style'); - var extra = numUnsupported > 0 ? serialise(unsupported) + '; ' : ''; - Attr.set(element, 'style', extra + base); - } - }; - - return { - filter: filter, - clobber: clobber, - scan: scan - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.cleanup.Cleaners', - - [ - 'ephox.pastiche.cleanup.AttributeAccess', - 'ephox.pastiche.cleanup.StyleAccess', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Element' - ], - - function (AttributeAccess, StyleAccess, Fun, Element) { - var special = [ 'mso-list' ]; - - var style = function (element, predicate) { - var unsupported = StyleAccess.scan(element, special, predicate); - var supported = StyleAccess.filter(element, predicate); - StyleAccess.clobber(element, supported, unsupported); - }; - - var attribute = function (element, predicate) { - var keepers = AttributeAccess.filter(element, predicate); - AttributeAccess.clobber(element, keepers, {}); - }; - - var validateStyles = function (element) { - var supported = StyleAccess.filter(element, Fun.constant(false)); - StyleAccess.clobber(element, supported, {}); - }; - - var styleDom = function (dom, predicate) { - style(Element.fromDom(dom), predicate); - }; - - var attributeDom = function (dom, predicate) { - attribute(Element.fromDom(dom), predicate); - }; - - return { - style: style, - attribute: attribute, - styleDom: styleDom, - attributeDom: attributeDom, - validateStyles: validateStyles - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Classes', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Class', - 'global!Array' - ], - - function (Arr, Class, Array) { - /* - * ClassList is IE10 minimum: - * https://developer.mozilla.org/en-US/docs/Web/API/Element.classList - */ - - var add = function (element, classes) { - Arr.each(classes, function (x) { - Class.add(element, x); - }); - }; - - var remove = function (element, classes) { - Arr.each(classes, function (x) { - Class.remove(element, x); - }); - }; - - var toggle = function (element, classes) { - Arr.each(classes, function (x) { - Class.toggle(element, x); - }); - }; - - var hasAll = function (element, classes) { - return Arr.forall(classes, function (clazz) { - return Class.has(element, clazz); - }); - }; - - var hasAny = function (element, classes) { - return Arr.exists(classes, function (clazz) { - return Class.has(element, clazz); - }); - }; - - var get = function (element) { - var classList = element.dom().classList; - var r = new Array(classList.length); - for (var i = 0; i < classList.length; i++) { - r[i] = classList.item(i); - } - return r; - }; - - // set deleted, risks bad performance. Be deterministic. - - return { - add: add, - remove: remove, - toggle: toggle, - hasAll: hasAll, - hasAny: hasAny, - get: get - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Pipeless', - - [ - 'ephox.compass.Arr', - 'ephox.highway.Merger', - 'ephox.pastiche.api.RuleMatch', - 'ephox.pastiche.cleanup.Cleaners', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Classes', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFilter' - ], - - function (Arr, Merger, RuleMatch, Cleaners, Fun, Attr, Class, Classes, Remove, SelectorFilter) { - var cleaner = function (type, rules, element) { - // Use Cleaners.style or Cleaners.attribute as "type". - type(element, function (value, key) { - return Arr.exists(rules, function (rule) { - return RuleMatch.keyval(element, value, key, rule); - }); - }); - }; - - var remover = function (container, strat) { - var strategy = Merger.merge({ styles: [], attributes: [], classes: [], tags: [] }, strat); - - var elements = SelectorFilter.descendants(container, '*'); - Arr.each(elements, function (element) { - cleaner(Cleaners.style, strategy.styles, element); - cleaner(Cleaners.attribute, strategy.attributes, element); - - Arr.each(strategy.classes, function (rule) { - var actual = Attr.has(element, 'class') ? Classes.get(element) : []; - Arr.each(actual, function (act) { - if (rule.name.matches(act)) Class.remove(element, act); - }); - }); - }); - - // Now, remove the tags. - var postElements = SelectorFilter.descendants(container, '*'); - Arr.each(postElements, function (element) { - var matching = Arr.exists(strategy.tags, Fun.curry(RuleMatch.name, element)); - if (matching) Remove.remove(element); - }); - }; - - var unwrapper = function (container, strat) { - var strategy = Merger.merge({ tags: [] }, strat); - - var elements = SelectorFilter.descendants(container, '*'); - Arr.each(elements, function (element) { - var matching = Arr.exists(strategy.tags, Fun.curry(RuleMatch.name, element)); - if (matching) Remove.unwrap(element); - }); - }; - - var transformer = function (container, strat) { - var strategy = Merger.merge({ tags: [] }, strat); - - var elements = SelectorFilter.descendants(container, '*'); - Arr.each(elements, function (element) { - var rule = Arr.find(strategy.tags, Fun.curry(RuleMatch.name, element)); - if (rule !== undefined && rule !== null) rule.mutate(element); - }); - }; - - var validator = function (container) { - var elements = SelectorFilter.descendants(container, '*'); - Arr.each(elements, function (element) { - Cleaners.validateStyles(element); - }); - }; - - return { - remover: remover, - unwrapper: unwrapper, - transformer: transformer, - validator: validator - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Token', - - [ - 'ephox.compass.Obj', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element' - ], - - function (Obj, Css, Element) { - var START_ELEMENT_TYPE = 'startElement'; - var END_ELEMENT_TYPE = 'endElement'; - var TEXT_TYPE = 'text'; - var COMMENT_TYPE = 'comment'; - - var token = function(node, endNode, syntheticStyles) { - var tokenType; - var tagName; - var tokenText; - - var element = Element.fromDom(node); - - switch (node.nodeType) { - case 1: - if (endNode) { - tokenType = END_ELEMENT_TYPE; - } else { - tokenType = START_ELEMENT_TYPE; - - Css.setAll(element, syntheticStyles || {}); - } - if (node.scopeName !== "HTML" && node.scopeName && node.tagName && node.tagName.indexOf(':') <= 0) { - tagName = (node.scopeName + ":" + node.tagName).toUpperCase(); - } else { - tagName = node.tagName; - } - - break; - case 3: - tokenType = TEXT_TYPE; - tokenText = node.nodeValue; - break; - case 8: - tokenType = COMMENT_TYPE; - tokenText = node.nodeValue; - break; - default: - console.log("WARNING: Unsupported node type encountered: " + node.nodeType); - break; - } - - var getNode = function() { - return node; - }; - - var tag = function() { - return tagName; - }; - - var type = function() { - return tokenType; - }; - - var text = function() { - return tokenText; - }; - - return { - getNode: getNode, - tag: tag, - type: type, - text: text - }; - }; - - var createStartElement = function(tag, attributes, styles, document) { - var node = document.createElement(tag), css = ""; - - Obj.each(attributes, function(value, name) { - node.setAttribute(name, value); - }); - - return token(node, false, styles); - }; - - var createEndElement = function(tag, document) { - return token(document.createElement(tag), true); - }; - - var createComment = function(text, document) { - return token(document.createComment(text), false); - }; - - var createText = function(text, document) { - return token(document.createTextNode(text)); - }; - - var FINISHED = createEndElement('HTML', window.document); - - return { - START_ELEMENT_TYPE: START_ELEMENT_TYPE, - END_ELEMENT_TYPE: END_ELEMENT_TYPE, - TEXT_TYPE: TEXT_TYPE, - COMMENT_TYPE: COMMENT_TYPE, - FINISHED: FINISHED, - token: token, - createStartElement: createStartElement, - createEndElement: createEndElement, - createComment: createComment, - createText: createText - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Serialiser', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - var create = function (doc) { - var currentNode = doc.createDocumentFragment(); - var initialNode = currentNode; - - var push = function(node) { - append(node); - currentNode = node; - }; - - var pop = function() { - currentNode = currentNode.parentNode; - }; - - var append = function(node) { - currentNode.appendChild(node); - }; - - var receive = function(token) { - var startElement = function(token) { - var node = token.getNode().cloneNode(false); - push(node); - }; - - var text = function(token, serializer) { - // IE7 will crash if you clone a text node that's a URL. - // IE8 throws an invalid argument error. - // So while cloning may be faster, we have to create a new node here. - var node = doc.createTextNode(token.text()); - append(node); - }; - - switch (token.type()) { - case Token.START_ELEMENT_TYPE: - startElement(token); - break; - case Token.TEXT_TYPE: - text(token); - break; - case Token.END_ELEMENT_TYPE: - pop(); - break; - case Token.COMMENT_TYPE: - // Ignore. - break; - default: - throw { message: 'Unsupported token type: ' + token.type() }; - } - }; - - return { - dom: initialNode, - receive: receive, - label: 'SERIALISER' - }; - }; - - return { - create: create - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Tokeniser', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - var tokenise = function(html, document) { - var container; - document = document || window.document; - container = document.createElement('div'); - document.body.appendChild(container); - container.style.position = 'absolute'; - container.style.left = '-10000px'; - container.innerHTML = html; - - nextNode = container.firstChild || Token.FINISHED; - - var nodeStack = []; - endNode = false; - - var getTokenForNode = function(node, endTag) { - if (node === Token.FINISHED) { - return node; - } else if (node) { - return Token.token(node, endTag); - } else { - return undefined; - } - }; - - var next = function() { - var currentNode = nextNode; - var currentEndNode = endNode; - if (!endNode && nextNode.firstChild) { - nodeStack.push(nextNode); - nextNode = nextNode.firstChild; - } else if (!endNode && nextNode.nodeType === 1) { - // Empty element. - endNode = true; - } else if (nextNode.nextSibling) { - nextNode = nextNode.nextSibling; - endNode = false; - } else { - nextNode = nodeStack.pop(); - endNode = true; - } - - if (currentNode !== Token.FINISHED && !nextNode) { - document.body.removeChild(container); - nextNode = Token.FINISHED; - } - - return getTokenForNode(currentNode, currentEndNode); - }; - - var hasNext = function() { - return nextNode !== undefined; - }; - - return { - hasNext: hasNext, - next: next - }; - }; - - return { - tokenise: tokenise - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Pipeline', - - [ - 'ephox.pastiche.engine.Serialiser', - 'ephox.pastiche.engine.Tokeniser' - ], - - function (Serialiser, Tokeniser) { - var build = function(doc, filters, sink) { - var i, filter = sink; - for (i = filters.length - 1; i >= 0; i--) { - //This is calling the function defined by Filter.createFilter(). - //The best description I can come up with is "function composition using CPS". - //Filters are run in reverse order to the loop, which is reversed so the arrays below define the order. - //And then the sink comes last (which means it's injected on the first pass of the loop). - // filter = filters[i](doc, filter); - - // TEMPORARY: - filter = filters[i](filter, {}, doc); - } - return filter; - }; - - var run = function(doc, content, filters) { - var sink = Serialiser.create(doc); - var tokeniser = Tokeniser.tokenise(content, doc); - var pipeline = build(doc, filters, sink); - while (tokeniser.hasNext()) { - var token = tokeniser.next(); - pipeline.receive(token); - } - return sink.dom; - }; - - return { - build: build, - run: run - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.api.HybridAction', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.engine.Pipeless', - 'ephox.pastiche.engine.Pipeline', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Arr, Pipeless, Pipeline, Element, Html, Remove, Traverse) { - var removal = function (spec) { - return function (container) { - Pipeless.remover(container, spec); - }; - }; - - var unwrapper = function (spec) { - return function (container) { - Pipeless.unwrapper(container, spec); - }; - }; - - var transformer = function (spec) { - return function (container) { - Pipeless.transformer(container, spec); - }; - }; - - var validate = function () { - return function (container) { - Pipeless.validator(container); - }; - }; - - var pipeline = function (pipes) { - return function (container) { - var html = Html.get(container); - var doc = Traverse.owner(container); - var sink = Pipeline.run(doc.dom(), html, pipes); - Remove.empty(container); - container.dom().appendChild(sink); - }; - }; - - var go = function (doc, input, actions) { - var container = Element.fromTag('div', doc.dom()); - container.dom().innerHTML = input; - Arr.each(actions, function (action) { - action(container); - }); - return Html.get(container); - }; - - var isWordContent = function (content) { - return content.indexOf('<o:p>') >= 0 || // IE, Safari, Opera - content.indexOf('p.MsoNormal, li.MsoNormal, div.MsoNormal') >= 0 || // Firefox Mac - content.indexOf('MsoListParagraphCxSpFirst') >= 0 || // Windows list only selection - content.indexOf('<w:WordDocument>') >= 0; // Firefox Windows - }; - - return { - removal: removal, - unwrapper: unwrapper, - transformer: transformer, - validate: validate, - pipeline: pipeline, - isWordContent: isWordContent, - go: go - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.api.RuleConditions', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.PredicateExists' - ], - - function (Arr, Attr, Html, Node, PredicateExists) { - var isNotImage = function (elem) { - return Node.name(elem) !== 'img'; - }; - - var isImportantSpan = function (elem) { - var attrs = elem.dom().attributes; - var hasAttrs = attrs !== undefined && attrs !== null && attrs.length > 0; - return Node.name(elem) === 'span' ? hasAttrs : true; - }; - - var hasContent = function (elem) { - if (!hasNoAttributes(elem)) return true; - else { - return isImportantSpan(elem) && PredicateExists.descendant(elem, function (e) { - var hasAttributes = !hasNoAttributes(e); - var isContentTag = !Arr.contains([ - 'font', 'em', 'strong', 'samp', 'acronym', 'cite', 'code', 'dfn', 'kbd', 'tt', 'b', 'i', - 'u', 's', 'sub', 'sup', 'ins', 'del', 'var', 'span' - ], Node.name(e)); - - return Node.isText(e) || hasAttributes || isContentTag; - }); - } - }; - - var isList = function (elem) { - return Node.name(elem) === 'ol' || Node.name(elem) === 'ul'; - }; - - var isLocal = function (element) { - var src = Attr.get(element, 'src'); - return (/^file:/).test(src); - }; - - var hasNoAttributes = function (elem) { - if (elem.dom().attributes === undefined || elem.dom().attributes === null) return true; - return elem.dom().attributes.length === 0 || (elem.dom().attributes.length === 1 && elem.dom().attributes[0].name === 'style'); - }; - - var isEmpty = function (elem) { - // Note, this means that things with zero width cursors are NOT considered empty - return Html.get(elem).length === 0; - }; - - return { - isNotImage: isNotImage, - hasContent: hasContent, - isList: isList, - isLocal: isLocal, - hasNoAttributes: hasNoAttributes, - isEmpty: isEmpty - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.api.RuleMutations', - - [ - 'ephox.compass.Arr', - 'ephox.compass.Obj', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Arr, Obj, Attr, Css, Element, Html, Insert, InsertAll, Node, Remove, Traverse) { - var changeTag = function (tag, element) { - // We cannot use replication because it uses innerHTML rather than setting the children. - // Which means that any further transformations done to the children are not represented - // in the final output. - var replica = Element.fromTag(tag); - Insert.before(element, replica); - - var attributes = element.dom().attributes; - Arr.each(attributes, function (attr) { - replica.dom().setAttribute(attr.name, attr.value); - }); - - var children = Traverse.children(element); - InsertAll.append(replica, children); - Remove.remove(element); - return replica; - }; - - // Adds a <br> tag to any <p> tags that are empty - var addBrTag = function (element) { - if (Html.get(element).length === 0) { - Insert.append(element, Element.fromTag('br')); - } - }; - - var properlyNest = function (element) { - Traverse.parent(element).each(function (parent) { - var tag = Node.name(parent); - if (Arr.contains([ 'ol', 'ul' ], tag)) { - var li = Element.fromTag('li'); - Css.set(li, 'list-style-type', 'none'); - Insert.wrap(element, li); - } - }); - }; - - var fontToSpan = function (element) { - var span = changeTag('span', element); - var conversions = { - face: 'font-family', - size: 'font-size', - color: 'font-color' - }; - - var values = { - 'font-size': { - '1': '8pt', - '2': '10pt', - '3': '12pt', - '4': '14pt', - '5': '18pt', - '6': '24pt', - '7': '36pt' - } - }; - - Obj.each(conversions, function (style, attribute) { - if (Attr.has(span, attribute)) { - var value = Attr.get(span, attribute); - var cssValue = values[style] !== undefined && values[style][value] !== undefined ? values[style][value] : value; - Css.set(span, style, cssValue); - Attr.remove(span, attribute); - } - }); - }; - - return { - changeTag: changeTag, - addBrTag: addBrTag, - properlyNest: properlyNest, - fontToSpan: fontToSpan - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.Filter', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.engine.Token' - ], - - function (Arr, Token) { - var createFilter = function(actualReceiver, clientReset, label) { - var filter = function(nextFilter, settings, document, _logger) { - var logger = _logger !== undefined ? _logger : []; - - var deferred; - var receivedTokens, emittedTokens, inTransaction = false; - - var resetState = function() { - if (clientReset) clientReset(api); - inTransaction = false; - receivedTokens = []; - emittedTokens = []; - }; - - var emitTokens = function(tokens) { - Arr.each(tokens, function(tok) { - nextFilter.receive(tok); - }); - }; - - var emit = function(token) { - if (inTransaction) { - emittedTokens.push(token); - } else { - nextFilter.receive(token); - } - }; - - var receive = function(token) { - if (clientReset) receivedTokens.push(token); - actualReceiver(api, token); - if (token === Token.FINISHED) { - commit(); - } - }; - - var startTransaction = function() { - inTransaction = true; - }; - - var rollback = function() { - emitTokens(receivedTokens); - resetState(); - }; - - var commit = function() { - emitDeferred(); - emitTokens(emittedTokens); - resetState(); - }; - - var defer = function(token) { - deferred = deferred || []; - deferred.push(token); - }; - - var hasDeferred = function() { - return deferred && deferred.length > 0; - }; - - var emitDeferred = function() { - Arr.each(deferred || [], function(token) { - emit(token); - }); - dropDeferred(); - }; - - var dropDeferred = function() { - deferred = []; - }; - - var api = { - document: document || window.document, - settings: settings || {}, - emit: emit, - receive: receive, - startTransaction: startTransaction, - rollback: rollback, - commit: commit, - defer: defer, - hasDeferred: hasDeferred, - emitDeferred: emitDeferred, - dropDeferred: dropDeferred, - label: label - }; - - resetState(); - return api; - }; - return filter; - }; - - return { - createFilter: createFilter - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.engine.TokenUtil', - - [ - 'ephox.pastiche.cleanup.StyleAccess', - 'ephox.pastiche.engine.Token', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element' - ], - - function (StyleAccess, Token, Fun, Attr, Css, Element) { - var getAttribute = function (token, property) { - var element = Element.fromDom(token.getNode()); - return Attr.get(element, property); - }; - - var getStyle = function (token, property) { - var element = Element.fromDom(token.getNode()); - return Css.get(element, property); - }; - - var isWhitespace = function (token) { - return token.type() === Token.TEXT_TYPE && /^[\s\u00A0]*$/.test(token.text()); - }; - - var getMsoList = function (token) { - var element = Element.fromDom(token.getNode()); - var styles = StyleAccess.scan(element, [ 'mso-list' ], Fun.constant(false)); - return styles['mso-list']; - }; - - return { - getAttribute: getAttribute, - getStyle: getStyle, - isWhitespace: isWhitespace, - getMsoList: getMsoList - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.ListSymbols', - - [ - 'ephox.compass.Arr', - 'ephox.highway.Merger' - ], - - function (Arr, Merger) { - - var orderedListTypes = [ - { regex: /^\(?[dc][\.\)]$/, type: { tag: 'OL', type: 'lower-alpha' } }, - { regex: /^\(?[DC][\.\)]$/, type: { tag: 'OL', type: 'upper-alpha' } }, - { regex: /^\(?M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})[\.\)]$/, type: { tag: 'OL', type: 'upper-roman' } }, - { regex: /^\(?m*(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})[\.\)]$/, type: { tag: 'OL', type: 'lower-roman' } }, - { regex: /^\(?[0-9]+[\.\)]$/, type: { tag: 'OL' } }, - { regex: /^([0-9]+\.)*[0-9]+\.?$/, type: { tag: 'OL', variant: 'outline' } }, - { regex: /^\(?[a-z]+[\.\)]$/, type: { tag: 'OL', type: 'lower-alpha' } }, - { regex: /^\(?[A-Z]+[\.\)]$/, type: { tag: 'OL', type: 'upper-alpha' } } - ]; - - var ulChars = { - '\u2022': { tag: 'UL', type: 'disc' }, - '\u00B7': { tag: 'UL', type: 'disc' }, - '\u00A7': { tag: 'UL', type: 'square' } - }; - - var ulNonSymbolChars = { - 'o': { tag: 'UL', type: 'circle' }, - '-': { tag: 'UL', type: 'disc' }, - '\u25CF': { tag: 'UL', type: 'disc' }, - '�': { tag: 'UL', type: 'circle' } - }; - - var getVariant = function (type, text) { - if (type.variant !== undefined) return type.variant; - else if (text.charAt(0) === '(') return '()'; - else if (text.charAt(text.length - 1) === ')') return ')'; - else return '.'; - }; - - var getStart = function (text) { - var number = parseInt(text, 10); - return isNaN(number) ? { } : { start: number }; - }; - - var match = function (text, inSymbol) { - var nonSymbols = ulNonSymbolChars[text] ? [ ulNonSymbolChars[text] ] : []; - var symbols = inSymbol && ulChars[text] ? [ ulChars[text] ] : inSymbol ? [{ tag: 'UL', variant: text }] : []; - var ordered = Arr.bind(orderedListTypes, function (o) { - return o.regex.test(text) ? [ Merger.merge(o.type, getStart(text), { - variant: getVariant(o.type, text) - })] : []; - }); - - var result = nonSymbols.concat(symbols).concat(ordered); - return Arr.map(result, function (x) { - return x.variant !== undefined ? x : Merger.merge(x, { - variant: text - }); - }); - }; - - return { - match: match - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.ListGuess', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.list.detect.ListSymbols', - 'ephox.perhaps.Option', - 'ephox.violin.Strings' - ], - - function (Arr, ListSymbols, Option, Strings) { - - var guess = function(bulletInfo, preferredType) { - var text = bulletInfo ? Strings.trim(bulletInfo.text) : ''; - var symbolFont = bulletInfo ? !!bulletInfo.symbolFont : false; - var candidates = ListSymbols.match(text, symbolFont); - var preferred = Arr.find(candidates, function (c) { - // The original code only ran preferred types for ordered lists. I have - // no idea whether this is a condition that we want preserved, but one - // of the QUnit tests implicitly stated it is. - return c.tag === 'UL' || (preferredType && eqListType(c, preferredType, true)); - }); - return preferred !== undefined ? Option.some(preferred) : - candidates.length > 0 ? Option.some(candidates[0]) : Option.none(); - }; - - var eqListType = function(t1, t2, ignoreVariant) { - return t1 === t2 || - (t1 && t2 && t1.tag === t2.tag && t1.type === t2.type && - (ignoreVariant || t1.variant === t2.variant)); - }; - - return { - guess: guess, - eqListType: eqListType - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.ListTypes', - - [ - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.engine.TokenUtil', - 'ephox.pastiche.list.detect.ListGuess' - ], - - function (Token, TokenUtil, ListGuess) { - - var guess = function(bulletInfo, preferredType, originalToken) { - var candidate = ListGuess.guess(bulletInfo, preferredType); - return candidate.fold(function () { - return null; - }, function (c) { - if (c.tag === 'OL' && originalToken && (originalToken.tag() !== 'P' || /^MsoHeading/.test(TokenUtil.getAttribute(originalToken, 'class')))) { - // Don't convert numbered headings but do convert bulleted headings. - listType = null; - } else { - return c; - } - }); - }; - - var eqListType = ListGuess.eqListType; - - var checkFont = function(token, symbolFont) { - if (token.type() == Token.START_ELEMENT_TYPE) { - font = TokenUtil.getStyle(token, 'font-family'); - if (font) { - symbolFont = (font === 'Wingdings' || font === 'Symbol'); - } else if (/^(P|H[1-6]|DIV)$/.test(token.tag())) { - symbolFont = false; - } - } - return symbolFont; - }; - - return { - guess: guess, - eqListType: eqListType, - checkFont: checkFont - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Microsoft', - - [ - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.engine.TokenUtil' - ], - - function (Token, TokenUtil) { - var isList = function (state, token) { - var style = TokenUtil.getMsoList(token); - return style && style !== 'skip'; - }; - - var isIgnore = function (state, token) { - return token.type() == Token.START_ELEMENT_TYPE && TokenUtil.getMsoList(token) === 'Ignore'; - }; - - return { - isList: isList, - isIgnore: isIgnore - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Tags', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.engine.Token', - 'ephox.violin.Strings' - ], - - function (Arr, Token, Strings) { - var isStart = function (state, token) { - return token.type() === Token.START_ELEMENT_TYPE; - }; - - var isEnd = function (state, token) { - return token.type() === Token.END_ELEMENT_TYPE; - }; - - var isTag = function (tag) { - return function (state, token) { - return token.tag() === tag; - }; - }; - - var isWhitespace = function (tag) { - return function (state, token) { - return isTag(tag)(state, token) && Strings.trim(token.getNode().textContent) === ''; - }; - }; - - var isStartOf = function (tag) { - return function (state, token) { - return isStart(state, token) && token.tag() === tag; - }; - }; - - var isEndOf = function (tag) { - return function (state, token) { - return isEnd(state, token) && token.tag() === tag; - }; - }; - - var isStartAny = function (tags) { - return function (state, token) { - return isStart(state, token) && Arr.contains(tags, token.tag()); - }; - }; - - var isEndAny = function (tags) { - return function (state, token, tags) { - return isEnd(state, token) && Arr.contains(tags, token.tag()); - }; - }; - - return { - isStart: isStart, - isEnd: isEnd, - isTag: isTag, - isStartOf: isStartOf, - isEndOf: isEndOf, - isStartAny: isStartAny, - isEndAny: isEndAny, - isWhitespace: isWhitespace - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Paragraphs', - - [ - 'ephox.pastiche.inspect.Microsoft', - 'ephox.pastiche.inspect.Tags' - ], - - function (Microsoft, Tags) { - // MOVE ME. - var isNormal = function (state, token) { - return !state.skippedPara.get() && Tags.isStart(state, token, 'P') && !Microsoft.isList(state, token); - }; - - return { - isNormal: isNormal - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Texts', - - [ - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.engine.TokenUtil', - 'ephox.violin.Strings' - ], - - function (Token, TokenUtil, Strings) { - var isWhitespace = function (state, token) { - return is(state, token) && TokenUtil.isWhitespace(token); - }; - - var is = function (state, token) { - return token.type() === Token.TEXT_TYPE; - }; - - var eq = function (value) { - return function (state, token) { - return is(state, token) && token.text() === value; - }; - }; - - var matches = function (value) { - return function (state, token) { - return is(state, token) && value.test(token.text()); - }; - }; - - // CHECK: Is this equivalent to isWhitespace? - var isBlank = function (state, token) { - return is(state, token) && Strings.trim(token.text()) === ''; - }; - - return { - isWhitespace: isWhitespace, - is: is, - isBlank: isBlank, - eq: eq, - matches: matches - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.Handler', - - [ - 'ephox.peanut.Fun' - ], - - function (Fun) { - return function (pred, action, label) { - return { - pred: pred, - action: action, - label: Fun.constant(label) - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.Handlers', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - function (Arr, Fun, Option) { - var logger = function (label, action) { - return function (api, state, token) { - // console.log('LOGGER: ', label, token.getNode().cloneNode(false)); - return action(api, state, token); - }; - }; - - return function (name, handlers, fallback) { - var logFallback = logger(name + ' :: FALLBACK --- ', fallback); - - var r = function (api, state, token) { - // console.log('token: ', token.getNode().cloneNode(true)); - var match = Option.from(Arr.find(handlers, function (x) { - return x.pred(state, token); - })); - - var action = match.fold(Fun.constant(logFallback), function (m) { - var label = m.label(); - return label === undefined ? m.action : logger(name + ' :: ' + label, m.action); - }); - action(api, state, token); - }; - - r.toString = function () { return 'Handlers for ' + name; }; - return r; - }; - - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.Transitions', - - [ - ], - - function () { - var next = function (state, listState) { - if (state === undefined || listState === undefined) { - console.trace(); - throw 'brick'; - } - state.nextFilter.set(listState); - }; - - var setNext = function (listState) { - return function (api, state, token) { - next(state, listState); - }; - }; - - var go = function (api, state, token) { - var nextFilter = state.nextFilter.get(); - nextFilter(api, state, token); - }; - - var jump = function (listState) { - return function (api, state, token) { - next(state, listState); - go(api, state, token); - }; - }; - - var isNext = function (state, listState) { - return state.nextFilter.get() === listState; - }; - - return { - next: next, - go: go, - jump: jump, - isNext: isNext, - setNext: setNext - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.AfterListState', - - [ - 'ephox.pastiche.inspect.Paragraphs', - 'ephox.pastiche.inspect.Texts', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Transitions' - ], - - function (Paragraphs, Texts, Handler, Handlers, Transitions) { - var run = function (skipEmptyParaState, noListState) { - - var blankAction = function (api, state, token) { - api.defer(token); - }; - - var normalParaAction = function (api, state, token) { - state.openedTag.set(token); - api.defer(token); - Transitions.next(state, skipEmptyParaState); - }; - - var fallback = function (api, state, token) { - noListState(api, state, token); - }; - - return Handlers('AfterListState', [ - Handler(Texts.isBlank, blankAction, 'blank text'), - Handler(Paragraphs.isNormal, normalParaAction, 'normal paragraph') - ], fallback); - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.States', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - // MOVE ME? - var isCloser = function (state, token) { - return token.type() === Token.END_ELEMENT_TYPE && state.originalToken.get() && token.tag() === state.originalToken.get().tag(); - }; - - return { - isCloser: isCloser - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.AfterNoBulletListState', - - [ - 'ephox.pastiche.inspect.States', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Transitions' - ], - - function (States, Handler, Handlers, Transitions) { - var run = function (afterListState) { - - var action = function (api, state, token) { - Transitions.next(state, afterListState); - /* - I think that this should be 0, but it breaks qUnit test cases in powerpaste if it isn't -1. Probably - need to look into it in more detail. The level 0 check in ListModel in the emitter should - take care of it anyway. - */ - state.styleLevelAdjust.set(-1); - api.emit(token); - }; - - var fallback = function (api, state, token) { - api.emit(token); - }; - - return Handlers('AfterNoBullet', [ - Handler(States.isCloser, action, ' closing open tag') - ], fallback); - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Images', - - [ - 'ephox.pastiche.inspect.Tags' - ], - - function (Tags) { - - var isEnd = Tags.isEndOf('IMG'); - var isStart = Tags.isStartOf('IMG'); - - return { - isStart: isStart, - isEnd: isEnd - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Markers', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - - var is = function (state, token) { - return token.tag() === 'A' || token.tag() === 'SPAN'; - }; - - var isStart = function (state, token) { - return token.type() === Token.START_ELEMENT_TYPE && is(state, token); - }; - - var isEnd = function (state, token) { - return token.type() === Token.END_ELEMENT_TYPE && is(state, token); - }; - - return { - isStart: isStart, - isEnd: isEnd, - is: is - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.Spans', - - [ - 'ephox.pastiche.list.state.Transitions' - ], - - function (Transitions) { - var deferAndPop = function (api, state, token) { - api.defer(token); - pop(api, state, token); - }; - - var deferAndPush = function (api, state, token) { - api.defer(token); - push(api, state, token); - }; - - var push = function (api, state, token) { - state.spanCount.get().push(token); - }; - - var pop = function (api, state, token) { - state.spanCount.get().pop(); - }; - - var pushThen = function (listState) { - return function (api, state, token) { - push(api, state, token); - Transitions.next(state, listState); - }; - }; - - var popThen = function (listState) { - return function (api, state, token) { - pop(api, state, token); - Transitions.next(state, listState); - }; - }; - - return { - deferAndPush: deferAndPush, - deferAndPop: deferAndPop, - push: push, - pop: pop, - pushThen: pushThen, - popThen: popThen - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.BeforeSpacerState', - - [ - 'ephox.pastiche.inspect.Images', - 'ephox.pastiche.inspect.Markers', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.peanut.Fun' - ], - - function (Images, Markers, Handler, Handlers, Spans, Fun) { - var run = function (spacerState, closeSpansState, unexpectedToken) { - - var fallback = function (api, state, token) { - unexpectedToken(api, token); - }; - - return Handlers('BeforeSpacer', [ - Handler(Markers.isStart, Spans.pushThen(spacerState), 'start marker'), - Handler(Markers.isEnd, Spans.popThen(closeSpansState), 'end marker'), - Handler(Images.isEnd, Fun.noop, 'end image') - ], fallback); - - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Comments', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - - var is = function (state, token) { - return token.type() === Token.COMMENT_TYPE; - }; - - var isNotEndIf = function (state, token) { - return is(state, token) && token.text() !== '[endif]'; - }; - - var isEndIf = function (state, token) { - return is(state, token) && token.text() === '[endif]'; - }; - - var isListSupport = function (state, token) { - return is(state, token) && token.text() === '[if !supportLists]'; - }; - - return { - is: is, - isNotEndIf: isNotEndIf, - isEndIf: isEndIf, - isListSupport: isListSupport - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Logic', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - var any = function (conditions) { - return function (state, token) { - return Arr.exists(conditions, function (c) { - return c(state, token); - }); - }; - }; - - var all = function (conditions) { - return function (state, token) { - return Arr.forall(conditions, function (c) { - return c(state, token); - }); - }; - }; - - return { - any: any, - all: all - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.CloseSpansState', - - [ - 'ephox.pastiche.inspect.Comments', - 'ephox.pastiche.inspect.Logic', - 'ephox.pastiche.inspect.Markers', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.inspect.Texts', - 'ephox.pastiche.list.detect.ListTypes', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.perhaps.Result' - ], - - function (Comments, Logic, Markers, Tags, Texts, ListTypes, Handler, Handlers, Spans, Transitions, Fun, Option, Result) { - var run = function (itemContentState, unexpectedToken) { - - var getListType = function (state) { - var currentType = state.emitter.getCurrentListType(); - var currentLevel = state.emitter.getCurrentLevel(); - // FIX: Don't coerce types. - var preferred = currentLevel == state.itemLevel.get() ? currentType : null; - return Option.from(ListTypes.guess(state.bulletInfo.get(), preferred, state.originalToken.get())); - }; - - var openItem = function (api, state, token) { - state.emitter.openItem(state.itemLevel.get(), state.originalToken.get(), state.listType.get(), state.skippedPara.get()); - api.emitDeferred(); - while (state.spanCount.get().length > 0) { - api.emit(state.spanCount.get().shift()); - } - }; - - var updateState = function (state, token) { - Transitions.next(state, itemContentState); - if (state.commentMode.get()) { - var indent = state.indentGuesser.guessIndentLevel(token, state.originalToken.get(), state.styles, state.bulletInfo.get()); - state.itemLevel.set(indent); - } - }; - - var tryItem = function (api, state, token) { - var listType = getListType(state); - return listType.fold(function () { - state.listType.set(null); - return Result.error("Unknown list type: " + state.bulletInfo.get().text + " Symbol font? " + state.bulletInfo.get().symbolFont); - }, function (type) { - state.listType.set(type); - return Result.value(openItem); - }); - }; - - var updateAndEmit = function (api, state, token) { - updateState(state, token); - var emitter = tryItem(api, state, token); - emitter.fold(function (msg) { - console.log(msg); - api.rollback(); - }, function (x) { - x(api, state, token); - api.emit(token); - }); - }; - - var skipComment = function (api, state, token) { - updateState(state, token); - var emitter = tryItem(api, state, token); - emitter.fold(function (msg) { - console.log(msg); - api.rollback(); - }, function (x) { - x(api, state, token); - }); - }; - - var handlers = [ - Handler(Logic.any([ Texts.is, Tags.isStart ]), updateAndEmit, 'text or start tag'), - Handler(Comments.isNotEndIf, updateAndEmit, 'non-endif comment'), - Handler(Comments.isEndIf, skipComment, 'endif comment'), - Handler(Markers.isEnd, Spans.pop, 'end marker'), - Handler(Tags.isEnd, Fun.noop, 'end tag') - ]; - - return Handlers('CloseSpans', handlers, function (api, state, token) { - unexpectedToken(api, token); - }); - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.FindListTypeState', - - [ - 'ephox.pastiche.inspect.Images', - 'ephox.pastiche.inspect.Markers', - 'ephox.pastiche.inspect.Texts', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions', - 'ephox.peanut.Fun' - ], - - function (Images, Markers, Texts, Handler, Handlers, Spans, Transitions, Fun) { - var run = function (beforeSpacerState, unexpectedToken) { - var action = function (bullets) { - return function (api, state, token) { - Transitions.next(state, beforeSpacerState); - state.bulletInfo.set(bullets(state, token)); - }; - }; - - var textAction = action(function (state, token) { - return { - text: token.text(), - symbolFont: state.symbolFont.get() - }; - }); - - var imageAction = action(function (state, token) { - // Custom list image type. We can't access the image so use a normal bullet instead. - // EditLive! may want this to come through as a CSS reference. - return { - text: '\u2202', - symbolFont: true - }; - }); - - var fallback = function (api, state, token) { - unexpectedToken(api, token); - }; - - return Handlers('FindListType', [ - Handler(Texts.isWhitespace, Fun.noop, 'text is whitespace'), - Handler(Texts.is, textAction, 'text'), - Handler(Markers.isStart, Spans.push, 'start marker'), - Handler(Markers.isEnd, Spans.pop, 'end marker'), - Handler(Images.isStart, imageAction, 'start image') - ], fallback); - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.ItemContentState', - - [ - 'ephox.pastiche.inspect.States', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Transitions' - ], - - function (States, Handler, Handlers, Transitions) { - var run = function (afterListState) { - - var closeItem = function (api, state, token) { - Transitions.next(state, afterListState); - state.skippedPara.set(false); - }; - - var handlers = [ - Handler(States.isCloser, closeItem, 'Closing open tag') - ]; - - return Handlers('ItemContentState', handlers, function (api, state, token) { - api.emit(token); - }); - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.CommentOff', - - [ - 'ephox.pastiche.inspect.Comments', - 'ephox.pastiche.inspect.Texts' - ], - - function (Comments, Texts) { - var isText = function (state, token) { - return !state.commentMode.get() && Texts.is(state, token); - }; - - var isComment = function (state, token) { - return !state.commentMode.get() && Comments.is(state, token); - }; - - return { - isText: isText, - isComment: isComment - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.CommentOn', - - [ - 'ephox.pastiche.engine.TokenUtil', - 'ephox.pastiche.inspect.Comments', - 'ephox.pastiche.inspect.Texts' - ], - - function (TokenUtil, Comments, Texts) { - var isText = function (state, token) { - return state.commentMode.get() && Texts.is(state, token); - }; - - var isComment = function (state, token) { - return state.commentMode.get() && Comments.is(state, token); - }; - - var isUnstyled = function (state, token) { - var style = TokenUtil.getAttribute(token, 'style'); - return state.commentMode.get() && style === "" || style === null; - }; - - return { - isText: isText, - isComment: isComment, - isUnstyled: isUnstyled - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.ListStartState', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.inspect.Logic', - 'ephox.pastiche.inspect.Microsoft', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.inspect.Texts', - 'ephox.pastiche.list.detect.ListSymbols', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.CommentOff', - 'ephox.pastiche.list.state.CommentOn', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions', - 'ephox.peanut.Fun' - ], - - function (Arr, Logic, Microsoft, Tags, Texts, ListSymbols, Handler, Handlers, CommentOff, CommentOn, Spans, Transitions, Fun) { - var run = function (findListTypeState, afterNoBulletListState, unexpectedToken) { - - /* In one of the adhoc tests on Word 2007, Win XP ... a span with a massive number of nbsp was - added at the ListStart stage. This was added to jump to the end of it. */ - var skipWhitespace = function () { - return Handlers('TESTER', [ - Handler(Tags.isEndOf('SPAN'), Transitions.setNext(result), 'Finishing span'), - Handler(Texts.isWhitespace, Fun.noop, 'Is whitespace') - ], function (api, state, token) { - unexpectedToken(api, token); - }); - }; - - var noBullet = function (api, state, token) { - // List type without a bullet, we should treat it as a paragraph. - - // What about if it is 1. or something similar? - var start = state.originalToken.get(); - var spans = state.spanCount.get(); - state.emitter.closeAllLists(); - api.emit(start); - Arr.each(spans, api.emit); - api.emit(token); - api.commit(); - state.originalToken.set(start); - Transitions.next(state, afterNoBulletListState); - }; - - var isBulletSymbol = function (s, t) { - return Texts.is(s, t) && ListSymbols.match(t.text(), s.symbolFont.get()).length > 0; - }; - - var result = function (api, state, token) { - if (Microsoft.isIgnore(state, token)) { - Transitions.next(state, findListTypeState); - } - - var r = Handlers('ListStartState', [ - Handler( - Logic.all([ Tags.isStartOf('SPAN'), CommentOn.isUnstyled ]), - Spans.pushThen(findListTypeState), - 'unstyled span' - ), - - // This handler was added due to adhoc Word 2007 XP content. It breaks QUnit tests. - /* Handler(Logic.all([ Tags.isStart, Tags.isWhitespace('SPAN') ]), Transitions.setNext(skipWhitespace()), 'a whitespace tag'), */ - Handler(Tags.isStartOf('SPAN'), Spans.push, 'starting span'), - Handler(Tags.isStartOf('A'), Spans.push, 'starting a'), - Handler(Tags.isEndOf('A'), Spans.pop, 'ending a'), - Handler(CommentOn.isText, Transitions.jump(findListTypeState), 'commentOn -> text'), - // This handler is new. It may be a problem. - Handler(isBulletSymbol, Transitions.jump(findListTypeState), 'mogran :: text is [1-9].'), - Handler(Texts.is, noBullet, 'text'), - Handler(CommentOff.isComment, Fun.noop, 'commentOff -> comment'), - - // This was added to handle more gracefully the images in some of the test data. May be wrong. - Handler(Tags.isStartOf('IMG'), Transitions.jump(findListTypeState), 'mogran :: start image tag') - ], function (api, state, token) { - unexpectedToken(api, token); - }); - - return r(api, state, token); - }; - - result.toString = function () { return 'Handlers for ListStartState'; }; - return result; - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Browser', - - [ - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.inspect.Microsoft', - 'global!document', - 'global!navigator' - ], - - function (Token, Microsoft, document, navigator) { - var supportsCustomStyles = function () { - // Firefox 4 preserves these styles in the DOM, but strips them when pasting. - // Since we can't trigger a paste there's no way to detect this situation apart from sniffing. - if (navigator.userAgent.indexOf('Gecko') > 0 && navigator.userAgent.indexOf('WebKit') < 0) return false; - var div = document.createElement('div'); - try { - div.innerHTML = '<p style="mso-list: Ignore;"> </p>'; - } catch (ex) { - // Can't set innerHTML if we're in XHTML mode so just assume we don't get custom styles. - return false; - } - - var token = Token.token(div.firstChild); - // INVESTIGATE: Does this need to be lowercased? - return Microsoft.isIgnore({}/*state*/, token); - }; - - return { - supportsCustomStyles: supportsCustomStyles - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.ImageList', - - [ - ], - - function () { - var is = function (state, node, symbol) { - var alt = node !== undefined && node !== null && node.getAttribute !== undefined && node.getAttribute !== null ? node.getAttribute('alt') : ''; - // The check here for === * is because we are disabling image lists as they - // interfere with regular images. The one exception where it is reasonable - // to assume it is a list is if the alt text is *. - return !!node && node.tagName === 'IMG' && alt === '*'; - }; - - return { - is: is - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.TextList', - - [ - 'ephox.pastiche.list.detect.ListTypes', - 'ephox.violin.Strings' - ], - - function (ListTypes, Strings) { - var is = function (state, rawNode, symbol) { - var node = rawNode; - var value = node.nodeValue; - if (!Strings.trim(value)) { - // This handles the case where there's a SPAN with nbsps before the bullet such as with roman numerals. - node = node.parentNode.nextSibling; - value = node ? node.nodeValue : ''; - } - - // Real lists have the bullet with NBSPs either side surrounded in a SPAN. If there's anything else, it's not a list. - if (!node || Strings.trim(node.parentNode.textContent) != value) { - return false; - } - listType = ListTypes.guess({ text: value, symbolFont: symbol }, null, state.originalToken.get()); - - if (listType) { - - // Don't convert numbered headings to lists. - var r = !!node.nextSibling && node.nextSibling.tagName === 'SPAN' && /^[\u00A0\s]/.test(node.nextSibling.firstChild.nodeValue) && - (state.openedTag.get().tag() === 'P' || listType.tag === 'UL'); - return r; - } else { - return false; - } - }; - - return { - is: is - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.detect.ListDetect', - - [ - 'ephox.highway.Merger', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.list.detect.ImageList', - 'ephox.pastiche.list.detect.TextList' - ], - - function (Merger, Tags, ImageList, TextList) { - - var update = function (output) { - var node = output.node; - var font = node.style.fontFamily; - return font ? Merger.merge(output, { symbol: (font === 'Wingdings' || font === 'Symbol') }) : output; - }; - - var hasMarkerFirst = function (node) { - return !!node.firstChild && (node.firstChild.tagName === 'SPAN' || node.firstChild.tagName === 'A'); - }; - - var findItem = function (node) { - var output = update({ node: node }); - - var initialEmptyA = node.childNodes.length > 1 && output.node.firstChild.tagName === 'A' && output.node.firstChild.textContent === ''; - output = initialEmptyA ? { node: output.node.childNodes[1], symbol: output.symbol } : output; - - while (hasMarkerFirst(output.node)) { - output = update({ node: output.node.firstChild, symbol: output.symbol }); - } - - return { - node: output.node.firstChild, - symbol: output.symbol - }; - }; - - var isUnofficialList = function (state, token) { - if (!Tags.isStartOf('SPAN')(state, token) || !state.openedTag.get()) return false; - var node = state.openedTag.get().getNode(); - var item = findItem(node); - var detector = item.node && item.node.nodeType === 3 ? TextList : ImageList; - return detector.is(state, item.node, item.symbol); - }; - - return { - isUnofficialList: isUnofficialList - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.inspect.Lists', - - [ - 'ephox.pastiche.engine.TokenUtil', - 'ephox.pastiche.inspect.Browser', - 'ephox.pastiche.inspect.Comments', - 'ephox.pastiche.inspect.Microsoft', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.list.detect.ListDetect', - 'ephox.perhaps.Option' - ], - - function (TokenUtil, Browser, Comments, Microsoft, Tags, ListDetect, Option) { - var getLevel = function (token) { - var msoList = TokenUtil.getMsoList(token); - var lvl = / level([0-9]+)/.exec(msoList); - return lvl && lvl[1] ? Option.some(parseInt(lvl[1], 10)) : Option.none(); - }; - - var isStart = function (state, token) { - return Tags.isStart(state, token) && Microsoft.isList(state, token) && token.tag() !== 'LI'; - }; - - var isValidStart = function (state, token) { - return isStart(state, token) && getLevel(token).isSome(); - }; - - var isInvalidStart = function (state, token) { - return isStart(state, token) && getLevel(token).isNone(); - }; - - var isSpecial = function (state, token) { - var custom = Browser.supportsCustomStyles(); - return !custom && Comments.isListSupport(state, token) || ListDetect.isUnofficialList(state, token); - }; - - return { - getLevel: getLevel, - isStart: isStart, - isValidStart: isValidStart, - isInvalidStart: isInvalidStart, - isSpecial: isSpecial - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.NoListState', - - [ - 'ephox.pastiche.inspect.Lists', - 'ephox.pastiche.inspect.Markers', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions' - ], - - function (Lists, Markers, Tags, Handler, Handlers, Spans, Transitions) { - var run = function (lazyListStartState) { - - var startList = function (api, state, token) { - var level = Lists.getLevel(token); - level.each(function (l) { - state.itemLevel.set(l + state.styleLevelAdjust.get()); - // Tokens between lists should be dropped (they're just whitespace anyway) - // however, tokens before a list should be emitted if we find an mso-list style - // since this is the very first token of the list. - var deferring = Transitions.isNext(state, result) ? api.emitDeferred : api.dropDeferred; - deferring(); - - Transitions.next(state, lazyListStartState()); - api.startTransaction(); - state.originalToken.set(token); - state.commentMode.set(false); - }); - }; - - var specialList = function (api, state, token) { - if (Tags.isStartOf('SPAN')(state, token)) { - Spans.push(api, state, token); - } - Transitions.next(state, lazyListStartState()); - api.startTransaction(); - state.originalToken.set(state.openedTag.get()); - state.commentMode.set(true); - state.openedTag.set(null); - api.dropDeferred(); - }; - - var startTag = function (api, state, token) { - if (state.openedTag.get()) { - state.emitter.closeAllLists(); - api.emitDeferred(); - } - state.openedTag.set(token); - api.defer(token); - }; - - var closeOutLists = function (api, state, token) { - state.emitter.closeAllLists(); - api.emitDeferred(); - state.openedTag.set(null); - api.emit(token); - Transitions.next(state, result); - }; - - var result = Handlers('NoListState', [ - Handler(Lists.isValidStart, startList, 'valid list so start it'), - Handler(Lists.isInvalidStart, closeOutLists, 'invalid list so close lists'), - Handler(Lists.isSpecial, specialList, 'special list'), - Handler(Markers.isEnd, Spans.deferAndPop, 'closing marker'), - Handler(Markers.isStart, Spans.deferAndPush, 'starting marker'), - Handler(Tags.isStart, startTag, 'starting tag') - ], closeOutLists); - - return result; - }; - - return { - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.SkipEmptyParaState', - - [ - 'ephox.pastiche.inspect.Browser', - 'ephox.pastiche.inspect.Logic', - 'ephox.pastiche.inspect.Microsoft', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.inspect.Texts', - 'ephox.pastiche.list.detect.ListDetect', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions' - ], - - function (Browser, Logic, Microsoft, Tags, Texts, ListDetect, Handler, Handlers, Spans, Transitions) { - var run = function (noListState, lazyAfterListState) { - - var isFirstMarker = function (state, token) { - return Tags.isStartOf('SPAN')(state, token) && state.spanCount.get().length === 0; - }; - - var isNotList = function (state, token) { - return (Browser.supportsCustomStyles() || !ListDetect.isUnofficialList(state, token)) && !Microsoft.isList(state, token); - }; - - var skip = function (api, state, token) { - api.defer(token); - state.skippedPara.set(true); - state.openedTag.set(null); - Transitions.next(state, lazyAfterListState()); - }; - - var defer = function (api, state, token) { - api.defer(token); - }; - - return Handlers('SkipEmptyPara', [ - Handler(Logic.all([ isFirstMarker, isNotList ]), Spans.deferAndPush, 'first marker or not list'), - Handler(Tags.isEndOf('SPAN'), Spans.deferAndPop, 'end span'), - Handler(Tags.isEndOf('P'), skip, 'end p'), - Handler(Tags.isEnd, Transitions.jump(noListState), 'end tag'), - Handler(Texts.isWhitespace, defer, 'whitespace') - ], Transitions.jump(noListState)); - }; - - return { - run: run - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.stage.SpacerState', - - [ - 'ephox.pastiche.inspect.Markers', - 'ephox.pastiche.inspect.Tags', - 'ephox.pastiche.list.stage.Handler', - 'ephox.pastiche.list.stage.Handlers', - 'ephox.pastiche.list.state.Spans', - 'ephox.pastiche.list.state.Transitions', - 'ephox.peanut.Fun' - ], - - function (Markers, Tags, Handler, Handlers, Spans, Transitions, Fun) { - var run = function (closeSpansState) { - return Handlers('Spacer', [ - Handler(Markers.isEnd, Spans.popThen(closeSpansState), 'end marker'), - Handler(Tags.isEnd, Transitions.setNext(closeSpansState), 'end tag') - ], Fun.noop); - }; - - return { - run: run - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.Emission', - - [ - 'ephox.scullion.Struct' - ], - - function (Struct) { - var result = Struct.immutable('state', 'result'); - var value = Struct.immutable('state', 'value'); - var state = Struct.immutable('level', 'type', 'types', 'items'); - - return { - state: state, - value: value, - result: result - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.ItemStack', - - [ - 'ephox.pastiche.list.emit.Emission', - 'ephox.perhaps.Option' - ], - - function (Emission, Option) { - var finish = function (state) { - var stack = state.items().slice(0); - if (stack.length > 0 && stack[stack.length - 1] !== 'P') { - var item = stack[stack.length - 1]; - stack[stack.length - 1] = 'P'; - var newState = Emission.state(state.level(), state.type(), state.types(), stack); - return Emission.value(newState, Option.some(item)); - } else { - return Emission.value(state, Option.none()); - } - }; - - var start = function (state, tag) { - var stack = state.items().slice(0); - var value = tag !== undefined && tag !== 'P' ? Option.some(tag) : Option.none(); - - value.fold(function () { - stack.push('P'); - }, function (v) { - stack.push(v); - }); - - var newState = Emission.state(state.level(), state.type(), state.types(), stack); - return Emission.value(newState, value); - }; - - return { - start: start, - finish: finish - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.ListLevels', - - [ - 'ephox.pastiche.list.emit.Emission' - ], - - function (Emission) { - var moveUntil = function (state, predicate, f) { - var tokens = []; - - var current = state; - while (predicate(current)) { - var acc = f(current); - current = acc.state(); - tokens = tokens.concat(acc.result()); - } - return Emission.result(current, tokens); - }; - - var moveRight = function (state, level, open) { - var predicate = function (s) { - return s.level() < level; - }; - - return moveUntil(state, predicate, open); - }; - - var moveLeft = function (state, level, close) { - var predicate = function (state) { - return state.level() > level; - }; - - return moveUntil(state, predicate, close); - }; - - return { - moveRight: moveRight, - moveLeft: moveLeft, - moveUntil: moveUntil - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.ListItemStyles', - - [ - 'ephox.pastiche.engine.TokenUtil' - ], - - function (TokenUtil) { - - var unsafeFrom = function (token) { - var leftMargin = TokenUtil.getStyle(token, 'margin-left'); - return leftMargin !== undefined && leftMargin !== '0px' ? { 'margin-left': leftMargin } : {}; - }; - - var from = function (token) { - var noToken = { - 'list-style-type': 'none' - }; - - return !token ? noToken : unsafeFrom(token); - }; - - return { - from: from - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.SkippedTokens', - - [ - 'ephox.pastiche.engine.Token', - 'ephox.peanut.Fun' - ], - - function (Token, Fun) { - var para = function (doc) { - return [ - Fun.curry(Token.createStartElement, 'P', {}, {}), - Fun.curry(Token.createText, '\u00A0'), - Fun.curry(Token.createEndElement, 'P') - ]; - }; - - return { - para: para - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.ListTokens', - - [ - 'ephox.pastiche.cleanup.Cleaners', - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.list.detect.ListTypes', - 'ephox.pastiche.list.emit.Emission', - 'ephox.pastiche.list.emit.ItemStack', - 'ephox.pastiche.list.emit.ListItemStyles', - 'ephox.pastiche.list.emit.SkippedTokens', - 'ephox.peanut.Fun' - ], - - function (Cleaners, Token, ListTypes, Emission, ItemStack, ListItemStyles, SkippedTokens, Fun) { - var open = function(state, type, style) { - var attributes = type.start && type.start > 1 ? { start: type.start } : {}; - var level = state.level() + 1; - var listType = type; - var listTypes = state.types().concat([type]); - var result = [ Fun.curry(Token.createStartElement, type.tag, attributes, style) ]; - var newState = Emission.state(level, listType, listTypes, state.items()); - return Emission.result(newState, result); - }; - - var close = function(state) { - var listTypes = state.types().slice(0); - var result = [ Fun.curry(Token.createEndElement, listTypes.pop().tag) ]; - var level = state.level() - 1; - var listType = listTypes[listTypes.length - 1]; - var newState = Emission.state(level, listType, listTypes, state.items()); - return Emission.result(newState, result); - }; - - var shuffle = function (state, type, skippedPara) { - var e1 = close(state); - var extra = skippedPara ? SkippedTokens.para() : []; - var e2 = open(e1.state(), type, type.type ? { 'list-style-type': type.type } : {}); - return Emission.result(e2.state(), e1.result().concat(extra).concat(e2.result())); - }; - - var openItem = function(state, paragraphToken, type, skippedPara) { - var attributes = {}; - var style = ListItemStyles.from(paragraphToken); - - var e1 = state.type() && !ListTypes.eqListType(state.type(), type) ? - shuffle(state, type, skippedPara) : - Emission.result(state, []); - var tokens = [ Fun.curry(Token.createStartElement, 'LI', attributes, style) ]; - - var e2 = ItemStack.start(e1.state(), paragraphToken && paragraphToken.tag()); - var moreTokens = e2.value().map(function (v) { - Cleaners.styleDom(paragraphToken.getNode(), Fun.constant(true)); - return [ Fun.constant(paragraphToken) ]; - }).getOr([]); - - return Emission.result(e2.state(), e1.result().concat(tokens).concat(moreTokens)); - }; - - var closeItem = function(state) { - var li = Fun.curry(Token.createEndElement, 'LI'); - var e1 = ItemStack.finish(state); - var r = e1.value().fold(function () { - return [ li ]; - }, function (item) { - return [ Fun.curry(Token.createEndElement, item), li ]; - }); - return Emission.result(e1.state(), r); - }; - - return { - open: open, - openItem: openItem, - close: close, - closeItem: closeItem - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.ListModel', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.engine.Token', - 'ephox.pastiche.list.emit.Emission', - 'ephox.pastiche.list.emit.ItemStack', - 'ephox.pastiche.list.emit.ListLevels', - 'ephox.pastiche.list.emit.ListTokens', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - function (Arr, Token, Emission, ItemStack, ListLevels, ListTokens, Fun, Option) { - var compose = function (emissions) { - if (emissions.length === 0) throw 'Compose must have at least one element in the list'; - var last = emissions[emissions.length - 1]; - var tokens = Arr.bind(emissions, function (emission) { - return emission.result(); - }); - return Emission.result(last.state(), tokens); - }; - - var closeLevel = function (state) { - var e1 = ListTokens.closeItem(state); - var e2 = ListTokens.close(e1.state()); - return compose([ e1, e2 ]); - }; - - var openLevel = function (state, type, level, paragraphToken) { - var style = state.level() === level - 1 && type.type ? { 'list-style-type': type.type } : {}; - var e1 = ListTokens.open(state, type, style); - var e2 = ListTokens.openItem(e1.state(), e1.state().level() == level ? paragraphToken : undefined, type); - return compose([ e1, e2 ]); - }; - - var sameLevel = function (state, type, paragraphToken, skippedPara) { - var e1 = state.level() > 0 ? ListTokens.closeItem(state) : Emission.result(state, []); - var e2 = ListTokens.openItem(e1.state(), paragraphToken, type, skippedPara); - return compose([ e1, e2 ]); - }; - - var openLevels = function (state, type, level, paragraphToken) { - return ListLevels.moveRight(state, level, function (s) { - return openLevel(s, type, level, paragraphToken); - }); - }; - - var closeLevels = function (state, level) { - return ListLevels.moveLeft(state, level, closeLevel); - }; - - var jumpToLevel = function (state, type, level, paragraphToken) { - var e1 = level > 1 ? ItemStack.finish(state) : Emission.value(state, Option.none()); - var tokens = e1.value().map(function (tag) { - return [ Fun.curry(Token.createEndElement, tag) ]; - }).getOr([]); - - var numLevels = level - e1.state().level(); - var e2 = openLevels(e1.state(), type, level, paragraphToken); - return Emission.result(e2.state(), tokens.concat(e2.result())); - }; - - var openItem = function(state, level, paragraphToken, type, skippedPara) { - var e1 = state.level() > level ? closeLevels(state, level) : Emission.result(state, []); - var e2 = e1.state().level() === level ? - sameLevel(e1.state(), type, paragraphToken, skippedPara) : - jumpToLevel(e1.state(), type, level, paragraphToken); - return compose([ e1, e2 ]); - }; - - var closeAllLists = closeLevels; - - return { - openItem: openItem, - closeAllLists: closeAllLists - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.emit.Emitter', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.list.emit.Emission', - 'ephox.pastiche.list.emit.ListModel' - ], - - function (Arr, Emission, ListModel) { - var impliedULatLevel = [ 'disc', 'circle', 'square' ]; - - var removeImpliedListType = function(type, level) { - if (type.tag === 'UL') { - if (impliedULatLevel[level - 1] === type.type) { - type = { tag: 'UL' }; - } - } - return type; - }; - - return function (api, doc) { - - var state = Emission.state(0, undefined, [], []); - - var emit = function (emission) { - Arr.each(emission.result(), function (x) { - var token = x(doc); - api.emit(token); - }); - }; - - var closeAllLists = function() { - var e1 = ListModel.closeAllLists(state, 0); - state = e1.state(); - emit(e1); - api.commit(); - }; - - var openItem = function(level, paragraphToken, type, skippedPara) { - var style = {}, token; - if (!type) return; - var cleanType = removeImpliedListType(type, level); - var e1 = ListModel.openItem(state, level, paragraphToken, cleanType, skippedPara); - state = e1.state(); - emit(e1); - }; - - var getCurrentLevel = function() { - return state.level(); - }; - var getCurrentListType = function() { - return state.type(); - }; - - return { - closeAllLists: closeAllLists, - openItem: openItem, - getCurrentListType: getCurrentListType, - getCurrentLevel: getCurrentLevel - }; - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.indent.ListIndent', - - [ - 'ephox.compass.Arr', - 'ephox.pastiche.engine.TokenUtil', - 'ephox.violin.Strings', - 'global!Math' - ], - - function (Arr, TokenUtil, Strings, Math) { - var getLeftOffset = function(node, paragraph) { - var parent, child, offset = 0; - parent = node.parentNode; - while (parent !== null && parent !== paragraph.parentNode) { - offset += parent.offsetLeft; - parent = parent.offsetParent; - } - return offset; - }; - - var ephoxGetComputedStyle = function(node) { - if (node.ownerDocument.defaultView) { - return node.ownerDocument.defaultView.getComputedStyle(node, null); - } - return node.currentStyle || {}; - }; - - - /** A simplified memoize function which only supports one or two function parameters. - * - * @param fn - * @param param the funtion p - * @returns - */ - var memoize2 = function(fn) { - var cache = {}; - return function(param1, param2) { - var result, key = param1 + "," + param2; - if (cache.hasOwnProperty(key)) { - return cache[key]; - } - result = fn.call(null, param1, param2); - cache[key] = result; - return result; - }; - }; - - var findStyles = memoize2(function(css, className) { - var results, matcher = /([^{]+){([^}]+)}/g, match, el, computedStyle; - matcher.lastIndex = 0; // Firefox Mac reuses the same regex so we need to reset it. - while ((results = matcher.exec(css)) !== null && !match) { - Arr.each(results[1].split(','), function(selector) { - var dotIndex = selector.indexOf('.'); - if (dotIndex >= 0 && Strings.trim(selector.substring(dotIndex + 1)) === className) { - match = results[2]; - return false; - } - }); - } - if (match) { - el = document.createElement('p'); - el.setAttribute("style", match); - computedStyle = ephoxGetComputedStyle(el); - return computedStyle ? "" + computedStyle.marginLeft : false; - } - return false; - }); - - var indentGuesser = function() { - - var listIndentAdjust; - var listIndentAmount; - var guessIndentLevel = function(currentToken, token, styles, bulletInfo) { - var indentAmount, itemIndent, el, level = 1; - - if (bulletInfo && /^([0-9]+\.)+[0-9]+\.?$/.test(bulletInfo.text)) { - // Outline list type so we can just count the number of sections. - return bulletInfo.text.replace(/([0-9]+|\.$)/g, '').length + 1; - } - indentAmount = listIndentAmount || parseInt(findStyles(styles, TokenUtil.getAttribute(token, 'class'))); - - itemIndent = getLeftOffset(currentToken.getNode(), token.getNode()); - if (!indentAmount) { - indentAmount = 48; - } else { - // We might get a 0 item indent if the list CSS code wasn't pasted as happens on Windows. - if (listIndentAdjust) { - itemIndent += listIndentAdjust; - } else if (itemIndent === 0) { - listIndentAdjust = indentAmount; - itemIndent += indentAmount; - } - } - listIndentAmount = indentAmount = Math.min(itemIndent, indentAmount); - level = Math.max(1, Math.floor(itemIndent / indentAmount)) || 1; - return level; - }; - return { - guessIndentLevel: guessIndentLevel - }; - }; - - return { - indentGuesser: indentGuesser - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.ListStyles', - - [ - 'ephox.pastiche.engine.Token' - ], - - function (Token) { - return function () { - var inStyle = false; - var styles = ""; - var check = function(token) { - if (inStyle && token.type() === Token.TEXT_TYPE) { - styles += token.text(); - return true; - } else if (token.type() === Token.START_ELEMENT_TYPE && token.tag() === 'STYLE') { - inStyle = true; - return true; - } else if (token.type() === Token.END_ELEMENT_TYPE && token.tag() === 'STYLE') { - inStyle = false; - return true; - } - return false; - }; - return { - check: check - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.scullion.Cell', - - [ - ], - - function () { - var Cell = function (initial) { - var value = initial; - - var get = function () { - return value; - }; - - var set = function (v) { - value = v; - }; - - var clone = function () { - return Cell(get()); - }; - - return { - get: get, - set: set, - clone: clone - }; - }; - - return Cell; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.list.state.ListState', - - [ - 'ephox.pastiche.list.emit.Emitter', - 'ephox.pastiche.list.indent.ListIndent', - 'ephox.pastiche.list.state.ListStyles', - 'ephox.peanut.Fun', - 'ephox.scullion.Cell' - ], - - function (Emitter, ListIndent, ListStyles, Fun, Cell) { - - var indentGuesser = ListIndent.indentGuesser(); - var styles = ListStyles(); - - - var emitter = { - getCurrentListType: function () { - return lazyEmitter().getCurrentListType(); - }, - getCurrentLevel: function () { - return lazyEmitter().getCurrentLevel(); - }, - closeAllLists: function () { - return lazyEmitter().closeAllLists.apply(undefined, arguments); - }, - openItem: function () { - return lazyEmitter().openItem.apply(undefined, arguments); - } - }; - - var lazyEmitter = function () { - return { - getCurrentListType: Fun.constant({}), - getCurrentLevel: Fun.constant(1), - closeAllLists: Fun.identity, - openItem: Fun.identity - }; - }; - - return function (initialState) { - var nextFilter = Cell(initialState); - var itemLevel = Cell(0); - var originalToken = Cell(null); - var commentMode = Cell(false); - var openedTag = Cell(null); - var symbolFont = Cell(false); - var listType = Cell(null); - var spanCount = Cell([]); - var skippedPara = Cell(false); - var styleLevelAdjust = Cell(0); - var bulletInfo = Cell(undefined); - var logger = Cell([]); - - var reset = function (api) { - nextFilter.set(initialState); - itemLevel.set(0); - originalToken.set(null); - commentMode.set(false); - openedTag.set(null); - symbolFont.set(false); - listType.set(null); - spanCount.set([]); - skippedPara.set(false); - styleLevelAdjust.set(0); - bulletInfo.set(undefined); - logger.set([]); - - // ASSUMPTION: I think this approach in the past also papered over the stack needing resetting in the emitter. - _emitter = Emitter(api, api.document); - lazyEmitter = Fun.constant(_emitter); - }; - - return { - reset: reset, - nextFilter: nextFilter, - itemLevel: itemLevel, - originalToken: originalToken, - commentMode: commentMode, - openedTag: openedTag, - symbolFont: symbolFont, - listType: listType, - spanCount: spanCount, - skippedPara: skippedPara, - styleLevelAdjust: styleLevelAdjust, - bulletInfo: bulletInfo, - logger: logger, - - emitter: emitter, - styles: styles, - indentGuesser: indentGuesser - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.pastiche.filter.Lists', - - [ - 'ephox.pastiche.engine.Filter', - 'ephox.pastiche.list.detect.ListTypes', - 'ephox.pastiche.list.stage.AfterListState', - 'ephox.pastiche.list.stage.AfterNoBulletListState', - 'ephox.pastiche.list.stage.BeforeSpacerState', - 'ephox.pastiche.list.stage.CloseSpansState', - 'ephox.pastiche.list.stage.FindListTypeState', - 'ephox.pastiche.list.stage.ItemContentState', - 'ephox.pastiche.list.stage.ListStartState', - 'ephox.pastiche.list.stage.NoListState', - 'ephox.pastiche.list.stage.SkipEmptyParaState', - 'ephox.pastiche.list.stage.SpacerState', - 'ephox.pastiche.list.state.ListState', - 'ephox.pastiche.list.state.Transitions' - ], - - function (Filter, ListTypes, AfterListState, AfterNoBulletListState, BeforeSpacerState, CloseSpansState, FindListTypeState, ItemContentState, ListStartState, NoListState, SkipEmptyParaState, SpacerState, ListState, Transitions) { - var unexpectedToken = function(api, token) { - var info = 'Type: ' + token.type() + ', Tag: ' + token.tag() + ' Text: ' + token.text(); - console.log('Unexpected token in list conversion: ' + info, activeState.nextFilter.get()); - api.rollback(); - }; - - var noListState = NoListState.run(function () { - return listStartState; - }); - var skipEmptyParaState = SkipEmptyParaState.run(noListState, function () { - return afterListState; - }); - var afterListState = AfterListState.run(skipEmptyParaState, noListState); - var itemContentState = ItemContentState.run(afterListState); - var closeSpansState = CloseSpansState.run(itemContentState, unexpectedToken); - var spacerState = SpacerState.run(closeSpansState); - var beforeSpacerState = BeforeSpacerState.run(spacerState, closeSpansState, unexpectedToken); - var findListTypeState = FindListTypeState.run(beforeSpacerState, unexpectedToken); - var afterNoBulletListState = AfterNoBulletListState.run(afterListState); - var listStartState = ListStartState.run(findListTypeState, afterNoBulletListState, unexpectedToken); - - var activeState = ListState(noListState); - - var receive = function(api, token) { - if (activeState.styles && activeState.styles.check(token)) { - return; - } - - activeState.symbolFont.set(ListTypes.checkFont(token, activeState.symbolFont.get())); - Transitions.go(api, activeState, token); - }; - - return Filter.createFilter(receive, activeState.reset, 'lists'); - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.process.Strategies', - - [ - 'ephox.pastiche.api.HtmlPatterns', - 'ephox.pastiche.api.HybridAction', - 'ephox.pastiche.api.RuleConditions', - 'ephox.pastiche.api.RuleMutations', - 'ephox.pastiche.filter.Lists', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Css', - 'ephox.violin.StringMatch' - ], - - function (HtmlPatterns, HybridAction, RuleConditions, RuleMutations, Lists, Fun, Class, Css, StringMatch) { - // This will UNWRAP! tags such as <O:> and <U1:> - // Context: Word copy and paste. - var unwrapWordTags = HybridAction.unwrapper({ - tags: [ - { name: StringMatch.pattern(/^([OVWXP]|U[0-9]+|ST[0-9]+):/i) } - ] - }); - - // This will try and turn p tags into ol,ul and li tags where appropriate - // Context: Word copy and paste. - var parseLists = HybridAction.pipeline([ Lists ]); - - // This will remove attributes matching: v:.., href with #_toc|#_mso, xmlns:, align - // and type on lists. - // Context: Word copy and paste. - var removeWordAttributes = HybridAction.removal({ - attributes: [ - { name: StringMatch.pattern(/^v:/) }, - { name: StringMatch.exact('href'), value: StringMatch.contains('#_toc') }, - { name: StringMatch.exact('href'), value: StringMatch.contains('#_mso') }, - { name: StringMatch.pattern(/^xmlns(:|$)/) }, - { name: StringMatch.exact('align') }, - { name: StringMatch.exact('type'), condition: RuleConditions.isList } - ] - }); - - // This will remove script,meta,link,empty-style tags and on,id,name,lang attributes - // or styles containing OLE_LINK - // Context: All - var removeExcess = HybridAction.removal({ - tags: [ - { name: StringMatch.exact('script') }, - { name: StringMatch.exact('meta') }, - { name: StringMatch.exact('link') }, - { name: StringMatch.exact('style'), condition: RuleConditions.isEmpty } - ], - attributes: [ - { name: StringMatch.starts('on') }, - { name: StringMatch.exact('"') }, - { name: StringMatch.exact('id') }, - { name: StringMatch.exact('name') }, - { name: StringMatch.exact('lang') }, - { name: StringMatch.exact('language') } - // INVESTIGATE: Should language go here as well ? - ], - styles: [ - { name: StringMatch.all(), value: StringMatch.pattern(/OLE_LINK/i) } - ] - }); - - var isNotTransformed = function (element) { - return !Class.has(element, 'ephox-limbo-transform'); - }; - - // This will remove any styles that are not list-style-type for all tags, and keep the width and height - // styles only for images. - // Context: Clean copy and paste. - var cleanStyles = HybridAction.removal({ - styles: [ - { - name: StringMatch.not( - StringMatch.pattern(/width|height|list-style-type/) - ), - condition: isNotTransformed - }, - { name: StringMatch.pattern(/width|height/), condition: RuleConditions.isNotImage } - ] - }); - - // This will remove all classes that are not 'rtf-data-image' - // Context: Clean copy and paste. - var cleanClasses = HybridAction.removal({ - classes: [ - { - name: StringMatch.not( - StringMatch.exact('rtf-data-image') - ) - } - ] - }); - - // This will remove all styles that are not considered valid. - // Context: Merge copy and paste. - var mergeStyles = HybridAction.removal({ - styles: [ - { name: StringMatch.pattern(HtmlPatterns.validStyles()) } - ] - }); - - // This will remove all classes that have mso in them. - // Context: Merge copy and paste. - var mergeClasses = HybridAction.removal({ - classes: [ - { name: StringMatch.pattern(/mso/i) } - ] - }); - - // This will remove (unwrap) all images that have a file protocol - // Context: Copy and paste with images. - var removeLocalImages = HybridAction.unwrapper({ - tags: [ - { name: StringMatch.exact('img'), condition: RuleConditions.isLocal }, - // OLE_LINK exact part. - { name: StringMatch.exact('a'), condition: RuleConditions.hasNoAttributes } - ] - }); - - // This will unwrap any <a> tags that have no attributes (i.e. are essentially useless) - // Context: Any - var removeVacantLinks = HybridAction.unwrapper({ - tags: [ - { name: StringMatch.exact('a'), condition: RuleConditions.hasNoAttributes } - ] - }); - - // This will remove any style attribute that has no content. - // Context: Any - var removeEmptyStyle = HybridAction.removal({ - attributes: [ - { name: StringMatch.exact('style'), value: StringMatch.exact(''), debug: true } - ] - }); - - // This will remove any style attribute that has no content. - // Context: Any - var removeEmptyClass = HybridAction.removal({ - attributes: [ - { name: StringMatch.exact('class'), value: StringMatch.exact(''), debug: true } - ] - }); - - // This will remove any inline elements that no longer serve a purpose: - // Fancy inline elements: contain no content - // Span inline elements: have no attributes - // Context: Any - var pruneInlineTags = HybridAction.unwrapper({ - tags: [ - { - name: StringMatch.pattern(HtmlPatterns.specialInline()), - condition: Fun.not(RuleConditions.hasContent) - } - ] - }); - - var addPlaceholders = HybridAction.transformer({ - tags: [ - { name: StringMatch.exact('p'), mutate: RuleMutations.addBrTag } - ] - }); - - var toUnderline = function (element) { - var span = RuleMutations.changeTag('span', element); - Class.add(span, 'ephox-limbo-transform'); - Css.set(span, 'text-decoration', 'underline'); - }; - - var nestedListFixes = HybridAction.transformer({ - tags: [ - { name: StringMatch.pattern(/ol|ul/), mutate: RuleMutations.properlyNest } - ] - }); - - var inlineTagFixes = HybridAction.transformer({ - tags: [ - { name: StringMatch.exact('b'), mutate: Fun.curry(RuleMutations.changeTag, 'strong') }, - { name: StringMatch.exact('i'), mutate: Fun.curry(RuleMutations.changeTag, 'em') }, - { name: StringMatch.exact('u'), mutate: toUnderline }, - { name: StringMatch.exact('s'), mutate: Fun.curry(RuleMutations.changeTag, 'strike') }, - { name: StringMatch.exact('font'), mutate: RuleMutations.fontToSpan, debug: true } - ] - }); - - // This will remove all classes that were put in to preserve transformations. - // Context: Any - var cleanupFlags = HybridAction.removal({ - classes: [ - { name: StringMatch.exact('ephox-limbo-transform') } - ] - }); - - // This will remove any href attributes of a tags that are local. - // Context: Any - var removeLocalLinks = HybridAction.removal({ - attributes: [ - { name: StringMatch.exact('href'), value: StringMatch.starts('file:///'), debug: true } - ] - }); - - return { - unwrapWordTags: unwrapWordTags, - removeWordAttributes: removeWordAttributes, - parseLists: parseLists, - removeExcess: removeExcess, - cleanStyles: cleanStyles, - cleanClasses: cleanClasses, - mergeStyles: mergeStyles, - mergeClasses: mergeClasses, - removeLocalImages: removeLocalImages, - removeVacantLinks: removeVacantLinks, - removeEmptyStyle: removeEmptyStyle, - removeEmptyClass: removeEmptyClass, - pruneInlineTags: pruneInlineTags, - addPlaceholders: addPlaceholders, - nestedListFixes: nestedListFixes, - inlineTagFixes: inlineTagFixes, - cleanupFlags: cleanupFlags, - removeLocalLinks: removeLocalLinks, - none: Fun.noop - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.process.PasteFilters', - - [ - 'ephox.compass.Arr', - 'ephox.limbo.api.RtfImage', - 'ephox.limbo.process.Strategies', - 'ephox.pastiche.api.HybridAction', - 'ephox.pastiche.engine.Filter', - 'ephox.pastiche.engine.Token', - 'ephox.sugar.api.Element' - ], - - function (Arr, RtfImage, Strategies, HybridAction, Filter, Token, Element) { - var isIE11 = function (platform) { - return platform.browser.isIE() && platform.browser.version.major >= 11; - }; - - var transform = function (f) { - // TODO: Move this to API in pastiche or change how this works. - // I think the reason I want to keep it in the tokenizer is because - // it needs to access comments. - return Filter.createFilter(function (api, token) { - var next = f(Element.fromDom(token.getNode())).fold(function () { - return token; - }, function (sugared) { - var node = sugared.dom(); - return Token.token(node, token.type() === Token.END_ELEMENT_TYPE, {}); - }); - api.emit(next); - }); - }; - - var images = function (isWord, merging, platform) { - var searcher = platform.browser.isFirefox() ? RtfImage.local : RtfImage.vshape; - var transformer = isIE11(platform) ? Strategies.none : HybridAction.pipeline([ transform(searcher) ]); - var local = searcher === RtfImage.local ? Strategies.none : Strategies.removeLocalImages; - var annotate = isWord ? transformer : Strategies.none; - - return { - annotate: [ annotate ], - local: [ local ] - }; - }; - - var styling = function (isWord, merging, platform) { - var merge = [ Strategies.mergeStyles, Strategies.mergeClasses ]; - var clean = [ Strategies.cleanStyles, Strategies.cleanClasses ]; - return merging ? merge : clean; - }; - - var word = function (isWord, merging, platform) { - if (!isWord) return Strategies.none; - var base = [ Strategies.unwrapWordTags ]; - var lists = isIE11(platform) ? [] : Strategies.parseLists; - return base.concat(lists); - }; - - var derive = function (isWord, merging, platform) { - var imageFilters = images(isWord, merging, platform); - - return Arr.flatten([ - imageFilters.annotate, - [ Strategies.inlineTagFixes ], - word(isWord, merging, platform), - [ Strategies.nestedListFixes ], - [ Strategies.removeExcess ], - imageFilters.local, - styling(isWord, merging, platform), - [ Strategies.removeLocalLinks, Strategies.removeVacantLinks ], - [ Strategies.removeEmptyStyle ], - [ Strategies.removeEmptyClass ], - [ Strategies.pruneInlineTags ], - [ Strategies.addPlaceholders ], - [ Strategies.cleanupFlags ] - ]); - }; - - return { - derive: derive - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.boss.common.TagBoundaries', - - [ - - ], - - function () { - // TODO: We need to consolidate this list. I think when we get rid of boss/universe, we can do it then. - return [ - 'body', - 'p', - 'div', - 'article', - 'aside', - 'figcaption', - 'figure', - 'footer', - 'header', - 'nav', - 'section', - 'ol', - 'ul', - 'li', - 'table', - 'thead', - 'tbody', - 'caption', - 'tr', - 'td', - 'th', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'blockquote', - 'pre', - 'address' - ]; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.Text', - - [ - 'ephox.sugar.api.Node', - 'ephox.sugar.impl.NodeValue' - ], - - function (Node, NodeValue) { - var api = NodeValue(Node.isText, 'text'); - - var get = function (element) { - return api.get(element); - }; - - var getOption = function (element) { - return api.getOption(element); - }; - - var set = function (element, value) { - api.set(element, value); - }; - - return { - get: get, - getOption: getOption, - set: set - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.boss.api.DomUniverse', - - [ - 'ephox.boss.common.TagBoundaries', - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Compare', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.PredicateFilter', - 'ephox.sugar.api.PredicateFind', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFilter', - 'ephox.sugar.api.SelectorFind', - 'ephox.sugar.api.Text', - 'ephox.sugar.api.Traverse' - ], - - function (TagBoundaries, Arr, Fun, Attr, Compare, Css, Element, Insert, InsertAll, Node, PredicateFilter, PredicateFind, Remove, SelectorFilter, SelectorFind, Text, Traverse) { - return function () { - var clone = function (element) { - return Element.fromDom(element.dom().cloneNode(false)); - }; - - var isBoundary = function (element) { - if (!Node.isElement(element)) return false; - if (Node.name(element) === 'body') return true; - var display = Css.get(element, 'display'); - // When the read display value is empty, we need to check the node name. - return display !== undefined && display.length > 0 ? - Arr.contains(['block', 'table-cell', 'table-row', 'table', 'list-item'], display) : - Arr.contains(TagBoundaries, Node.name(element)); - }; - - var isEmptyTag = function (element) { - if (!Node.isElement(element)) return false; - return Arr.contains(['br', 'img', 'hr'], Node.name(element)); - }; - - var comparePosition = function (element, other) { - return element.dom().compareDocumentPosition(other.dom()); - }; - - var copyAttributesTo = function (source, destination) { - var as = Attr.clone(source); - Attr.setAll(destination, as); - }; - - return { - up: Fun.constant({ - selector: SelectorFind.ancestor, - closest: SelectorFind.closest, - predicate: PredicateFind.ancestor, - all: Traverse.parents - }), - down: Fun.constant({ - selector: SelectorFilter.descendants, - predicate: PredicateFilter.descendants - }), - styles: Fun.constant({ - get: Css.get, - set: Css.set, - remove: Css.remove - }), - attrs: Fun.constant({ - get: Attr.get, - set: Attr.set, - remove: Attr.remove, - copyTo: copyAttributesTo - }), - insert: Fun.constant({ - before: Insert.before, - after: Insert.after, - afterAll: InsertAll.after, - append: Insert.append, - appendAll: InsertAll.append, - prepend: Insert.prepend, - wrap: Insert.wrap - }), - remove: Fun.constant({ - unwrap: Remove.unwrap, - remove: Remove.remove - }), - create: Fun.constant({ - nu: Element.fromTag, - clone: clone, - text: Element.fromText - }), - query: Fun.constant({ - comparePosition: comparePosition, - prevSibling: Traverse.prevSibling, - nextSibling: Traverse.nextSibling - }), - property: Fun.constant({ - children: Traverse.children, - name: Node.name, - parent: Traverse.parent, - isText: Node.isText, - isElement: Node.isElement, - getText: Text.get, - setText: Text.set, - isBoundary: isBoundary, - isEmptyTag: isEmptyTag - }), - eq: Compare.eq, - is: Compare.is - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.data.NamedPattern', - - [ - 'ephox.scullion.Struct' - ], - - function (Struct) { - return Struct.immutable('word', 'pattern'); - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.data.Spot', - - [ - 'ephox.scullion.Struct' - ], - - function (Struct) { - var point = Struct.immutable('element', 'offset'); - var delta = Struct.immutable('element', 'deltaOffset'); - var range = Struct.immutable('element', 'start', 'finish'); - var points = Struct.immutable('begin', 'end'); - var text = Struct.immutable('element', 'text'); - - return { - point: point, - delta: delta, - range: range, - points: points, - text: text - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.extract.TypedItem', - - [ - 'ephox.peanut.Fun', - 'ephox.perhaps.Option' - ], - - /** - * Church encoded ADT representing whether an element is: - * - boundary (block tag or inline tag with block CSS display) - * - empty - * - text - */ - function (Fun, Option) { - var no = Fun.constant(false); - var yes = Fun.constant(true); - - var boundary = function (item, universe) { - return folder(function (b, e, t) { - return b(item, universe); - }); - }; - - var empty = function (item, universe) { - return folder(function (b, e, t) { - return e(item, universe); - }); - }; - - var text = function (item, universe) { - return folder(function (b, e, t) { - return t(item, universe); - }); - }; - - var folder = function (fold) { - var isBoundary = function () { - return fold(yes, no, no); - }; - - var toText = function () { - return fold(Option.none, Option.none, function (item, universe) { - return Option.some(item); - }); - }; - - var is = function (other) { - return fold(no, no, function (item, universe) { - return universe.eq(item, other); - }); - }; - - var len = function () { - return fold(Fun.constant(0), Fun.constant(1), function (item, universe) { - return universe.property().getText(item).length; - }); - }; - - return { - isBoundary: isBoundary, - fold: fold, - toText: toText, - is: is, - len: len - }; - }; - - return { - text: text, - boundary: boundary, - empty: empty - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.array.Boundaries', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun' - ], - - function (Arr, Fun) { - var boundAt = function (xs, left, right, comparator) { - var leftIndex = Arr.findIndex(xs, Fun.curry(comparator, left)); - var first = leftIndex > -1 ? leftIndex : 0; - var rightIndex = Arr.findIndex(xs, Fun.curry(comparator, right)); - var last = rightIndex > -1 ? rightIndex + 1 : xs.length; - return xs.slice(first, last); - }; - - return { - boundAt: boundAt - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.array.Slice', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - /** - * Slice an array at the first item matched by the predicate - */ - var sliceby = function (list, pred) { - var index = Arr.findIndex(list, pred); - return list.slice(0, index); - }; - - return { - sliceby: sliceby - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.array.Split', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - /** - * Split an array into chunks matched by the predicate - */ - var splitby = function (xs, pred) { - var r = []; - var part = []; - Arr.each(xs, function (x) { - if (pred(x)) { - r.push(part); - part = []; - } else { - part.push(x); - } - }); - - if (part.length > 0) r.push(part); - return r; - }; - - return { - splitby: splitby - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.api.Arrays', - - [ - 'ephox.polaris.array.Boundaries', - 'ephox.polaris.array.Slice', - 'ephox.polaris.array.Split' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Boundaries, Slice, Split) { - var boundAt = function (xs, left, right, comparator) { - return Boundaries.boundAt(xs, left, right, comparator); - }; - - var splitby = function (array, predicate) { - return Split.splitby(array, predicate); - }; - - var sliceby = function (array, predicate) { - return Slice.sliceby(array, predicate); - }; - - return { - splitby: splitby, - sliceby: sliceby, - boundAt: boundAt - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.extract.TypedList', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.phoenix.api.data.Spot', - 'ephox.polaris.api.Arrays' - ], - - /** - * Extracts various information from a list of TypedItem - */ - function (Arr, Fun, Option, Spot, Arrays) { - - var count = function (parray) { - return Arr.foldr(parray, function (b, a) { - return a.len() + b; - }, 0); - }; - - var dropUntil = function (parray, target) { - return Arrays.sliceby(parray, function (x) { - return x.is(target); - }); - }; - - /** - * Transform a TypedItem into a range representing that item from the start position. - * - * The generation function for making a PositionArray out of a list of TypedItems. - */ - var gen = function (unit, start) { - return unit.fold(Option.none, function (e) { - return Option.some(Spot.range(e, start, start + 1)); - }, function (t) { - return Option.some(Spot.range(t, start, start + unit.len())); - }); - }; - - var justText = function (parray) { - return Arr.bind(parray, function (x) { - return x.fold(Fun.constant([]), Fun.constant([]), Fun.identity); - }); - }; - - return { - count: count, - dropUntil: dropUntil, - gen: gen, - justText: justText - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.extract.Extract', - - [ - 'ephox.compass.Arr', - 'ephox.phoenix.api.data.Spot', - 'ephox.phoenix.extract.TypedItem', - 'ephox.phoenix.extract.TypedList' - ], - - function (Arr, Spot, TypedItem, TypedList) { - /** - * Flattens the item tree into TypedItem representations. - * - * Boundaries are returned twice, before and after their children. - */ - var typed = function (universe, item, optimise) { - if (universe.property().isText(item)) { - return [ TypedItem.text(item, universe) ]; - } else if (universe.property().isEmptyTag(item)) { - return [ TypedItem.empty(item, universe) ]; - } else if (universe.property().isElement(item)) { - var children = universe.property().children(item); - var boundary = universe.property().isBoundary(item) ? [TypedItem.boundary(item, universe)] : []; - var rest = optimise !== undefined && optimise(item) ? [] : Arr.bind(children, function (child) { - return typed(universe, child, optimise); - }); - return boundary.concat(rest).concat(boundary); - } else { - return []; - } - }; - - /** - * Returns just the actual elements from a call to typed(). - */ - var items = function (universe, item, optimise) { - var typedItemList = typed(universe, item, optimise); - - var raw = function (item, universe) { return item; }; - - return Arr.map(typedItemList, function (typedItem) { - return typedItem.fold(raw, raw, raw); - }); - }; - - var extractToElem = function (universe, child, offset, item, optimise) { - var extractions = typed(universe, item, optimise); - var prior = TypedList.dropUntil(extractions, child); - var count = TypedList.count(prior); - return Spot.point(item, count + offset); - }; - - /** - * Generates an absolute point in the child's parent - * that can be used to reference the offset into child later. - * - * To find the exact reference later, use Find. - */ - var extract = function (universe, child, offset, optimise) { - return universe.property().parent(child).fold(function () { - return Spot.point(child, offset); - }, function (parent) { - return extractToElem(universe, child, offset, parent, optimise); - }); - }; - - /** - * Generates an absolute point that can be used to reference the offset into child later. - * This absolute point will be relative to a parent node (specified by predicate). - * - * To find the exact reference later, use Find. - */ - var extractTo = function (universe, child, offset, pred, optimise) { - return universe.up().predicate(child, pred).fold(function () { - return Spot.point(child, offset); - }, function (v) { - return extractToElem(universe, child, offset, v, optimise); - }); - }; - - return { - typed: typed, - items: items, - extractTo: extractTo, - extract: extract - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.extract.ExtractText', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.phoenix.extract.Extract' - ], - - function (Arr, Fun, Extract) { - var newline = '\n'; - var space = ' '; - - var onEmpty = function (item, universe) { - return universe.property().name(item) === 'img' ? space : newline; - }; - - var from = function (universe, item, optimise) { - var typed = Extract.typed(universe, item, optimise); - return Arr.map(typed, function (t) { - return t.fold(Fun.constant(newline), onEmpty, universe.property().getText); - }).join(''); - }; - - return { - from: from - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.parray.Generator', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun' - ], - - function (Arr, Fun) { - - /** - * Generate a PositionArray - * - * xs: list of thing - * f: thing -> Optional unit - * _start: sets the start position to search at - */ - var make = function (xs, f, _start) { - - var init = { - len: _start !== undefined ? _start : 0, - list: [] - }; - - var r = Arr.foldl(xs, function (b, a) { - var value = f(a, b.len); - return value.fold(Fun.constant(b), function (v) { - return { - len: v.finish(), - list: b.list.concat([v]) - }; - }); - }, init); - - return r.list; - }; - - return { - make: make - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.parray.Query', - - [ - 'ephox.compass.Arr', - 'ephox.perhaps.Option' - ], - - function (Arr, Option) { - - /** - * Simple "is position within unit" utility function - */ - var inUnit = function (unit, position) { - return position >= unit.start() && position <= unit.finish(); - }; - - /** - * Finds the unit in the PositionArray that contains this offset (if there is one) - */ - var get = function (parray, offset) { - var unit = Arr.find(parray, function (x) { - return inUnit(x, offset); - }); - - return Option.from(unit); - }; - - var startindex = function (parray, offset) { - return Arr.findIndex(parray, function (unit) { - return unit.start() === offset; - }); - }; - - var tryend = function (parray, finish) { - var finishes = parray[parray.length - 1] && parray[parray.length - 1].finish() === finish; - return finishes ? parray.length + 1 : -1; - }; - - - /** - * Extracts the pieces of the PositionArray that are bounded *exactly* on the start and finish offsets - */ - var sublist = function (parray, start, finish) { - var first = startindex(parray, start); - var rawlast = startindex(parray, finish); - var last = rawlast > -1 ? rawlast : tryend(parray, finish); - - return first > -1 && last > -1 ? parray.slice(first, last) : []; - }; - - var find = function (parray, pred) { - return Option.from(Arr.find(parray, pred)); - }; - - return { - get: get, - find: find, - inUnit: inUnit, - sublist: sublist - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.parray.Translate', - - [ - 'ephox.compass.Arr', - 'ephox.highway.Merger', - 'ephox.peanut.Fun' - ], - - function (Arr, Merger, Fun) { - /** Adjust a PositionArray positions by an offset */ - var translate = function (parray, offset) { - return Arr.map(parray, function (unit) { - return Merger.merge(unit, { - start: Fun.constant(unit.start() + offset), - finish: Fun.constant(unit.finish() + offset) - }); - }); - }; - - return { - translate: translate - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.parray.Split', - - [ - 'ephox.compass.Arr', - 'ephox.polaris.parray.Query', - 'ephox.polaris.parray.Translate' - ], - - function (Arr, Query, Translate) { - /** - * After subdivide has split the unit, update the resulting PositionArray based on the unit start position. - */ - var divide = function (unit, positions, subdivide) { - var mini = subdivide(unit, positions); - return Translate.translate(mini, unit.start()); - }; - - /** - * Adds extra split points into a PositionArray, using subdivide to split if necessary - */ - var splits = function (parray, positions, subdivide) { - if (positions.length === 0) return parray; - - return Arr.bind(parray, function (unit) { - var relevant = Arr.bind(positions, function (pos) { - return Query.inUnit(unit, pos) ? [ pos - unit.start() ] : []; - }); - - return relevant.length > 0 ? divide(unit, relevant, subdivide) : [ unit ]; - }); - }; - - return { - splits: splits - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.api.PositionArray', - - [ - 'ephox.polaris.parray.Generator', - 'ephox.polaris.parray.Query', - 'ephox.polaris.parray.Split', - 'ephox.polaris.parray.Translate' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Generator, Query, Split, Translate) { - var generate = function (items, generator, _start) { - return Generator.make(items, generator, _start); - }; - - var get = function (parray, offset) { - return Query.get(parray, offset); - }; - - var find = function (parray, pred) { - return Query.find(parray, pred); - }; - - var splits = function (parray, positions, subdivide) { - return Split.splits(parray, positions, subdivide); - }; - - var translate = function (parray, amount) { - return Translate.translate(parray, amount); - }; - - var sublist = function (parray, start, finish) { - return Query.sublist(parray, start, finish); - }; - - return { - generate: generate, - get: get, - find: find, - splits: splits, - translate: translate, - sublist: sublist - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.extract.Find', - - [ - 'ephox.phoenix.api.data.Spot', - 'ephox.phoenix.extract.Extract', - 'ephox.phoenix.extract.TypedList', - 'ephox.polaris.api.PositionArray' - ], - - function (Spot, Extract, TypedList, PositionArray) { - - /** - * Finds an exact reference to a document point generated by Extract - */ - var find = function (universe, parent, offset, optimise) { - var extractions = Extract.typed(universe, parent, optimise); - - var parray = PositionArray.generate(extractions, TypedList.gen); - var spot = PositionArray.get(parray, offset); - return spot.map(function (v) { - return Spot.point(v.element(), offset - v.start()); - }); - }; - - return { - find: find - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.general.Extract', - - [ - 'ephox.phoenix.extract.Extract', - 'ephox.phoenix.extract.ExtractText', - 'ephox.phoenix.extract.Find' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Extract, ExtractText, Find) { - - var from = function (universe, item, optimise) { - return Extract.typed(universe, item, optimise); - }; - - var all = function (universe, item, optimise) { - return Extract.items(universe, item, optimise); - }; - - var extract = function (universe, child, offset, optimise) { - return Extract.extract(universe, child, offset, optimise); - }; - - var extractTo = function (universe, child, offset, pred, optimise) { - return Extract.extractTo(universe, child, offset, pred, optimise); - }; - - var find = function (universe, parent, offset, optimise) { - return Find.find(universe, parent, offset, optimise); - }; - - var toText = function (universe, item, optimise) { - return ExtractText.from(universe, item, optimise); - }; - - return { - extract: extract, - extractTo: extractTo, - all: all, - from: from, - find: find, - toText: toText - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.family.Group', - - [ - 'ephox.compass.Arr', - 'ephox.phoenix.api.general.Extract', - 'ephox.polaris.api.Arrays' - ], - - function (Arr, Extract, Arrays) { - /** - * Return an array of arrays split by boundaries - */ - var group = function (universe, items, optimise) { - var extractions = Arr.bind(items, function (item) { - return Extract.from(universe, item, optimise); - }); - - var segments = Arrays.splitby(extractions, function (item) { - return item.isBoundary(); - }); - - return Arr.filter(segments, function (x) { return x.length > 0; }); - }; - - return { - group: group - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.family.Parents', - - [ - 'ephox.compass.Arr', - 'ephox.perhaps.Option' - ], - - function (Arr, Option) { - /** - * Search the parents of both items for a common element - */ - var common = function (universe, item1, item2) { - var item1parents = [item1].concat(universe.up().all(item1)); - var item2parents = [item2].concat(universe.up().all(item2)); - - var r = Arr.find(item1parents, function (x) { - return Arr.exists(item2parents, function (y) { - return universe.eq(y, x); - }); - }); - - return Option.from(r); - }; - - return { - common: common - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.wrap.OrphanText', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - // Textnodes cannot be children of these tags - var textBlacklist = [ 'table', 'tbody', 'thead', 'tfoot', 'tr', 'ul', 'ol' ]; - - return function (universe) { - var domUtils = universe.property(); - var validateParent = function (node, blacklist) { - return domUtils.parent(node).map(domUtils.name).map(function (name) { - return !Arr.contains(blacklist, name); - }).getOr(false); - }; - - var validateText = function (textNode) { - return domUtils.isText(textNode) && validateParent(textNode, textBlacklist); - }; - - return { - validateText: validateText - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.family.Range', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.phoenix.api.general.Extract', - 'ephox.phoenix.family.Parents', - 'ephox.phoenix.wrap.OrphanText' - ], - - function (Arr, Fun, Extract, Parents, OrphanText) { - var index = function (universe, items, item) { - return Arr.findIndex(items, Fun.curry(universe.eq, item)); - }; - - var order = function (items, a, delta1, b, delta2) { - return a < b ? items.slice(a + delta1, b + delta2) : items.slice(b + delta2, a + delta1); - }; - - /** - * Returns a flat array of text nodes between two defined nodes. - * - * Deltas are a broken concept. They control whether the item passed is included in the result. - */ - var range = function (universe, item1, delta1, item2, delta2) { - if (universe.eq(item1, item2)) return [item1]; - - return Parents.common(universe, item1, item2).fold(function () { - return []; // no common parent, therefore no intervening path. How does this clash with Path in robin? - }, function (parent) { - var items = [ parent ].concat(Extract.all(universe, parent, Fun.constant(false))); - var start = index(universe, items, item1); - var finish = index(universe, items, item2); - var result = start > -1 && finish > -1 ? order(items, start, delta1, finish, delta2) : []; - var orphanText = OrphanText(universe); - return Arr.filter(result, orphanText.validateText); - }); - }; - - return { - range: range - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.general.Family', - - [ - 'ephox.phoenix.family.Group', - 'ephox.phoenix.family.Range' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Group, Range) { - var range = function (universe, start, startDelta, finish, finishDelta) { - return Range.range(universe, start, startDelta, finish, finishDelta); - }; - - var group = function (universe, items, optimise) { - return Group.group(universe, items, optimise); - }; - - return { - range: range, - group: group - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.string.Sanitise', - - [ - - ], - - function () { - /** - * Sanitises a string for use in a CSS class name - */ - var css = function (str) { - // special case; the first character must a letter. More strict than CSS, but easier to implement. - var r = /^[a-zA-Z]/.test(str) ? '' : 'e'; - - // any non-word character becomes a hyphen - var sanitised = str.replace(/[^\w]/gi, '-'); - - return r + sanitised; - }; - - return { - css: css - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.string.Split', - - [ - 'ephox.compass.Arr' - ], - - function (Arr) { - /** - * Splits a string into multiple chunks - */ - var splits = function (value, indices) { - if (indices.length === 0) return [value]; - - var divisions = Arr.foldl(indices, function (acc, x) { - if (x === 0) return acc; - - var part = value.substring(acc.prev, x); - return { - prev: x, - values: acc.values.concat([part]) - }; - }, { prev: 0, values: [] }); - - var lastPoint = indices[indices.length - 1]; - return lastPoint < value.length ? divisions.values.concat(value.substring(lastPoint)) : divisions.values; - }; - - return { - splits: splits - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.api.Strings', - - [ - 'ephox.polaris.string.Sanitise', - 'ephox.polaris.string.Split' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Sanitise, Split) { - var splits = function (text, points) { - return Split.splits(text, points); - }; - - var cssSanitise = function (str) { - return Sanitise.css(str); - }; - - return { - cssSanitise: cssSanitise, - splits: splits - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.search.Splitter', - - [ - 'ephox.compass.Arr', - 'ephox.perhaps.Option', - 'ephox.phoenix.api.data.Spot', - 'ephox.polaris.api.PositionArray', - 'ephox.polaris.api.Strings' - ], - - function (Arr, Option, Spot, PositionArray, Strings) { - - /** - * Re-generates an item's text nodes, split as defined by the positions array. - * - * Returns a PositionArray of the result. - */ - var subdivide = function (universe, item, positions) { - var text = universe.property().getText(item); - var pieces = Arr.filter(Strings.splits(text, positions), function (section) { - return section.length > 0; - }); - - if (pieces.length <= 1) return [ Spot.range(item, 0, text.length) ]; - universe.property().setText(item, pieces[0]); - - var others = PositionArray.generate(pieces.slice(1), function (a, start) { - var nu = universe.create().text(a); - var result = Spot.range(nu, start, start + a.length); - return Option.some(result); - }, pieces[0].length); - - var otherElements = Arr.map(others, function (a) { return a.element(); }); - universe.insert().afterAll(item, otherElements); - - return [ Spot.range(item, 0, pieces[0].length) ].concat(others); - }; - - return { - subdivide: subdivide - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.search.MatchSplitter', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.phoenix.search.Splitter', - 'ephox.polaris.api.PositionArray' - ], - - function (Arr, Fun, Splitter, PositionArray) { - /** - * Split each text node in the list using the match endpoints. - * - * Each match is then mapped to the word it matched and the elements that make up the word. - */ - var separate = function (universe, list, matches) { - var allPositions = Arr.bind(matches, function (match) { - return [ match.start(), match.finish() ]; - }); - - var subdivide = function (unit, positions) { - return Splitter.subdivide(universe, unit.element(), positions); - }; - - var structure = PositionArray.splits(list, allPositions, subdivide); - - var collate = function (match) { - var sub = PositionArray.sublist(structure, match.start(), match.finish()); - - var elements = Arr.map(sub, function (unit) { return unit.element(); }); - - var exact = Arr.map(elements, universe.property().getText).join(''); - return { - elements: Fun.constant(elements), - word: match.word, - exact: Fun.constant(exact) - }; - }; - - return Arr.map(matches, collate); - }; - - return { - separate: separate - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.bud.Unicode', - - [ - ], - - function () { - // \u200B needs to be removed manually as it is not considered whitespace when trimming - // \uFEFF does not need to be removed manually. It is considered whitespace when trimming - var zeroWidth = function () { - return '\u200B'; - }; - - // Note, we are separating these out so that we are accounting for the subtle differences - // between them. Eventually, we'll want to combine them again. - var trimNative = function (str) { - return str.replace(/\u200B/, '').trim(); - }; - - var trimWithRegex = function (str) { - return str.replace(/^\s+|\s+$/g, '').replace(/\u200B/, ''); - }; - - return { - zeroWidth: zeroWidth, - trimNative: trimNative, - trimWithRegex: trimWithRegex - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.pattern.Chars', - - [ - 'ephox.bud.Unicode', - 'ephox.peanut.Fun' - ], - - function (Unicode, Fun) { - // \w is a word character - // \' is an apostrophe - // '-' is a hyphen - // \u00C0 - \u00FF are various language characters - // \u2018 and \u2019 are the smart quote characters - var chars = '\\w' + '\'' + '\\-' + '\\u00C0-\\u00FF' + Unicode.zeroWidth() + '\\u2018\\u2019'; - var wordbreak = '[^' + chars + ']'; - var wordchar = '[' + chars + ']'; - - return { - chars: Fun.constant(chars), - wordbreak: Fun.constant(wordbreak), - wordchar: Fun.constant(wordchar) - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.pattern.Custom', - - [ - 'global!RegExp' - ], - - function (RegExp) { - return function (regex, prefix, suffix, flags) { - var term = function () { - return new RegExp(regex, flags.getOr('g')); - }; - - return { - term: term, - prefix: prefix, - suffix: suffix - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.pattern.Unsafe', - - [ - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.polaris.pattern.Chars', - 'ephox.polaris.pattern.Custom' - ], - - function (Fun, Option, Chars, Custom) { - - /** - * Tokens have no prefix or suffix - */ - var token = function (input) { - return Custom(input, Fun.constant(0), Fun.constant(0), Option.none()); - }; - - /** - * Words have complex rules as to what a "word break" actually is. - * - * These are consumed by the regex and then excluded by prefix/suffix lengths. - */ - var word = function (input) { - var regex = '((?:^\'?)|(?:' + Chars.wordbreak() + '+\'?))' + input + '((?:\'?$)|(?:\'?' + Chars.wordbreak() + '+))'; - - // ASSUMPTION: There are no groups in their input - var prefix = function (match) { - return match.length > 1 ? match[1].length : 0; - }; - - var suffix = function (match) { - return match.length > 2 ? match[2].length : 0; - }; - - return Custom(regex, prefix, suffix, Option.none()); - }; - - return { - token: token, - word: word - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.pattern.Safe', - - [ - 'ephox.polaris.pattern.Unsafe' - ], - - /** Sanitises all inputs to Unsafe */ - function (Unsafe) { - /** Escapes regex characters in a string */ - var sanitise = function (input) { - return input.replace(/[-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); - }; - - var word = function (input) { - var value = sanitise(input); - return Unsafe.word(value); - }; - - var token = function (input) { - var value = sanitise(input); - return Unsafe.token(value); - }; - - return { - sanitise: sanitise, - word: word, - token: token - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.api.Pattern', - - [ - 'ephox.polaris.pattern.Chars', - 'ephox.polaris.pattern.Custom', - 'ephox.polaris.pattern.Safe', - 'ephox.polaris.pattern.Unsafe' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Chars, Custom, Safe, Unsafe) { - var safeword = function (input) { - return Safe.word(input); - }; - - var safetoken = function (input) { - return Safe.token(input); - }; - - var custom = function (input, prefix, suffix, flags) { - return Custom(input, prefix, suffix, flags); - }; - - var unsafeword = function (input) { - return Unsafe.word(input); - }; - - var unsafetoken = function (input) { - return Unsafe.token(input); - }; - - var sanitise = function (input) { - return Safe.sanitise(input); - }; - - var chars = function () { - return Chars.chars(); - }; - - var wordbreak = function () { - return Chars.wordbreak(); - }; - - var wordchar = function () { - return Chars.wordchar(); - }; - - return { - safeword: safeword, - safetoken: safetoken, - custom: custom, - unsafeword: unsafeword, - unsafetoken: unsafetoken, - sanitise: sanitise, - chars: chars, - wordbreak: wordbreak, - wordchar: wordchar - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.search.Find', - - [ - 'ephox.peanut.Fun' - ], - - function (Fun) { - - /** - * Returns the offset pairs of all matches of pattern on the input string, adjusting for prefix and suffix offsets - */ - var all = function (input, pattern) { - var term = pattern.term(); - var r = []; - var match = term.exec(input); - while (match) { - var start = match.index + pattern.prefix(match); - var length = match[0].length - pattern.prefix(match) - pattern.suffix(match); - r.push({ - start: Fun.constant(start), - finish: Fun.constant(start + length) - }); - term.lastIndex = start + length; - match = term.exec(input); - } - return r; - }; - - return { - all: all - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.search.Sleuth', - - [ - 'ephox.compass.Arr', - 'ephox.highway.Merger', - 'ephox.polaris.search.Find', - 'global!Array' - ], - - function (Arr, Merger, Find, Array) { - var sort = function (array) { - var r = Array.prototype.slice.call(array, 0); - r.sort(function (a, b) { - if (a.start() < b.start()) return -1; - else if (b.start() < a.start()) return 1; - else return 0; - }); - return r; - }; - - /** - * For each target (pattern, ....), find the matching text (if there is any) and record the start and end offsets. - * - * Then sort the result by start point. - */ - var search = function (text, targets) { - var unsorted = Arr.bind(targets, function (t) { - var results = Find.all(text, t.pattern()); - return Arr.map(results, function (r) { - return Merger.merge(t, { - start: r.start, - finish: r.finish - }); - }); - }); - - return sort(unsorted); - }; - - return { - search: search - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.polaris.api.Search', - - [ - 'ephox.polaris.search.Find', - 'ephox.polaris.search.Sleuth' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Find, Sleuth) { - var findall = function (input, pattern) { - return Find.all(input, pattern); - }; - - var findmany = function (input, targets) { - return Sleuth.search(input, targets); - }; - - return { - findall: findall, - findmany: findmany - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.search.Searcher', - - [ - 'ephox.compass.Arr', - 'ephox.perhaps.Option', - 'ephox.phoenix.api.data.NamedPattern', - 'ephox.phoenix.api.data.Spot', - 'ephox.phoenix.api.general.Family', - 'ephox.phoenix.extract.TypedList', - 'ephox.phoenix.search.MatchSplitter', - 'ephox.polaris.api.Pattern', - 'ephox.polaris.api.PositionArray', - 'ephox.polaris.api.Search' - ], - - function (Arr, Option, NamedPattern, Spot, Family, TypedList, MatchSplitter, Pattern, PositionArray, Search) { - var gen = function (universe, input) { - return PositionArray.generate(input, function (unit, offset) { - var finish = offset + universe.property().getText(unit).length; - return Option.from(Spot.range(unit, offset, finish)); - }); - }; - - /** - * Extracts groups of elements separated by boundaries. - * - * For each group, search the text for pattern matches. - * - * Returns a list of matches. - */ - var run = function (universe, elements, patterns, optimise) { - var sections = Family.group(universe, elements, optimise); - var result = Arr.bind(sections, function (x) { - var input = TypedList.justText(x); - var text = Arr.map(input, universe.property().getText).join(''); - - var matches = Search.findmany(text, patterns); - var plist = gen(universe, input); - - return MatchSplitter.separate(universe, plist, matches); - }); - - return result; - }; - - - /** - * Runs a search for one or more words - */ - var safeWords = function (universe, elements, words, optimise) { - var patterns = Arr.map(words, function (word) { - var pattern = Pattern.safeword(word); - return NamedPattern(word, pattern); - }); - return run(universe, elements, patterns, optimise); - }; - - - /** - * Runs a search for a single token - */ - var safeToken = function (universe, elements, token, optimise) { - var pattern = NamedPattern(token, Pattern.safetoken(token)); - return run(universe, elements, [pattern], optimise); - }; - - return { - safeWords: safeWords, - safeToken: safeToken, - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.general.Search', - - [ - 'ephox.phoenix.search.Searcher' - ], - - /** - * Documentation is in the actual implementations. - */ - function (Searcher) { - var run = function (universe, items, patterns, optimise) { - return Searcher.run(universe, items, patterns, optimise); - }; - - var safeWords = function (universe, items, words, optimise) { - return Searcher.safeWords(universe, items, words, optimise); - }; - - var safeToken = function (universe, items, token, optimise) { - return Searcher.safeToken(universe, items, token, optimise); - }; - - return { - safeWords: safeWords, - safeToken: safeToken, - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.phoenix.api.dom.DomSearch', - - [ - 'ephox.boss.api.DomUniverse', - 'ephox.phoenix.api.general.Search' - ], - - /** - * Documentation is in the actual implementations. - */ - function (DomUniverse, Search) { - var universe = DomUniverse(); - - var run = function (elements, patterns, optimise) { - return Search.run(universe, elements, patterns, optimise); - }; - - var safeWords = function (elements, words, optimise) { - return Search.safeWords(universe, elements, words, optimise); - }; - - var safeToken = function (elements, token, optimise) { - return Search.safeToken(universe, elements, token, optimise); - }; - - return { - safeWords: safeWords, - safeToken: safeToken, - run: run - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sugar.api.SelectorExists', - - [ - 'ephox.sugar.api.SelectorFind' - ], - - function (SelectorFind) { - var any = function (selector) { - return SelectorFind.first(selector).isSome(); - }; - - var ancestor = function (scope, selector, isRoot) { - return SelectorFind.ancestor(scope, selector, isRoot).isSome(); - }; - - var sibling = function (scope, selector) { - return SelectorFind.sibling(scope, selector).isSome(); - }; - - var child = function (scope, selector) { - return SelectorFind.child(scope, selector).isSome(); - }; - - var descendant = function (scope, selector) { - return SelectorFind.descendant(scope, selector).isSome(); - }; - - var closest = function (scope, selector, isRoot) { - return SelectorFind.closest(scope, selector, isRoot).isSome(); - }; - - return { - any: any, - ancestor: ancestor, - sibling: sibling, - child: child, - descendant: descendant, - closest: closest - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.process.Preprocessor', - - [ - 'ephox.compass.Arr', - 'ephox.perhaps.Option', - 'ephox.phoenix.api.dom.DomSearch', - 'ephox.polaris.api.Pattern', - 'ephox.scullion.Struct', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.SelectorExists' - ], - - function (Arr, Option, DomSearch, Pattern, Struct, Attr, Css, Element, Html, Insert, InsertAll, Node, SelectorExists) { - //the big fat holy grail of URL pattern matching.. - var regex = '((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)(:[0-9]+)?((?:\\/[\\+~%\\/\\.\\w\\-_]*)?\\??(?:[\\-\\+=&;%@\\.\\w_]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)'; - - var findLinks = function (elements) { - var data = Struct.immutable('word', 'pattern'); - var term = Pattern.unsafetoken(regex); - var pattern = data('__INTERNAL__', term); - return DomSearch.run(elements, [pattern]); - }; - - var notInLink = function (element) { - // return true; - return !SelectorExists.closest(element, 'a'); - }; - - var wrap = function (elements) { - return Option.from(elements[0]).filter(notInLink).map(function (first) { - var tag = Element.fromTag('a'); - Insert.before(first, tag); - InsertAll.append(tag, elements); - Attr.set(tag, 'href', Html.get(tag)); - return tag; - }); - }; - - var links = function (elements) { - var matches = findLinks(elements); - Arr.each(matches, function (match) { - // TBIO-2444 Do not wrap anything with @ symbol, it could be an email - if(match.exact().indexOf('@') < 0) wrap(match.elements()); - }); - }; - - var position = function (elements) { - Arr.each(elements, function (elem) { - if (Node.isElement(elem)) Css.remove(elem, 'position'); - }); - }; - - return { - links: links, - position: position - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.api.RunPaste', - - [ - 'ephox.compass.Arr', - 'ephox.limbo.process.PasteFilters', - 'ephox.limbo.process.Preprocessor', - 'ephox.pastiche.api.HybridAction', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Traverse' - ], - - function (Arr, PasteFilters, Preprocessor, HybridAction, Html, Traverse) { - var preprocess = function (platform, container) { - var children = Traverse.children(container); - Arr.each([ Preprocessor.links, Preprocessor.position ], function (f) { - f(children); - }); - }; - - var go = function (doc, platform, container, merging, isWord) { - preprocess(platform, container); - var html = Html.get(container); - var filters = PasteFilters.derive(isWord, merging, platform); - return HybridAction.go(doc, html, filters); - }; - - return { - go: go - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.limbo.api.Sources', - - [ - 'ephox.pastiche.api.HybridAction', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.PredicateExists' - ], - - function (HybridAction, Attr, Html, PredicateExists) { - var ie11 = function (container) { - // This looks expensive. Using grep on corpus, - // string searching for "<font" or "mso-list:" picked up all relevant cases - return PredicateExists.descendant(container, function (el) { - return Attr.has(el, 'style') ? Attr.get(el, 'style').indexOf('mso-') > -1 : false; - }); - }; - - var other = function (container) { - var html = Html.get(container); - return HybridAction.isWordContent(html); - }; - - var isWord = function (platform, container) { - var browser = platform.browser; - var detector = browser.isIE() && browser.version.major >= 11 ? ie11 : other; - return detector(container); - }; - - return { - isWord: isWord - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.data.Range', - - [ - 'ephox.peanut.Fun', - 'ephox.sugar.api.Compare' - ], - - function (Fun, Compare) { - return function (startContainer, startOffset, endContainer, endOffset) { - var collapsed = Compare.eq(startContainer, endContainer) && startOffset === endOffset; - - return { - startContainer: Fun.constant(startContainer), - startOffset: Fun.constant(startOffset), - endContainer: Fun.constant(endContainer), - endOffset: Fun.constant(endOffset), - collapsed: Fun.constant(collapsed) - }; - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.api.BodySwitch', - - [ - 'ephox.sloth.data.Range', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Range, Element, Insert, Remove, Traverse) { - return function (selection) { - - var placeholder = Element.fromTag('br'); - - var toOn = function (element, offscreen) { - element.dom().focus(); - }; - - var getWin = function (offscreen) { - var doc = Traverse.owner(offscreen); - return doc.dom().defaultView; - }; - - var toOff = function (element, offscreen) { - var win = getWin(offscreen); - win.focus(); - Insert.append(offscreen, placeholder); - selection.set(win, Range(placeholder, 0, placeholder, 0)); - }; - - var cleanup = function () { - Remove.remove(placeholder); - }; - - return { - cleanup: cleanup, - toOn: toOn, - toOff: toOff - }; - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.api.DivSwitch', - - [ - 'ephox.peanut.Fun' - ], - - function (Fun) { - return function () { - var toOn = function (element, offscreen) { - element.dom().focus(); - }; - - var toOff = function (element, offscreen) { - offscreen.dom().focus(); - }; - - var cleanup = Fun.identity; - - return { - toOn: toOn, - toOff: toOff, - cleanup: cleanup - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.plumber.tap.control.BlockControl', - - [ - ], - - function () { - var create = function () { - var blocked = false; - var isBlocked = function () { return blocked; }; - var block = function () { blocked = true; }; - var unblock = function () { blocked = false; }; - - return { - isBlocked: isBlocked, - block: block, - unblock: unblock - } - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.plumber.tap.wrap.Tapped', - - [ - ], - - function () { - var create = function (control, instance) { - return { - control: control, - instance: instance - } - }; - - return { - create: create - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.plumber.tap.function.BlockTap', - - [ - 'ephox.plumber.tap.control.BlockControl', - 'ephox.plumber.tap.wrap.Tapped' - ], - - function (BlockControl, Tapped) { - var tap = function (fn) { - var control = BlockControl.create(); - - var instance = function () { - if (!control.isBlocked()) - fn.apply(null, arguments); - }; - - return Tapped.create(control, instance); - }; - - return { - tap: tap - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.api.Paste', - - [ - 'ephox.fred.PlatformDetection', - 'ephox.peanut.Fun', - 'global!setTimeout' - ], - - function (PlatformDetection, Fun, setTimeout) { - var detection = PlatformDetection.detect(); - - var ie10 = function (doc, tap, postpaste) { - // Block the tap, and fire a paste. - tap.control.block(); - doc.dom().execCommand('paste'); - postpaste(); - tap.control.unblock(); - }; - - var others = function (doc, tap, postpaste) { - setTimeout(postpaste, 1); - }; - - // Most browsers can just let the paste event continue. - // on IE10, the paste event must be cancelled and done manually - var willBlock = detection.browser.isIE() && detection.browser.version.major <= 10; - - var runner = willBlock ? ie10 : others; - - var run = function (doc, tap, postpaste) { - return runner(doc, tap, postpaste); - }; - - return { - willBlock: Fun.constant(willBlock), - run: run - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.engine.Consolidator', - - [ - 'ephox.compass.Arr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.InsertAll', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse' - ], - - function (Arr, Element, Insert, InsertAll, Remove, Traverse) { - // TBIO-2440. In some situations on Windows 7 Chrome, pasting into the offscreen div - // actually splits the div in two. The purpose of this function is to incorporate - // any of the split divs into the main one. - var consolidate = function (offscreen, isOffscreen) { - Traverse.nextSibling(offscreen).filter(isOffscreen).each(function (other) { - var children = Traverse.children(other); - InsertAll.append(offscreen, children); - Remove.remove(other); - }); - oneChild(offscreen, isOffscreen); - }; - // TBIO-3010: In Chrome (reproducible in both Windows and Mac) when pasting from notepad the offscreen div - // generates multiple sloth divs, causing the content to be not pasted correctly. This function - // runs across the children of the offscreen div and if it is a sloth element then it extract - // the content and wraps it in a normal div. - var cleanChild = function (child, offscreen) { - var children = Traverse.children(child); - var wrapper = Element.fromTag('div', Traverse.owner(child).dom()); - InsertAll.append(wrapper, children); - Insert.before(child, wrapper); - Remove.remove(child); - }; - - var oneChild = function (offscreen, isOffscreen) { - var children = Traverse.children(offscreen); - Arr.each(children, function (child) { - if (isOffscreen(child)) cleanChild(child, offscreen); - }); - }; - - return { - consolidate: consolidate - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.engine.Offscreen', - - [ - 'ephox.epithet.Id', - 'ephox.scullion.Struct', - 'ephox.sloth.engine.Consolidator', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Css', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Html', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFind', - 'ephox.sugar.api.Traverse' - ], - - function (Id, Struct, Consolidator, Attr, Class, Css, Element, Html, Insert, Remove, SelectorFind, Traverse) { - var hash = Id.generate('ephox-sloth-bin'); - - return function (switcher) { - var offscreen = Element.fromTag('div'); - Attr.set(offscreen, 'contenteditable', 'true'); - Class.add(offscreen, hash); - Css.setAll(offscreen, { - position: 'absolute', - left: '0px', - top: '0px', - width: '0px', - height: '0px', - overflow: 'hidden' - }); - - var attach = function (target) { - Remove.empty(offscreen); - Insert.append(target, offscreen); - }; - - var focus = function () { - var body = SelectorFind.ancestor(offscreen, 'body'); - body.each(function (b) { - switcher.toOff(b, offscreen); - }); - }; - - var isOffscreen = function (other) { - return Class.has(other, hash); - }; - - var contents = function () { - Consolidator.consolidate(offscreen, isOffscreen); - var data = Struct.immutable('elements', 'html', 'container'); - var elements = Traverse.children(offscreen); - var html = Html.get(offscreen); - return data(elements, html, offscreen); - }; - - var detach = function () { - Remove.remove(offscreen); - }; - - var container = function () { - return offscreen; - }; - - return { - attach: attach, - focus: focus, - contents: contents, - container: container, - detach: detach - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.sloth.api.ProxyPaste', - - [ - 'ephox.peanut.Fun', - 'ephox.plumber.tap.function.BlockTap', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sloth.api.Paste', - 'ephox.sloth.engine.Offscreen', - 'ephox.sugar.api.Traverse' - ], - - function (Fun, BlockTap, Event, Events, Paste, Offscreen, Traverse) { - return function (switcher, element) { - var offscreen = Offscreen(switcher); - - var postpaste = function () { - switcher.cleanup(); - var contents = offscreen.contents(); - offscreen.detach(); - events.trigger.after(contents.elements(), contents.html(), offscreen.container()); - }; - - var tap = BlockTap.tap(function () { - events.trigger.before(); - offscreen.attach(element); - offscreen.focus(); - Paste.run(Traverse.owner(element), tap, postpaste); - }); - - var handler = function () { - tap.instance(); - }; - - var events = Events.create({ - before: Event([]), - after: Event(['elements', 'html', 'container']) - }); - - var destroy = Fun.noop; - - return { - instance: Fun.constant(handler), - destroy: destroy, - events: events.registry - }; - }; - - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.pastiche.Pastiche', - - [ - 'ephox.cement.api.CementConstants', - 'ephox.cement.pastiche.IeBlob', - 'ephox.compass.Arr', - 'ephox.fred.PlatformDetection', - 'ephox.fussy.api.WindowSelection', - 'ephox.limbo.api.RunPaste', - 'ephox.limbo.api.Sources', - 'ephox.peanut.Fun', - 'ephox.perhaps.Option', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.sloth.api.BodySwitch', - 'ephox.sloth.api.DivSwitch', - 'ephox.sloth.api.ProxyPaste', - 'ephox.sugar.api.Class', - 'ephox.sugar.api.Elements', - 'ephox.sugar.api.Node', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.Traverse', - 'global!console', - 'global!setTimeout' - ], - - function (CementConstants, IeBlob, Arr, PlatformDetection, WindowSelection, RunPaste, Sources, Fun, Option, Event, Events, BodySwitch, DivSwitch, ProxyPaste, Class, Elements, Node, Remove, Traverse, console, setTimeout) { - var platform = PlatformDetection.detect(); - - return function (prePasteFilter, body, mergeSettings, intraFlag) { - // Temporary hack until we restructure in TBIO-1515 - var findClipboardTags = function (container, isWord) { - return (intraFlag !== undefined && !isWord) ? intraFlag.findClipboardTags(Traverse.children(container)) : Option.none(); - }; - - - var events = Events.create({ - paste: Event(['elements', 'assets']), - error: Event(['message']) - }); - - var fakeSelecton = { - // dupe from hare.selection.Selection - set: function (win, range) { - WindowSelection.setExact(win, range.startContainer(), range.startOffset(), range.endContainer(), range.endOffset()); - } - }; - - // TBIO-2019: scrollbar lock on paste. - // When using DivSwitch for inline editing, FF & webkit browsers will lock the scrollbar after paste - // This is because the the offscreen div was not used and hence no filtration was run and the scrollbar unlock code never got called - // To verify this paste formatted html and see the formatting unchanged <span style="color:red">test</span> - // DivSwitch calls focus on the offscreen div, FF & Webkit do not set selection on focus, - // so inserting into offscreen div fails, bypassing the rest of the past process. - // It works in IE because amazingly IE sets selection on focus. - // Calling BodySwitch with IE inline mode paste fails altogether, the cause of the failure is unknown - var switchF = platform.browser.isIE() && Node.name(body) !== 'body' ? DivSwitch: BodySwitch; - var switcher = switchF(fakeSelecton); - var documentElement = Traverse.owner(body); - var proxyPaste = ProxyPaste(switcher, body); - var backgroundAssets = Option.none(); - - proxyPaste.events.after.bind(function (event) { - var container = event.container(); - switcher.toOn(body, container); - - // Run a paste filter over the off-screen div. - prePasteFilter(container); - - Class.add(container, CementConstants.binStyle()); - var isWord = Sources.isWord(platform, container); - - var pasteImpl = function (pasteSettings) { - var merging = (isWord && pasteSettings.mergeOfficeStyles) === true || (!isWord && pasteSettings.mergeHtmlStyles === true); - - try { - var dump = RunPaste.go(documentElement, platform, container, merging, isWord); - if (dump !== undefined && dump !== null && dump.length > 0) { - var elements = Elements.fromHtml(dump); - - backgroundAssets.fold(function () { - events.trigger.paste(elements, []); - }, function (future) { - future.get(function (assets) { - events.trigger.paste(elements, assets); - }); - }); - backgroundAssets = Option.none(); - } else { - // This is required to stop the scroll blocking. (TBIO-2440) - events.trigger.paste([], []); - } - } catch (e) { - console.error(e); - events.trigger.error('errors.paste.process.failure'); - } - }; - - // This potentially prompts the user, so it needs to be a callback - var normalPaste = Fun.curry(mergeSettings.get, isWord, pasteImpl); - - // Temporary hack until we restructure in TBIO-1515 - findClipboardTags(container, isWord).fold(normalPaste, function (tags) { - Arr.each(tags, Remove.remove); - // making sure it's asynchronous in both scenarios - setTimeout(function () { - // No need to call mergeSettings.get, we're just hard coding true - pasteImpl({ mergeHtmlStyles: true }); - }, 0); - }); - }); - - var destroy = function () { - proxyPaste.destroy(); - }; - - var handler = function (raw) { - try { - backgroundAssets = IeBlob.convert(raw); - var instance = proxyPaste.instance(); - instance(); - } catch (e) { - console.error(e); - events.trigger.error('errors.paste.process.failure'); - } - }; - - return { - handler: handler, - isSupported: Fun.constant(true), - events: events.registry, - destroy: destroy - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.smartpaste.PasteHandlers', - - [ - 'ephox.cement.html.HtmlPaste', - 'ephox.cement.images.ImagePaste', - 'ephox.cement.pastiche.Pastiche', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.scullion.Struct', - 'ephox.violin.Strings' - ], - - function (HtmlPaste, ImagePaste, Pastiche, Event, Events, Struct, Strings) { - var result = Struct.immutable('captured'); - - var dataContainsMicrosoftOfficeUrn = function (data) { - // copied from ELJ, this logic doesn't exist in Tord and Pastiche's version isn't good enough - return Strings.contains(data, '<html') && - (Strings.contains(data, 'xmlns:o="urn:schemas-microsoft-com:office:office"') || - Strings.contains(data, 'xmlns:x="urn:schemas-microsoft-com:office:excel"')); - }; - - return function (prePasteFilter, body, mergeSettings, pasteSettings) { - // Temporary hack until we restructure in TBIO-1515 - var intraFlag = pasteSettings.intraFlag; - - var htmlPaste = HtmlPaste(mergeSettings, pasteSettings); - var imagePaste = ImagePaste(pasteSettings); - var fallback = Pastiche(prePasteFilter, body, mergeSettings, intraFlag); - - var events = Events.create({ - paste: Event(['elements', 'assets']), - error: Event(['message']), - cancel: Event([]) - }); - - var bindEvents = function (source) { - // why can't this be easy - source.events.error.bind(function (event) { - events.trigger.error(event.message()); - }); - source.events.paste.bind(function (event) { - var elements = event.elements(); - var assets = event.assets(); - - if (elements.length === 0 && assets.length === 0) - events.trigger.cancel(); - else events.trigger.paste(elements, assets); - }); - }; - - bindEvents(htmlPaste); - bindEvents(imagePaste); - bindEvents(fallback); - - var htmlRawImpl = function (raw, preferredType) { - var data = raw.clipboardData.getData(preferredType); - // the decision was made that non-word HTML paste uses pastiche, - // rather than run pastiche after tord - var captured = dataContainsMicrosoftOfficeUrn(data) ? - htmlPaste.handler(data) : - execFallback(raw, preferredType); - - return result(captured); - }; - - var imageRawImpl = function (raw, _) { - var captured = imagePaste.handler(raw.clipboardData.items); - return result(captured); - }; - - // has it's own function to ensure when the arguments change both places are updated - var execFallback = function (raw, _) { - fallback.handler(raw); - return false; - }; - - var fallbackImpl = function (raw, preferredType) { - var captured = execFallback(raw, preferredType); - return result(captured); - }; - - // this must contain everything from the priority list in PasteBroker - var handlers = { - 'html': htmlRawImpl, - 'image': imagePaste.isSupported() ? imageRawImpl : fallbackImpl, - 'files': imagePaste.isSupported() ? imageRawImpl : fallbackImpl, - 'fallback': fallbackImpl - }; - - // Temporary hack until we restructure in TBIO-1515 - if (intraFlag !== undefined) { - handlers[intraFlag.clipboardType()] = fallbackImpl; - } - - var destroy = function () { - fallback.destroy(); - }; - - return { - events: events.registry, - handlers: handlers, - destroy: destroy - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.smartpaste.PasteBroker', - - [ - 'ephox.cement.smartpaste.Inspection', - 'ephox.cement.smartpaste.PasteHandlers', - 'ephox.perhaps.Option', - 'ephox.perhaps.Options', - 'global!RegExp' - ], - - function (Inspection, PasteHandlers, Option, Options, RegExp) { - // these must match the list of handler functions in PasteHandlers - var defaultPriority = ['html', 'image', 'files']; - - var unknownFlavor = { flavor: 'fallback' }; - - var getPreferredFlavor = function (priority, data) { - if (!Inspection.isValidData(data)) return unknownFlavor; - var types = data.types; - - var r = Options.findMap(priority, function (p) { - // case insensitive match on priority text (e.g. 'html' matches 'text/html') - var pmatch = new RegExp(p, 'i'); - return Options.findMap(types, function (t) { - return t.match(pmatch) !== null ? - Option.some({ type: t, flavor: p }) : - Option.none(); - }); - }); - return r.getOr(unknownFlavor); - }; - - // extracted to enforce separation of concerns between events, priority order and handling functions - var createHandler = function (intraFlag, handlers) { - - // Temporary hack until we restructure in TBIO-1515 - var priority = intraFlag === undefined ? defaultPriority : [ intraFlag.clipboardType() ].concat(defaultPriority); - - return function (raw) { - var preferred = getPreferredFlavor(priority, raw.clipboardData); - var impl = handlers[preferred.flavor]; - var result = impl(raw, preferred.type); - if (result.captured()) { - raw.preventDefault(); - } - }; - }; - - return function (prePasteFilter, body, mergeSettings, pasteSettings) { - var pasteHandlers = PasteHandlers(prePasteFilter, body, mergeSettings, pasteSettings); - - var handlePaste = createHandler(pasteSettings.intraFlag, pasteHandlers.handlers); - - var destroy = function () { - pasteHandlers.destroy(); - }; - - return { - events: pasteHandlers.events, - handlePaste: handlePaste, - destroy: destroy - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.porkbun.SourceEvent', - - [ - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.porkbun.Event' - ], - - function (Arr, Fun, Event) { - - /** An event sourced from another event. - - :: ([String], {bind: ..., unbind: ...}) -> SourceEvent - */ - return function (fields, source) { - var mine = Event(fields); - var numHandlers = 0; - - var triggerer = function(evt) { - // yay! Let's unbox this event, convert it to a varargs, so it can be re-boxed! - var args = Arr.map(fields, function (field) { - return evt[field](); - }); - mine.trigger.apply(null, args); - }; - - var bind = function (handler) { - mine.bind(handler); - numHandlers++; - if (numHandlers === 1) { - source.bind(triggerer); - } - }; - - var unbind = function (handler) { - mine.unbind(handler); - numHandlers--; - if (numHandlers === 0) { - source.unbind(triggerer); - } - }; - - return { - bind: bind, - unbind: unbind, - trigger: Fun.die("Cannot trigger a source event.") - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.cement.api.Cement', - - [ - 'ephox.cement.flash.Flash', - 'ephox.cement.smartpaste.MergeSettings', - 'ephox.cement.smartpaste.PasteBroker', - 'ephox.limbo.api.RtfImage', - 'ephox.plumber.tap.function.BlockTap', - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.porkbun.SourceEvent', - 'ephox.sloth.api.Paste', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.InsertAll' - ], - - function (Flash, MergeSettings, PasteBroker, RtfImage, BlockTap, Event, Events, SourceEvent, Paste, Element, InsertAll) { - return function (body, createDialog, prePasteFilter, cementConfig) { - var flash = Flash(createDialog, cementConfig); - var mergeSettings = MergeSettings(createDialog, cementConfig); - var pasteSettings = { baseUrl: cementConfig.baseUrl, allowLocalImages: cementConfig.allowLocalImages, intraFlag: cementConfig.intraFlag }; - var pasteBroker = PasteBroker(prePasteFilter, body, mergeSettings, pasteSettings); - - var events = Events.create({ - cancel: SourceEvent([], mergeSettings.events.cancel), // only merge settings can cancel paste, not flash - error: Event(['message']), - insert: Event(['elements', 'assets']) - }); - - var insert = function (event) { - pasteTap.control.unblock(); - events.trigger.insert(event.elements(), event.assets()); - }; - - flash.events.insert.bind(insert); - - var pasteTap = BlockTap.tap(function (nativeEvent) { - if (Paste.willBlock()) { - /* - On IE10, a second paste is required. That happens synchronously, before we can - return anything that says "block the tap". - In order to make this code reentrant, we need to eagerly block. - */ - pasteTap.control.block(); - - /* - We then need to cancel the native event, because due to reentrancy the "is blocked" - check below actually returns false. If we don't prevent default here, we allow the - default paste to complete on the initial paste event. - */ - nativeEvent.preventDefault(); - } - - pasteBroker.handlePaste(nativeEvent); - - // If dialogs are opened, we set the block and need to prevent default - if (pasteTap.control.isBlocked()) nativeEvent.preventDefault(); - }); - - // block the broker from receiving paste events while the merge window is open. - mergeSettings.events.open.bind(pasteTap.control.block); - mergeSettings.events.close.bind(pasteTap.control.unblock); - - pasteBroker.events.paste.bind(function (event) { - var elements = event.elements(); - var content = Element.fromTag('div'); - InsertAll.append(content, elements); - - if (RtfImage.exists(content)) { - // block the broker from receiving paste events while the flash window is open. - pasteTap.control.block(); - flash.gordon(content, event.assets()); - } else { - insert(event); - } - }); - - var destroy = function () { - pasteBroker.destroy(); - }; - - var passThroughError = function (event) { - pasteTap.control.unblock(); - events.trigger.error(event.message()); - }; - flash.events.error.bind(passThroughError); - pasteBroker.events.error.bind(passThroughError); - - return { - paste: pasteTap.instance, - isBlocked: pasteTap.control.isBlocked, - destroy: destroy, - events: events.registry - }; - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.settings.Defaults', - - [ - - ], - - function() { - return { - officeStyles: 'prompt', - htmlStyles: 'clean' - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.styles.Styles', - - [ - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorExists', - 'ephox.sugar.api.SelectorFind', - 'global!document' - ], - - function(Attr, Element, Insert, Remove, SelectorExists, SelectorFind, document) { - var styleid = 'powerpaste-styles'; - var styleidselector = '#' + styleid; - - var injectStyles = function(url) { - if (!SelectorExists.any(styleidselector)){ - var htmlString = - '<style>' + - '.ephox-cement-flashbin-helpcopy-kbd ' + - '{font-size: 3em !important; text-align: center !important; vertical-align: middle !important; margin: .5em 0} ' + - '.ephox-cement-flashbin-helpcopy-kbd .ephox-polish-help-kbd ' + - '{font-size: 3em !important; vertical-align: middle !important;} ' + - '.ephox-cement-flashbin-helpcopy a ' + - '{text-decoration: underline} ' + - '.ephox-cement-flashbin-loading-spinner ' + - '{background-image: url(' + url + ') !important; width: 96px !important; height:96px !important; display: block; margin-left: auto !important; margin-right: auto !important; margin-top: 2em !important; margin-bottom: 2em !important;} ' + - '.ephox-cement-flashbin-loading p ' + - '{text-align: center !important; margin: 2em 0 !important} ' + - '.ephox-cement-flashbin-target ' + - '{height: 1px !important;} ' + - '.ephox-cement-flashbin-target.ephox-cement-flash-activate ' + - '{height: 150px !important; width: 100% !important;} ' + - '.ephox-cement-flashbin-target object ' + - '{height: 1px !important;} ' + - '.ephox-cement-flashbin-target.ephox-cement-flash-activate object ' + - '{height: 150px !important; width: 100% !important;} ' + - '</style>'; - - var style = Element.fromHtml(htmlString); - Attr.set(style, 'type', 'text/css'); - Attr.set(style, 'id', styleid); - - var head = SelectorFind.first('head').getOrDie('Head element could not be found.'); - - Insert.append(head, style); - - } - }; - - var removeStyles = function() { - if (SelectorExists.any(styleidselector)) { - - var head = SelectorFind.first('head').getOrDie('Head element could not be found.'); - var style = SelectorFind.descendant(head, styleidselector).getOrDie('The style element could not be removed'); - - Remove.remove(style); - - } - }; - - return { - injectStyles: injectStyles, - removeStyles: removeStyles - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.ModernTinyDialog', - - [ - 'ephox.porkbun.Event', - 'ephox.porkbun.Events', - 'ephox.powerpaste.util.NodeUtil', - 'ephox.sugar.api.Attr', - 'ephox.sugar.api.Element', - 'ephox.sugar.api.Insert', - 'ephox.sugar.api.Remove', - 'ephox.sugar.api.SelectorFind' - ], - - function(Event, Events, NodeUtil, Attr, Element, Insert, Remove, SelectorFind) { - return function(editor) { - var createDialog = function() { - var win, title = "", content = "", controls = [], dialogContent = null; - - var events = Events.create({ - close: Event([]) - }); - - var setTitle = function(label) { - title = label; - }; - - var setContent = function(c) { - if (tinymce.Env.safari) { - - } - var contentString = NodeUtil.nodeToString(c.dom()); - content = [{ - type: 'container', - html: contentString - }]; - dialogContent = c; - }; - - var setButtons = function(buttons) { - var tinyButtons = []; - - buttons.forEach(function(element, index, array){ - //Convert cement buttons into tiny buttons - tinyButtons.push({ - text: element.text, - onclick: element.click - }); - }); - - controls = tinyButtons; - - }; - - var winCloseEvent = function(e) { - events.trigger.close(); - }; - - var programmaticWinClose = function() { - //Unbind the close event, as the dialog close event has already triggered and doesn't need to be triggered again - win.off('close', winCloseEvent); - win.close('close'); - }; - - var show = function() { - //If we don't have any buttons, we need to add one (even if it just closes the dialog) - if (controls.length === 0) { - //This gives us back the capability to hit esc to close the dialog & the dialog doesn't take focus away from the editor - controls = [{ - text: 'Close', - onclick: function() { - win.close(); - } - }]; - } - - var winSettings = { - title: title, - spacing: 10, - padding: 10, - items: content, - buttons: controls - }; - - win = editor.windowManager.open(winSettings); - - var tinyWindow = Element.fromDom(win.getEl()); - var proxy = SelectorFind.descendant(tinyWindow, '.' + Attr.get(dialogContent, 'class')).getOrDie('We must find this element or we cannot continue'); - Insert.before(proxy, dialogContent); - Remove.remove(proxy); - - win.on('close', winCloseEvent); - - }; - - var hide = function() { - programmaticWinClose(); - }; - - var destroy = function() { - programmaticWinClose(); - }; - - var reflow = function() { - //(this doesn't work, reflow doesn't calc based on what's actually there, it works it out based on what's in the container on tiny's side) - //So we could update the items, but for now the dialog sizes match so... - }; - - return { - events: events.registry, - setTitle: setTitle, - setContent: setContent, - setButtons: setButtons, - show: show, - hide: hide, - destroy: destroy, - reflow: reflow - }; - }; - - return { - createDialog: createDialog - }; - }; - - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.ModernPowerPaste', - [ - 'ephox.cement.api.Cement', - 'ephox.compass.Arr', - 'ephox.peanut.Fun', - 'ephox.powerpaste.i18n.I18n', - 'ephox.powerpaste.settings.Defaults', - 'ephox.powerpaste.styles.Styles', - 'ephox.powerpaste.tinymce.ErrorDialog', - 'ephox.powerpaste.tinymce.ModernTinyDialog', - 'ephox.powerpaste.util.NodeUtil', - 'ephox.sugar.api.DomEvent', - 'ephox.sugar.api.Element', - 'global!setTimeout', - 'global!tinymce' - ], - function (Cement, Arr, Fun, I18n, Defaults, Styles, ErrorDialog, ModernTinyDialog, NodeUtil, DomEvent, Element, setTimeout, tinymce) { - return function (editor, url, settings, uploader) { - - var bm, swfUrl, imgUrl, cssUrl, jsUrl; - - jsUrl = (settings ? settings.swfUrl : url) + '/js'; - swfUrl = (settings ? settings.swfUrl : url) + '/flash/textboxpaste.swf'; - imgUrl = (settings ? settings.imgUrl : url) + '/img/spinner_96.gif'; - cssUrl = (settings ? settings.cssUrl : url) + '/css/editorcss.css'; - - editor.on('init', function(e) { - //Inject the styles for our dialog into the page - Styles.injectStyles(imgUrl); - - //Inject css into editor - editor.dom.loadCSS(cssUrl); - - var cementSettings = { - baseUrl: jsUrl, - swf: swfUrl, - officeStyles: editor.settings.powerpaste_word_import || Defaults.officeStyles, - htmlStyles: editor.settings.powerpaste_html_import || Defaults.htmlStyles, - translations: I18n.translate, - allowLocalImages: editor.settings.powerpaste_allow_local_images - }; - - var tinyDialog = ModernTinyDialog(editor); - var ed = Element.fromDom(editor.getBody()); - var cement = Cement(ed, tinyDialog.createDialog, Fun.noop, cementSettings); - - cement.events.cancel.bind(function() { - bm = null; - }); - - cement.events.error.bind(function(event) { - - bm = null; - - ErrorDialog.showDialog(editor, - I18n.translate( - event.message() - ) - ); - }); - - cement.events.insert.bind(function(event) { - - var stringHTML = Arr.map(event.elements(), function (element) { - return NodeUtil.nodeToString(element.dom()); - }).join(''); - - //This code was taken from tiny4 - if (editor.hasEventListeners('PastePostProcess')) { - // We need to attach the element to the DOM so Sizzle selectors work on the contents - var tempBody = editor.dom.add(editor.getBody(), 'div', {style: 'display:none'}, stringHTML); - stringHTML = editor.fire('PastePostProcess', {node: tempBody}).node.innerHTML; - editor.dom.remove(tempBody); - } - - //Ensure the editor has focus - editor.focus(); - - //Wait for focus to come back (ie10) - setTimeout(function(){ - - //Once we've got the html we want to insert and have performed post processing, return the - editor.selection.moveToBookmark(bm); //the selection to where it was - - //Delete the bookmark reference so we can do it all again - bm = null; - - editor.undoManager.transact(function(){ - //Content insertion - editor.insertContent(stringHTML, {merge: editor.settings.paste_merge_formats !== false}); - - uploader.prepareImages(event.assets()); - }); - - uploader.uploadImages(event.assets()); - - }, 1); - - - }); - - DomEvent.bind(ed, 'paste', function (e) { - //We need to bookmark the selection before we paste the content - //So that it knows where to place it back in to the editor when we insert from cement. - - if (!bm) { - //Since ie pastes twice, we need to get the bookmark once and ignore the second - bm = editor.selection.getBookmark(); - } - - cement.paste(e.raw()); - - //IE appears to require that we blur the iframe - setTimeout(function() { - if (editor.windowManager.windows[0]) { - editor.windowManager.windows[0].getEl().focus(); - } - }, 1); - }); - - }); - - editor.on('remove', function(e) { - //When we're removing the last editor, we need to remove our injected styles - if (tinymce.editors.length === 1) { - Styles.removeStyles(); - } - }); - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.tinymce.TinyPowerPaste', - [ - 'ephox.powerpaste.imageupload.UploaderFactory', - 'ephox.powerpaste.tinymce.LegacyPowerPaste', - 'ephox.powerpaste.tinymce.ModernPowerDrop', - 'ephox.powerpaste.tinymce.ModernPowerPaste', - 'global!tinymce' - ], - - function (UploaderFactory, LegacyPowerPaste, ModernPowerDrop, ModernPowerPaste, tinymce) { - /*jshint jquery:true */ - return function (settings) { - - return function (editor, url) { - - var setupModern = function () { - var uploader = UploaderFactory(editor); - - ModernPowerPaste(editor, url, settings, uploader); - - if (!editor.settings.powerpaste_block_drop) { - ModernPowerDrop(editor, url, settings, uploader); - } - }; - - var setupLegacy = function () { - LegacyPowerPaste(editor, settings); - }; - - if (tinymce.Env.ie && tinymce.Env.ie < 10) { - setupLegacy(); - } else { - setupModern(); - } - - var blockDragEvents = function (element) { - editor.dom.bind(element, 'drop dragstart dragend dragover dragenter dragleave dragdrop draggesture', function(e) { - return tinymce.dom.Event.cancel(e); - }); - }; - - if (editor.settings.powerpaste_block_drop) { - editor.on('init', function(e) { - blockDragEvents(editor.getBody()); - blockDragEvents(editor.getDoc()); - }); - } - - if (editor.settings.paste_postprocess) { - editor.on('PastePostProcess', function(e) { - editor.settings.paste_postprocess.call(this, this, e); - }); - } - }; - }; - } -); - -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -(function (define, require, demand) { -define( - 'ephox.powerpaste.PowerPastePlugin', - [ - 'ephox.powerpaste.tinymce.TinyPowerPaste', - 'global!tinymce' - ], - function(TinyPowerPaste, tinymce) { - return function(settings) { - tinymce.PluginManager.requireLangPack('powerpaste', 'ar,ca,cs,da,de,el,es,fa,fi,fr_FR,he_IL,hr,hu_HU,it,ja,kk,ko_KR,nb_NO,nl,pl,pt_BR,pt_PT,ro,ru,sk,sl_SI,sv_SE,th_TH,tr,uk,zh_CN,zh_TW'); - tinymce.PluginManager.add('powerpaste', TinyPowerPaste(settings)); - - }; - } -); -})(ephox.bolt.module.api.define, ephox.bolt.module.api.require, ephox.bolt.module.api.demand); - -dem('ephox.powerpaste.PowerPastePlugin')(); - if (this.ephox && this.ephox.bolt) - this.ephox.bolt = old; -})(); diff --git a/static/tinymce1.3/plugins/powerpaste/plugin.min.js b/static/tinymce1.3/plugins/powerpaste/plugin.min.js deleted file mode 100644 index a6f2107a..00000000 --- a/static/tinymce1.3/plugins/powerpaste/plugin.min.js +++ /dev/null @@ -1,23 +0,0 @@ -; -/* Ephox Fluffy plugin - * - * Copyright 2010-2016 Ephox Corporation. All rights reserved. - * - * Version: 1.0.0-3 - */ - -!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})};g("1",[],function(){var a=function(a,b){return{isRequired:a,applyPatch:b}},b=function(a,b){return function(){var c=Array.prototype.slice.call(arguments),d=b.apply(this,c),e="undefined"==typeof d?c:d;return a.apply(this,e)}},c=function(a,b){return function(){var c=a.apply(this,arguments),d=b(c),e="undefined"==typeof d?c:d;return e}},d=function(a,b){if(a)for(var c=0;c<b.length;c++)b[c].isRequired(a)&&b[c].applyPatch(a);return a};return{nu:a,before:b,after:c,applyPatches:d}}),g("5",[],function(){var a=function(a,b){b=b.split(".");for(var c=0;c<b.length&&(a=a[b[c]],a);c++);return a};return{resolve:a}}),h("d",setInterval),h("e",clearInterval),g("b",["d","e"],function(a,b){var c=function(){return(new Date).getTime()},d=function(d,e,f,g,h){var i,j=c();i=a(function(){d()&&(b(i),e()),c()-j>h&&(b(i),f())},g)};return{waitFor:d}}),h("4",window),h("c",document),g("8",["b","4","c"],function(a,b,c){var d=function(a,c){var d=a.currentStyle?a.currentStyle[c]:b.getComputedStyle(a,null)[c];return d?d:""},e=function(a){return function(){var b=d(a,"position").toLowerCase();return"absolute"===b||"fixed"===b}},f=function(){var a=c.createElement("div");return a.style.display="none",a.className="mce-floatpanel",a},g=function(a){a.parentNode.removeChild(a)},h=function(b,d){var h=f();c.body.appendChild(h),a.waitFor(e(h),function(){g(h),b()},function(){g(h),d()},10,5e3)};return{waitForSkinLoaded:h}}),h("9",alert),g("6",["8","9"],function(a,b){var c=function(a,b){a.notificationManager?a.notificationManager.open({text:b,type:"warning",timeout:0,icon:""}):a.windowManager.alert(b)},d=function(d){d.EditorManager.on("AddEditor",function(d){var e=d.editor,f=e.settings.service_message;f&&a.waitForSkinLoaded(function(){c(e,e.settings.service_message)},function(){b(f)})})};return{error:c,register:d}}),g("2",["5","1","6","4"],function(a,b,c,d){var e=function(b){var c,e,f=a.resolve(d,"tinymce.util.URI");c=b.base_url,c&&(this.baseURL=new f(this.documentBaseURL).toAbsolute(c.replace(/\/+$/,"")),this.baseURI=new f(this.baseURL)),e=b.suffix,b.suffix&&(this.suffix=e),this.defaultSettings=b},f=function(b){var c=a.resolve(d,"tinymce.util.Tools");return[c.extend({},this.defaultSettings,b)]},g=function(a){return"function"!=typeof a.overrideDefaults},h=function(a){c.register(a),a.overrideDefaults=e,a.EditorManager.init=b.before(a.EditorManager.init,f)};return{patch:b.nu(g,h)}}),g("a",[],function(){var a=0,b=1,c=-1,d=function(a){return parseInt(a,10)},e=function(a){return function(){return a}},f=function(a,b,c){return{major:e(a),minor:e(b),patch:e(c)}},g=function(a){var b=/([0-9]+)\.([0-9]+)\.([0-9]+)(?:(\-.+)?)/.exec(a);return b?f(d(b[1]),d(b[2]),d(b[3])):f(0,0,0)},h=function(d,e){var f=d-e;return 0===f?a:f>0?b:c},i=function(b,c){var d=h(b.major(),c.major());if(d!==a)return d;var e=h(b.minor(),c.minor());if(e!==a)return e;var f=h(b.patch(),c.patch());return f!==a?f:a};return{nu:f,parse:g,compare:i}}),g("7",["a"],function(a){var b=function(a){var b=[a.majorVersion,a.minorVersion].join(".");return b.split(".").slice(0,3).join(".")},c=function(c){return c?a.parse(b(c)):null},d=function(b,d){return a.compare(c(b),a.parse(d))<0};return{getVersion:c,isLessThan:d}}),g("3",["7","1"],function(a,b){var c=function(a){return function(b){var c=b.plugin_base_urls;for(var d in c)a.PluginManager.urls[d]=c[d]}},d=function(b){return a.isLessThan(b,"4.5.0")},e=function(a){a.overrideDefaults=b.before(a.overrideDefaults,c(a))};return{patch:b.nu(d,e)}}),g("0",["1","2","3","4"],function(a,b,c,d){var e=function(d){a.applyPatches(d,[b.patch,c.patch])};return e(d.tinymce),function(){return{applyPatches:e}}}),d("0")()}();; - -/* Ephox PowerPaste plugin - * - * Copyright 2010-2016 Ephox Corporation. All rights reserved. - * - * Version: 2.1.10-115 - */ - -!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("12",Array),h("13",String),g("g",["12","13"],function(a,b){var c=function(a){return function(b){return a===b}},d=function(){var b=a.prototype.indexOf,d=function(a,c){return b.call(a,c)},e=function(a,b){return r(a,c(b))};return void 0===b?e:d}(),e=function(a,b){return d(a,b)>-1},f=function(a,b){return r(a,b)>-1},g=function(a,b){for(var c=[],d=0;d<a.length;d+=b){var e=a.slice(d,d+b);c.push(e)}return c},h=function(b,c){for(var d=b.length,e=new a(d),f=0;f<d;f++){var g=b[f];e[f]=c(g,f,b)}return e},i=function(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];b(e,c,a)}},j=function(a,b){for(var c=[],d=[],e=0,f=a.length;e<f;e++){var g=a[e],h=b(g,e,a)?c:d;h.push(g)}return{pass:c,fail:d}},k=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++){var f=a[d];b(f,d,a)&&c.push(f)}return c},l=function(a,b){if(0===a.length)return[];for(var c=b(a[0]),d=[],e=[],f=0,g=a.length;f<g;f++){var h=a[f],i=b(h);i!==c&&(d.push(e),e=[]),c=i,e.push(h)}return 0!==e.length&&d.push(e),d},m=function(a,b,c){return n(z(a),b,c)},n=function(a,b,c){return i(a,function(a){c=b(c,a)}),c},o=function(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];if(b(e,c,a))return e}},p=function(a,b,c){var d=o(a,b);return void 0!==d?d:c},q=function(a,c,d){var e=o(a,c);if(void 0===e)throw d||"Could not find element in array: "+b(a);return e},r=function(a,b){for(var c=b||v,d=0,e=a.length;d<e;++d)if(c(a[d])===!0)return d;return-1},s=a.prototype.push,t=function(a){for(var b=[],c=0,d=a.length;c<d;++c)s.apply(b,a[c]);return b},u=function(a,b){var c=h(a,b);return t(c)},v=c(!0),w=function(a,b){for(var c=b||v,d=0,e=a.length;d<e;++d)if(c(a[d],d)!==!0)return!1;return!0},x=function(a,b){return a.length===b.length&&w(a,function(a,c){return a===b[c]})},y=a.prototype.slice,z=function(a){var b=y.call(a,0);return b.reverse(),b},A=function(a,b){return k(a,function(a){return!e(b,a)})},B=function(a,c){for(var d={},e=0,f=a.length;e<f;e++){var g=a[e];d[b(g)]=c(g,e)}return d},C=function(a){return[a]};return{map:h,each:i,partition:j,filter:k,groupBy:l,indexOf:d,foldr:m,foldl:n,find:o,findIndex:r,findOr:p,findOrDie:q,flatten:t,bind:u,forall:w,exists:f,contains:e,equal:x,reverse:z,chunk:g,difference:A,mapToObject:B,pure:C}}),g("p",["12"],function(a){var b=function(){},c=function(a,b){return function(){return a(b.apply(null,arguments))}},d=function(a){return function(){return a}},e=function(a){return a},f=function(a,b){return a===b},g=function(b){for(var c=new a(arguments.length-1),d=1;d<arguments.length;d++)c[d-1]=arguments[d];return function(){for(var d=new a(arguments.length),e=0;e<d.length;e++)d[e]=arguments[e];var f=c.concat(d);return b.apply(null,f)}},h=function(a){return function(){return!a.apply(null,arguments)}},i=function(a){return function(){throw a}},j=function(a){return a()},k=function(a){a()};return{noop:b,compose:c,constant:d,identity:e,tripleEquals:f,curry:g,not:h,die:i,apply:j,call:k}}),h("14",Object),g("n",["p","14"],function(a,b){var c=a.constant(!1),d=a.constant(!0),e=function(){return f},f=function(){var f=function(a){return a.isNone()},g=function(a){return a()},h=function(a){return a},i={fold:function(a,b){return a()},is:c,isSome:c,isNone:d,getOr:h,getOrThunk:g,getOrDie:function(a){throw a||"error: getOrDie called on none."},or:h,orThunk:g,map:e,ap:e,each:e,bind:e,flatten:e,exists:c,forall:d,filter:e,equals:f,equals_:f,toArray:function(){return[]},toString:a.constant("none()")};return b.freeze&&b.freeze(i),i}(),g=function(a){var b=function(){return a},h=function(){return k},i=function(b){return g(b(a))},j=function(b){return b(a)},k={fold:function(b,c){return c(a)},is:function(b){return a===b},isSome:d,isNone:c,getOr:b,getOrThunk:b,getOrDie:b,or:h,orThunk:h,map:i,ap:function(b){return b.fold(e,function(b){return g(b(a))})},each:i,bind:j,flatten:b,exists:j,forall:j,filter:function(b){return b(a)?k:f},equals:function(b){return b.is(a)},equals_:function(b,d){return b.fold(c,function(b){return d(a,b)})},toArray:function(){return[a]},toString:function(){return"some("+a+")"}};return k},h=function(a){return null===a||void 0===a?f:g(a)},i=function(a,b){return a.equals(b)},j=function(a,b,c){return a.equals_(b,c)};return{some:g,none:e,from:h,equals:i,equals_:j}}),g("c",["g","p"],function(a,b){return function(c){var d=function(){c.uploadImages()},e=function(d){a.each(d,function(d){d.fold(function(b,d,e,f){a.each(c.dom.select('img[src="'+e+'"]'),function(a){c.dom.setAttrib(a,"src",f.result)})},b.noop)})},f=function(a,b,c,d){return d.result};return{uploadImages:d,prepareImages:e,getLocalURL:f}}}),g("y",[],function(){return function(a){var b=!1;return function(){b||(b=!0,a.apply(null,arguments))}}}),h("2",tinymce),g("d",["2"],function(a){var b=function(){return"Your browser security settings may be preventing images from being imported."},c=function(){return a.Env.mac&&a.Env.webkit?b()+' <a href="https://support.ephox.com/entries/59328357-Safari-6-1-and-7-Flash-Sandboxing" style="text-decoration: underline">More information on paste for Safari</a>':b()},d=function(){return'Safari does not support direct paste of images. <a href="https://support.ephox.com/entries/88543243-Safari-Direct-paste-of-images-does-not-work" style="text-decoration: underline">More information on image pasting for Safari</a>'},e={"cement.dialog.paste.title":"Paste Formatting Options","cement.dialog.paste.instructions":"Choose to keep or remove formatting in the pasted content.","cement.dialog.paste.merge":"Keep Formatting","cement.dialog.paste.clean":"Remove Formatting","cement.dialog.flash.title":"Additional step needed to paste images","cement.dialog.flash.trigger-paste":"Your browser requires you to take one more action to paste the images in your content. Please press the below keys to complete the image paste:","cement.dialog.flash.missing":'Adobe Flash is required to import images from Microsoft Office. Install the <a href="http://get.adobe.com/flashplayer/" target="_blank">Adobe Flash Player</a>.',"cement.dialog.flash.press-escape":'Press <span class="ephox-polish-help-kbd">"Close"</span> to paste your content without images.',"loading.wait":"Please wait...","flash.clipboard.no.rtf":c(),"safari.imagepaste":d(),"webview.imagepaste":d(),"error.code.images.not.found":"The images service was not found: (","error.imageupload":"Image failed to upload: (","error.full.stop":").","errors.local.images.disallowed":"Local image paste has been disabled. Local images have been removed from pasted content.","flash.crashed":"Images have not been imported as Adobe Flash appears to have crashed. This may be caused by pasting large documents.","errors.imageimport.failed":"Some images failed to import.","errors.imageimport.unsupported":"Unsupported image type.","errors.imageimport.invalid":"Image is invalid."},f=function(a){return e[a]},g=function(b){return a.translate(f(b))};return{translate:g}}),g("s",[],function(){return{showDialog:function(a,b){var c=function(){win.close()},d=[{text:"Ok",onclick:c}],e={title:"Error",spacing:10,padding:10,items:[{type:"container",html:b}],buttons:d};win=a.windowManager.open(e)}}}),g("15",["y","d","s"],function(a,b,c){return function(d,e){var f=function(){return b.translate("error.code.images.not.found")+e+b.translate("error.full.stop")},g=function(){return b.translate("error.imageupload")+e+b.translate("error.full.stop")},h=function(a){var b=a.status(),e=0===b||b>=400||b<500,h=e?f:g;c.showDialog(d,h())},i=function(){return a(h)};return{instance:i}}}),g("3g",["g"],function(a){var b=function(b){var e=c(b),f=function(b){var c=b.split(" "),f=a.map(c,function(a){return d(e,a)});return f.join(" ")};return{resolve:f}},c=function(a){return a.replace(/\./g,"-")},d=function(a,b){return a+"-"+b};return{create:b,cssNamespace:c,cssClass:d}}),g("2d",["3g"],function(a){var b=a.create("ephox-salmon");return{resolve:b.resolve}}),g("26",["p","2d"],function(a,b){var c=b.resolve("upload-image-in-progress"),d="data-"+b.resolve("image-blob");return{uploadInProgress:a.constant(c),blobId:a.constant(d)}}),g("3h",[],function(){return function(a,b,c){var d=c||!1,e=function(){b(),d=!0},f=function(){a(),d=!1},g=function(){var a=d?f:e;a()},h=function(){return d};return{on:e,off:f,toggle:g,isOn:h}}}),g("1b",["12","13"],function(a,b){var c=function(c){if(null===c)return"null";var d=typeof c;return"object"===d&&a.prototype.isPrototypeOf(c)?"array":"object"===d&&b.prototype.isPrototypeOf(c)?"string":d},d=function(a){return function(b){return c(b)===a}};return{isString:d("string"),isObject:d("object"),isArray:d("array"),isNull:d("null"),isBoolean:d("boolean"),isUndefined:d("undefined"),isFunction:d("function"),isNumber:d("number")}}),g("1c",["14"],function(a){var b=function(){var b=a.keys,c=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b};return void 0===b?c:b}(),c=function(a,c){for(var d=b(a),e=0,f=d.length;e<f;e++){var g=d[e],h=a[g];c(h,g,a)}},d=function(a,b){return e(a,function(a,c,d){return{k:c,v:b(a,c,d)}})},e=function(a,b){var d={};return c(a,function(c,e){var f=b(c,e,a);d[f.k]=f.v}),d},f=function(a,b){var d={},e={};return c(a,function(a,c){var f=b(a,c)?d:e;f[c]=a}),{t:d,f:e}},g=function(a,b){var d=[];return c(a,function(a,c){d.push(b(a,c))}),d},h=function(a,c){for(var d=b(a),e=0,f=d.length;e<f;e++){var g=d[e],h=a[g];if(c(h,g,a))return h}},i=function(a){return g(a,function(a){return a})},j=function(a){return i(a).length};return{bifilter:f,each:c,map:d,mapToArray:g,tupleMap:e,find:h,keys:b,values:i,size:j}}),g("2e",[],function(){return{ATTRIBUTE:2,CDATA_SECTION:4,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,ELEMENT:1,TEXT:3,PROCESSING_INSTRUCTION:7,ENTITY_REFERENCE:5,ENTITY:6,NOTATION:12}}),g("1d",["2e"],function(a){var b=function(a){var b=a.dom().nodeName;return b.toLowerCase()},c=function(a){return a.dom().nodeType},d=function(a){return a.dom().nodeValue},e=function(a){return function(b){return c(b)===a}},f=function(d){return c(d)===a.COMMENT||"#comment"===b(d)},g=e(a.ELEMENT),h=e(a.TEXT),i=e(a.DOCUMENT);return{name:b,type:c,value:d,isElement:g,isText:h,isDocument:i,isComment:f}}),h("1e",Error),g("1f",[],function(){return"undefined"==typeof console&&(console={log:function(){}}),console}),g("j",["1b","g","1c","1d","1e","1f"],function(a,b,c,d,e,f){var g=function(b,c,d){if(!(a.isString(d)||a.isBoolean(d)||a.isNumber(d)))throw f.error("Invalid call to Attr.set. Key ",c,":: Value ",d,":: Element ",b),new e("Attribute value was not simple");b.setAttribute(c,d+"")},h=function(a,b,c){g(a.dom(),b,c)},i=function(a,b){var d=a.dom();c.each(b,function(a,b){g(d,b,a)})},j=function(a,b){var c=a.dom().getAttribute(b);return null===c?void 0:c},k=function(a,b){var c=a.dom();return!(!c||!c.hasAttribute)&&c.hasAttribute(b)},l=function(a,b){a.dom().removeAttribute(b)},m=function(a){var b=a.dom().attributes;return void 0===b||null===b||0===b.length},n=function(a){return b.foldl(a.dom().attributes,function(a,b){return a[b.name]=b.value,a},{})},o=function(a,b,c){k(a,c)&&!k(b,c)&&h(b,c,j(a,c))},p=function(a,c,e){d.isElement(a)&&d.isElement(c)&&b.each(e,function(b){o(a,c,b)})};return{clone:n,set:h,setAll:i,get:j,has:k,remove:l,hasNone:m,transfer:p}}),g("5z",["g","j"],function(a,b){var c=function(a,c){var d=b.get(a,c);return void 0===d||""===d?[]:d.split(" ")},d=function(a,d,e){var f=c(a,d),g=f.concat([e]);b.set(a,d,g.join(" "))},e=function(d,e,f){var g=a.filter(c(d,e),function(a){return a!==f});g.length>0?b.set(d,e,g.join(" ")):b.remove(d,e)};return{read:c,add:d,remove:e}}),g("3i",["g","5z"],function(a,b){var c=function(a){return void 0!==a.dom().classList},d=function(a){return b.read(a,"class")},e=function(a,c){return b.add(a,"class",c)},f=function(a,c){return b.remove(a,"class",c)},g=function(b,c){a.contains(d(b),c)?f(b,c):e(b,c)};return{get:d,add:e,remove:f,toggle:g,supports:c}}),g("27",["3h","j","3i"],function(a,b,c){var d=function(a,b){c.supports(a)?a.dom().classList.add(b):c.add(a,b)},e=function(a){var d=c.supports(a)?a.dom().classList:c.get(a);0===d.length&&b.remove(a,"class")},f=function(a,b){if(c.supports(a)){var d=a.dom().classList;d.remove(b)}else c.remove(a,b);e(a)},g=function(a,b){return c.supports(a)?a.dom().classList.toggle(b):c.toggle(a,b)},h=function(b,d){var e=c.supports(b),f=b.dom().classList,g=function(){e?f.remove(d):c.remove(b,d)},h=function(){e?f.add(d):c.add(b,d)};return a(g,h,i(b,d))},i=function(a,b){return c.supports(a)&&a.dom().classList.contains(b)};return{add:d,remove:f,toggle:g,toggler:h,has:i}}),h("1g",document),g("k",["p","1e","1f","1g"],function(a,b,c,d){var e=function(a,b){var e=b||d,f=e.createElement("div");if(f.innerHTML=a,!f.hasChildNodes()||f.childNodes.length>1)throw c.error("HTML does not have a single root node",a),"HTML must have a single root node";return h(f.childNodes[0])},f=function(a,b){var c=b||d,e=c.createElement(a);return h(e)},g=function(a,b){var c=b||d,e=c.createTextNode(a);return h(e)},h=function(c){if(null===c||void 0===c)throw new b("Node cannot be null or undefined");return{dom:a.constant(c)}};return{fromHtml:e,fromTag:f,fromText:g,fromDom:h}}),g("3k",["g","1c","p","12"],function(a,b,c,d){var e=function(e,f){var g=function(){for(var b=new d(arguments.length),f=0;f<b.length;f++)b[f]=arguments[f];if(e.length!==b.length)throw'Wrong number of arguments to struct. Expected "['+e.length+']", got '+b.length+" arguments";var g={};return a.each(e,function(a,d){g[a]=c.constant(b[d])}),g},h=function(a,b){for(var d=0;d<e.length;d++){var g=f&&f[d]||c.tripleEquals,h=e[d];if(!g(a[h](),b[h]()))return!1}return!0},i=function(a){return b.map(a,function(a){return a()})};return{nu:g,eq:h,evaluate:i}};return{product:e}}),g("3j",["3k"],function(a){return function(){return a.product(arguments).nu}}),g("60",["1b","g"],function(a,b){var c=function(a){return a.slice(0).sort()},d=function(a,b){throw"All required keys ("+c(a).join(", ")+") were not specified. Specified keys were: "+c(b).join(", ")+"."},e=function(a){throw"Unsupported keys for object: "+c(a).join(", ")},f=function(c,d){if(!a.isArray(d))throw"The "+c+" fields must be an array. Was: "+d+".";b.each(d,function(b){if(!a.isString(b))throw"The value "+b+" in the "+c+" fields was not a string."})},g=function(a,b){throw"All values need to be of type: "+b+". Keys ("+c(a).join(", ")+") were not."},h=function(a){var d=c(a),e=b.find(d,function(a,b){return b<d.length-1&&a===d[b+1]});if(void 0!==e&&null!==e)throw"The field: "+e+" occurs more than once in the combined fields: ["+d.join(", ")+"]."};return{sort:c,reqMessage:d,unsuppMessage:e,validateStrArr:f,invalidTypeMessage:g,checkDupes:h}}),g("3l",["g","1c","p","n","60","14"],function(a,b,c,d,e,f){return function(g,h){var i=g.concat(h);if(0===i.length)throw"You must specify at least one required or optional field.";return e.validateStrArr("required",g),e.validateStrArr("optional",h),e.checkDupes(i),function(j){var k=b.keys(j),l=a.forall(g,function(b){return a.contains(k,b)});l||e.reqMessage(g,k);var m=a.filter(k,function(b){return!a.contains(i,b)});m.length>0&&e.unsuppMessage(m);var n={};return a.each(g,function(a){n[a]=c.constant(j[a])}),a.each(h,function(a){n[a]=c.constant(f.prototype.hasOwnProperty.call(j,a)?d.some(j[a]):d.none())}),n}}}),g("2c",["3j","3k","3l"],function(a,b,c){return{immutable:a,immutable2:b,immutableBag:c}}),g("3m",[],function(){var a=function(a,b){var c=[],d=function(a){return c.push(a),b(a)},e=b(a);do e=e.bind(d);while(e.isSome());return c};return{toArray:a}}),g("4j",["p"],function(a){return function(b,c,d){var e=b.isiOS()&&/ipad/i.test(d)===!0,f=b.isiOS()&&!e,g=b.isAndroid()&&3===b.version.major,h=b.isAndroid()&&4===b.version.major,i=e||g||h&&/mobile/i.test(d)===!0,j=b.isiOS()||b.isAndroid(),k=j&&!i,l=c.isSafari()&&b.isiOS()&&/safari/i.test(d)===!1;return{isiPad:a.constant(e),isiPhone:a.constant(f),isTablet:a.constant(i),isPhone:a.constant(k),isTouch:a.constant(j),isAndroid:b.isAndroid,isiOS:b.isiOS,isWebView:a.constant(l)}}}),g("4k",[],function(){var a=function(a,b,c){return{browser:{current:a,version:b},os:{current:c}}};return{create:a}}),g("61",[],function(){var a=function(a){return function(){return a}},b=function(b,c,d){for(var e=0;e<d.length;e++)b["is"+d[e].name]=a(d[e].name===c)};return{getter:a,attachGetters:b}}),g("4l",["61"],function(a){var b=function(b,c,d){var e=a.attachGetters,f={};return f.current=c,f.version=d,e(f,f.current,b),f};return{create:b}}),h("62",Math),h("63",isFinite),h("64",isNaN),h("65",parseFloat),g("3s",["62","63","64","65"],function(a,b,c,d){var e=function(a){return function(b,c){var d=typeof c;if(d!==a)throw b+" was not a "+a+". Was: "+c+" ("+d+")"}},f=e("string"),g=function(a,b){f(a,b);var c=b.length;if(1!==c)throw a+" was not a single char. Was: "+b},h=e("number"),i=function(b,c){if(h(b,c),c!==a.abs(c))throw b+" was not an integer. Was: "+c},j=function(a){return!c(d(a))&&b(a)},k=function(a,b){if(i(a,b),b<0)throw a+" was not a natural number. Was: "+b};return{vString:f,vChar:g,vInt:i,vNat:k,pNum:j}}),g("37",["3s"],function(a){var b=function(a,b,c){if(""===b)return!0;if(a.length<b.length)return!1;var d=a.substr(c,c+b.length);return d===b},c=function(a,b){var c=function(a){var b=typeof a;return"string"===b||"number"===b};return a.replace(/\${([^{}]*)}/g,function(a,d){var e=b[d];return c(e)?e:a})},d=function(a){var b=function(a,b){for(var c=[],d=0;d<a.length;d++)c.push(b(a[d]));return c};return function(){var c=b(arguments,function(a){return"string"==typeof a?a.toLowerCase():a});return a.apply(this,c)}},e=function(a,c){return b(a,c,0)},f=d(e),g=function(a,c){return b(a,c,a.length-c.length)},h=d(g),i=function(a,b){return a.substr(0,b)},j=function(a,b){return a.substr(a.length-b,a.length)},k=function(a,b){return function(c,d){return a(c,d)?b(c,c.length-d.length):c}},l=k(e,j),m=k(g,i),n=function(a,b){return a+b},o=function(a,b){return b+a},p=function(a,b){return function(c,d){return a(c,d)?c:b(c,d)}},q=p(e,o),r=p(g,n),s=function(a){return a.replace(/^\s+|\s+$/g,"")},t=function(a){return a.replace(/^\s+/g,"")},u=function(a){return a.replace(/\s+$/g,"")},v=function(a,b){return a.indexOf(b)!=-1},w=d(v),x=function(a){return a.replace(/\"/gm,""")},y=function(a,b){return a===b},z=d(y),A=function(a){if(""===a)throw"head on empty string";return a.substr(0,1)},B=function(a){if(""===a)throw"toe on empty string";return a.substr(a.length-1,a.length)},C=function(a){if(""===a)throw"tail on empty string";return a.substr(1,a.length-1)},D=function(a){if(""===a)throw"torso on empty string";return a.substr(0,a.length-1)},E=function(a){return""===a?a:A(a).toUpperCase()+C(a)},F=function(b,c){a.vString("str",b),a.vNat("num",c);for(var d="",e=0;e<c;e++)d+=b;return d},G=function(b){return function(c,d,e){a.vString("str",c),a.vChar("c",d),a.vNat("width",e);var f=c.length;return f>=e?c:b(c,F(d,e-f))}},H=G(function(a,b){return b+a}),I=G(function(a,b){return a+b});return{supplant:c,startsWith:e,startsWithIgnoringCase:f,endsWith:g,endsWithIgnoringCase:h,first:i,last:j,removeLeading:l,removeTrailing:m,ensureLeading:q,ensureTrailing:r,trim:s,lTrim:t,rTrim:u,contains:v,containsIgnoringCase:w,htmlEncodeDoubleQuotes:x,equals:y,equalsIgnoringCase:z,head:A,repead:F,padLeft:H,padRight:I,toe:B,tail:C,torso:D,capitalize:E}}),g("4m",["37"],function(a){var b=a.contains,c=function(a){return function(c){return b(c,a)}},d=function(){try{var a=new ActiveXObject("ChromeTab.ChromeFrame");return!!a}catch(b){return!1}},e=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,f=function(a){var d=[{name:"Spartan",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(a){var c=b(a,"edge/")&&b(a,"chrome")&&b(a,"safari")&&b(a,"applewebkit");return c}},{name:"ChromeFrame",versionRegexes:[/.*?chromeframe\/([0-9]+)\.([0-9]+).*/,e],search:function(c){return!!b(c,"chromeframe")&&a()}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,e],search:function(a){return b(a,"chrome")&&!b(a,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(c){var d=b(c,"msie")||b(c,"trident"),e=b(c,"chromeframe");return e?d&&!a():d}},{name:"Opera",versionRegexes:[e,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:c("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:c("firefox")},{name:"Safari",versionRegexes:[e,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(a){return(b(a,"safari")||b(a,"mobile/"))&&b(a,"applewebkit")}},{name:"Envjs",versionRegexes:[/.*?envjs\/\ ?([0-9]+)\.([0-9]+).*/],search:c("envjs")}],f=[{name:"Windows",search:c("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(a){return b(a,"iphone")||b(a,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:c("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:c("os x"),versionRegexes:[/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:c("linux")},{name:"Solaris",search:c("sunos")},{name:"FreeBSD",search:c("freebsd")}];return{browsers:d,oses:f}};return{create:f,chromeFrameChecker:d}}),g("4n",[],function(){var a=function(a,b){var c=typeof a;if("boolean"===c)return!!a;if("object"===c){var d=a.minimum;return b.major>d.major||b.major===d.major&&b.minor>=d.minor}throw"invalid spec"};return{meetsSpec:a}}),g("66",[],function(){var a=function(a,b,c){for(var d=0;d<a.length;d++){var e=a[d];if(c(e,d,a))return e}return b};return{findOneInArrayOr:a}}),g("4o",["66"],function(a){var b=function(b,c){var d=a.findOneInArrayOr,e=String(c).toLowerCase();return d(b,{name:void 0},function(a){return a.search(e)})};return{detect:b}}),g("4p",[],function(){var a=function(a,b){function c(a,b){for(var c=0;c<a.length;c++){var d=a[c];if(d.test(b))return d}}function d(a,b){var d=c(a,b);if(!d)return{major:0,minor:0};var e=function(a){return Number(b.replace(d,"$"+a))};return{major:e(1),minor:e(2)}}var e=String(b).toLowerCase(),f=a.versionRegexes;return f?d(f,e):{major:0,minor:0}};return{detectVersion:a}}),g("2t",["4j","4k","4l","4m","4n","4o","4p"],function(a,b,c,d,e,f,g){var h=g.detectVersion,i=c.create,j=e.meetsSpec,k=f.detect,l=function(a,b,c,d){return!!a[b]&&(a[b][c]?j(a[b][c],d):!!a[b].All)},m=function(a,b){var c=b.browser,d=b.os;return l(a,d.current,c.current,c.version)},n=function(b,c){var e=d.create(c),f=e.browsers,g=e.oses,j=k(g,b),m=j.name,n=h(j,b),o=k(f,b),p=o.name,q=h(o,b),r=i(g,m,n),s=i(f,p,q),t=a(r,s,b),u=function(a){return l(a,m,p,q)};return{browser:s,os:r,deviceType:t,isSupported:u}},o=function(){return n(navigator.userAgent,d.chromeFrameChecker)};return{Platform:b,detect:o,doDetect:n,isSupported:l,isSupportedPlatform:m}}),g("72",[],function(){return Function("return this;")()}),g("68",["72"],function(a){var b=function(b,c){for(var d=c||a,e=0;e<b.length&&void 0!==d&&null!==d;++e)d=d[b[e]];return d},c=function(a,c){var d=a.split(".");return b(d,c)};return{path:b,resolve:c}}),g("3p",["68"],function(a){var b=function(b,c){return a.resolve(b,c)},c=function(a,c){var d=b(a,c);if(void 0===d)throw a+" not available on this browser";return d};return{getOrDie:c}}),g("67",["3p"],function(a){var b=function(){var b=a.getOrDie("Node");return b},c=function(a,b,c){return 0!==(a.compareDocumentPosition(b)&c)},d=function(a,d){return c(a,d,b().DOCUMENT_POSITION_PRECEDING)},e=function(a,d){return c(a,d,b().DOCUMENT_POSITION_CONTAINED_BY)};return{documentPositionPreceding:d,documentPositionContainedBy:e}}),g("2h",["2e","g","n","k","1e","1g"],function(a,b,c,d,e,f){var g=0,h=1,i=2,j=3,k=function(){var a=f.createElement("span");return void 0!==a.matches?g:void 0!==a.msMatchesSelector?h:void 0!==a.webkitMatchesSelector?i:void 0!==a.mozMatchesSelector?j:-1}(),l=a.ELEMENT,m=a.DOCUMENT,n=function(a,b){var c=a.dom();if(c.nodeType!==l)return!1;if(k===g)return c.matches(b);if(k===h)return c.msMatchesSelector(b);if(k===i)return c.webkitMatchesSelector(b);if(k===j)return c.mozMatchesSelector(b);throw new e("Browser lacks native selectors")},o=function(a){return a.nodeType!==l&&a.nodeType!==m||0===a.childElementCount},p=function(a,c){var e=void 0===c?f:c.dom();return o(e)?[]:b.map(e.querySelectorAll(a),d.fromDom)},q=function(a,b){var e=void 0===b?f:b.dom();return o(e)?c.none():c.from(e.querySelector(a)).map(d.fromDom)};return{all:p,is:n,one:q}}),g("3n",["g","2t","67","p","2h"],function(a,b,c,d,e){var f=function(a,b){return a.dom()===b.dom()},g=function(a,b){return a.dom().isEqualNode(b.dom())},h=function(b,c){return a.exists(c,d.curry(f,b))},i=function(a,b){var c=a.dom(),d=b.dom();return c!==d&&c.contains(d)},j=function(a,b){return c.documentPositionContainedBy(a.dom(),b.dom())},k=b.detect().browser,l=k.isIE()?j:i;return{eq:f,isEqualNode:g,member:h,contains:l,is:e.is}}),g("3f",["1b","g","p","n","2c","3m","3n","k"],function(a,b,c,d,e,f,g,h){var i=function(a){return h.fromDom(a.dom().ownerDocument)},j=function(a){var b=i(a);return h.fromDom(b.dom().documentElement)},k=function(a){var b=a.dom(),c=b.ownerDocument.defaultView;return h.fromDom(c)},l=function(a){var b=a.dom();return d.from(b.parentNode).map(h.fromDom)},m=function(a){return l(a).bind(function(c){var e=u(c),f=b.findIndex(e,function(b){return g.eq(a,b)});return f>-1?d.some(f):d.none()})},n=function(b,d){for(var e=a.isFunction(d)?d:c.constant(!1),f=b.dom(),g=[];null!==f.parentNode&&void 0!==f.parentNode;){var i=f.parentNode,j=h.fromDom(i);if(g.push(j),e(j)===!0)break;f=i}return g},o=function(a){var c=function(c){return b.filter(c,function(b){return!g.eq(a,b)})};return l(a).map(u).map(c).getOr([])},p=function(a){var b=a.dom();return d.from(b.offsetParent).map(h.fromDom)},q=function(a){var b=a.dom();return d.from(b.previousSibling).map(h.fromDom)},r=function(a){var b=a.dom();return d.from(b.nextSibling).map(h.fromDom)},s=function(a){return b.reverse(f.toArray(a,q))},t=function(a){return f.toArray(a,r)},u=function(a){var c=a.dom();return b.map(c.childNodes,h.fromDom)},v=function(a,b){var c=a.dom().childNodes;return d.from(c[b]).map(h.fromDom)},w=function(a){return v(a,0)},x=function(a){return v(a,a.dom().childNodes.length-1)},y=e.immutable("element","offset"),z=function(a,b){var c=u(a);return c.length>0&&b<c.length?y(c[b],0):y(a,b)};return{owner:i,defaultView:k,documentElement:j,parent:l,findIndex:m,parents:n,siblings:o,prevSibling:q,offsetParent:p,prevSiblings:s,nextSibling:r,nextSiblings:t,children:u,child:v,firstChild:w,lastChild:x,leaf:z}}),g("28",["g","k","3f","1g"],function(a,b,c,d){var e=function(a,e){var f=e||d,g=f.createElement("div");return g.innerHTML=a,c.children(b.fromDom(g))},f=function(c,d){return a.map(c,function(a){return b.fromTag(a,d)})},g=function(c,d){return a.map(c,function(a){return b.fromText(a,d)})},h=function(c){return a.map(c,b.fromDom)};return{fromHtml:e,fromTags:f,fromText:g,fromDom:h}}),g("1x",["3f"],function(a){var b=function(b,c){var d=a.parent(b);d.each(function(a){a.dom().insertBefore(c.dom(),b.dom())})},c=function(c,d){var f=a.nextSibling(c);f.fold(function(){var b=a.parent(c);b.each(function(a){e(a,d)})},function(a){b(a,d)})},d=function(b,c){var d=a.firstChild(b);d.fold(function(){e(b,c)},function(a){b.dom().insertBefore(c.dom(),a.dom())})},e=function(a,b){a.dom().appendChild(b.dom())},f=function(c,d,f){a.child(c,f).fold(function(){e(c,d)},function(a){b(a,d)})},g=function(a,c){b(a,c),e(c,a)};return{before:b,after:c,prepend:d,append:e,appendAt:f,wrap:g}}),g("29",["g","1x"],function(a,b){var c=function(c,d){a.each(d,function(a){b.before(c,a)})},d=function(c,d){a.each(d,function(a,e){var f=0===e?c:d[e-1];b.after(f,a)})},e=function(c,d){a.each(d.slice().reverse(),function(a){b.prepend(c,a)})},f=function(c,d){a.each(d,function(a){b.append(c,a)})};return{before:c,after:d,prepend:e,append:f}}),g("5w",[],function(){var a=function(a){var b,c=!1;return function(){return c||(c=!0,b=a.apply(null,arguments)),b}};return{cached:a}}),g("5i",["5w","k","1d","1g"],function(a,b,c,d){var e=function(a){var b=c.isText(a)?a.dom().parentNode:a.dom();return void 0!==b&&null!==b&&b.ownerDocument.body.contains(b)},f=a.cached(function(){return g(b.fromDom(d))}),g=function(a){var c=a.dom().body;if(null===c||void 0===c)throw"Body is not available yet";return b.fromDom(c)};return{body:f,getBody:g,inBody:e}}),g("3o",["g","5i","3f"],function(a,b,c){var d=function(a){return h(b.body(),a)},e=function(b,d,e){return a.filter(c.parents(b,e),d)},f=function(b,d){return a.filter(c.siblings(b),d)},g=function(b,d){return a.filter(c.children(b),d)},h=function(b,d){var e=[];return a.each(c.children(b),function(a){d(a)&&(e=e.concat([a])),e=e.concat(h(a,d))}),e};return{all:d,ancestors:e,siblings:f,children:g,descendants:h}}),g("2a",["3o","2h"],function(a,b){var c=function(a){return b.all(a)},d=function(c,d,e){return a.ancestors(c,function(a){return b.is(a,d)},e)},e=function(c,d){return a.siblings(c,function(a){return b.is(a,d)})},f=function(c,d){return a.children(c,function(a){return b.is(a,d)})},g=function(a,c){return b.all(c,a)};return{all:c,ancestors:d,siblings:e,children:f,descendants:g}}),g("16",["g","26","27","k","28","29","2a"],function(a,b,c,d,e,f,g){var h=function(a){c.remove(a,b.uploadInProgress())},i=function(c){for(var i=0;i<c.undoManager.data.length;i++){var j=c.undoManager.data[i].content,k=d.fromTag("div");f.append(k,e.fromHtml(j));var l=g.descendants(k,"."+b.uploadInProgress());a.each(l,h),c.undoManager.data[i].content=k.dom().innerHTML}},j=function(a,b,c){for(var d=0;d<a.undoManager.data.length;d++)a.undoManager.data[d].content=a.undoManager.data[d].content.split(b.objurl()).join(c.location)};return{unwrapHistory:i,resrcHistory:j}}),g("2b",["3p"],function(a){var b=function(){return a.getOrDie("URL")},c=function(a){return b().createObjectURL(a)},d=function(a){b().revokeObjectURL(a)};return{createObjectURL:c,revokeObjectURL:d}}),g("17",["1c","2b","n","2c"],function(a,b,c,d){var e=d.immutable("id","blob","objurl","data");return function(){var d={},f=function(a,b,c,f){var g=e(a,b,c,f);return d[a]=g,g},g=function(a){return c.from(d[a])},h=function(a){b.revokeObjectURL(a.objurl())},i=function(b){return c.from(a.find(d,function(a){return a.data().result===b}))},j=function(a){var b=d[a];delete d[a],void 0!==b&&h(b)},k=function(){a.each(d,h),d={}};return{add:f,get:g,remove:j,lookupByData:i,destroy:k}}}),g("21",["g","2c"],function(a,b){return function(c){var d=b.immutable.apply(null,c),e=[],f=function(a){if(void 0===a)throw"Event bind error: undefined handler";e.push(a)},g=function(b){e=a.filter(e,function(a){return a!==b})},h=function(){var b=d.apply(null,arguments);a.each(e,function(a){a(b)})};return{bind:f,unbind:g,trigger:h}}}),g("22",["1c"],function(a){var b=function(b){var c=a.map(b,function(a){return{bind:a.bind,unbind:a.unbind}}),d=a.map(b,function(a){return a.trigger});return{registry:c,trigger:d}};return{create:b}}),g("18",["g","2d","26","21","22","j","2a"],function(a,b,c,d,e,f,g){var h="data-"+b.resolve("image-upload"),i=function(a,b){return g.descendants(a,"img["+h+'="'+b+'"]')},j=function(a){return g.descendants(a,"img:not(["+h+"])["+c.blobId()+"]")};return function(){var b=[],c=[],g=e.create({complete:d(["response"])}),k=function(a,c){f.set(a,h,c),b.push(c)},l=function(c){b=a.filter(b,function(a,b){return a!==c}),p()===!1&&o()},m=function(a,b){c.push({success:a,element:b.dom()})},n=function(b,c,d){a.each(c,function(a){f.remove(a,h),m(d,a)}),l(b)},o=function(){g.trigger.complete(c),c=[]},p=function(){return b.length>0},q=function(c){return a.contains(b,c)};return{findById:i,findAll:j,register:k, -report:n,inProgress:p,isActive:q,events:g.registry}}}),g("1l",["1b","12"],function(a,b){var c=function(a,b){return b},d=function(b,c){var d=a.isObject(b)&&a.isObject(c);return d?f(b,c):c},e=function(a){return function(){for(var c=new b(arguments.length),d=0;d<c.length;d++)c[d]=arguments[d];if(0===c.length)throw"Can't merge zero objects";for(var e={},f=0;f<c.length;f++){var g=c[f];for(var h in g)g.hasOwnProperty(h)&&(e[h]=a(e[h],g[h]))}return e}},f=e(d),g=e(c);return{deepMerge:f,merge:g}}),g("1m",["1b","g","1c","12"],function(a,b,c,d){var e=function(e){if(!a.isArray(e))throw"cases must be an array";if(0===e.length)throw"there must be at least one case";var f={};return b.each(e,function(b,g){var h=c.keys(b);if(1!==h.length)throw"one and only one name per case";var i=h[0],j=b[i];if(void 0!==f[i])throw"duplicate key detected:"+i;if("cata"===i)throw"cannot have a case named cata (sorry)";if(!a.isArray(j))throw"case arguments must be an array";f[i]=function(){var a=arguments.length;if(a!==j.length)throw"Wrong number of arguments to case "+i+". Expected "+j.length+" ("+j+"), got "+a;for(var b=new d(a),c=0;c<b.length;c++)b[c]=arguments[c];return{fold:function(){if(arguments.length!==e.length)throw"Wrong number of arguments to fold. Expected "+e.length+", got "+arguments.length;var a=arguments[g];return a.apply(null,b)}}}}),f};return{generate:e}}),g("h",["1l","1m"],function(a,b){var c=b.generate([{blob:["id","blob","objurl","data"]},{url:["id","url","raw"]}]),d=function(a,b,c){return a.fold(b,c)};return a.merge(c,{cata:d})}),g("2f",["p","n"],function(a,b){var c=function(a){return e(function(b,c){return c(a)})},d=function(a){return e(function(b,c){return b(a)})},e=function(e){var f=function(b){return e(a.constant(!1),function(a){return a===b})},g=function(){return e(a.constant(!1),a.constant(!0))},h=a.not(g),i=function(b){return e(a.constant(b),a.identity)},j=function(b){return e(b,a.identity)},k=function(){return e(function(b){a.die(b)()},a.identity)},l=function(b){return e(a.constant(b),c)},m=function(a){return e(a,c)},n=function(a){return p(function(b){return c(a(b))})},o=n,p=function(a){return e(d,a)},q=function(b){return e(a.constant(!1),b)},r=function(b){return e(a.constant(!0),b)},s=function(){return e(b.none,b.some)};return{is:f,isValue:g,isError:h,getOr:i,getOrThunk:j,getOrDie:k,or:l,orThunk:m,fold:e,map:n,each:o,bind:p,exists:q,forall:r,toOption:s}};return{value:c,error:d}}),g("3q",["g","27","3i","12"],function(a,b,c,d){var e=function(c,d){a.each(d,function(a){b.add(c,a)})},f=function(c,d){a.each(d,function(a){b.remove(c,a)})},g=function(c,d){a.each(d,function(a){b.toggle(c,a)})},h=function(c,d){return a.forall(d,function(a){return b.has(c,a)})},i=function(c,d){return a.exists(d,function(a){return b.has(c,a)})},j=function(a){for(var b=a.dom().classList,c=new d(b.length),e=0;e<b.length;e++)c[e]=b.item(e);return c},k=function(a){return c.supports(a)?j(a):c.get(a)};return{add:e,remove:f,toggle:g,hasAll:h,hasAny:i,get:k}}),g("2g",["27","3q"],function(a,b){var c=function(b){return function(c){a.add(c,b)}},d=function(b){return function(c){a.remove(c,b)}},e=function(a){return function(c){b.remove(c,a)}},f=function(b){return function(c){return a.has(c,b)}};return{addClass:c,removeClass:d,removeClasses:e,hasClass:f}}),g("2i",["1b","n"],function(a,b){return function(c,d,e,f,g){return c(e,f)?b.some(e):a.isFunction(g)&&g(e)?b.none():d(e,f,g)}}),g("20",["n","2a","2h","2i"],function(a,b,c,d){var e=function(c){return a.from(b.all(c)[0])},f=function(c,d,e){return a.from(b.ancestors(c,d,e)[0])},g=function(c,d){return a.from(b.siblings(c,d)[0])},h=function(c,d){return a.from(b.children(c,d)[0])},i=function(c,d){return a.from(b.descendants(c,d)[0])},j=function(a,b,e){return d(c.is,f,a,b,e)};return{first:e,ancestor:f,sibling:g,child:h,descendant:i,closest:j}}),g("19",["g","h","p","n","2f","26","1m","2c","j","27","2g","20","1f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=h.immutable("image","blobInfo"),o=g.generate([{failure:["error"]},{success:["result","images","blob"]}]),p=function(a,b,c){var e=a.isActive(b);return a.register(c,b),j.add(c,f.uploadInProgress()),e?d.none():d.some(b)},q=function(b,c,d,e){return a.each(c,function(a){i.set(a,"src",e.location),i.remove(a,f.blobId())}),u(b,d)},r=function(b,d,e,g,h,i,j){var l=function(){m.error("Internal error with blob cache",h),j(o.failure({status:c.constant(666)}))};b.upload(i,h,function(b){var c=d.findById(g,h);a.each(c,k.removeClass(f.uploadInProgress())),b.fold(function(a){j(o.failure(a))},function(a){q(e,c,h,a).fold(l,function(b){j(o.success(a,c,b))})}),d.report(h,c,b.isValue())})},s=function(a,b,c,d,e,g){var h=a.lookupByData(e.result).getOrThunk(function(){return a.add(b,c,d,e)});return i.set(g,f.blobId(),h.id()),n(g,h)},t=function(a,b){var c=i.get(b,f.blobId());return a.get(c).fold(function(){return e.error(c)},function(a){return e.value(n(b,a))})},u=function(a,b){return a.get(b).fold(function(){return e.error("Internal error with blob cache")},function(c){return a.remove(b),e.value(c)})},v=function(d,f,g){return a.bind(g,function(a){return b.cata(a,function(a,b,c,g){var h=l.descendant(f,'img[src="'+c+'"]');return h.fold(function(){return[e.error("Image that was just inserted could not be found: "+c)]},function(f){return[e.value(s(d,a,b,c,g,f))]})},c.constant([]))})},w=function(b,c,d){var e=b.findAll(d);return b.inProgress()?[]:a.map(e,function(a){return t(c,a)})};return{prepareForUpload:p,handleUpload:r,registerAssets:v,registerBlob:s,findBlobs:w}}),g("3r",["3p"],function(a){return function(){var b=a.getOrDie("FormData");return new b}}),g("2j",["1b","g","3r","2c","37"],function(a,b,c,d,e){var f=d.immutable("message","status","contents"),g=["jpg","png","gif","jpeg"],h=function(c,d){if(a.isString(c.type)&&e.startsWith(c.type,"image/")){var f=c.type.substr("image/".length);return b.contains(g,f)?d+"."+f:d}return d},i=function(b,c){var d=a.isString(b.name)&&!e.endsWith(b.name,".tmp");return d?b.name:h(b,c)},j=function(a,b,d){var e=c();return e.append(a,b,d),{data:e,contentType:!1,processData:!1}};return{failureObject:f,getFilename:i,buildExtra:j}}),g("1u",["12"],function(a){var b=function(b){return function(){var c=a.prototype.slice.call(arguments),d=this;setTimeout(function(){b.apply(d,c)},0)}};return{bounce:b}}),g("1v",[],function(){return function(a,b){var c=function(c){return a(function(a){b(function(b){var d=c(b);a(d)})})},d=function(c){return a(function(a){b(function(b){c(b).get(a)})})},e=function(c){return a(function(a){b(function(b){c.get(a)})})};return{get:b,map:c,bind:d,anonBind:e}}}),g("1w",["g"],function(a){return function(b){var c=function(a){return b(function(b){b(a)})},d=function(c){return b(function(b){var d=[],e=0,f=function(a){return function(f){d[a]=f,e++,e>=c.length&&b(d)}};0===c.length?b([]):a.each(c,function(a,b){a.get(f(b))})})},e=function(b,c){return d(a.map(b,c))},f=function(a,c,d){return b(function(b){var e=!1,f=!1,g=void 0,h=void 0,i=function(){if(e&&f){var a=d(g,h);b(a)}};a.get(function(a){g=a,e=!0,i()}),c.get(function(a){h=a,f=!0,i()})})},g=function(a,b){return function(c){return b(c).bind(a)}};return{nu:b,pure:c,par:d,mapM:e,lift2:f,compose:g}}}),g("o",["1u","1v","1w"],function(a,b,c){var d=function(c){var e=function(b){c(a.bounce(b))};return b(d,e)};return c(d)}),g("2u",["3p"],function(a){return function(){var b=a.getOrDie("FileReader");return new b}}),g("73",["o","2u"],function(a,b){return function(c){return a.nu(function(a){var d=b();d.onload=function(b){var c=b.target;a(c.result)},d.readAsText(c)})}}),g("74",["3p"],function(a){return function(){var b=a.getOrDie("XMLHttpRequest");return new b}}),g("69",["1b","1c","1l","73","o","74","n","2f","37","1f"],function(a,b,c,d,e,f,g,h,i,j){var k={"*":"*/*",text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},l=function(l,m,n,o){var p={url:l,contentType:"application/json",processData:!1,type:"GET"},q=c.merge(p,o),r=f();r.open(q.type.toUpperCase(),q.url,!0),"blob"===q.responseType&&(r.responseType=q.responseType),a.isString(q.contentType)&&r.setRequestHeader("Content-Type",q.contentType);var s=q.dataType,t=a.isString(s)&&"*"!==s?k[s]+", "+k["*"]+"; q=0.01":k["*"];r.setRequestHeader("Accept",t),void 0!==q.xhrFields&&q.xhrFields.withCredentials===!0&&(r.withCredentials=!0),a.isObject(q.headers)&&b.each(q.headers,function(b,c){a.isString(c)||a.isString(b)?r.setRequestHeader(c,b):j.error("Request header data was not a string: ",c," -> ",b)});var u=function(a,b,c){m(a)},v=function(){return"blob"===q.responseType?g.from(r.response).map(d).getOr(e.pure("no response content")):e.pure(r.responseText)},w=function(){v().get(function(a){0===r.status?n("Unknown HTTP error (possible cross-domain request)",r.status,a):n('Could not load url "'+l+'": '+r.statusText,r.status,a)})},x=function(){try{return h.value(JSON.parse(r.response))}catch(a){return h.error({status:r.status,statusText:"Response was not JSON",responseText:r.responseText})}},y=function(){var a="json"===s?x(r):h.value(r.response);a.fold(w,function(a){u(a,r.statusText,r)})},z=function(){0===r.status?i.startsWith(q.url,"file:")?y():w():r.status<100||r.status>=400?w():y()};r.onerror=w,r.onload=z,void 0===q.data?r.send():r.send(q.data)};return{ajax:l}}),g("3u",["3p"],function(a){var b=function(){return a.getOrDie("JSON")},c=function(a){return b().parse(a)},d=function(a,c,d){return b().stringify(a,c,d)};return{parse:c,stringify:d}}),g("3t",["1l","69","3u"],function(a,b,c){var d=function(c,d,e,f){b.ajax(c,d,e,a.merge({dataType:"text",type:"GET"},f))},e=function(d,e,f,g,h){b.ajax(d,f,g,a.merge({dataType:"text",data:c.stringify(e),type:"POST"},h))};return{get:d,post:e}}),g("6a",[],function(){var a=function(a){var b="";return""!==a.protocol&&(b+=a.protocol,b+=":"),""!==a.authority&&(b+="//",b+=a.authority),b+=a.path,""!==a.query&&(b+="?",b+=a.query),""!==a.anchor&&(b+="#",b+=a.anchor),b};return{recompose:a}}),g("75",["1l"],function(a){var b={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@\/]*)(?::([^:@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@\/]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*)(?::([^:@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},c=function(a,b){for(var c=b,d=c.parser[c.strictMode?"strict":"loose"].exec(a),e={},f=14;f--;)e[c.key[f]]=d[f]||"";return e[c.q.name]={},e[c.key[12]].replace(c.q.parser,function(a,b,d){b&&(e[c.q.name][b]=d)}),e},d=function(d,e){var f=a.merge(b,e);return c(d,f)};return{parse:d}}),g("76",["37"],function(a){var b=function(b){return a.removeTrailing(b,d(b))},c=function(a){return a.match(/(^\/?.*?)(\/|$)/)[1]},d=function(a){return a.substring(a.lastIndexOf("/"))},e=function(d){for(var e=d,f="";""!==e;)if(a.startsWith(e,"../"))e=a.removeLeading(e,"../");else if(a.startsWith(e,"./"))e=a.removeLeading(e,"./");else if(a.startsWith(e,"/./"))e="/"+a.removeLeading(e,"/./");else if("/."===e)e="/";else if(a.startsWith(e,"/../"))e="/"+a.removeLeading(e,"/../"),f=b(f);else if("/.."===e)e="/",f=b(f);else if("."===e||".."===e)e="";else{var g=c(e);e=a.removeLeading(e,g),f+=g}return f};return{remove:e}}),g("77",["37"],function(a){var b=function(b,c,d){if(""!==d&&""===b)return"/"+c;var e=b.substring(b.lastIndexOf("/")+1);return a.removeTrailing(b,e)+c};return{merge:b}}),g("6b",["37","75","76","77"],function(a,b,c,d){var e=function(e,f){var g={strictMode:!0},h=b.parse(e,g),i=b.parse(f,g),j={};return""!==i.protocol?(j.protocol=i.protocol,j.authority=i.authority,j.path=c.remove(i.path),j.query=i.query):(""!==i.authority?(j.authority=i.authority,j.path=c.remove(i.path),j.query=i.query):(""===i.path?(j.path=h.path,""!==i.query?j.query=i.query:j.query=h.query):(a.startsWith(i.path,"/")?j.path=c.remove(i.path):(j.path=d.merge(h.path,i.path,e.authority),j.path=c.remove(j.path)),j.query=i.query),j.authority=h.authority),j.protocol=h.protocol),j.anchor=i.anchor,j};return{transform:e}}),g("3v",["6a","6b"],function(a,b){var c=function(c,d){var e=b.transform(c,d);return a.recompose(e)};return{resolve:c}}),g("2k",["1b","1l","3t","3u","2f","2j","37","3v"],function(a,b,c,d,e,f,g,h){return function(i){var j=function(){var a=i.url,b=a.lastIndexOf("/"),c=b>0?a.substr(0,b):a,d=void 0===i.basePath?c:i.basePath;return g.endsWith(d,"/")?d:d+"/"},k=j(),l=function(a,b){var c=a.split(/\s+/),d=1===c.length&&""!==c[0]?c[0]:b;return h.resolve(k,d)},m=function(g,h,j){var k=g.blob(),m=function(a,b,c){j(e.error(f.failureObject(a,b,c)))},n=f.getFilename(k,h),o=i.credentials!==!0?{}:{xhrFields:{withCredentials:!0}},p=b.merge(o,f.buildExtra("image",k,n)),q=function(b){var c;try{var f=d.parse(b);if(!a.isString(f.location))return void m("JSON response did not contain a string location",500,b);c=f.location}catch(g){c=b}var h=l(c,n);j(e.value({location:h}))};c.post(i.url,{},q,m,p)};return{upload:m}}}),h("x",setTimeout),g("2l",["1b","2f","2j","2c","1f","x"],function(a,b,c,d,e,f){var g=d.immutable("id","filename","blob","base64");return function(d){var h=function(h,i,j){var k=function(a){j(b.error(a))},l=function(c){a.isString(c)?j(b.value({location:c})):(e.error("Image upload result was not a string"),k(""))},m=c.getFilename(h.blob(),i),n=g(i,m,h.blob(),h.data().result);f(function(){d(n,l,k)},0)};return{upload:h}}}),g("1a",["2j","2k","2l"],function(a,b,c){var d=function(a){return b(a)},e=function(a){return c(a)},f=function(b,c,d){return a.failureObject(b,c,d)},g=function(b,c){return a.getFilename(b,c)},h=function(b,c,d){return a.buildExtra(b,c,d)};return{direct:d,custom:e,failureObject:f,getFilename:g,buildExtra:h}}),g("b",["g","p","n","c","15","16","17","18","19","1a","j","k"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=function(d,m){var n=g(),o=h(),p=(e(),e(d,m.url)),q=j.direct(m),r=function(){return l.fromDom(d.getBody())},s=function(b,c,e){a.each(c,function(a){k.set(a,"data-mce-src",b.location)}),f.resrcHistory(d,e,b)};o.events.complete.bind(function(a){f.unwrapHistory(d)});var t=function(a,b,c){i.handleUpload(q,o,n,r(),a,b,function(a){a.fold(function(a){c(a)},s)})},u=function(a,b){i.prepareForUpload(o,a.blobInfo().id(),a.image()).each(function(c){t(c,a.blobInfo(),b)})},v=function(b){var c=p.instance(),d=i.registerAssets(n,r(),b);a.each(d,function(a){a.fold(function(a){console.error(a)},function(a){u(a,c)})})},w=function(){var b=p.instance(),d=i.findBlobs(o,n,r());a.each(d,function(a){a.fold(function(a){o.report(a,c.none(),!1)},function(a){u(a,b)})})},x=function(a){w(),v(a)},y=function(a,b,c,d){return c};return{uploadImages:x,prepareImages:b.noop,getLocalURL:y}},n=function(a){var c=d(a);return{uploadImages:b.noop,prepareImages:c.prepareImages,getLocalURL:c.getLocalURL}};return function(a,b){return b?m(a,b):n(a)}}),g("3",["b","c"],function(a,b){return function(c){var d=!c.uploadImages&&c.settings.images_upload_url?{url:c.settings.images_upload_url,basePath:c.settings.images_upload_base_path,credentials:c.settings.images_upload_credentials}:null;return c.uploadImages?b(c):a(c,d)}}),g("1h",[],function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},b=function(a){return a.ownerDocument.defaultView?a.ownerDocument.defaultView.getComputedStyle(a,null):a.currentStyle||{}},c=function(a){"undefined"!=typeof console&&console.log&&console.log(a)},d=function(a){var b=Array.prototype.slice.call(a).reverse();return function(a){for(var c=a,d=0;d<b.length;d++){var e=b[d];c=e(c)}return c}},e=function(a){return tinymce.each(Array.prototype.slice.call(arguments,1),function(b){for(var c in b)a[c]=b[c]}),a};return{each:tinymce.each,trim:tinymce.trim,bind:a,extend:e,ephoxGetComputedStyle:b,log:c,compose:d}}),g("e",["1h"],function(a){var b=(tinymce.each,function(b,c,d,e){var f,g,h,i,j,k=b.selection,l=b.dom,m=b.getBody();if(j=d.isText(),d.reset(),e.clipboardData&&e.clipboardData.getData("text/html")){e.preventDefault();var n=e.clipboardData.getData("text/html"),o=n.match(/<html[\s\S]+<\/html>/i),p=null===o?n:o[0];return c(p)}if(!l.get("_mcePaste")){if(f=l.add(m,"div",{id:"_mcePaste","class":"mcePaste"},'\ufeff<br _mce_bogus="1">'),i=m!=b.getDoc().body?l.getPos(b.selection.getStart(),m).y:m.scrollTop,l.setStyles(f,{position:"absolute",left:-1e4,top:i,width:1,height:1,overflow:"hidden"}),tinymce.isIE)return h=l.doc.body.createTextRange(),h.moveToElementText(f),h.execCommand("Paste"),l.remove(f),"\ufeff"===f.innerHTML?(b.execCommand("mcePasteWord"),void e.preventDefault()):(c(j?f.innerText:f.innerHTML),tinymce.dom.Event.cancel(e));var q=function(a){a.preventDefault()};l.bind(b.getDoc(),"mousedown",q),l.bind(b.getDoc(),"keydown",q),tinymce.isGecko&&(h=b.selection.getRng(!0),h.startContainer==h.endContainer&&3==h.startContainer.nodeType&&(nodes=l.select("p,h1,h2,h3,h4,h5,h6,pre",f),1==nodes.length&&l.remove(nodes.reverse(),!0))),g=b.selection.getRng(),f=f.firstChild,h=b.getDoc().createRange(),h.setStart(f,0),h.setEnd(f,1),k.setRng(h),window.setTimeout(function(){var d="",e=l.select("div.mcePaste");a.each(e,function(b){var c=b.firstChild;c&&"DIV"==c.nodeName&&c.style.marginTop&&c.style.backgroundColor&&l.remove(c,1),a.each(l.select("div.mcePaste",b),function(a){l.remove(a,1)}),a.each(l.select("span.Apple-style-span",b),function(a){l.remove(a,1)}),a.each(l.select("br[_mce_bogus]",b),function(a){l.remove(a)}),d+=b.innerHTML}),a.each(e,function(a){l.remove(a)}),g&&k.setRng(g),c(d),l.unbind(b.getDoc(),"mousedown",q),l.unbind(b.getDoc(),"keydown",q)},0)}}),c=function(a,c,d){return function(e){b(a,c,d,e)}},d=function(a,c,d){return function(e){(tinymce.isOpera||navigator.userAgent.indexOf("Firefox/2")>0)&&((tinymce.isMac?e.metaKey:e.ctrlKey)&&86==e.keyCode||e.shiftKey&&45==e.keyCode)&&b(a,c,d,e)}};return{getOnPasteFunction:c,getOnKeyDownFunction:d}}),g("1i",[],function(){var a=function(a,b){var c,d=b.getDoc(),e="ephoxInsertMarker",f=b.selection,g=b.dom;f.setContent('<span id="'+e+'"> </span>'),c=g.get(e);for(var h=d.createDocumentFragment();a.firstChild&&!g.isBlock(a.firstChild);)h.appendChild(a.firstChild);for(var i=d.createDocumentFragment();a.lastChild&&!g.isBlock(a.lastChild);)i.appendChild(a.lastChild);if(c.parentNode.insertBefore(h,c),g.insertAfter(i,c),a.firstChild){if(g.isBlock(a.firstChild)){for(;!g.isBlock(c.parentNode)&&c.parentNode!==g.getRoot();)c=g.split(c.parentNode,c);g.is(c.parentNode,"td,th")||c.parentNode===g.getRoot()||(c=g.split(c.parentNode,c))}g.replace(a,c)}else g.remove(c)};return{insert:a}}),g("1j",["1h"],function(a){var b={strip_class_attributes:"all",retain_style_properties:"none"},c={strip_class_attributes:"none",retain_style_properties:"valid"},d=function(a,d){if(a&&"string"!=typeof a)return a;switch(a){case"clean":return b;case"merge":return c;default:return d}},e=function(b,c,e){var f=d(b,c);return f=a.extend(f,{base_64_images:e})},f=function(a,d,f){var g=e(a,b,f),h=e(d,c,f),i=h,j=function(a){i=a?g:h},k=function(a){return i[a]};return{setWordContent:j,get:k}};return{create:f}}),g("6c",["1h"],function(a){var b=function(a){return a.specified!==!1||"name"===a.nodeName&&""!==a.value},c=function(a,b){return a&&b?function(c,d){return b(c,a(c,d))}:a||b},d=function(d){var e,f,g=0,h=function(){return e},i=function(){return f()};f=function(){return e={},g=0,a.each(d.attributes,function(a){var c=a.nodeName,d=a.value;b(a)&&null!==d&&void 0!==d&&(e[c]=d,g++)}),void 0===e.style&&d.style.cssText&&(e.style=d.style.cssText,g++),f=h,e};var j,k,l=function(){return f(),g},m=function(a){j||(k=f),j=c(j,a),f=function(){return f=k,o(function(a,b){var c=j(a,b);null===c?(d.removeAttribute(a),delete e[a],g--):c!==b&&("class"===a?d.className=c:d.setAttribute(a,c),e[a]=c)}),f=h,e}},n=function(a){return f()[a]},o=function(b){a.each(f(),function(a,c){b(c,a)})};return{get:n,each:o,filter:m,getAttributes:i,getAttributeCount:l}};return{manager:d}}),g("3w",["6c","1h"],function(a,b,c){var d="startElement",e="endElement",f="text",g="comment",h=a.manager,i=function(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})},j=function(a){return a.replace(/([A-Z])/g,function(a,b){return"-"+b.toLowerCase()})},k=!1,l=function(a,c,d){var e,f,g;a.style.length;g=c||a.getAttribute("style"),void 0!==g&&null!==g&&g.split||(g=a.style.cssText),b.each(g.split(";"),function(a){var c=a.indexOf(":");c>0&&(e=b.trim(a.substring(0,c)),e.toUpperCase()===e&&(e=e.toLowerCase()),e=j(e),f=b.trim(a.substring(c+1)),k||(k=0===e.indexOf("mso-")),d(e,f))}),k||(f=a.style["mso-list"],f&&d("mso-list",f))},m=function(a,c,j){var k,m,n,o,p;switch(a.nodeType){case 1:c?k=e:(k=d,o=h(a),p={},l(a,j,function(a,b){p[a]=b})),m="HTML"!==a.scopeName&&a.scopeName&&a.tagName&&a.tagName.indexOf(":")<=0?(a.scopeName+":"+a.tagName).toUpperCase():a.tagName;break;case 3:k=f,n=a.nodeValue;break;case 8:k=g,n=a.nodeValue;break;default:b.log("WARNING: Unsupported node type encountered: "+a.nodeType)}var q=function(){return o&&o.getAttributes(),a},r=function(){return m},s=function(){return k},t=function(){return n},u=function(){return"Type: "+k+", Tag: "+m+" Text: "+n},v=function(a){return o.get(a.toLowerCase())},w=function(a){k===d&&o.filter(a)},x=function(c){if(s()===d){var e="";b.each(p,function(b,d){var f=c(d,b);null===f?(a.style.removeProperty?a.style.removeProperty(i(d)):a.style.removeAttribute(i(d)),delete p[d]):(e+=d+": "+f+"; ",p[d]=f)}),e=e?e:null,w(function(a,b){return"style"===a?e:b}),a.style.cssText=e}},y=function(){return o.getAttributeCount()},z=function(a){o.each(a)},A=function(a){return p[a]},B=function(a){b.each(p,function(b,c){a(c,b)})},C=function(){return b.ephoxGetComputedStyle(a)},D=function(){return k===f&&/^[\s\u00A0]*$/.test(n)};return{getNode:q,tag:r,type:s,text:t,toString:u,getAttribute:v,filterAttributes:w,filterStyles:x,getAttributeCount:y,attributes:z,getStyle:A,styles:B,getComputedStyle:C,isWhitespace:D}},n=function(a,c,d,e){var f=e.createElement(a),g="";return b.each(c,function(a,b){f.setAttribute(b,a)}),b.each(d,function(a,b){g+=b+":"+a+";",f.style[i(b)]=a}),m(f,!1,""!==g?g:null)},o=function(a,b){return m(b.createElement(a),!0)},p=function(a,b){return m(b.createComment(a),!1)},q=function(a,b){return m(b.createTextNode(a))},r=o("HTML",window.document);return{START_ELEMENT_TYPE:d,END_ELEMENT_TYPE:e,TEXT_TYPE:f,COMMENT_TYPE:g,FINISHED:r,token:m,createStartElement:n,createEndElement:o,createComment:p,createText:q}}),g("2m",["3w"],function(a){var b=function(b){var c=b.createDocumentFragment(),d=c,e=function(a){g(a),c=a},f=function(){c=c.parentNode},g=function(a){c.appendChild(a)},h=function(c){var d=function(a){var b=a.getNode().cloneNode(!1);e(b)},h=function(a,c){var d=b.createTextNode(a.text());g(d)};switch(c.type()){case a.START_ELEMENT_TYPE:d(c);break;case a.TEXT_TYPE:h(c);break;case a.END_ELEMENT_TYPE:f();break;case a.COMMENT_TYPE:break;default:throw{message:"Unsupported token type: "+c.type()}}};return{dom:d,receive:h}};return{create:b}}),g("2n",["3w"],function(a){var b=function(b,c){var d;c=c||window.document,d=c.createElement("div"),c.body.appendChild(d),d.style.position="absolute",d.style.left="-10000px",d.innerHTML=b,nextNode=d.firstChild||a.FINISHED;var e=[];endNode=!1;var f=function(b,c){return b===a.FINISHED?b:b?a.token(b,c):void 0},g=function(){var b=nextNode,g=endNode;return!endNode&&nextNode.firstChild?(e.push(nextNode),nextNode=nextNode.firstChild):endNode||1!==nextNode.nodeType?nextNode.nextSibling?(nextNode=nextNode.nextSibling,endNode=!1):(nextNode=e.pop(),endNode=!0):endNode=!0,b===a.FINISHED||nextNode||(c.body.removeChild(d),nextNode=a.FINISHED),f(b,g)},h=function(){return void 0!==nextNode};return{hasNext:h,next:g}};return{tokenize:b}}),g("3x",["3w","1h"],function(a,b){var c=function(c,d){var e=function(e,f,g){var h,i,j,k=!1,l=function(){d&&d(w),k=!1,i=[],j=[]},m=function(a){b.each(a,function(a){e.receive(a)})},n=function(a){k?j.push(a):e.receive(a)},o=function(b){d&&i.push(b),c(w,b),b===a.FINISHED&&r()},p=function(){k=!0},q=function(){m(i),l()},r=function(){u(),m(j),l()},s=function(a){h=h||[],h.push(a)},t=function(){return h&&h.length>0},u=function(){b.each(h,function(a){n(a)}),v()},v=function(){h=[]},w={document:g||window.document,settings:f||{},emit:n,receive:o,startTransaction:p,rollback:q,commit:r,defer:s,hasDeferred:t,emitDeferred:u,dropDeferred:v};return l(),w};return e},d=function(a){return c(function(c,d){d.filterAttributes(b.bind(a,c)),c.emit(d)})};return{createFilter:c,createAttributeFilter:d}}),g("2o",["3x","3w"],function(a,b){var c=/^(P|H[1-6]|T[DH]|LI|DIV|BLOCKQUOTE|PRE|ADDRESS|FIELDSET|DD|DT|CENTER)$/,d=function(a){return c.test(a.tag())},e=function(){return null},f=!1;return a.createFilter(function(a,c){var g=function(){f||(a.emit(b.createStartElement("P",{},{},a.document)),f=!0)};switch(c.type()){case b.TEXT_TYPE:g(),a.emit(c);break;case b.END_ELEMENT_TYPE:f&&(d(c)||c===b.FINISHED)?(a.emit(b.createEndElement("P",a.document)),f=!1):"BR"===c.tag()&&a.emit(c);break;case b.START_ELEMENT_TYPE:"BR"===c.tag()?(c.filterAttributes(e),c.filterStyles(e),a.emit(c)):"IMG"===c.tag()&&c.getAttribute("alt")&&(g(),a.emit(b.createText(c.getAttribute("alt"),a.document)))}c===b.FINISHED&&a.emit(c)})}),g("3y",["3w"],function(a){var b=function(){if(navigator.userAgent.indexOf("Gecko")>0&&navigator.userAgent.indexOf("WebKit")<0)return!1;var b=document.createElement("div");try{b.innerHTML='<p style="mso-list: Ignore;"> </p>'}catch(c){return!1}return"Ignore"===a.token(b.firstChild).getStyle("mso-list")},c=b(),d=function(a){return"A"===a.tag()||"SPAN"===a.tag()},e=function(a){var b=a.getStyle("mso-list");return b&&"skip"!==b},f=function(b,c){return b.type()===a.START_ELEMENT_TYPE?0===b.getAttributeCount()||c&&1===b.getAttributeCount()&&null!==b.getAttribute("style")&&void 0!==b.getAttribute("style"):b.type()===a.END_ELEMENT_TYPE};return{hasNoAttributes:f,supportsCustomStyles:c,spanOrA:d,hasMsoListStyle:e}}),g("42",["3w","1h"],function(a,b){var c=[{regex:/^\(?[dc][\.\)]$/,type:{tag:"OL",type:"lower-alpha"}},{regex:/^\(?[DC][\.\)]$/,type:{tag:"OL",type:"upper-alpha"}},{regex:/^\(?M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})[\.\)]$/,type:{tag:"OL",type:"upper-roman"}},{regex:/^\(?m*(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})[\.\)]$/,type:{tag:"OL",type:"lower-roman"}},{regex:/^\(?[0-9]+[\.\)]$/,type:{tag:"OL"}},{regex:/^([0-9]+\.)*[0-9]+\.?$/,type:{tag:"OL",variant:"outline"}},{regex:/^\(?[a-z]+[\.\)]$/,type:{tag:"OL",type:"lower-alpha"}},{regex:/^\(?[A-Z]+[\.\)]$/,type:{tag:"OL",type:"upper-alpha"}}],d={"\u2022":{tag:"UL",type:"disc"},"\xb7":{tag:"UL",type:"disc"},"\xa7":{tag:"UL",type:"square"}},e={o:{tag:"UL",type:"circle"},"-":{tag:"UL",type:"disc"},"\u25cf":{tag:"UL",type:"disc"}},f=function(a,b){var c={tag:a.tag,type:a.type,variant:b};return a.start&&(c.start=a.start),a.type||delete c.type,c},g=function(a,g,i){var j,k,l,m=null;return a&&(j=a.text,k=a.symbolFont),j=b.trim(j),m=e[j],m?m=f(m,j):k?(m=d[j],m=m?f(m,j):{tag:"UL",variant:j}):(b.each(c,function(a){if(a.regex.test(j)){if(g&&h(a.type,g,!0))return m=a.type,m.start=parseInt(j),!1;m||(m=a.type),m.start=parseInt(j)}}),m&&!m.variant&&(l="("===j.charAt(0)?"()":")"===j.charAt(j.length-1)?")":".",m=f(m,l))),m&&"OL"===m.tag&&i&&("P"!==i.tag()||/^MsoHeading/.test(i.getAttribute("class")))&&(m=null),m},h=function(a,b,c){return a===b||a&&b&&a.tag===b.tag&&a.type===b.type&&(c||a.variant===b.variant)},i=function(b,c){return b.type()==a.START_ELEMENT_TYPE&&(font=b.getStyle("font-family"),font?c="Wingdings"===font||"Symbol"===font:/^(P|H[1-6]|DIV)$/.test(b.tag())&&(c=!1)),c};return{guessListType:g,eqListType:h,checkFont:i}}),g("3z",["3w","42","1h"],function(a,b,c){var d=function(d,e){var f,g,h,i=!1,j=function(a){var b=a.style.fontFamily;b&&(i="Wingdings"===b||"Symbol"===b)};if(d.type()===a.START_ELEMENT_TYPE&&e.openedTag&&"SPAN"===d.tag()){for(f=e.openedTag.getNode(),j(f),f.childNodes.length>1&&"A"===f.firstChild.tagName&&""===f.firstChild.textContent&&(f=f.childNodes[1]);f.firstChild&&("SPAN"===f.firstChild.tagName||"A"===f.firstChild.tagName);)f=f.firstChild,j(f);if(f=f.firstChild,!f||3!==f.nodeType)return f&&"IMG"===f.tagName;if(g=f.value,c.trim(g)||(f=f.parentNode.nextSibling,g=f?f.value:""),!f||c.trim(f.parentNode.textContent)!=g)return!1;if(h=b.guessListType({text:g,symbolFont:i},null,e.originalToken))return f.nextSibling&&"SPAN"===f.nextSibling.tagName&&/^[\u00A0\s]/.test(f.nextSibling.firstChild.value)&&("P"===e.openedTag.tag()||"UL"===h.tag)}return!1},e=function(a,b){var c,d=0;for(c=a.parentNode;null!==c&&void 0!==c&&c!==b.parentNode;)d+=c.offsetLeft,c=c.offsetParent;return d},f=function(a){var b={};return function(c,d){var e,f=c+","+d;return b.hasOwnProperty(f)?b[f]:(e=a.call(null,c,d),b[f]=e,e)}},g=function(a){var b=a.indexOf(".");if(b>=0&&c.trim(a.substring(b+1))===className)return match=results[2],!1},h=f(function(a,b){var d,e,f,h,i=/([^{]+){([^}]+)}/g;for(i.lastIndex=0;null!==(d=i.exec(a))&&!e;)c.each(d[1].split(","),g(selector));return!!e&&(f=document.createElement("p"),f.setAttribute("style",e),h=c.ephoxGetComputedStyle(f),!!h&&""+h.marginLeft)}),i=function(){var a,b,c=function(c,d,f,g){var i,j,k=1;return g&&/^([0-9]+\.)+[0-9]+\.?$/.test(g.text)?g.text.replace(/([0-9]+|\.$)/g,"").length+1:(i=b||parseInt(h(f,d.getAttribute("class"))),j=e(c.getNode(),d.getNode()),i?a?j+=a:0===j&&(a=i,j+=i):i=48,b=i=Math.min(j,i),k=Math.max(1,Math.floor(j/i))||1)};return{guessIndentLevel:c}},j=function(){var b=!1,c="",d=function(d){return b&&d.type()===a.TEXT_TYPE?(c+=d.text(),!0):d.type()===a.START_ELEMENT_TYPE&&"STYLE"===d.tag()?(b=!0,!0):d.type()===a.END_ELEMENT_TYPE&&"STYLE"===d.tag()&&(b=!1,!0)};return{check:d}};return{isListWithoutCommentsOrStyles:d,indentGuesser:i,styles:j}}),g("40",["3w","42"],function(a,b){var c=["disc","circle","square"],d=function(a,b){return"UL"===a.tag&&c[b-1]===a.type&&(a={tag:"UL"}),a};return function(c,e){var f,g=[],h=[],i=0,j=function(b,d){var h={},j={};i++,d&&b.type&&(h={"list-style-type":b.type}),b.start&&b.start>1&&(j={start:b.start}),g.push(b),c.emit(a.createStartElement(b.tag,j,h,e)),f=b},k=function(){c.emit(a.createEndElement(g.pop().tag,e)),i--,f=g[g.length-1]},l=function(){for(;i>0;)m(),k();c.commit()},m=function(){var b=h?h.pop():"P";"P"!=b&&c.emit(a.createEndElement(b,e)),c.emit(a.createEndElement("LI",e))},n=function(d,g,i){var l={};if(d){var m=d.getStyle("margin-left");void 0!==m&&(l["margin-left"]=m)}else l["list-style-type"]="none";f&&!b.eqListType(f,g)&&(k(),i&&(c.emit(a.createStartElement("P",{},{},e)),c.emit(a.createText("\xa0",e)),c.emit(a.createEndElement("P",e))),j(g,!0)),c.emit(a.createStartElement("LI",{},l,e)),d&&"P"!=d.tag()?(h.push(d.tag()),d.filterStyles(function(){return null}),c.emit(d)):h.push("P")},o=function(b,f,g,l){if(g){for(i||(i=0);i>b;)m(),k();if(g=d(g,b),i==b)m(),n(f,g,l);else for(b>1&&h.length>0&&"P"!==h[h.length-1]&&(c.emit(a.createEndElement(h[h.length-1],e)),h[h.length-1]="P");i<b;)j(g,i==b-1),n(i==b?f:void 0,g)}},p=function(){return i},q=function(){return f};return{openList:j,closelist:k,closeAllLists:l,closeItem:m,openLI:n,openItem:o,getCurrentListType:q,getCurrentLevel:p}}}),g("41",["3y","3w","3z","42","1h"],function(a,b,c,d,e){var f=function(a,b){e.log("Unexpected token in list conversion: "+b.toString()),a.rollback()},g=function(a,b,c){return b==c?a:null},h=function(c,d,f){f.type()===b.TEXT_TYPE&&""===e.trim(f.text())?c.defer(f):d.skippedPara||f.type()!==b.START_ELEMENT_TYPE||"P"!==f.tag()||a.hasMsoListStyle(f)?j(c,d,f):(d.openedTag=f,c.defer(f),d.nextFilter=i)},i=function(d,e,f){f.type()!==b.START_ELEMENT_TYPE||"SPAN"!==f.tag()||0!==e.spanCount.length||!a.supportsCustomStyles&&c.isListWithoutCommentsOrStyles(f,e)||a.hasMsoListStyle(f)?f.type()===b.END_ELEMENT_TYPE?"SPAN"===f.tag()?(d.defer(f),e.spanCount.pop()):"P"===f.tag()?(d.defer(f),e.skippedPara=!0,e.openedTag=null,e.nextFilter=h):(e.nextFilter=j,e.nextFilter(d,e,f)):f.isWhitespace()?d.defer(f):(e.nextFilter=j,e.nextFilter(d,e,f)):(d.defer(f),e.spanCount.push(f))},j=function(d,e,f){ -var g=function(){e.emitter.closeAllLists(),d.emitDeferred(),e.openedTag=null,d.emit(f),e.nextFilter=j};if(f.type()===b.START_ELEMENT_TYPE&&a.hasMsoListStyle(f)&&"LI"!==f.tag()){var h=(f.getStyle("mso-list"),/ level([0-9]+)/.exec(f.getStyle("mso-list")));h&&h[1]?(e.itemLevel=parseInt(h[1],10)+e.styleLevelAdjust,e.nextFilter===j?d.emitDeferred():d.dropDeferred(),e.nextFilter=l,d.startTransaction(),e.originalToken=f,e.commentMode=!1):g()}else!a.supportsCustomStyles&&(f.type()===b.COMMENT_TYPE&&"[if !supportLists]"===f.text()||c.isListWithoutCommentsOrStyles(f,d))?(f.type()===b.START_ELEMENT_TYPE&&"SPAN"===f.tag()&&e.spanCount.push(f),e.nextFilter=l,d.startTransaction(),e.originalToken=e.openedTag,e.commentMode=!0,e.openedTag=null,d.dropDeferred()):f.type()===b.END_ELEMENT_TYPE&&a.spanOrA(f)?(d.defer(f),e.spanCount.pop()):f.type()===b.START_ELEMENT_TYPE?a.spanOrA(f)?(d.defer(f),e.spanCount.push(f)):(e.openedTag&&(e.emitter.closeAllLists(),d.emitDeferred()),e.openedTag=f,d.defer(f)):g()},k=function(a,c,d){d.type()===b.END_ELEMENT_TYPE&&c.originalToken.tag()===d.tag()&&(c.nextFilter=h,c.styleLevelAdjust=-1),a.emit(d)},l=function(a,c,d){if(d.type()==b.START_ELEMENT_TYPE&&"Ignore"===d.getStyle("mso-list")&&(c.nextFilter=m),d.type()===b.START_ELEMENT_TYPE&&"SPAN"===d.tag())c.spanCount.push(d),(c.commentMode&&""===d.getAttribute("style")||null===d.getAttribute("style"))&&(c.nextFilter=m);else if("A"===d.tag())d.type()===b.START_ELEMENT_TYPE?c.spanCount.push(d):c.spanCount.pop();else if(d.type()===b.TEXT_TYPE)if(c.commentMode)c.nextFilter=m,c.nextFilter(a,c,d);else{var g=c.originalToken,h=c.spanCount;c.emitter.closeAllLists(),a.emit(g),e.each(h,e.bind(a.emit,a)),a.emit(d),a.commit(),c.originalToken=g,c.nextFilter=k}else(c.commentMode||d.type()!==b.COMMENT_TYPE)&&f(a,d)},m=function(c,d,e){e.type()===b.TEXT_TYPE?e.isWhitespace()||(d.nextFilter=n,d.bulletInfo={text:e.text(),symbolFont:d.symbolFont}):a.spanOrA(e)?e.type()===b.START_ELEMENT_TYPE?d.spanCount.push(e):d.spanCount.pop():e.type()===b.START_ELEMENT_TYPE&&"IMG"===e.tag()?(d.nextFilter=n,d.bulletInfo={text:"\u2202",symbolFont:!0}):f(c,e)},n=function(c,d,e){e.type()===b.START_ELEMENT_TYPE&&a.spanOrA(e)?(d.spanCount.push(e),d.nextFilter=o):e.type()===b.END_ELEMENT_TYPE&&a.spanOrA(e)?(d.spanCount.pop(),d.nextFilter=p):e.type()===b.END_ELEMENT_TYPE&&"IMG"===e.tag()||f(c,e)},o=function(c,d,e){e.type()===b.END_ELEMENT_TYPE&&(a.spanOrA(e)&&d.spanCount.pop(),d.nextFilter=p)},p=function(c,h,i){var j=function(a){if(h.nextFilter=q,h.commentMode&&(h.itemLevel=h.indentGuesser.guessIndentLevel(i,h.originalToken,h.styles.styles,h.bulletInfo)),h.listType=d.guessListType(h.bulletInfo,g(h.emitter.getCurrentListType(),h.emitter.getCurrentLevel(),h.itemLevel),h.originalToken),h.listType){for(h.emitter.openItem(h.itemLevel,h.originalToken,h.listType,h.skippedPara),c.emitDeferred();h.spanCount.length>0;)c.emit(h.spanCount.shift());a&&c.emit(i)}else e.log("Unknown list type: "+h.bulletInfo.text+" Symbol font? "+h.bulletInfo.symbolFont),c.rollback()};i.type()===b.TEXT_TYPE||i.type()===b.START_ELEMENT_TYPE?j(!0):i.type()===b.COMMENT_TYPE?j("[endif]"!==i.text()):i.type()===b.END_ELEMENT_TYPE?a.spanOrA(i)&&h.spanCount.pop():f(c,i)},q=function(a,c,d){d.type()===b.END_ELEMENT_TYPE&&d.tag()===c.originalToken.tag()?(c.nextFilter=h,c.skippedPara=!1):a.emit(d)},r=j;return{initial:r}}),g("2p",["3x","3y","3w","3z","40","41","42","1h"],function(a,b,c,d,e,f,g,h){var i={},j=function(a){i.nextFilter=f.initial,i.itemLevel=0,i.originalToken=null,i.commentMode=!1,i.openedTag=null,i.symbolFont=!1,i.listType=null,i.indentGuesser=d.indentGuesser(),i.emitter=e(a,a.document),i.styles=d.styles(),i.spanCount=[],i.skippedPara=!1,i.styleLevelAdjust=0,i.bulletInfo=void 0};j({});var k=function(a){j(a)},l=function(a,b){i.styles.check(b)||(i.symbolFont=g.checkFont(b,i.symbolFont),i.nextFilter(a,i,b))};return a.createFilter(l,k)}),g("2q",["1h"],function(a){var b=function(a){var b=a,c=65279===b.charCodeAt(b.length-1);return c?b.substring(0,b.length-1):a},c=function(a){return/<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(a)?a.replace(/(?:<br> [\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br> [\s\r\n]+|<br>)*/g,"$1"):a},d=function(a){return a.replace(/<br><br>/g,"<BR><BR>")},e=function(a){return a.replace(/<br>/g," ")},f=function(a){return a.replace(/<BR><BR>/g,"<br>")},g=[b],h=tinymce.isIE&&document.documentMode>=9?[f,e,d,c].concat(g):g,i=a.compose(h);return{all:i,textOnly:b}}),g("43",["3x"],function(a){var b=/^(mso-.*|tab-stops|tab-interval|language|text-underline|text-effect|text-line-through|font-color|horiz-align|list-image-[0-9]+|separator-image|table-border-color-(dark|light)|vert-align|vnd\..*)$/,c=function(a){return function(c,d){var e=!1;switch(a){case"all":case"*":e=!0;break;case"valid":e=!b.test(c);break;case void 0:case"none":e="list-style-type"===c;break;default:e=(","+a+",").indexOf(","+c+",")>=0}return e?d:null}};return a.createFilter(function(a,b){var d=a.settings.get("retain_style_properties");b.filterStyles(c(d)),a.emit(b)})}),g("44",["3x","3w"],function(a,b){return a.createFilter(function(a,c){a.seenList?a.emit(c):a.inferring?("LI"===c.tag()&&(c.type()===b.START_ELEMENT_TYPE?a.inferring++:(a.inferring--,a.inferring||(a.needsClosing=!0))),a.emit(c)):("OL"===c.tag()||"UL"===c.tag()?a.seenList=!0:"LI"===c.tag()&&(a.inferring=1,a.needsClosing||a.emit(b.createStartElement("UL",{},{},a.document))),!a.needsClosing||a.inferring||c.isWhitespace()||(a.needsClosing=!1,a.emit(b.createEndElement("UL",a.document))),a.emit(c))})}),g("45",["3x"],function(a){return a.createAttributeFilter(function(a,b){return"name"===a||"id"===a?null:b})}),g("46",["3x"],function(a){return a.createAttributeFilter(function(a,b){var c;if("class"===a)switch(c=this.settings.get("strip_class_attributes")){case"mso":return 0===b.indexOf("Mso")?null:b;case"none":return b;default:return null}return b})}),g("47",["3x","3y","3w"],function(a,b,c){var d=[],e=[],f=!1,g=function(a,b){var e,f,g=1;for(e=b+1;e<a;e++)if(f=d[e],f&&"SPAN"===f.tag())if(f.type()===c.START_ELEMENT_TYPE)g++;else if(f.type()===c.END_ELEMENT_TYPE&&(g--,0===g))return void(d[e]=null)},h=function(a){if(f){var h,i,j=d.length;for(i=0;i<j;i++)h=d[i],h&&(h.type()===c.START_ELEMENT_TYPE&&"SPAN"===h.tag()&&b.hasNoAttributes(h)?g(j,i):a.emit(h))}d=[],e=[],f=!1},i=function(a,b){if(d.push(b),e=e||[],b.type()===c.START_ELEMENT_TYPE)e.push(b);else if(b.type()===c.END_ELEMENT_TYPE&&(e.pop(),0===e.length))return void h(a,b)};return a.createFilter(function(a,e){var g=",FONT,EM,STRONG,SAMP,ACRONYM,CITE,CODE,DFN,KBD,TT,B,I,U,S,SUB,SUP,INS,DEL,VAR,SPAN,";d=d||[];var h=function(a){return!(g.indexOf(","+a.tag()+",")>=0&&b.hasNoAttributes(a,!0))};0===d.length?e.type()===c.START_ELEMENT_TYPE?h(e)?a.emit(e):i(a,e):a.emit(e):(f||(f=h(e)),i(a,e))})}),g("48",["3x"],function(a){return a.createAttributeFilter(function(a,b){return"style"===a&&""===b?null:b})}),g("49",["3x"],function(a){return a.createAttributeFilter(function(a,b){return"lang"===a?null:b})}),g("4a",["3x","3w"],function(a,b){return a.createFilter(function(a,c){if("IMG"===c.tag()){if(c.type()===b.END_ELEMENT_TYPE&&a.skipEnd)return void(a.skipEnd=!1);if(c.type()===b.START_ELEMENT_TYPE){if(/^file:/.test(c.getAttribute("src")))return void(a.skipEnd=!0);if(a.settings.get("base_64_images")&&/^data:image\/.*;base64/.test(c.getAttribute("src")))return void(a.skipEnd=!0)}}a.emit(c)})}),g("4b",["3x"],function(a){return a.createFilter(function(a,b){"META"!==b.tag()&&"LINK"!==b.tag()&&a.emit(b)})}),g("4c",["3x","3y","3w"],function(a,b,c){var d=function(a){return!b.hasNoAttributes(a)&&!/^OLE_LINK/.test(a.getAttribute("name"))},e=[];return a.createFilter(function(a,b){var f;b.type()===c.START_ELEMENT_TYPE&&"A"===b.tag()?(e.push(b),d(b)&&a.defer(b)):b.type()===c.END_ELEMENT_TYPE&&"A"===b.tag()?(f=e.pop(),d(f)&&a.defer(b),0===e.length&&a.emitDeferred()):a.hasDeferred()?a.defer(b):a.emit(b)})}),g("4d",["3x","3w"],function(a,b){var c=!1;return a.createFilter(function(a,d){"SCRIPT"===d.tag()?c=d.type()===b.START_ELEMENT_TYPE:c||(d.filterAttributes(function(a,b){return/^on/.test(a)||"language"===a?null:b}),a.emit(d))})}),g("2r",["43","44","45","46","47","48","49","4a","4b","4c","4d"],function(a,b,c,d,e,f,g,h,i,j,k){return[k,c,h,a,g,f,d,j,e,i,b]}),g("4e",["3x"],function(a){return a.createFilter(function(a,b){b.filterAttributes(function(a,c){return"align"===a?null:"UL"!==b.tag()&&"OL"!==b.tag()||"type"!==a?c:null}),a.emit(b)})}),g("4f",["3x"],function(a){return a.createAttributeFilter(function(a,b){return/^xmlns(:|$)/.test(a)?null:b})}),g("4g",["3x"],function(a){return a.createFilter(function(a,b){b.tag&&/^([OVWXP]|U[0-9]+|ST[0-9]+):/.test(b.tag())||a.emit(b)})}),g("4h",["3x"],function(a){return a.createAttributeFilter(function(a,b){return"href"===a&&(b.indexOf("#_Toc")>=0||b.indexOf("#_mso")>=0)?null:b})}),g("4i",["3x"],function(a){return a.createAttributeFilter(function(a,b){return/^v:/.test(a)?null:b})}),g("2s",["4e","4f","4g","4h","4i","2p"],function(a,b,c,d,e,f){return[c,f,d,e,b,a]}),g("1k",["2m","2n","2o","2p","2q","2r","2s"],function(a,b,c,d,e,f,g){var h=function(a,b,c,d){var e,f=b;for(e=a.length-1;e>=0;e--)f=a[e](f,c,d);return f},i=function(c,d,e,f){var g=a.create(e),i=b.tokenize(c,e);for(pipeline=h(f,g,d,e);i.hasNext();)pipeline.receive(i.next());return g.dom},j=function(a,b,c){var d=e.all(a),h=l(d);b.setWordContent(h);var j=f;return h&&(j=g.concat(f)),i(d,b,c,j)},k=function(a,b,d){var f=e.textOnly(a);return i(f,b,d,[c])},l=function(a){return a.indexOf("<o:p>")>=0||a.indexOf("p.MsoNormal, li.MsoNormal, div.MsoNormal")>=0||a.indexOf("MsoListParagraphCxSpFirst")>=0||a.indexOf("<w:WordDocument>")>=0};return{filter:j,filterPlainText:k,isWordContent:l}}),g("f",["1i","1j","1k","x"],function(a,b,c,d){return function(e,f){var g=function(g){var h=function(d){var f={content:g};e.fire("PastePreProcess",f);var h=b.create(d||e.settings.powerpaste_word_import,d||e.settings.powerpaste_html_import,!0),i=c.filter(f.content,h,e.getDoc());e.fire("PastePostProcess",i),e.undoManager.transact(function(){a.insert(i,e)})},i=function(a){return"clean"===a||"merge"===a},j=function(){var a,b=function(){a.close(),h("clean")},c=function(){a.close(),h("merge")},g=[{text:f("cement.dialog.paste.clean"),onclick:b},{text:f("cement.dialog.paste.merge"),onclick:c}],i={title:f("cement.dialog.paste.title"),spacing:10,padding:10,items:[{type:"container",html:f("cement.dialog.paste.instructions")}],buttons:g};a=e.windowManager.open(i),d(function(){a&&a.getEl().focus()},1)};c.isWordContent(g)&&!i(e.settings.powerpaste_word_import)?j():i(e.settings.powerpaste_html_import)?h():j()};return{showDialog:g}}}),g("4",["d","e","f"],function(a,b,c){return function(d,e,f){var g,h,i=this,j=c(d,a.translate),k=function(a){return function(b){a(b)}};g=b.getOnPasteFunction(d,j.showDialog,e),d.on("paste",k(g)),h=b.getOnKeyDownFunction(d,j.showDialog,e),d.on("keydown",k(h)),d.addCommand("mceInsertClipboardContent",function(a,b){j.showDialog(b.content||b)}),d.settings.paste_preprocess&&d.on("PastePreProcess",function(a){d.settings.paste_preprocess.call(i,i,a)})}}),g("1s",[],function(){var a=0,b=function(b){var c=new Date,d=c.getTime(),e=Math.floor(1e9*Math.random());return a++,b+"_"+e+a+String(d)};return{generate:b}}),g("1n",["g","1s","2t","h","o","2u","2b","j"],function(a,b,c,d,e,f,g,h){var i=c.detect(),j=function(a){var b=g.createObjectURL(a);return k(a,b)},k=function(a,c){return e.nu(function(e){var g=f();g.onload=function(f){var g=b.generate("image"),h=f.target,i=d.blob(g,a,c,h);e(i)},g.readAsDataURL(a)})},l=function(a){return 0===a.length?e.pure([]):e.mapM(a,j)},m=function(a){return a.raw().target.files||a.raw().dataTransfer.files},n=function(b){return 1===b.length&&a.contains(b,"Files")},o=function(b){return!a.contains(b,"text/_moz_htmlcontext")},p=function(b){return a.contains(b,"Files")},q=function(a){return!0},r=function(){return i.browser.isChrome()||i.browser.isSafari()||i.browser.isOpera()?p:i.browser.isFirefox()?o:i.browser.isIE()?n:q},s=r(),t=function(c){var f=a.map(c,function(a){var c=b.generate("image");return d.url(c,h.get(a,"src"),a)});return e.pure(f)};return{multiple:l,toFiles:m,isFiles:s,fromImages:t,single:j,singleWithUrl:k}}),g("i",["1n"],function(a){var b=function(b){return a.multiple(b)},c=function(b){return a.single(b)},d=function(b,c){return a.singleWithUrl(b,c)};return{multiple:b,single:c,singleWithUrl:d}}),g("5",["g","h","i","j","k","d","f","2"],function(a,b,c,d,e,f,g,h){return function(i,j,k,l){var m,n=/^image\/(jpe?g|png|gif|bmp)$/i;i.on("dragstart dragend",function(a){m="dragstart"===a.type}),i.on("dragover dragend dragleave",function(a){a.preventDefault()});var o=function(a){var b={};if(a){if(a.getData){var c=a.getData("Text");c&&c.length>0&&(b["text/plain"]=c)}if(a.types)for(var d=0;d<a.types.length;d++){var e=a.types[d];b[e]=a.getData(e)}}return b},p=function(a,b){return b in a&&a[b].length>0},q=function(a){return!r(a)&&(p(a,"text/html")||p(a,"text/plain"))},r=function(a){var b=a["text/plain"];return!!b&&0===b.indexOf("file://")},s=function(b){var c=b.target.files||b.dataTransfer.files;return a.filter(c,function(a){return n.test(a.type)})},t=function(c){return a.map(c,function(a){var c=e.fromTag("img"),f=b.cata(a,l.getLocalURL,function(a,b,c){return b});return d.set(c,"src",f),c.dom().outerHTML}).join("")},u=function(a){c.multiple(a).get(function(a){var b=t(a);i.insertContent(b,{merge:i.settings.paste_merge_formats!==!1}),l.uploadImages(a)})};i.on("drop",function(a){if(!m){if(h.dom.RangeUtils&&h.dom.RangeUtils.getCaretRangeFromPoint){var b=h.dom.RangeUtils.getCaretRangeFromPoint(a.clientX,a.clientY,i.getDoc());b&&i.selection.setRng(b)}var c=s(a);if(c.length>0)return u(c),void a.preventDefault();var d=o(a.dataTransfer);if(q(d)){var e=g(i,f.translate);e.showDialog(d["text/html"]||d["text/plain"]),a.preventDefault()}}})}}),g("4r",["g","2c","1f"],function(a,b,c){var d=["officeStyles","htmlStyles","isWord","proxyBin","isInternal","backgroundAssets"],e=function(b,c){var e={};return a.each(d,function(a){var d=c[a]().or(b[a]());d.each(function(b){e[a]=b})}),f(e)},f=b.immutableBag([],d);return{nu:f,merge:e}}),g("2w",["n","1m"],function(a,b){var c=b.generate([{error:["message"]},{paste:["elements","assets","correlated"]},{cancel:[]},{incomplete:["elements","assets","correlated","message"]}]),d=function(a,b,c,d,e){return a.fold(b,c,d,e)},e=function(b,e){return d(b,a.none,a.none,a.none,function(b,f,g,h){return d(e,a.none,function(b,d,e){return a.some(c.incomplete(b,d,e,h))},a.none,a.none)}).getOr(e)};return{error:c.error,paste:c.paste,cancel:c.cancel,incomplete:c.incomplete,cata:d,carry:e}}),g("4q",["4r","2w","1v","2c"],function(a,b,c,d){var e=d.immutableBag(["response","bundle"],[]),f=function(a){return l(function(b){var c=e(a);b(c)})},g=function(a,b){a(e(b))},h=function(a){return f({response:a.response(),bundle:a.bundle()})},i=function(c){return f({response:b.error(c),bundle:a.nu({})})},j=function(){return f({response:b.cancel(),bundle:a.nu({})})},k=function(){return f({response:b.paste([],[],[]),bundle:a.nu({})})},l=function(a){var b=function(b){a(b)};return c(l,b)};return{call:g,sync:l,pure:f,pass:h,done:e,error:i,initial:k,cancel:j}}),g("23",["n"],function(a){var b=function(a){for(var b=[],c=function(a){b.push(a)},d=0;d<a.length;d++)a[d].each(c);return b},c=function(b,c){for(var d=0;d<b.length;d++){var e=c(b[d],d);if(e.isSome())return e}return a.none()},d=function(b,c){for(var d=[],e=0;e<b.length;e++){var f=b[e];if(!f.isSome())return a.none();d.push(f.getOrDie())}return a.some(c.apply(null,d))};return{cat:b,findMap:c,liftN:d}}),g("2v",["4q","4r","2w","g","p","23","2c"],function(a,b,c,d,e,f,g){var h=g.immutable("steps","input","label","capture"),i=function(a,b){return f.findMap(a,function(a){return a.getAvailable(b).map(function(b){return h(a.steps(),b,a.label(),a.capture())})})},j=function(a,b,c){var d=i(a,c);return d.getOrThunk(function(){var a=b.getAvailable(c);return h(b.steps(),a,b.label(),b.capture())})},k=function(d,f){var g=e.curry(a.pass,d),h=function(){return f().map(function(e){var f=b.merge(d.bundle(),e.bundle()),g=c.carry(d.response(),e.response());return a.done({response:g,bundle:f})})};return c.cata(d.response(),g,h,g,h)},l=function(b,c){var e=d.foldl(b,function(a,b){return a.bind(function(a){var d=function(){return b(c,a)};return k(a,d)})},a.initial());return e.map(function(a){return a.response()})};return{choose:j,run:l}}),g("4s",[],function(){var a=function(){var a=!1,b=function(){return a},c=function(){a=!0},d=function(){a=!1};return{isBlocked:b,block:c,unblock:d}};return{create:a}}),g("4t",[],function(){var a=function(a,b){return{control:a,instance:b}};return{create:a}}),g("2x",["4s","4t"],function(a,b){var c=function(c){var d=a.create(),e=function(){d.isBlocked()||c.apply(null,arguments)};return b.create(d,e)};return{tap:c}}),g("2y",["2t","p","x"],function(a,b,c){var d=a.detect(),e=function(a,b,c){b.control.block(),a.dom().execCommand("paste"),c(),b.control.unblock()},f=function(a,b,d){c(d,1)},g=d.browser.isIE()&&d.browser.version.major<=10,h=g?e:f,i=function(a,b,c){return h(a,b,c)};return{willBlock:b.constant(g),run:i}}),g("1o",["2v","2w","g","p","2x","21","22","2y"],function(a,b,c,d,e,f,g,h){return function(i,j){var k=g.create({cancel:f([]),error:f(["message"]),insert:f(["elements","assets","correlated"])}),l=e.tap(function(d){h.willBlock()&&(l.control.block(),d.preventDefault());var e=a.choose(i,j,d);e.capture()&&d.preventDefault();var f=c.map(e.steps(),function(a){return a(l.control)}),g=a.run(f,e.input());g.get(function(a){b.cata(a,function(a){k.trigger.error(a)},function(a,b,c){k.trigger.insert(a,b,c)},function(){k.trigger.cancel()},function(a,b,c,d){k.trigger.insert(a,b,c),k.trigger.error(d)})})});return{paste:l.instance,isBlocked:l.control.isBlocked,destroy:d.noop,events:k.registry}}}),g("2z",["p"],function(a){var b=function(a){return function(b){return function(c,d,e){return b.block(),a(c,d,e).map(function(a){return b.unblock(),a})}}},c=function(b){return a.constant(b)};return{blocking:b,normal:c}}),g("4u",["68","i","o","2b","n"],function(a,b,c,d,e){var f=function(a){return void 0!==a.convertURL?a.convertURL:void 0!==a.msConvertURL?a.msConvertURL:void 0},g=function(g){var h=a.resolve("window.clipboardData.files"),i=f(g);if(void 0!==h&&void 0!==i&&h.length>0){var j=c.mapM(h,function(a){var c=d.createObjectURL(a);return i.apply(g,[a,"specified",c]),b.singleWithUrl(a,c)});return e.some(j)}return e.none()};return{convert:g}}),g("30",["4u","o","p","n"],function(a,b,c,d){var e=function(){var c=d.none(),e=function(b){c=a.convert(b)},f=function(a){return c.fold(function(){return b.nu(function(a){a([])})},function(a){return a}).get(a)},g=function(){c=d.none()};return{convert:e,listen:f,clear:g}},f=function(){return{convert:d.none,listen:function(a){a([])},clear:c.noop}};return{background:e,ignore:f}}),h("4v",RegExp),g("31",["n","23","4v"],function(a,b,c){var d=function(a){return void 0!==a&&void 0!==a.types&&null!==a.types},e=function(a,c){return b.findMap(a,function(a){return f(c,a)})},f=function(d,e){var f=new c(e,"i");return b.findMap(d,function(b){return null!==b.match(f)?a.some({type:b,flavor:e}):a.none()})};return{isValidData:d,getPreferredFlavor:e,getFlavor:f}}),g("4x",["1l","1m"],function(a,b){var c=b.generate([{none:[]},{error:["message "]},{blob:["blob"]}]),d=function(a,b,c,d){return a.fold(b,c,d)};return a.merge(c,{cata:d})}),g("78",["3p"],function(a){return function(b,c){var d=a.getOrDie("Blob");return new d(b,c)}}),g("79",["3p"],function(a){return function(b){var c=a.getOrDie("Uint8Array");return new c(b)}}),g("7a",["3p"],function(a){var b=function(b){var c=a.getOrDie("requestAnimationFrame");c(b)},c=function(b){var c=a.getOrDie("atob");return c(b)};return{atob:c,requestAnimationFrame:b}}),g("6d",["4x","78","79","7a","n","2f","37","12","62"],function(a,b,c,d,e,f,g,h,i){var j=function(a,e){for(var f=1024,g=d.atob(a),j=g.length,k=i.ceil(j/f),l=new h(k),m=0;m<k;++m){for(var n=m*f,o=i.min(n+f,j),p=new h(o-n),q=n,r=0;q<o;++r,++q)p[r]=g[q].charCodeAt(0);l[m]=c(p)}return b(l,{type:e})},k=function(a){return g.startsWith(a,"data:image/")&&a.indexOf(";base64,")>"data:image/".length},l=function(b){if(!k(b))return a.none();var c=b.indexOf(";"),d=b.substr("data:".length,c-"data:".length),e=b.substr(c+";base64,".length);try{var f=a.blob(j(e,d));return f}catch(g){return a.error(g)}};return{convert:l}}),g("4w",["6d"],function(a){var b=function(b){return a.convert(b)};return{toBlob:b}}),g("4y",["2w","g","h","p","2c","j","k","1d","2a","1f"],function(a,b,c,d,e,f,g,h,i,j){var k=e.immutable("asset","image"),l=function(a,e){var g=[];return b.each(a,function(a,b){c.cata(a,function(c,d,h,i){var j=e[b];f.set(j,"src",h),g.push(k(a,j))},d.noop)}),g},m=function(a,e){var g=[],j=b.bind(a,function(a){return"img"===h.name(a)?[a]:i.descendants(a,"img")});return b.each(e,function(a){c.cata(a,function(c,d,e,h){b.each(j,function(b){f.get(b,"src")===e&&g.push(k(a,b))})},d.noop)}),g},n=function(d){var e=[],h=[],i=[];return b.each(d,function(a){return c.cata(a,function(b,c,d,j){var l=g.fromTag("img");f.set(l,"src",d),e.push(l),h.push(a),i.push(k(a,l))},function(a,b,c){j.error("Internal error: Paste operation produced an image URL instead of a Data URI: ",b)})}),a.paste(e,h,i)};return{createImages:n,findImages:m,updateSources:l}}),g("1y",["g","29","3f"],function(a,b,c){var d=function(b){b.dom().textContent="",a.each(c.children(b),function(a){e(a)})},e=function(a){var b=a.dom();null!==b.parentNode&&b.parentNode.removeChild(b)},f=function(a){var d=c.children(a);d.length>0&&b.before(a,d),e(a)};return{empty:d,remove:e,unwrap:f}}),g("32",["4w","4x","4q","4y","2w","g","i","n","2c","j","k","1d","1y","29","2a"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p=i.immutable("blob","image"),q=function(c,d){var e=a.toBlob(d);return b.cata(e,h.none,h.none,function(a){return h.some(p(a,c))})},r=function(a){var b=k.fromTag("div");return n.append(b,a),o.descendants(b,"img[src]")},s=function(a){return 0===a.indexOf("data:")&&a.indexOf("base64")>-1},t=function(a){return 0===a.indexOf("blob:")},u=function(a){return s(a)||t(a)},v=function(a){var b=j.get(a,"src");return u(b)},w=function(a){return f.bind(r(a),function(a){var b=j.get(a,"src");return u(b)?q(a,b).toArray():[]})},x=function(a){var b=f.filter(a,function(a){return"img"!==l.name(a)||!v(a)});return e.incomplete(b,[],[],"errors.local.images.disallowed")};return function(a){return function(b,h){return c.sync(function(b){var i=function(){c.call(b,{response:h.response(),bundle:h.bundle()})},j=function(a){var i=w(a),j=f.map(i,function(a){return a.blob()});g.multiple(j).get(function(g){var j=f.map(i,function(a){return a.image()}),k=d.updateSources(g,j);c.call(b,{response:e.paste(a,g,k),bundle:h.bundle()})})},k=function(a){var d=f.filter(r(a),v);f.each(d,m.remove),c.call(b,{response:d.length>0?x(a):h.response(),bundle:h.bundle()})},l=function(b,c,d,e){a.allowLocalImages===!1?k(b):0===c.length?j(b):i()};e.cata(h.response(),i,l,i,l)})}}}),g("4z",["4q","2w","o","1f"],function(a,b,c,d){var e=function(c){var e=function(e,f){return c.proxyBin().fold(function(){return d.error(e),a.pure({response:b.cancel(),bundle:{}})},f)};return{handle:e}},f=function(a){return c.nu(function(b){a.backgroundAssets().fold(function(){b([])},function(a){a.listen(b)})})},g=function(a){var b=j(a);return b&&h(a)||!b&&i(a)},h=function(a){return a.officeStyles().getOr(!0)},i=function(a){return a.htmlStyles().getOr(!1)},j=function(a){return a.isWord().getOr(!1)},k=function(a){return a.isInternal().getOr(!1)};return{proxyBin:e,backgroundAssets:f,merging:g,mergeOffice:h,mergeNormal:i,isWord:j,isInternal:k}}),g("5c",["3g"],function(a){var b=a.create("ephox-cement");return{resolve:b.resolve}}),g("50",["5c","1l","p","n","27","k","28","1x","29"],function(a,b,c,d,e,f,g,h,i){return function(j,k){var l=k.translations,m=function(a,c,e){e(d.some(b.merge(c,{officeStyles:a,htmlStyles:a})))},n=function(b,c){var k=function(){t(),m(!1,b,c)},n=function(){t(),m(!0,b,c)},o=f.fromTag("div");e.add(o,a.resolve("styles-dialog-content"));var p=f.fromTag("p"),q=g.fromHtml(l("cement.dialog.paste.instructions"));i.append(p,q),h.append(o,p);var r={text:l("cement.dialog.paste.clean"),tabindex:0,className:a.resolve("clean-styles"),click:k},s={text:l("cement.dialog.paste.merge"),tabindex:1,className:a.resolve("merge-styles"),click:n},t=function(){v.destroy()},u=function(){c(d.none()),t()},v=j(!0);v.setTitle(l("cement.dialog.paste.title")),v.setContent(o),v.setButtons([r,s]),v.show(),v.events.close.bind(u)},o=function(a,b){var c=a?"officeStyles":"htmlStyles",d=k[c];"clean"===d?m(!1,k,b):"merge"===d?m(!0,k,b):n(k,b)};return{get:o,destroy:c.noop}}}),g("33",["4q","4r","4z","50","2w"],function(a,b,c,d,e){var f=function(f,g){var h=d(f,g);return function(d,f){var g=f.bundle(),i=f.response();return a.sync(function(d){h.get(c.isWord(g),function(c){var g=c.fold(function(){return{response:e.cancel(),bundle:f.bundle()}},function(a){return{response:i,bundle:b.nu({officeStyles:a.officeStyles,htmlStyles:a.htmlStyles})}});a.call(d,g)})})}},g=function(d,e){return function(g,h){return c.isInternal(h.bundle())?a.pure({response:h.response(),bundle:b.nu({officeStyles:!0,htmlStyles:!0})}):f(d,e)(g,h)}},h=function(c,d){return function(e,f){return a.pure({response:f.response(),bundle:b.nu({officeStyles:c,htmlStyles:d})})}};return{fixed:h,fromConfig:f,fromConfigIfExternal:g}}),g("7r",["2t","p","k","1g"],function(a,b,c,d){var e=function(a){for(var b=[];null!==a.nextNode();)b.push(c.fromDom(a.currentNode));return b},f=function(a){try{return e(a)}catch(b){return[]}},g=a.detect().browser,h=g.isIE()||g.isSpartan()?f:e,i=b.constant(b.constant(!0)),j=function(a,b){var c=b.fold(i,function(a){return function(b){return a(b.nodeValue)}});c.acceptNode=c;var e=d.createTreeWalker(a.dom(),NodeFilter.SHOW_COMMENT,c,!1);return h(e)};return{find:j}}),g("7b",["n","7r","37","1g"],function(a,b,c,d){var e=function(d){return b.find(d,a.some(function(a){return c.startsWith(a,"[if gte vml 1]")}))};return{find:e}}),g("6q",[],function(){var a=function(a){return void 0!==a.style};return{isSupported:a}}),h("11",window),g("5d",["1b","g","1c","n","j","5i","k","1d","6q","37","1e","1f","11"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=function(b,c,d){if(!a.isString(d))throw l.error("Invalid call to CSS.set. Property ",c,":: Value ",d,":: Element ",b),new k("CSS value must be a string: "+d);i.isSupported(b)&&b.style.setProperty(c,d)},o=function(a,b){i.isSupported(a)&&a.style.removeProperty(b)},p=function(a,b,c){var d=a.dom();n(d,b,c)},q=function(a,b){var d=a.dom();c.each(b,function(a,b){n(d,b,a)})},r=function(a,b){var d=a.dom();c.each(b,function(a,b){a.fold(function(){o(d,b)},function(a){n(d,b,a)})})},s=function(a,b){var c=a.dom(),d=m.getComputedStyle(c),e=d.getPropertyValue(b),g=""!==e||f.inBody(a)?e:t(c,b);return null===g?void 0:g},t=function(a,b){return i.isSupported(a)?a.style.getPropertyValue(b):""},u=function(a,b){var c=a.dom(),e=t(c,b);return d.from(e).filter(function(a){return a.length>0})},v=function(a,b,c){var d=g.fromTag(a);p(d,b,c);var e=u(d,b);return e.isSome()},w=function(a,b){var c=a.dom();o(c,b),e.has(a,"style")&&""===j.trim(e.get(a,"style"))&&e.remove(a,"style")},x=function(a,b){var c=e.get(a,"style"),d=b(a),f=void 0===c?e.remove:e.set;return f(a,"style",c),d},y=function(a,b){var c=a.dom(),d=b.dom();i.isSupported(c)&&i.isSupported(d)&&(d.style.cssText=c.style.cssText)},z=function(a){return a.dom().offsetWidth},A=function(a,b,c){u(a,c).each(function(a){u(b,c).isNone()&&p(b,c,a)})},B=function(a,c,d){h.isElement(a)&&h.isElement(c)&&b.each(d,function(b){A(a,c,b)})};return{copy:y,set:p,preserve:x,setAll:q,setOptions:r,remove:w,get:s,getRaw:u,isValidValue:v,reflow:z,transfer:B}}),g("6r",["1b","g","p","n","5i","3n","k","2i"],function(a,b,c,d,e,f,g,h){var i=function(a){return n(e.body(),a)},j=function(b,e,f){for(var h=b.dom(),i=a.isFunction(f)?f:c.constant(!1);h.parentNode;){h=h.parentNode;var j=g.fromDom(h);if(e(j))return d.some(j);if(i(j))break}return d.none()},k=function(a,b,c){var d=function(a){return b(a)};return h(d,j,a,b,c)},l=function(a,b){var c=a.dom();return c.parentNode?m(g.fromDom(c.parentNode),function(c){return!f.eq(a,c)&&b(c)}):d.none()},m=function(a,e){var f=b.find(a.dom().childNodes,c.compose(e,g.fromDom));return d.from(f).map(g.fromDom)},n=function(a,b){var c=function(a){for(var e=0;e<a.childNodes.length;e++){if(b(g.fromDom(a.childNodes[e])))return d.some(g.fromDom(a.childNodes[e]));var f=c(a.childNodes[e]);if(f.isSome())return f}return d.none()};return c(a.dom())};return{first:i,ancestor:j,closest:k,sibling:l,child:m,descendant:n}}),g("6s",["j","k","1x","29","1y","3f"],function(a,b,c,d,e,f){var g=function(a,c){return b.fromDom(a.dom().cloneNode(c))},h=function(a){return g(a,!1)},i=function(a){return g(a,!0)},j=function(c,d){var e=b.fromTag(d),f=a.clone(c);return a.setAll(e,f),e},k=function(a,b){var c=j(a,b),e=f.children(i(a));return d.append(c,e),c},l=function(a,b){var g=j(a,b);c.before(a,g);var h=f.children(a);return d.append(g,h),e.remove(a),g};return{shallow:h,shallowAs:j,deep:i,copy:k,mutate:l}}),g("5a",["n","j","27","5d","k","1d","6r","6s","2a","37"],function(a,b,c,d,e,f,g,h,i,j){var k=function(a,b){var c=f.value(a),d=e.fromTag("div"),h=c.indexOf("]>");return d.dom().innerHTML=c.substr(h+"]>".length),g.descendant(d,function(a){return f.name(a)===b})},l=function(b){return f.isComment(b)?k(b,"v:shape"):a.none()},m=function(a){return l(a).map(function(a){var f=b.get(a,"o:spid"),g=void 0===f?b.get(a,"id"):f,h=e.fromTag("img");return c.add(h,"rtf-data-image"),b.set(h,"data-image-id",g.substr("_x0000_".length)),b.set(h,"data-image-type","code"),d.setAll(h,{width:d.get(a,"width"),height:d.get(a,"height")}),h})},n=function(d){if("img"===f.name(d)){var e=b.get(d,"src");if(void 0!==e&&null!==e&&j.startsWith(e,"file://")){var g=h.shallow(d),i=e.split(/[\/\\]/),k=i[i.length-1];return b.set(g,"data-image-id",k),b.remove(g,"src"),b.set(g,"data-image-type","local"),c.add(g,"rtf-data-image"),a.some(g)}return a.none()}return a.none()},o=function(a){return p(a).length>0},p=function(a){return i.descendants(a,".rtf-data-image")};return{local:n,vshape:m,find:p,exists:o,scour:l}}),g("6e",["7b","g","5a","n","23","2c","j","28","2a","1f"],function(a,b,c,d,e,f,g,h,i,j){var k=f.immutable("img","vshape"),l=function(a){var b=n(a);return b._rawElement=a.dom(),b},m=function(a){var b=n(a);return b._rawElement=a.dom(),b},n=function(a){return g.clone(a)},o=function(d){var f=h.fromHtml(d),g=b.bind(f,function(a){return i.descendants(a,"img")}),j=b.bind(f,a.find),k=e.cat(b.map(j,c.scour)),l=b.map(g,function(a){return p(a,k)});return e.cat(l)},p=function(a,c){var e=g.get(a,"v:shapes"),f=d.from(b.find(c,function(a){return g.get(a,"id")===e}));return f.isNone()&&j.log("WARNING: unable to find data for image",a.dom()),f.map(function(b){return q(a,b)})},q=function(a,b){return k(l(a),m(b))};return{extract:o}}),g("7c",["1b","g","p","n","j","27"],function(a,b,c,d,e,f){var g=function(b,c){var d=c.style;if(e.has(b,"width")&&e.has(b,"height")&&a.isString(d)){var f=d.match(/rotation:([^;]*)/);null===f||"90"!==f[1]&&"-90"!==f[1]||e.setAll(b,{width:e.get(b,"height"),height:e.get(b,"width")})}},h=function(a,b){var c=b["o:spid"],d=void 0===c?b.id:c;g(a,b),f.add(a,"rtf-data-image"),e.set(a,"data-image-id",d.substr("_x0000_".length)),e.set(a,"data-image-type","code")},i=function(a,b,c){return c.img()[a]===b},j=function(a,f,g){var h=e.get(f,g),j=c.curry(i,g,h),k=b.find(a,j);return d.from(k).map(function(a){return e.remove(f,g),a})},k=function(a,c,d){b.each(c,function(b){j(a,b,d).each(function(a){h(b,a.vshape())})})};return{rotateImage:g,insertRtfCorrelation:k}}),g("7s",["2t","n","1e"],function(a,b,c){return function(d,e){var f=function(a){if(!d(a))throw new c("Can only get "+e+" value of a "+e+" node");return j(a).getOr("")},g=function(a){try{return h(a)}catch(c){return b.none()}},h=function(a){ -return d(a)?b.from(a.dom().nodeValue):b.none()},i=a.detect().browser,j=i.isIE()&&10===i.version.major?g:h,k=function(a,b){if(!d(a))throw new c("Can only set raw "+e+" value of a "+e+" node");a.dom().nodeValue=b};return{get:f,getOption:j,set:k}}}),g("7d",["1d","7s"],function(a,b){var c=b(a.isComment,"comment"),d=function(a){return c.get(a)},e=function(a){return c.getOption(a)},f=function(a,b){c.set(a,b)};return{get:d,getOption:e,set:f}}),g("7t",["1x"],function(a){var b=function(b,c,d){b.dom().styleSheet?b.dom().styleSheet.cssText=c:a.append(b,d)};return{setCss:b}}),g("8f",[],function(){var a=function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")};return{escape:a}}),g("7u",["1c","8f","4v"],function(a,b,c){var d=function(a,d,e){var f=new c("url\\(\\s*['\"]?"+b.escape(d)+"(.*?)['\"]?\\s*\\)","g");return a.replace(f,'url("'+e+'$1")')},e=function(b,c){var e=b;return a.each(c,function(a,b){e=d(e,b,a)}),e};return{replace:d,replaceMany:e}}),g("7e",["j","k","1x","20","7t","7u","12"],function(a,b,c,d,e,f,g){var h=function(c){var d=b.fromTag("style",c.dom());return a.set(d,"type","text/css"),d},i=function(a,c,d){e.setCss(a,c,b.fromText(c,d.dom()))},j=function(a,b,e){var g=h(e),j=void 0===b?a:f.replaceMany(a,b);i(g,j,e);var k=d.descendant(e,"head").getOrDie();c.append(k,g)},k=function(a){var b=a.dom().styleSheets;return g.prototype.slice.call(b)};return{stylesheets:k,inject:j}}),g("7v",["g","2c"],function(a,b){var c=b.immutable("selector","style","raw"),d=function(b){var d=b.cssRules;return a.map(d,function(a){var b=a.selectorText,d=a.style.cssText;if(void 0===d)throw"WARNING: Browser does not support cssText property";return c(b,d,a.style)})},e=function(b){return a.bind(b,d)};return{extract:d,extractAll:e}}),g("7f",["7v"],function(a){var b=function(b){return a.extract(b)},c=function(b){return a.extractAll(b)};return{extract:b,extractAll:c}}),function(a,b,c){a("7g",[],function(){var a=function(){var a,b,c;return a=function(a){var c,d,e,f,g=[];for(c=a.split(","),e=0,f=c.length;e<f;e+=1)d=c[e],d.length>0&&g.push(b(d));return g},b=function(a){var b,c=a,d={a:0,b:0,c:0},e=[],f=/(\[[^\]]+\])/g,g=/(#[^\s\+>~\.\[:]+)/g,h=/(\.[^\s\+>~\.\[:]+)/g,i=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi,j=/(:[\w-]+\([^\)]*\))/gi,k=/(:[^\s\+>~\.\[:]+)/g,l=/([^\s\+>~\.\[:]+)/g;return b=function(b,f){var g,h,i,j,k,l;if(b.test(c))for(g=c.match(b),h=0,i=g.length;h<i;h+=1)d[f]+=1,j=g[h],k=c.indexOf(j),l=j.length,e.push({selector:a.substr(k,l),type:f,index:k,length:l}),c=c.replace(j,Array(l+1).join(" "))},function(){var a=function(a){var b,d,e,f;if(a.test(c))for(b=c.match(a),d=0,e=b.length;d<e;d+=1)f=b[d],c=c.replace(f,Array(f.length+1).join("A"))},b=/\\[0-9A-Fa-f]{6}\s?/g,d=/\\[0-9A-Fa-f]{1,5}\s/g,e=/\\./g;a(b),a(d),a(e)}(),function(){var a=/:not\(([^\)]*)\)/g;a.test(c)&&(c=c.replace(a," $1 "))}(),function(){var a,b,d,e,f=new RegExp("{[^]*","gm");if(f.test(c))for(a=c.match(f),b=0,d=a.length;b<d;b+=1)e=a[b],c=c.replace(e,Array(e.length+1).join(" "))}(),b(f,"b"),b(g,"a"),b(h,"b"),b(i,"c"),b(j,"b"),b(k,"b"),c=c.replace(/[\*\s\+>~]/g," "),c=c.replace(/[#\.]/g," "),b(l,"c"),e.sort(function(a,b){return a.index-b.index}),{selector:a,specificity:"0,"+d.a.toString()+","+d.b.toString()+","+d.c.toString(),specificityArray:[0,d.a,d.b,d.c],parts:e}},c=function(a,c){var d,e,f;if("string"==typeof a){if(a.indexOf(",")!==-1)throw"Invalid CSS selector";d=b(a).specificityArray}else{if(!Array.isArray(a))throw"Invalid CSS selector or specificity array";if(4!==a.filter(function(a){return"number"==typeof a}).length)throw"Invalid specificity array";d=a}if("string"==typeof c){if(c.indexOf(",")!==-1)throw"Invalid CSS selector";e=b(c).specificityArray}else{if(!Array.isArray(c))throw"Invalid CSS selector or specificity array";if(4!==c.filter(function(a){return"number"==typeof a}).length)throw"Invalid specificity array";e=c}for(f=0;f<4;f+=1){if(d[f]<e[f])return-1;if(d[f]>e[f])return 1}return 0},{calculate:a,compare:c}}();return"undefined"!=typeof exports&&(exports.calculate=a.calculate,exports.compare=a.compare),a})}(f.bolt.module.api.define,f.bolt.module.api.require,f.bolt.module.api.demand),g("6f",["7c","g","p","2c","j","7d","5d","1y","2a","3f","7e","7f","7g"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=d.immutable("selector","raw"),o=function(b,c,d,e,f){var g=i.descendants(c,"img");t(c),a.insertRtfCorrelation(d,g,e);var h=f.mergeInline()?s:p;h(b,c)},p=c.noop,q=function(a,c){var d={};return b.each(a,function(e){if(void 0!==a[e]){var f=c.dom().style;b.contains(f,e)||(d[e]=a[e])}}),d},r=function(a,c){var d=b.bind(c,function(c){var d=i.descendants(a,c.selector());return b.each(d,function(a){var b=q(c.raw(),a);g.setAll(a,b)}),d});b.each(d,function(a){e.remove(a,"class")})},s=function(a,c){var d=k.stylesheets(a),e=l.extractAll(d),f=function(a){return a.selector().indexOf(",")!==-1},g=function(a){return!f(a)},h=function(a){var c=a.selector().split(",");return b.map(c,function(b){var c=b.trim();return n(c,a.raw())})},i=b.flatten(b.map(b.filter(e,f),h)),j=b.filter(e,g),o=j.concat(i);o.sort(function(a,b){return m.compare(a.selector(),b.selector())}).reverse(),r(c,o)},t=function(a){var c=j.children(a);b.each(c,function(a){f.getOption(a).each(function(b){"StartFragment"!==b&&"EndFragment"!==b||h.remove(a)})})};return{doMergeInlineStyles:r,process:o}}),g("71",["n","k"],function(a,b){var c=function(c){var d=c.dom();try{var e=d.contentWindow?d.contentWindow.document:d.contentDocument;return void 0!==e&&null!==e?a.some(b.fromDom(e)):a.none()}catch(f){return console.log("Error reading iframe: ",d),console.log("Error was: "+f),a.none()}},d=function(a){var b=c(a);return b.fold(function(){return a},function(a){return a})};return{doc:d}}),g("5x",["71","5i"],function(a,b){var c=function(c,d){if(!b.inBody(c))throw"Internal error: attempted to write to an iframe that is not in the DOM";var e=a.doc(c),f=e.dom();f.open(),f.writeln(d),f.close()};return{write:c}}),g("25",["p","k"],function(a,b){var c=function(b,c,d,e,f,g,h){return{target:a.constant(b),x:a.constant(c),y:a.constant(d),stop:e,prevent:f,kill:g,raw:a.constant(h)}},d=function(d,e){return function(f){if(d(f)){var g=b.fromDom(f.target),h=function(){f.stopPropagation()},i=function(){f.preventDefault()},j=a.compose(i,h),k=c(g,f.clientX,f.clientY,h,i,j,f);e(k)}}},e=function(b,c,e,f,g){var i=d(e,f);return b.dom().addEventListener(c,i,g),{unbind:a.curry(h,b,c,i,g)}},f=function(a,b,c,d){return e(a,b,c,d,!1)},g=function(a,b,c,d){return e(a,b,c,d,!0)},h=function(a,b,c,d){a.dom().removeEventListener(b,c,d)};return{bind:f,capture:g}}),g("w",["p","25"],function(a,b){var c=a.constant(!0),d=function(a,d,e){return b.bind(a,d,c,e)},e=function(a,d,e){return b.capture(a,d,c,e)};return{bind:d,capture:e}}),g("6g",["p","5x","5d","w","k","1x","1y","x"],function(a,b,c,d,e,f,g,h){return function(i){var j=function(j,k,l){var m=e.fromTag("div"),n=e.fromTag("iframe");c.setAll(m,{display:"none"});var o=d.bind(n,"load",function(){o.unbind(),b.write(n,j);var c=n.dom().contentWindow.document;if(void 0===c)throw"sandbox iframe load event did not fire correctly";var d=e.fromDom(c),f=c.body;if(void 0===f)throw"sandbox iframe does not have a body";var i=e.fromDom(f),p=k(d,i);g.remove(m),h(a.curry(l,p),0)});f.append(m,n),f.append(i,m)};return{play:j}}}),g("6h",["k","28","1x","29","1y","3f"],function(a,b,c,d,e,f){var g=function(a){return a.dom().innerHTML},h=function(g,h){var i=f.owner(g),j=i.dom(),k=a.fromDom(j.createDocumentFragment()),l=b.fromHtml(h,j);d.append(k,l),e.empty(g),c.append(g,k)},i=function(b){var d=a.fromTag("div"),e=a.fromDom(b.dom().cloneNode(!0));return c.append(d,e),g(d)};return{get:g,set:h,getOuter:i}}),g("51",["4q","4r","6e","6f","2w","p","6g","k","28","6h","1g"],function(a,b,c,d,e,f,g,h,i,j,k){var l="data-textbox-image",m=function(a){return void 0===a||null===a||0===a.length},n=function(a){var b=1;return a.replace(/(<img[^>]*)src=".*?"/g,function(a,c,d){return c+l+'="'+b++ +'"'})},o=function(a,b){var c=g(h.fromDom(k.body));return function(e,g){c.play(e,function(c,e){return d.process(c,e,a,l,{mergeInline:f.constant(b)}),j.get(e)},g)}},p=function(d,f,g){return a.sync(function(h){var j=c.extract(d),k=o(j,f);k(g,function(c){var d=i.fromHtml(c);a.call(h,{response:e.paste(d,[],[]),bundle:b.nu({})})})})},q=function(){return a.pure({response:e.paste([],[],[]),bundle:b.nu({})})},r=function(a){var b=a.indexOf("</html>");return b>-1?a.substr(0,b+"</html>".length):a},s=function(b,c,d){var f=r(b.data()),g=n(f);return d.cleanDocument(g,c).fold(function(){return a.pure({response:e.error("errors.paste.word.notready"),bundle:{}})},function(a){return m(a)?q():p(g,c,a)})};return{handle:s}}),g("52",["4q","4r","4y","g","i"],function(a,b,c,d,e){var f=function(f){var g=d.filter(f,function(a){return"file"===a.kind&&/image/.test(a.type)}),h=d.map(g,function(a){return a.getAsFile()});return a.sync(function(d){e.multiple(h).get(function(e){var f=c.createImages(e);a.call(d,{response:f,bundle:b.nu({})})})})};return{handle:f}}),g("7w",[],function(){return{validStyles:function(){return/^(mso-.*|tab-stops|tab-interval|language|text-underline|text-effect|text-line-through|font-color|horiz-align|list-image-[0-9]+|separator-image|table-border-color-(dark|light)|vert-align|vnd\..*)$/},specialInline:function(){return/^(font|em|strong|samp|acronym|cite|code|dfn|kbd|tt|b|i|u|s|sub|sup|ins|del|var|span)$/}}}),g("83",[],function(){var a=function(a){return g(function(b,c,d,e,f,g){return b(a)})},b=function(a){return g(function(b,c,d,e,f,g){return c(a)})},c=function(a){return g(function(b,c,d,e,f,g){return d(a)})},d=function(a){return g(function(b,c,d,e,f,g){return e(a)})},e=function(){return g(function(a,b,c,d,e,f){return e()})},f=function(a){return g(function(b,c,d,e,f,g){return g(a)})},g=function(a){var b=function(b){return a(function(a){return 0===b.toLowerCase().indexOf(a.toLowerCase())},function(a){return a.test(b.toLowerCase())},function(a){return b.toLowerCase().indexOf(a.toLowerCase())>=0},function(a){return b.toLowerCase()===a.toLowerCase()},function(){return!0},function(a){return!a.matches(b)})};return{fold:a,matches:b}},h=function(a,b,c,d,e,f,g){return a.fold(b,c,d,e,f,g)};return{starts:a,pattern:b,contains:c,exact:d,all:e,not:f,cata:h}}),g("7x",["p","1d","83"],function(a,b,c){var d=function(b,d,e,f){var g=f.name,h=void 0!==f.condition?f.condition:a.constant(!0),i=void 0!==f.value?f.value:c.all();return g.matches(e)&&i.matches(d)&&h(b)},e=function(c,d){var e=b.name(c),f=d.name,g=void 0!==d.condition?d.condition:a.constant(!0);return f.matches(e)&&g(c)};return{keyval:d,name:e}}),g("8g",["g","1c","p","j"],function(a,b,c,d){var e=function(b,c){var d={};return a.each(b.dom().attributes,function(a){c(a.value,a.name)||(d[a.name]=a.value)}),d},f=function(c,e,f){a.each(e,function(a){d.remove(c,a)}),b.each(f,function(a,b){d.set(c,b,a)})},g=function(c,d,e){var g=a.map(c.dom().attributes,function(a){return a.name});b.size(d)!==g.length&&f(c,g,d)};return{filter:e,clobber:g,scan:c.constant({})}}),g("8h",["g","1c","j","5d","37"],function(a,b,c,d,e){var f=function(b){var c={},d=void 0!==b&&null!==b?b.split(";"):[];return a.each(d,function(a){var b=a.split(":");2===b.length&&(c[e.trim(b[0])]=e.trim(b[1]))}),c},g=function(a,b){return a.dom().style.getPropertyValue(b)},h=function(b,c){var d=b.dom().style,e=void 0===d?[]:d,f={};return a.each(e,function(a){var d=g(b,a);c(d,a)||(f[a]=d)}),f},i=function(a,b,c){d.set(a,b,c)},j=function(b,c,d){var e=b.dom().getAttribute("style"),g=f(e),h={};return a.each(c,function(a){var b=g[a];void 0===b||d(b,a)||(h[a]=b)}),h},k=function(c){var d=b.keys(c);return a.map(d,function(a){return a+": "+c[a]}).join("; ")},l=function(a,d,e){c.set(a,"style","");var f=b.size(d),g=b.size(e);if(0===f&&0===g)c.remove(a,"style");else if(0===f)c.set(a,"style",k(e));else{b.each(d,function(b,c){i(a,c,b)});var h=c.get(a,"style"),j=g>0?k(e)+"; ":"";c.set(a,"style",j+h)}};return{filter:h,clobber:l,scan:j}}),g("7y",["8g","8h","p","k"],function(a,b,c,d){var e=["mso-list"],f=function(a,c){var d=b.scan(a,e,c),f=b.filter(a,c);b.clobber(a,f,d)},g=function(b,c){var d=a.filter(b,c);a.clobber(b,d,{})},h=function(a){var d=b.filter(a,c.constant(!1));b.clobber(a,d,{})},i=function(a,b){f(d.fromDom(a),b)},j=function(a,b){g(d.fromDom(a),b)};return{style:f,attribute:g,styleDom:i,attributeDom:j,validateStyles:h}}),g("7i",["g","1l","7x","7y","p","j","27","3q","1y","2a"],function(a,b,c,d,e,f,g,h,i,j){var k=function(b,d,e){b(e,function(b,f){return a.exists(d,function(a){return c.keyval(e,b,f,a)})})},l=function(l,m){var n=b.merge({styles:[],attributes:[],classes:[],tags:[]},m),o=j.descendants(l,"*");a.each(o,function(b){k(d.style,n.styles,b),k(d.attribute,n.attributes,b),a.each(n.classes,function(c){var d=f.has(b,"class")?h.get(b):[];a.each(d,function(a){c.name.matches(a)&&g.remove(b,a)})})});var p=j.descendants(l,"*");a.each(p,function(b){var d=a.exists(n.tags,e.curry(c.name,b));d&&i.remove(b)})},m=function(d,f){var g=b.merge({tags:[]},f),h=j.descendants(d,"*");a.each(h,function(b){var d=a.exists(g.tags,e.curry(c.name,b));d&&i.unwrap(b)})},n=function(d,f){var g=b.merge({tags:[]},f),h=j.descendants(d,"*");a.each(h,function(b){var d=a.find(g.tags,e.curry(c.name,b));void 0!==d&&null!==d&&d.mutate(b)})},o=function(b){var c=j.descendants(b,"*");a.each(c,function(a){d.validateStyles(a)})};return{remover:l,unwrapper:m,transformer:n,validator:o}}),g("86",["1c","5d","k"],function(a,b,c){var d="startElement",e="endElement",f="text",g="comment",h=function(a,h,i){var j,k,l,m=c.fromDom(a);switch(a.nodeType){case 1:h?j=e:(j=d,b.setAll(m,i||{})),k="HTML"!==a.scopeName&&a.scopeName&&a.tagName&&a.tagName.indexOf(":")<=0?(a.scopeName+":"+a.tagName).toUpperCase():a.tagName;break;case 3:j=f,l=a.nodeValue;break;case 8:j=g,l=a.nodeValue;break;default:console.log("WARNING: Unsupported node type encountered: "+a.nodeType)}var n=function(){return a},o=function(){return k},p=function(){return j},q=function(){return l};return{getNode:n,tag:o,type:p,text:q}},i=function(b,c,d,e){var f=e.createElement(b);return a.each(c,function(a,b){f.setAttribute(b,a)}),h(f,!1,d)},j=function(a,b){return h(b.createElement(a),!0)},k=function(a,b){return h(b.createComment(a),!1)},l=function(a,b){return h(b.createTextNode(a))},m=j("HTML",window.document);return{START_ELEMENT_TYPE:d,END_ELEMENT_TYPE:e,TEXT_TYPE:f,COMMENT_TYPE:g,FINISHED:m,token:h,createStartElement:i,createEndElement:j,createComment:k,createText:l}}),g("7z",["86"],function(a){var b=function(b){var c=b.createDocumentFragment(),d=c,e=function(a){g(a),c=a},f=function(){c=c.parentNode,null===c&&(c=d)},g=function(a){c.appendChild(a)},h=function(c){var d=function(a){var b=a.getNode().cloneNode(!1);e(b)},h=function(a,c){var d=b.createTextNode(a.text());g(d)};switch(c.type()){case a.START_ELEMENT_TYPE:d(c);break;case a.TEXT_TYPE:h(c);break;case a.END_ELEMENT_TYPE:f();break;case a.COMMENT_TYPE:break;default:throw{message:"Unsupported token type: "+c.type()}}};return{dom:d,receive:h,label:"SERIALISER"}};return{create:b}}),g("80",["86"],function(a){var b=function(b,c){var d;c=c||window.document,d=c.createElement("div"),c.body.appendChild(d),d.style.position="absolute",d.style.left="-10000px",d.innerHTML=b,nextNode=d.firstChild||a.FINISHED;var e=[];endNode=!1;var f=function(b,c){return b===a.FINISHED?b:b?a.token(b,c):void 0},g=function(){var b=nextNode,g=endNode;return!endNode&&nextNode.firstChild?(e.push(nextNode),nextNode=nextNode.firstChild):endNode||1!==nextNode.nodeType?nextNode.nextSibling?(nextNode=nextNode.nextSibling,endNode=!1):(nextNode=e.pop(),endNode=!0):endNode=!0,b===a.FINISHED||nextNode||(c.body.removeChild(d),nextNode=a.FINISHED),f(b,g)},h=function(){return void 0!==nextNode};return{hasNext:h,next:g}};return{tokenise:b}}),g("7j",["7z","80"],function(a,b){var c=function(a,b,c){var d,e=c;for(d=b.length-1;d>=0;d--)e=b[d](e,{},a);return e},d=function(d,e,f){for(var g=a.create(d),h=b.tokenise(e,d),i=c(d,f,g);h.hasNext();){var j=h.next();i.receive(j)}return g.dom};return{build:c,run:d}}),g("6m",["g","7i","7j","k","6h","1y","3f"],function(a,b,c,d,e,f,g){var h=function(a){return function(c){b.remover(c,a)}},i=function(a){return function(c){b.unwrapper(c,a)}},j=function(a){return function(c){b.transformer(c,a)}},k=function(){return function(a){b.validator(a)}},l=function(a){return function(b){var d=e.get(b),h=g.owner(b),i=c.run(h.dom(),d,a);f.empty(b),b.dom().appendChild(i)}},m=function(b,c,f){var g=d.fromTag("div",b.dom());return g.dom().innerHTML=c,a.each(f,function(a){a(g)}),e.get(g)},n=function(a,b){return a.indexOf("<o:p>")>=0||b.browser.isSpartan()&&a.indexOf('v:shapes="')>=0||b.browser.isSpartan()&&a.indexOf("mso-")>=0||a.indexOf("mso-list")>=0||a.indexOf("p.MsoNormal, li.MsoNormal, div.MsoNormal")>=0||a.indexOf("MsoListParagraphCxSpFirst")>=0||a.indexOf("<w:WordDocument>")>=0};return{removal:h,unwrapper:i,transformer:j,validate:k,pipeline:l,isWordContent:n,go:m}}),g("7l",["g","86"],function(a,b){return function(c,d,e){return function(e,f,g){var h=function(b){a.each(b,i)},i=function(a){e.receive(a)},j=function(a){c(l,a,k)},k=function(a,c){return b.token(c,a.type()===b.END_ELEMENT_TYPE,{})},l={emit:i,emitTokens:h,receive:j,document:window.document};return d(l),l}}}),g("8u",["8h","86","p","j","5d","k"],function(a,b,c,d,e,f){var g=function(a,b){var c=f.fromDom(a.getNode());return d.get(c,b)},h=function(a,b){var c=f.fromDom(a.getNode());return e.get(c,b)},i=function(a){return a.type()===b.TEXT_TYPE&&/^[\s\u00A0]*$/.test(a.text())},j=function(b){var d=f.fromDom(b.getNode()),e=a.scan(d,["mso-list"],c.constant(!1));return e["mso-list"]};return{getAttribute:g,getStyle:h,isWhitespace:i,getMsoList:j}}),g("96",["g","n"],function(a,b){var c=function(c,e){var f=a.find(c,function(a){return"UL"===a.tag||e&&d(a,e,!0)});return void 0!==f?b.some(f):c.length>0?b.some(c[0]):b.none()},d=function(a,b,c){return a===b||a&&b&&a.tag===b.tag&&a.type===b.type&&(c||a.variant===b.variant)};return{guessFrom:c,eqListType:d}}),g("8l",[],function(){var a=function(a,b){if(void 0===a||void 0===b)throw console.trace(),"brick";a.nextFilter.set(b)},b=function(b){return function(c,d,e){a(d,b)}},c=function(a,b,c){var d=b.nextFilter.get();d(a,b,c)},d=function(b){return function(d,e,f){a(e,b),c(d,e,f)}},e=function(a,b){return a.nextFilter.get()===b};return{next:a,go:c,jump:d,isNext:e,setNext:b}}),g("8t",["g","8u","96","8l","p","2c","j","k"],function(a,b,c,d,e,f,g,h){var i=function(a,b){return g.has(h.fromDom(b.getNode()),"data-list-level")},j=function(a){var b=parseInt(g.get(a,"data-list-level"),10),c=g.get(a,"data-list-emblems"),d=JSON.parse(c);return g.remove(a,"data-list-level"),g.remove(a,"data-list-emblems"),{level:e.constant(b),emblems:e.constant(d)}},k=f.immutable("level","token","type"),l=function(c){return!a.contains(["P"],c.tag())||/^MsoHeading/.test(b.getAttribute(c,"class"))},m=function(a,b,d,e){var f=d.getCurrentListType(),g=d.getCurrentLevel(),h=g==e.level()?f:null;return c.guessFrom(e.emblems(),h).filter(function(a){return!("OL"===a.tag&&l(b))})},n=function(a,b,c){var d=m(c.listType.get(),a,c.emitter,b);return d.each(c.listType.set),k(b.level(),c.originalToken.get(),c.listType.get())},o=function(a){return function(b,c,e){var f=j(h.fromDom(e.getNode()));f.level();c.originalToken.set(e);var g=n(e,f,c);c.emitter.openItem(g.level(),g.token(),g.type()),d.next(c,a.inside())}};return{predicate:i,action:o}}),g("8v",["p"],function(a){return function(b,c,d){return{pred:b,action:c,label:a.constant(d)}}}),g("8w",["g","p","n"],function(a,b,c){var d=function(a,b){return function(a,c,d){return b(a,c,d)}};return function(e,f,g){var h=d(e+" :: FALLBACK --- ",g),i=function(g,i,j){var k=c.from(a.find(f,function(a){return a.pred(i,j)})),l=k.fold(b.constant(h),function(a){var b=a.label();return void 0===b?a.action:d(e+" :: "+b,a.action)});l(g,i,j)};return i.toString=function(){return"Handlers for "+e},i}}),g("8i",["8t","86","8u","8v","8w","8l"],function(a,b,c,d,e,f){var g=function(a){var c=function(b,c,d){f.next(c,a.outside())},g=function(a,c){return c.type()===b.END_ELEMENT_TYPE&&a.originalToken.get()&&c.tag()===a.originalToken.get().tag()};return e("Inside.List.Item",[d(g,c,"Closing open tag")],function(a,b,c){a.emit(c)})},h=function(g){var h=function(a,b,c){b.emitter.closeAllLists(),a.emit(c),f.next(b,g.outside())},i=function(a,d){return d.type()===b.TEXT_TYPE&&c.isWhitespace(d)};return e("Outside.List.Item",[d(a.predicate,a.action(g),"Data List ****"),d(i,function(a,b,c){a.emit(c)},"Whitespace")],h)};return{inside:g,outside:h}}),g("97",["2c"],function(a){var b=a.immutable("state","result"),c=a.immutable("state","value"),d=a.immutable("level","type","types","items");return{state:d,value:c,result:b}}),g("9j",["97","n"],function(a,b){var c=function(c){var d=c.items().slice(0);if(d.length>0&&"P"!==d[d.length-1]){var e=d[d.length-1];d[d.length-1]="P";var f=a.state(c.level(),c.type(),c.types(),d);return a.value(f,b.some(e))}return a.value(c,b.none())},d=function(c,d){var e=c.items().slice(0),f=void 0!==d&&"P"!==d?b.some(d):b.none();f.fold(function(){e.push("P")},function(a){e.push(a)});var g=a.state(c.level(),c.type(),c.types(),e);return a.value(g,f)};return{start:d,finish:c}}),g("9k",["97"],function(a){var b=function(b,c,d){for(var e=[],f=b;c(f);){var g=d(f);f=g.state(),e=e.concat(g.result())}return a.result(f,e)},c=function(a,c,d){var e=function(a){return a.level()<c};return b(a,e,d)},d=function(a,c,d){var e=function(a){return a.level()>c};return b(a,e,d)};return{moveRight:c,moveLeft:d,moveUntil:b}}),g("9v",["8u"],function(a){var b=function(b){var c=a.getStyle(b,"margin-left");return void 0!==c&&"0px"!==c?{"margin-left":c}:{}},c=function(a){var c={"list-style-type":"none"};return a?b(a):c};return{from:c}}),g("9l",["7y","86","96","97","9j","9v","p"],function(a,b,c,d,e,f,g){var h=function(a,c,e){var f=c.start&&c.start>1?{start:c.start}:{},h=a.level()+1,i=c,j=a.types().concat([c]),k=[g.curry(b.createStartElement,c.tag,f,e)],l=d.state(h,i,j,a.items());return d.result(l,k)},i=function(a){var c=a.types().slice(0),e=[g.curry(b.createEndElement,c.pop().tag)],f=a.level()-1,h=c[c.length-1],i=d.state(f,h,c,a.items());return d.result(i,e)},j=function(a,b){var c=i(a),e=h(c.state(),b,b.type?{"list-style-type":b.type}:{});return d.result(e.state(),c.result().concat(e.result()))},k=function(h,i,k){var l={},m=f.from(i),n=h.type()&&!c.eqListType(h.type(),k)?j(h,k):d.result(h,[]),o=[g.curry(b.createStartElement,"LI",l,m)],p=e.start(n.state(),i&&i.tag()),q=p.value().map(function(b){return a.styleDom(i.getNode(),g.constant(!0)),[g.constant(i)]}).getOr([]);return d.result(p.state(),n.result().concat(o).concat(q))},l=function(a){var c=g.curry(b.createEndElement,"LI"),f=e.finish(a),h=f.value().fold(function(){return[c]},function(a){return[g.curry(b.createEndElement,a),c]});return d.result(f.state(),h)};return{open:h,openItem:k,close:i,closeItem:l}}),g("98",["g","86","97","9j","9k","9l","p","n"],function(a,b,c,d,e,f,g,h){var i=function(b){if(0===b.length)throw"Compose must have at least one element in the list";var d=b[b.length-1],e=a.bind(b,function(a){return a.result()});return c.result(d.state(),e)},j=function(a){var b=f.closeItem(a),c=f.close(b.state());return i([b,c])},k=function(a,b,c,d){var e=a.level()===c-1&&b.type?{"list-style-type":b.type}:{},g=f.open(a,b,e),h=f.openItem(g.state(),g.state().level()==c?d:void 0,b);return i([g,h])},l=function(a,b,d){var e=a.level()>0?f.closeItem(a):c.result(a,[]),g=f.openItem(e.state(),d,b);return i([e,g])},m=function(a,b,c,d){return e.moveRight(a,c,function(a){return k(a,b,c,d)})},n=function(a,b){return e.moveLeft(a,b,j)},o=function(a,e,f,i){var j=f>1?d.finish(a):c.value(a,h.none()),k=j.value().map(function(a){return[g.curry(b.createEndElement,a)]}).getOr([]),l=(f-j.state().level(),m(j.state(),e,f,i));return c.result(l.state(),k.concat(l.result()))},p=function(a,b,d,e){var f=a.level()>b?n(a,b):c.result(a,[]),g=f.state().level()===b?l(f.state(),e,d):o(f.state(),e,b,d);return i([f,g])},q=n;return{openItem:p,closeAllLists:q}}),g("8x",["g","97","98"],function(a,b,c){var d=["disc","circle","square"],e=function(a,b){return"UL"===a.tag&&d[b-1]===a.type&&(a={tag:"UL"}),a};return function(d,f){var g=b.state(0,void 0,[],[]),h=function(b){a.each(b.result(),function(a){var b=a(f);d.emit(b)})},i=function(){var a=c.closeAllLists(g,0);g=a.state(),h(a)},j=function(a,b,d){if(d){var f=e(d,a),i=c.openItem(g,a,b,f);g=i.state(),h(i)}},k=function(){return g.level()},l=function(){return g.type()};return{closeAllLists:i,openItem:j,getCurrentListType:l,getCurrentLevel:k}}}),g("z",[],function(){var a=function(b){var c=b,d=function(){return c},e=function(a){c=a},f=function(){return a(d())};return{get:d,set:e,clone:f}};return a}),g("8j",["8x","p","z"],function(a,b,c){var d={getCurrentListType:function(){return e().getCurrentListType()},getCurrentLevel:function(){return e().getCurrentLevel()},closeAllLists:function(){return e().closeAllLists.apply(void 0,arguments)},openItem:function(){return e().openItem.apply(void 0,arguments)}},e=function(){return{getCurrentListType:b.constant({}),getCurrentLevel:b.constant(1),closeAllLists:b.identity,openItem:b.identity}};return function(f){var g=c(f),h=c(null),i=c(null),j=function(c){g.set(f),h.set(null),i.set(null),_emitter=a(c,c.document),e=b.constant(_emitter)};return{reset:j,nextFilter:g,originalToken:h,listType:i,emitter:d}}}),g("8k",["86"],function(a){return function(){var b=!1,c="",d=function(d){return b&&d.type()===a.TEXT_TYPE?(c+=d.text(),!0):d.type()===a.START_ELEMENT_TYPE&&"STYLE"===d.tag()?(b=!0,!0):d.type()===a.END_ELEMENT_TYPE&&"STYLE"===d.tag()&&(b=!1,!0)};return{check:d}}}),g("81",["7l","8i","8j","8k","8l","1g"],function(a,b,c,d,e,f){var g={inside:function(){return i},outside:function(){return j}},h=d(),i=b.inside(g),j=b.outside(g),k=c(j);return a(function(a,b,c){h.check(b)||e.go(a,k,b)},k.reset,"list.filters")}),h("8o",parseInt),g("8y",["g","1l","64","8o"],function(a,b,c,d){var e=[{regex:/^\(?[dc][\.\)]$/,type:{tag:"OL",type:"lower-alpha"}},{regex:/^\(?[DC][\.\)]$/,type:{tag:"OL",type:"upper-alpha"}},{regex:/^\(?M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})[\.\)]$/,type:{tag:"OL",type:"upper-roman"}},{regex:/^\(?m*(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})[\.\)]$/,type:{tag:"OL",type:"lower-roman"}},{regex:/^\(?[0-9]+[\.\)]$/,type:{tag:"OL"}},{regex:/^([0-9]+\.)*[0-9]+\.?$/,type:{tag:"OL",variant:"outline"}},{regex:/^\(?[a-z]+[\.\)]$/,type:{tag:"OL",type:"lower-alpha"}},{regex:/^\(?[A-Z]+[\.\)]$/,type:{tag:"OL",type:"upper-alpha"}}],f={"\u2022":{tag:"UL",type:"disc"},"\xb7":{tag:"UL",type:"disc"},"\xa7":{tag:"UL",type:"square"}},g={o:{tag:"UL",type:"circle"},"-":{tag:"UL",type:"disc"},"\u25cf":{tag:"UL",type:"disc"},"\ufffd":{tag:"UL",type:"circle"}},h=function(a,b){return void 0!==a.variant?a.variant:"("===b.charAt(0)?"()":")"===b.charAt(b.length-1)?")":"."},i=function(a){var b=a.split("."),e=function(){if(0===b.length)return a;var c=b[b.length-1];return 0===c.length&&b.length>1?b[b.length-2]:c}(),f=d(e,10);return c(f)?{}:{start:f}},j=function(c,d){var j=g[c]?[g[c]]:[],k=d&&f[c]?[f[c]]:d?[{tag:"UL",variant:c}]:[],l=a.bind(e,function(a){return a.regex.test(c)?[b.merge(a.type,i(c),{variant:h(a.type,c)})]:[]}),m=j.concat(k).concat(l);return a.map(m,function(a){return void 0!==a.variant?a:b.merge(a,{variant:c})})};return{extract:j}}),g("7o",[],function(){var a=function(a){return a.dom().textContent},b=function(a,b){a.dom().textContent=b};return{get:a,set:b}}),g("8m",["g","8y","8h","p","n","5d","6h","1d","6r","7o","3f","62","64","8o"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=18,p=function(a){var b=c.scan(a,["mso-list"],d.constant(!1));return b["mso-list"]},q=function(a){var b=p(a),c=/ level([0-9]+)/.exec(b);return c&&c[1]?e.some(n(c[1],10)):e.none()},r=function(a,c){var d=j.get(a).trim(),f=b.extract(d,c);return f.length>0?e.some(f):e.none()},s=function(a){return i.child(a,v)},t=function(a){return i.child(a,h.isComment).bind(k.nextSibling).filter(function(a){return"span"===h.name(a)})},u=function(a){return i.descendant(a,function(a){var b=h.isElement(a)?c.scan(a,["mso-list"],d.constant(!1)):[];return!!b["mso-list"]})},v=function(b){return h.isElement(b)&&f.getRaw(b,"font-family").exists(function(b){return a.contains(["wingdings","symbol"],b.toLowerCase())})},w=function(a){return f.getRaw(a,"margin-left").bind(function(a){var b=n(a,10);return m(b)?e.none():e.some(l.max(1,l.ceil(b/o)))})};return{getMsoList:p,extractLevel:q,extractEmblem:r,extractSymSpan:s,extractMsoIgnore:u,extractCommentSpan:t,isSymbol:v,deduceLevel:w}}),h("8n",JSON),g("82",["g","8m","n","j","7r","1d","1y","3f","8n","8o"],function(a,b,c,d,e,f,g,h,i,j){var k=function(a,b,c){d.set(a,"data-list-level",b);var e=i.stringify(c);d.set(a,"data-list-emblems",e)},l=function(b){var d=e.find(b,c.none());a.each(d,g.remove)},m=function(b,c,e,f){k(b,c,e),l(b),a.each(f,g.remove),d.remove(b,"style"),d.remove(b,"class")},n=function(a){return b.extractLevel(a).bind(function(c){return b.extractSymSpan(a).bind(function(d){return b.extractEmblem(d,!0).map(function(b){var e=function(){m(a,c,b,[d])};return{mutate:e}})})})},o=function(a){return b.extractLevel(a).bind(function(c){return b.extractCommentSpan(a).bind(function(d){return b.extractEmblem(d,b.isSymbol(d)).map(function(b){var e=function(){m(a,c,b,[d])};return{mutate:e}})})})},p=function(a){return b.extractLevel(a).bind(function(c){return b.extractCommentSpan(a).bind(function(d){return b.extractEmblem(d,b.isSymbol(d)).map(function(b){var e=function(){m(a,c,b,[d])};return{mutate:e}})})})},q=function(a){return"p"!==f.name(a)?c.none():b.extractLevel(a).bind(function(c){return b.extractMsoIgnore(a).bind(function(d){return b.extractEmblem(d,!1).map(function(b){var e=function(){m(a,c,b,[h.parent(d).getOr(d)])};return{mutate:e}})})})},r=function(a){return"p"!==f.name(a)?c.none():b.extractMsoIgnore(a).bind(function(c){var d=h.parent(c).getOr(c),e=b.isSymbol(d);return b.extractEmblem(c,e).bind(function(c){return b.deduceLevel(a).map(function(b){var e=function(){m(a,b,c,[d])};return{mutate:e}})})})},s=function(a){return n(a).orThunk(function(){return o(a)}).orThunk(function(){return p(a)}).orThunk(function(){return q(a)}).orThunk(function(){return r(a)})};return{find:s}}),g("7k",["6m","81","82","83"],function(a,b,c,d){var e=a.transformer({tags:[{name:d.pattern(/^(p|h\d+)$/),mutate:function(a){c.find(a).each(function(a){a.mutate()})}}]});return{filter:b,preprocess:e}}),g("6n",["6r"],function(a){var b=function(b){return a.first(b).isSome()},c=function(b,c,d){return a.ancestor(b,c,d).isSome()},d=function(b,c,d){return a.closest(b,c,d).isSome()},e=function(b,c){return a.sibling(b,c).isSome()},f=function(b,c){return a.child(b,c).isSome()},g=function(b,c){return a.descendant(b,c).isSome()};return{any:b,ancestor:c,closest:d,sibling:e,child:f,descendant:g}}),g("84",["g","j","6h","1d","6n"],function(a,b,c,d,e){var f=function(a){return"img"!==d.name(a)},g=function(a){var b=a.dom().attributes,c=void 0!==b&&null!==b&&b.length>0;return"span"!==d.name(a)||c},h=function(b){return!k(b)||g(b)&&e.descendant(b,function(b){var c=!k(b),e=!a.contains(["font","em","strong","samp","acronym","cite","code","dfn","kbd","tt","b","i","u","s","sub","sup","ins","del","var","span"],d.name(b));return d.isText(b)||c||e})},i=function(a){return"ol"===d.name(a)||"ul"===d.name(a)},j=function(a){var c=b.get(a,"src");return/^file:/.test(c)},k=function(a){return void 0===a.dom().attributes||null===a.dom().attributes||(0===a.dom().attributes.length||1===a.dom().attributes.length&&"style"===a.dom().attributes[0].name)},l=function(a){return 0===c.get(a).length};return{isNotImage:f,hasContent:h,isList:i,isLocal:j,hasNoAttributes:k,isEmpty:l}}),g("8p",["1d","7s"],function(a,b){var c=b(a.isText,"text"),d=function(a){return c.get(a)},e=function(a){return c.getOption(a)},f=function(a,b){c.set(a,b)};return{get:d,getOption:e,set:f}}),g("85",["g","1c","n","j","5d","k","6h","1x","29","1d","1y","8p","3f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=function(b,c){var d=f.fromTag(b);h.before(c,d);var e=c.dom().attributes;a.each(e,function(a){d.dom().setAttribute(a.name,a.value)});var g=m.children(c); -return i.append(d,g),k.remove(c),d},o=function(a){0===g.get(a).length&&h.append(a,f.fromTag("br"))},p=function(a){return m.prevSibling(a).bind(function(a){return j.isText(a)&&0===l.get(a).trim().length?p(a):"li"===j.name(a)?c.some(a):c.none()})},q=function(b){m.parent(b).each(function(c){var d=j.name(c);a.contains(["ol","ul"],d)&&p(b).fold(function(){var a=f.fromTag("li");e.set(a,"list-style-type","none"),h.wrap(b,a)},function(a){h.append(a,b)})})},r=function(a){var c=n("span",a),f={face:"font-family",size:"font-size",color:"color"},g={"font-size":{1:"8pt",2:"10pt",3:"12pt",4:"14pt",5:"18pt",6:"24pt",7:"36pt"}};b.each(f,function(a,b){if(d.has(c,b)){var f=d.get(c,b),h=void 0!==g[a]&&void 0!==g[a][f]?g[a][f]:f;e.set(c,a,h),d.remove(c,b)}})};return{changeTag:n,addBrTag:o,properlyNest:q,fontToSpan:r}}),g("7h",["7w","6m","7k","84","85","p","27","5d","3f","1d","83"],function(a,b,c,d,e,f,g,h,i,j,k){var l=b.unwrapper({tags:[{name:k.pattern(/^([OVWXP]|U[0-9]+|ST[0-9]+):/i)}]}),m=[b.pipeline([c.filter])],n=b.removal({attributes:[{name:k.pattern(/^v:/)},{name:k.exact("href"),value:k.contains("#_toc")},{name:k.exact("href"),value:k.contains("#_mso")},{name:k.pattern(/^xmlns(:|$)/)},{name:k.exact("type"),condition:d.isList}]}),o=b.removal({attributes:[{name:k.exact("id")},{name:k.exact("name")}]}),p=b.removal({tags:[{name:k.exact("script")},{name:k.exact("meta")},{name:k.exact("link")},{name:k.exact("style"),condition:d.isEmpty}],attributes:[{name:k.starts("on")},{name:k.exact('"')},{name:k.exact("lang")},{name:k.exact("language")}],styles:[{name:k.all(),value:k.pattern(/OLE_LINK/i)}]}),q=function(a){return!g.has(a,"ephox-limbo-transform")},r=function(a){return function(b){return i.parent(b).exists(function(b){return j.name(b)===a&&1===i.children(b).length})}},s=b.removal({styles:[{name:k.not(k.pattern(/width|height|list-style-type/)),condition:q},{name:k.pattern(/width|height/),condition:d.isNotImage}]}),t=b.removal({classes:[{name:k.not(k.exact("rtf-data-image"))}]}),u=b.removal({styles:[{name:k.pattern(a.validStyles())}]}),v=b.removal({classes:[{name:k.pattern(/mso/i)}]}),w=b.unwrapper({tags:[{name:k.exact("img"),condition:d.isLocal},{name:k.exact("a"),condition:d.hasNoAttributes}]}),x=b.unwrapper({tags:[{name:k.exact("a"),condition:d.hasNoAttributes}]}),y=b.removal({attributes:[{name:k.exact("style"),value:k.exact(""),debug:!0}]}),z=b.removal({attributes:[{name:k.exact("class"),value:k.exact(""),debug:!0}]}),A=b.unwrapper({tags:[{name:k.pattern(a.specialInline()),condition:f.not(d.hasContent)}]}),B=b.unwrapper({tags:[{name:k.exact("p"),condition:r("li")}]}),C=b.transformer({tags:[{name:k.exact("p"),mutate:e.addBrTag}]}),D=function(a){var b=e.changeTag("span",a);g.add(b,"ephox-limbo-transform"),h.set(b,"text-decoration","underline")},E=b.transformer({tags:[{name:k.pattern(/ol|ul/),mutate:e.properlyNest}]}),F=b.transformer({tags:[{name:k.exact("b"),mutate:f.curry(e.changeTag,"strong")},{name:k.exact("i"),mutate:f.curry(e.changeTag,"em")},{name:k.exact("u"),mutate:D},{name:k.exact("s"),mutate:f.curry(e.changeTag,"strike")},{name:k.exact("font"),mutate:e.fontToSpan,debug:!0}]}),G=b.removal({classes:[{name:k.exact("ephox-limbo-transform")}]}),H=b.removal({attributes:[{name:k.exact("href"),value:k.starts("file:///"),debug:!0}]});return{unwrapWordTags:l,removeWordAttributes:n,parseLists:m,removeExcess:p,cleanStyles:s,cleanClasses:t,mergeStyles:u,mergeClasses:v,removeLocalImages:w,removeVacantLinks:x,removeEmptyStyle:y,removeEmptyClass:z,pruneInlineTags:A,unwrapSingleParagraphsInlists:B,addPlaceholders:C,nestedListFixes:E,inlineTagFixes:F,cleanupFlags:G,removeLocalLinks:H,removeAnchors:o,none:f.noop}}),g("6k",["g","5a","7h","6m","7k","7l","p","k"],function(a,b,c,d,e,f,g,h){var i=function(a){return a.browser.isIE()&&a.browser.version.major>=11},j=function(a){return f(function(b,c,d){var e=a(h.fromDom(c.getNode())).fold(function(){return c},function(a){return d(c,a.dom())});b.emit(e)},g.noop,"image filters")},k=function(a,e,f){var g=f.browser.isFirefox()||f.browser.isSpartan()?b.local:b.vshape,h=i(f)?c.none:d.pipeline([j(g)]),k=g===b.local?c.none:c.removeLocalImages,l=a?h:c.none;return{annotate:[l],local:[k]}},l=function(a,b){var d=i(b)&&a;return d?[c.unwrapSingleParagraphsInlists]:[]},m=function(a,b,d){var e=[c.mergeStyles,c.mergeClasses],f=[c.cleanStyles,c.cleanClasses];return b?e:f},n=function(a,b,c){return i(c)||!a?[]:[e.preprocess]},o=function(a,b,d){if(!a)return[c.none];var e=[c.unwrapWordTags],f=i(d)?[]:c.parseLists;return e.concat(f).concat([c.removeWordAttributes])},p=function(a,b,d){return a?[c.removeAnchors]:[c.none]},q=function(b,d,e){var f=k(b,d,e);return a.flatten([n(b,d,e),f.annotate,[c.inlineTagFixes],o(b,d,e),[c.nestedListFixes],[c.removeExcess],p(b,d,e),f.local,m(b,d,e),[c.removeLocalLinks,c.removeVacantLinks],[c.removeEmptyStyle],[c.removeEmptyClass],[c.pruneInlineTags],[c.addPlaceholders],l(b,e),[c.cleanupFlags]])};return{derive:q}}),g("8q",[],function(){return["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"]}),g("87",["8q","g","p","j","3n","5d","k","1x","29","1d","3o","6r","1y","2a","20","8p","3f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){return function(){var r=function(a){return g.fromDom(a.dom().cloneNode(!1))},s=function(c){return!!j.isElement(c)&&("body"===j.name(c)||b.contains(a,j.name(c)))},t=function(a){return!!j.isElement(a)&&b.contains(["br","img","hr"],j.name(a))},u=function(a,b){return a.dom().compareDocumentPosition(b.dom())},v=function(a,b){var c=d.clone(a);d.setAll(b,c)};return{up:c.constant({selector:o.ancestor,closest:o.closest,predicate:l.ancestor,all:q.parents}),down:c.constant({selector:n.descendants,predicate:k.descendants}),styles:c.constant({get:f.get,getRaw:f.getRaw,set:f.set,remove:f.remove}),attrs:c.constant({get:d.get,set:d.set,remove:d.remove,copyTo:v}),insert:c.constant({before:h.before,after:h.after,afterAll:i.after,append:h.append,appendAll:i.append,prepend:h.prepend,wrap:h.wrap}),remove:c.constant({unwrap:m.unwrap,remove:m.remove}),create:c.constant({nu:g.fromTag,clone:r,text:g.fromText}),query:c.constant({comparePosition:u,prevSibling:q.prevSibling,nextSibling:q.nextSibling}),property:c.constant({children:q.children,name:j.name,parent:q.parent,isText:j.isText,isElement:j.isElement,getText:p.get,setText:p.set,isBoundary:s,isEmptyTag:t}),eq:e.eq,is:e.is}}}),g("8z",["2c"],function(a){return a.immutable("word","pattern")}),g("90",["2c"],function(a){var b=a.immutable("element","offset"),c=a.immutable("element","deltaOffset"),d=a.immutable("element","start","finish"),e=a.immutable("begin","end"),f=a.immutable("element","text");return{point:b,delta:c,range:d,points:e,text:f}}),g("9n",["p","n"],function(a,b){var c=a.constant(!1),d=a.constant(!0),e=function(a,b){return h(function(c,d,e){return c(a,b)})},f=function(a,b){return h(function(c,d,e){return d(a,b)})},g=function(a,b){return h(function(c,d,e){return e(a,b)})},h=function(e){var f=function(){return e(d,c,c)},g=function(){return e(b.none,b.none,function(a,c){return b.some(a)})},h=function(a){return e(c,c,function(b,c){return c.eq(b,a)})},i=function(){return e(a.constant(0),a.constant(1),function(a,b){return b.property().getText(a).length})};return{isBoundary:f,fold:e,toText:g,is:h,len:i}},i=function(a,b,c,d){return a.fold(b,c,d)};return{text:g,boundary:e,empty:f,cata:i}}),g("9o",["g","p"],function(a,b){var c=function(c,d,e,f){var g=a.findIndex(c,b.curry(f,d)),h=g>-1?g:0,i=a.findIndex(c,b.curry(f,e)),j=i>-1?i+1:c.length;return c.slice(h,j)};return{boundAt:c}}),g("9p",["g"],function(a){var b=function(b,c){var d=a.findIndex(b,c);return b.slice(0,d)};return{sliceby:b}}),g("9r",["1m"],function(a){var b=a.generate([{include:["item"]},{excludeWith:["item"]},{excludeWithout:["item"]}]),c=function(a,b,c,d){return a.fold(b,c,d)};return{include:b.include,excludeWith:b.excludeWith,excludeWithout:b.excludeWithout,cata:c}}),g("9q",["g","9r"],function(a,b){var c=function(a,c){return d(a,function(a){return c(a)?b.excludeWithout(a):b.include(a)})},d=function(c,d){var e=[],f=[];return a.each(c,function(a){var c=d(a);b.cata(c,function(){f.push(a)},function(){f.length>0&&e.push(f),e.push([a]),f=[]},function(){f.length>0&&e.push(f),f=[]})}),f.length>0&&e.push(f),e};return{splitby:c,splitbyAdv:d}}),g("9b",["9o","9p","9q"],function(a,b,c){var d=function(b,c,d,e){return a.boundAt(b,c,d,e)},e=function(a,b){return c.splitby(a,b)},f=function(a,b){return c.splitbyAdv(a,b)},g=function(a,c){return b.sliceby(a,c)};return{splitby:e,splitbyAdv:f,sliceby:g,boundAt:d}}),g("92",["g","p","n","90","9b"],function(a,b,c,d,e){var f=function(b){return a.foldr(b,function(a,b){return b.len()+a},0)},g=function(a,b){return e.sliceby(a,function(a){return a.is(b)})},h=function(a,b){return a.fold(c.none,function(a){return c.some(d.range(a,b,b+1))},function(e){return c.some(d.range(e,b,b+a.len()))})},i=function(c){return a.bind(c,function(a){return a.fold(b.constant([]),b.constant([]),function(a){return[a]})})};return{count:f,dropUntil:g,gen:h,justText:i}}),g("9w",["g","90","9n","92"],function(a,b,c,d){var e=function(b,d,f){if(b.property().isText(d))return[c.text(d,b)];if(b.property().isEmptyTag(d))return[c.empty(d,b)];if(b.property().isElement(d)){var g=b.property().children(d),h=b.property().isBoundary(d)?[c.boundary(d,b)]:[],i=void 0!==f&&f(d)?[]:a.bind(g,function(a){return e(b,a,f)});return h.concat(i).concat(h)}return[]},f=function(b,c,d){var f=e(b,c,d),g=function(a,b){return a};return a.map(f,function(a){return a.fold(g,g,g)})},g=function(a,c,f,g,h){var i=e(a,g,h),j=d.dropUntil(i,c),k=d.count(j);return b.point(g,k+f)},h=function(a,c,d,e){return a.property().parent(c).fold(function(){return b.point(c,d)},function(b){return g(a,c,d,b,e)})},i=function(a,c,d,e,f){return a.up().predicate(c,e).fold(function(){return b.point(c,d)},function(b){return g(a,c,d,b,f)})};return{typed:e,items:f,extractTo:i,extract:h}}),g("9x",["g","p","9w"],function(a,b,c){var d="\n",e=" ",f=function(a,b){return"img"===b.property().name(a)?e:d},g=function(e,g,h){var i=c.typed(e,g,h);return a.map(i,function(a){return a.fold(b.constant(d),f,e.property().getText)}).join("")};return{from:g}}),g("9d",["g","p"],function(a,b){var c=function(c,d,e){var f={len:void 0!==e?e:0,list:[]},g=a.foldl(c,function(a,c){var e=d(c,a.len);return e.fold(b.constant(a),function(b){return{len:b.finish(),list:a.list.concat([b])}})},f);return g.list};return{make:c}}),g("9e",["g","n"],function(a,b){var c=function(a,b){return b>=a.start()&&b<=a.finish()},d=function(d,e){var f=a.find(d,function(a){return c(a,e)});return b.from(f)},e=function(b,c){return a.findIndex(b,function(a){return a.start()===c})},f=function(a,b){var c=a[a.length-1]&&a[a.length-1].finish()===b;return c?a.length+1:-1},g=function(a,b,c){var d=e(a,b),g=e(a,c),h=g>-1?g:f(a,c);return d>-1&&h>-1?a.slice(d,h):[]},h=function(c,d){return b.from(a.find(c,d))};return{get:d,find:h,inUnit:c,sublist:g}}),g("9g",["g","1l","p"],function(a,b,c){var d=function(d,e){return a.map(d,function(a){return b.merge(a,{start:c.constant(a.start()+e),finish:c.constant(a.finish()+e)})})};return{translate:d}}),g("9f",["g","9e","9g"],function(a,b,c){var d=function(a,b,d){var e=d(a,b);return c.translate(e,a.start())},e=function(c,e,f){return 0===e.length?c:a.bind(c,function(c){var g=a.bind(e,function(a){return b.inUnit(c,a)?[a-c.start()]:[]});return g.length>0?d(c,g,f):[c]})};return{splits:e}}),g("94",["9d","9e","9f","9g"],function(a,b,c,d){var e=function(b,c,d){return a.make(b,c,d)},f=function(a,c){return b.get(a,c)},g=function(a,c){return b.find(a,c)},h=function(a,b,d){return c.splits(a,b,d)},i=function(a,b){return d.translate(a,b)},j=function(a,c,d){return b.sublist(a,c,d)};return{generate:e,get:f,find:g,splits:h,translate:i,sublist:j}}),g("9y",["90","9w","92","94"],function(a,b,c,d){var e=function(e,f,g,h){var i=b.typed(e,f,h),j=d.generate(i,c.gen),k=d.get(j,g);return k.map(function(b){return a.point(b.element(),g-b.start())})};return{find:e}}),g("9m",["9w","9x","9y"],function(a,b,c){var d=function(b,c,d){return a.typed(b,c,d)},e=function(b,c,d){return a.items(b,c,d)},f=function(b,c,d,e){return a.extract(b,c,d,e)},g=function(b,c,d,e,f){return a.extractTo(b,c,d,e,f)},h=function(a,b,d,e){return c.find(a,b,d,e)},i=function(a,c,d){return b.from(a,c,d)};return{extract:f,extractTo:g,all:e,from:d,find:h,toText:i}}),g("99",["g","9m","9n","9b","9r"],function(a,b,c,d,e){var f=function(f,g,h){var i=a.bind(g,function(a){return b.from(f,a,h)}),j=d.splitbyAdv(i,function(a){return c.cata(a,function(){return e.excludeWithout(a)},function(){return e.excludeWith(a)},function(){return e.include(a)})});return a.filter(j,function(a){return a.length>0})};return{group:f}}),g("9s",["g","n"],function(a,b){var c=function(c,d,e){var f=[d].concat(c.up().all(d)),g=[e].concat(c.up().all(e)),h=a.find(f,function(b){return a.exists(g,function(a){return c.eq(a,b)})});return b.from(h)};return{common:c}}),g("9t",["g"],function(a){var b=["table","tbody","thead","tfoot","tr","ul","ol"];return function(c){var d=c.property(),e=function(b,c){return d.parent(b).map(d.name).map(function(b){return!a.contains(c,b)}).getOr(!1)},f=function(a){return d.isText(a)&&e(a,b)};return{validateText:f}}}),g("9a",["g","p","9m","9s","9t"],function(a,b,c,d,e){var f=function(c,d,e){return a.findIndex(d,b.curry(c.eq,e))},g=function(a,b,c,d,e){return b<d?a.slice(b+c,d+e):a.slice(d+e,b+c)},h=function(h,i,j,k,l){return h.eq(i,k)?[i]:d.common(h,i,k).fold(function(){return[]},function(d){var m=[d].concat(c.all(h,d,b.constant(!1))),n=f(h,m,i),o=f(h,m,k),p=n>-1&&o>-1?g(m,n,j,o,l):[],q=e(h);return a.filter(p,q.validateText)})};return{range:h}}),g("91",["99","9a"],function(a,b){var c=function(a,c,d,e,f){return b.range(a,c,d,e,f)},d=function(b,c,d){return a.group(b,c,d)};return{range:c,group:d}}),g("9z",[],function(){var a=function(a){var b=/^[a-zA-Z]/.test(a)?"":"e",c=a.replace(/[^\w]/gi,"-");return b+c};return{css:a}}),g("a0",["g"],function(a){var b=function(b,c){if(0===c.length)return[b];var d=a.foldl(c,function(a,c){if(0===c)return a;var d=b.substring(a.prev,c);return{prev:c,values:a.values.concat([d])}},{prev:0,values:[]}),e=c[c.length-1];return e<b.length?d.values.concat(b.substring(e)):d.values};return{splits:b}}),g("9u",["9z","a0"],function(a,b){var c=function(a,c){return b.splits(a,c)},d=function(b){return a.css(b)};return{cssSanitise:d,splits:c}}),g("9c",["g","n","90","94","9u"],function(a,b,c,d,e){var f=function(f,g,h){var i=f.property().getText(g),j=a.filter(e.splits(i,h),function(a){return a.length>0});if(j.length<=1)return[c.range(g,0,i.length)];f.property().setText(g,j[0]);var k=d.generate(j.slice(1),function(a,d){var e=f.create().text(a),g=c.range(e,d,d+a.length);return b.some(g)},j[0].length),l=a.map(k,function(a){return a.element()});return f.insert().afterAll(g,l),[c.range(g,0,j[0].length)].concat(k)};return{subdivide:f}}),g("93",["g","p","9c","94"],function(a,b,c,d){var e=function(e,f,g){var h=a.bind(g,function(a){return[a.start(),a.finish()]}),i=function(a,b){return c.subdivide(e,a.element(),b)},j=d.splits(f,h,i),k=function(c){var f=d.sublist(j,c.start(),c.finish()),g=a.map(f,function(a){return a.element()}),h=a.map(g,e.property().getText).join("");return{elements:b.constant(g),word:c.word,exact:b.constant(h)}};return a.map(g,k)};return{separate:e}}),g("8s",[],function(){var a=function(){return"\ufeff"};return{zeroWidth:a}}),g("89",["8s","p"],function(a,b){var c="\\w'\\-\\u0100-\\u017F\\u00C0-\\u00FF"+a.zeroWidth()+"\\u2018\\u2019",d="[^"+c+"]",e="["+c+"]";return{chars:b.constant(c),wordbreak:b.constant(d),wordchar:b.constant(e)}}),g("8a",["4v"],function(a){return function(b,c,d,e){var f=function(){return new a(b,e.getOr("g"))};return{term:f,prefix:c,suffix:d}}}),g("8c",["p","n","89","8a"],function(a,b,c,d){var e=function(c){return d(c,a.constant(0),a.constant(0),b.none())},f=function(a){var e="((?:^'?)|(?:"+c.wordbreak()+"+'?))"+a+"((?:'?$)|(?:'?"+c.wordbreak()+"+))",f=function(a){return a.length>1?a[1].length:0},g=function(a){return a.length>2?a[2].length:0};return d(e,f,g,b.none())};return{token:e,word:f}}),g("8b",["8c"],function(a){var b=function(a){return a.replace(/[-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},c=function(c){var d=b(c);return a.word(d)},d=function(c){var d=b(c);return a.token(d)};return{sanitise:b,word:c,token:d}}),g("7n",["89","8a","8b","8c"],function(a,b,c,d){var e=function(a){return c.word(a)},f=function(a){return c.token(a)},g=function(a,c,d,e){return b(a,c,d,e)},h=function(a){return d.word(a)},i=function(a){return d.token(a)},j=function(a){return c.sanitise(a)},k=function(){return a.chars()},l=function(){return a.wordbreak()},m=function(){return a.wordchar()};return{safeword:e,safetoken:f,custom:g,unsafeword:h,unsafetoken:i,sanitise:j,chars:k,wordbreak:l,wordchar:m}}),g("9h",["p"],function(a){var b=function(b,c){for(var d=c.term(),e=[],f=d.exec(b);f;){var g=f.index+c.prefix(f),h=f[0].length-c.prefix(f)-c.suffix(f);e.push({start:a.constant(g),finish:a.constant(g+h)}),d.lastIndex=g+h,f=d.exec(b)}return e};return{all:b}}),g("9i",["g","1l","9h","12"],function(a,b,c,d){var e=function(a){var b=d.prototype.slice.call(a,0);return b.sort(function(a,b){return a.start()<b.start()?-1:b.start()<a.start()?1:0}),b},f=function(d,f){var g=a.bind(f,function(e){var f=c.all(d,e.pattern());return a.map(f,function(a){return b.merge(e,{start:a.start,finish:a.finish})})});return e(g)};return{search:f}}),g("95",["9h","9i"],function(a,b){var c=function(b,c){return a.all(b,c)},d=function(a,c){return b.search(a,c)};return{findall:c,findmany:d}}),g("8r",["g","n","8z","90","91","92","93","7n","94","95"],function(a,b,c,d,e,f,g,h,i,j){var k=function(a,c){return i.generate(c,function(c,e){var f=e+a.property().getText(c).length;return b.from(d.range(c,e,f))})},l=function(b,c,d,h){var i=e.group(b,c,h),l=a.bind(i,function(c){var e=f.justText(c),h=a.map(e,b.property().getText).join(""),i=j.findmany(h,d),l=k(b,e);return g.separate(b,l,i)});return l},m=function(b,d,e,f){var g=a.map(e,function(a){var b=h.safeword(a);return c(a,b)});return l(b,d,g,f)},n=function(a,b,d,e){var f=c(d,h.safetoken(d));return l(a,b,[f],e)};return{safeWords:m,safeToken:n,run:l}}),g("88",["8r"],function(a){var b=function(b,c,d,e){return a.run(b,c,d,e)},c=function(b,c,d,e){return a.safeWords(b,c,d,e)},d=function(b,c,d,e){return a.safeToken(b,c,d,e)};return{safeWords:c,safeToken:d,run:b}}),g("7m",["87","88"],function(a,b){var c=a(),d=function(a,d,e){return b.run(c,a,d,e)},e=function(a,d,e){return b.safeWords(c,a,d,e)},f=function(a,d,e){return b.safeToken(c,a,d,e)};return{safeWords:e,safeToken:f,run:d}}),g("1z",["20"],function(a){var b=function(b){return a.first(b).isSome()},c=function(b,c,d){return a.ancestor(b,c,d).isSome()},d=function(b,c){return a.sibling(b,c).isSome()},e=function(b,c){return a.child(b,c).isSome()},f=function(b,c){return a.descendant(b,c).isSome()},g=function(b,c,d){return a.closest(b,c,d).isSome()};return{any:b,ancestor:c,sibling:d,child:e,descendant:f,closest:g}}),g("6l",["g","n","7m","7n","2c","j","5d","k","1x","29","1d","1z","7o","3f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\.\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w\.]+@)[A-Za-z0-9\.\-]+)(:[0-9]+)?((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-_.~*+=!&;:'%@?^${}()\w,]*)#?(?:[\-_.~*+=!&;:'%@?^${}()\w,\/]*))?)/g,p=o.source,q=3,r=9,s=function(a){var b=e.immutable("word","pattern"),f=d.unsafetoken(p),g=b("__INTERNAL__",f);return c.run(a,[g])},t=function(a){return!l.closest(a,"a")},u=function(a){return b.from(a[0]).filter(t).map(function(b){var c=h.fromTag("a");return i.before(b,c),j.append(c,a),f.set(c,"href",m.get(c)),c})},v=function(b){var c=s(b);a.each(c,function(a){var b=a.exact();(b.indexOf("@")<0||w(b))&&u(a.elements())})},w=function(a){var b=a.indexOf("://");return b>=q&&b<=r},x=function(b){a.each(b,function(a){k.isElement(a)&&g.getRaw(a,"position").isSome()&&g.remove(a,"position")})},y=function(b){var c=a.filter(b,function(a){return"li"===k.name(a)});if(c.length>0){var d=n.prevSiblings(c[0]),e=h.fromTag("ul");if(i.before(b[0],e),d.length>0){var f=h.fromTag("li");i.append(e,f),j.append(f,d)}j.append(e,c)}};return{links:v,position:x,list:y}}),g("55",["g","6k","6l","6m","6h","3f"],function(a,b,c,d,e,f){var g=function(b){var d=f.children(b);a.each([c.links,c.position,c.list],function(a){a(d)})},h=function(a,c,f,h,i){g(f);var j=e.get(f),k=b.derive(i,h,c);return d.go(a,j,k)};return{go:h,preprocess:g}}),g("6i",["4q","4r","4y","2w","2t","55","2f","28","1f"],function(a,b,c,d,e,f,g,h,i){var j=e.detect(),k=function(a,b,c,d){try{var e=f.go(a,j,b,c,d),k=void 0!==e&&null!==e&&e.length>0,l=k?h.fromHtml(e):[];return g.value(l)}catch(m){return i.error(m),g.error("errors.paste.process.failure")}},l=function(e,f,g,h,i){var j=k(e,f,h,g);return j.fold(function(b){return a.error(b)},function(e){return a.sync(function(f){i.get(function(g){var h=c.findImages(e,g);a.call(f,{response:d.paste(e,g,h),bundle:b.nu({})})})})})};return{transfer:l}}),g("53",["6i","g","o","n","1y","3f"],function(a,b,c,d,e,f){var g=function(b,c,d,e,f){return a.transfer(b,c,e,d,f)},h=function(g,h,i){var j=!1,k=!0,l=function(a,b){return void 0===h||b?d.none():h.findClipboardTags(f.children(a))},m=l(i,j).getOr([]);b.each(m,e.remove);var n=c.nu(function(a){a([])});return a.transfer(g,i,j,k,n)};return{internal:h,external:g}}),g("6j",["g","k","6h","7o"],function(a,b,c,d){var e=function(a){var e=b.fromTag("div");return d.set(e,a),c.get(e)},f=function(b){var c=b.trim().split(/\n{2,}|(?:\r\n){2,}/),d=a.map(c,function(a){return a.split(/\n|\r\n/).join("<br />")});return 1===d.length?d[0]:a.map(d,function(a){return"<p>"+a+"</p>"}).join("")};return{encode:e,convert:f}}),g("54",["4q","6j","4r","31","2w","n","23","28","11"],function(a,b,c,d,e,f,g,h,i){var j=function(a){return a.length>0},k=function(a){return d.isValidData(a)?g.findMap(a.types,function(b){return"text/plain"===b?f.some(a.getData(b)):f.none()}):f.none()},l=function(){var a=i.clipboardData;return void 0!==a?f.some(a.getData("text")):f.none()},m=function(a){var c=b.encode(a),d=b.convert(c),f=h.fromHtml(d);return e.paste(f,[],[])},n=function(b){return a.sync(function(f){var g=d.isValidData(b)?k:l,h=g(b).filter(j).fold(e.cancel,m);a.call(f,{response:h,bundle:c.nu({})})})};return{handle:n}}),g("34",["4q","4r","4z","51","52","53","54","2w","2t","55","p","k","29","3f","1f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p=i.detect(),q=function(a,b,c){return g.handle(a)},r=function(b,c){var d=function(b,d,e){var f=l.fromTag("div");m.append(f,b),j.preprocess(f);var g=n.children(f);return a.pure({response:h.paste(g,d,e),bundle:c.bundle()})},e=k.curry(a.pass,c);return h.cata(c.response(),e,d,e,d)},s=function(a,b){return function(d,e){var g=e.bundle();return c.proxyBin(g).handle("There was no proxy bin setup. Ensure you have run proxyStep first.",function(c){var d=n.owner(a);return f.internal(d,b,c)})}},t=function(a,b){return function(d,e){var g=e.bundle();return c.proxyBin(g).handle("There was no proxy bin setup. Ensure you have run proxyStep first.",function(d){var e=c.merging(g),h=c.isWord(g),i=c.isInternal(g),j=c.backgroundAssets(g),k=n.owner(a);return i?f.internal(k,b,d):f.external(k,d,e,h,j)})}},u=function(){return function(b,c){return a.error("errors.local.images.disallowed")}},v=function(){return function(b,c){if(p.browser.isSafari()){var d=p.deviceType.isWebView()?"webview.imagepaste":"safari.imagepaste";return a.error(d)}return e.handle(b)}},w=function(a){return function(b,e){var f=c.mergeOffice(e.bundle());return d.handle(b,f,a)}},x=function(b,c){return a.cancel()},y=function(c){return function(d,e){var f=b.merge(e.bundle(),b.nu(c));return a.pure({response:e.response(),bundle:f})}};return{plain:q,autolink:r,noImages:u,images:v,internal:s,external:t,gwt:w,setBundle:y,none:x}}),g("56",["5c","p"],function(a,b){var c=a.resolve("smartpaste-eph-bin");return{binStyle:b.constant(c)}}),g("57",["6m","j","6h","6n"],function(a,b,c,d){var e=function(a,c){return d.descendant(a,function(a){return!!b.has(a,"style")&&b.get(a,"style").indexOf("mso-")>-1})},f=function(b,d){var e=c.get(b);return a.isWordContent(e,d)},g=function(a,b){var c=a.browser,d=c.isIE()&&c.version.major>=11?e:f;return d(b,a)};return{isWord:g}}),g("35",["4q","4r","56","2t","57","27","3f"],function(a,b,c,d,e,f,g){var h=d.detect();return function(d,i,j,k,l){return function(m,n){var o=l(),p=n.response();return a.sync(function(l){var n=d(j);n.events.after.bind(function(d){var j=d.container();i(j),f.add(j,c.binStyle());var m=e.isWord(h,j),n=g.children(j),q=k.findClipboardTags(n,m).isSome();a.call(l,{response:p,bundle:b.nu({isWord:m,isInternal:q,proxyBin:j,backgroundAssets:o})})}),o.convert(m.data()),n.run()})}}}),g("8d",["78","79","12","62","13","8o"],function(a,b,c,d,e,f){var g=function(a){for(var b=new c(a.length/2),e=0;e<a.length;e+=2){var g=a.substr(e,2),h=d.floor(e/2);b[h]=f(g,16)}return b},h=function(c,d){if(0===c.length)throw"Zero length content passed to Hex conversion";var e=g(c),f=b(e);return a([f],{type:d})};return{convert:h}}),g("7q",["1m"],function(a){var b=a.generate([{unsupported:["id","message"]},{supported:["id","contentType","blob"]}]),c=function(a,b,c){return a.fold(b,c)};return{unsupported:b.unsupported,supported:b.supported,cata:c}}),g("8e",["p","n"],function(a,b){var c="{\\pict{",d="i",e="{\\shp{",f="s",g=function(a,b,c){return b.indexOf(a,c)},h=function(c,d,e,f,g){return c===-1||d===-1?b.none():b.some({start:a.constant(c),end:a.constant(d),bower:e,regex:a.constant(f),idRef:a.constant(g)})},i=function(a,b,c){return function(){return a.substring(b,c)}},j=function(a,b){if(b===-1)return b;var c,d,e=0,f=a.length;do if(c=a.indexOf("{",b),d=a.indexOf("}",b),d>c&&c!==-1?(b=c+1,++e):(c>d||c<0)&&d!==-1&&(b=d+1,--e),b>f||d===-1)return-1;while(e>0);return b},k=function(a,b,c,e){var f=i(a,c,e),g=/[^a-fA-F0-9]([a-fA-F0-9]+)\}$/;return h(c,e,f,g,d)},l=function(a,b,c,d){var e=i(a,c,d),g=/([a-fA-F0-9]{64,})(?:\}.*)/;return h(c,d,e,g,f)},m=function(d,f){var h=g(c,d,f),i=j(d,h),m=g(e,d,f),n=j(d,m),o=a.curry(l,d,f,m,n),p=a.curry(k,d,f,h,i);return h===-1&&m===-1?b.none():h===-1?o():m===-1?p():m<h&&n>i?p():h<m&&i>n?o():h<m?p():m<h?o():b.none()};return{identify:m,endBracket:j}}),g("7p",["8d","7q","8e","n","2f"],function(a,b,c,d,e){var f=function(a,b){return c.identify(a,b)},g=function(a){return a.indexOf("\\pngblip")>=0?e.value("image/png"):a.indexOf("\\jpegblip")>=0?e.value("image/jpeg"):e.error("errors.imageimport.unsupported")},h=function(a){return a.replace(/\r/g,"").replace(/\n/g,"")},i=function(a,b){var c=a.match(b);return c&&c[1]&&c[1].length%2===0?e.value(c[1]):e.error("errors.imageimport.invalid")},j=function(a){var b=a.match(/\\shplid(\d+)/);return null!==b?d.some(b[1]):d.none()},k=function(c){var d=c.bower(),e=c.regex();return j(d).map(function(f){var h=c.idRef()+f;return g(d).fold(function(a){return b.unsupported(h,a)},function(c){return i(d,e).fold(function(a){return b.unsupported(h,a)},function(d){return b.supported(h,c,a.convert(d,c))})})})},l=function(a){for(var b=[],c=function(){return a.length},d=function(a){var c=k(a);return b=b.concat(c.toArray()),a.end()},e=0;e<a.length;)e=f(a,e).fold(c,d);return b},m=function(a){var b=h(a);return l(b)};return{nextBower:f,extractId:j,extractContentType:g,extractHex:i,images:m}}),g("6o",["7p","7q","2f"],function(a,b,c){var d=function(b){return a.images(b)},e=function(a){return b.cata(a,function(a,b){return a},function(a,b,c){return a})},f=function(a){return b.cata(a,function(a,b){return c.error(b)},function(a,b,d){return c.value(d)})};return{images:d,toId:e,toBlob:f}}),g("6p",["6o","4y","g","i","n","j","27","1f"],function(a,b,c,d,e,f,g,h){var i=function(b,d,f){var g=c.find(d,function(c){return a.toId(c)===b});return e.from(g)},j=function(a,b,c){return e.from(b[c])},k={local:j,code:i},l=function(b){var d=[],e=function(b){return!c.exists(d,function(c){return a.toId(c)===b})};return c.bind(b,function(b){var c=a.toId(b);return e(c)?(d.push(b),[b]):[]})},m=function(i,j,m,n){var o=l(j),p=[],q=!1,r=c.bind(i,function(b,c){var d=f.get(b,"data-image-type"),i=f.get(b,"data-image-id");g.remove(b,"rtf-data-image"),f.remove(b,"data-image-type"),f.remove(b,"data-image-id");var j=void 0!==k[d]?k[d]:e.none;return j(i,o,c).fold(function(){return h.log("WARNING: unable to find data for image ",b.dom()),[]},function(c){return a.toBlob(c).fold(function(a){return q=!0,f.set(b,"alt",n(a)),[]},function(a){return p.push(b),[a]})})});d.multiple(r).get(function(a){var c=b.updateSources(a,p);m(a,c,q)})};return{convert:m}}),g("59",["6o","6p","5a","21","22","3f"],function(a,b,c,d,e,f){return function(g){var h=g.translations,i=e.create({insert:d(["elements","assets","correlated"]),incomplete:d(["elements","assets","correlated","message"])}),j=function(d,e,g,j,k){var l=a.images(j),m=c.find(d);b.convert(m,l,function(a,b,c){var h=f.children(d),j=a.concat(e),l=b.concat(g);c?i.trigger.incomplete(h,j,l,"errors.imageimport.failed"):i.trigger.insert(h,j,l),k()},h)};return{events:i.registry,processRtf:j}}}),g("58",["59","g","5a","21","22","1y","3f"],function(a,b,c,d,e,f,g){return function(h,i){var j=e.create({error:d(["message"]),insert:d(["elements","assets","correlated"]),incomplete:d(["elements","assets","correlated","message"])}),k=a(i);k.events.incomplete.bind(function(a){j.trigger.incomplete(a.elements(),a.assets(),a.correlated(),a.message())}),k.events.insert.bind(function(a){j.trigger.insert(a.elements(),a.assets(),a.correlated())});var l=function(a,d,e){var l=function(b){k.processRtf(a,d,e,b.rtf(),b.hide())},m=function(h){var i=c.find(a);b.each(i,f.remove),j.trigger.incomplete(g.children(a),d,e,h)},n=function(){var h=c.find(a);b.each(h,f.remove),j.trigger.insert(g.children(a),d,e)},o=function(a){m(a.message())};if(i.allowLocalImages===!0&&i.enableFlashImport===!0){var p=h(i);p.events.response.bind(l),p.events.cancel.bind(n),p.events.failed.bind(o),p.events.error.bind(o),p.open()}else m("errors.local.images.disallowed")};return{events:j.registry,gordon:l}}}),g("36",["4q","4r","58","59","2w","g","5a","p","n","z","k","29","1y","3f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){return function(o,p){var q=c(o,p),r=d(p),s=j(i.none()),t=function(c){s.get().each(function(d){a.call(d,{response:c,bundle:b.nu({})})})};return q.events.insert.bind(function(a){t(e.paste(a.elements(),a.assets(),a.correlated()))}),q.events.incomplete.bind(function(a){t(e.incomplete(a.elements(),a.assets(),a.correlated(),a.message()))}),q.events.error.bind(function(a){var b=a.message(),c=e.error(b);t(c)}),r.events.insert.bind(function(a){t(e.paste(a.elements(),a.assets(),a.correlated()))}),r.events.incomplete.bind(function(a){t(e.incomplete(a.elements(),a.assets(),a.correlated(),a.message()))}),function(b,c){return a.sync(function(d){var j=function(){a.call(d,{response:c.response(),bundle:c.bundle()})},o=function(a,c,o){s.set(i.some(d));var u=k.fromTag("div");l.append(u,a),b.rtf().fold(function(){g.exists(u)?q.gordon(u,c,o):j()},function(a){if(p.allowLocalImages===!0)r.processRtf(u,c,o,a,h.noop);else{var b=g.find(u),d=n.children(u);b.length>0?(f.each(b,m.remove),t(e.incomplete(d,c,o,"errors.local.images.disallowed"))):t(e.paste(d,c,o))}})};e.cata(c.response(),j,o,j,o)})}}}),g("1p",["2z","30","31","32","33","34","35","36","2t","p","n","2c","37","11"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=l.immutable("data","rtf"),p=i.detect(),q="^image/",r="file",s=[q,r],t="html",u="rtf",v=function(a){return m.contains(a,"<html")&&(m.contains(a,'xmlns:o="urn:schemas-microsoft-com:office:office"')||m.contains(a,'xmlns:x="urn:schemas-microsoft-com:office:excel"'))},w=function(a){var b=a.clipboardData;return c.isValidData(b)?c.getFlavor(b.types,t).bind(function(c){var d=b.getData(c.type);return v(d)?k.some(o(d,C(a))):k.none()}):k.none()},x=function(a){return o(a,k.none())},y=function(a){if(p.browser.isIE()||p.browser.isFirefox())return k.none();if(c.isValidData(a.clipboardData)){var b=a.clipboardData;return c.getPreferredFlavor(s,b.types).map(function(a){return b.items; -})}return k.none()},z=function(a,b){var d=c.isValidData(b.clipboardData)?b.clipboardData.types:[];return c.getFlavor(d,a.clipboardType()).map(function(a){return o(b,k.none())})},A=function(a){return p.browser.isIE()?k.some(n.clipboardData):c.isValidData(a.clipboardData)?k.some(a.clipboardData):k.none()},B=function(a){if(p.browser.isSpartan())return k.none();var b=a.clipboardData,d=c.isValidData(b)?b.types:[];return 1===d.length&&"text/plain"===d[0]?k.some(b):k.none()},C=function(a){var b=a.clipboardData;return c.isValidData(b)?c.getFlavor(b.types,u).bind(function(a){var c=b.getData(a.type);return c.length>0?k.some(c):k.none()}):k.none()},D=function(a,b,c,d){return{label:j.constant(a),getAvailable:b,steps:j.constant(c),capture:j.constant(d)}},E=function(c,d,h,i){var k=j.curry(z,i);return D("Within Textbox.io (tables) pasting",k,[a.normal(g(d,c,h,i,b.ignore)),a.normal(e.fixed(!0,!0)),a.normal(f.internal(h,i))],!1)},F=function(c,i,j,k,l,m,n){return D("Outside of Textbox.io pasting (could be internal but another browser)",x,[a.normal(g(k,j,l,n,b.background)),a.normal(e.fromConfigIfExternal(c,i)),a.normal(f.external(l,n)),a.blocking(h(m,i)),a.normal(d(i))],!1)},G=function(b,c,d,g){return D("GWT pasting",w,[a.normal(f.setBundle({isWord:!0})),a.normal(e.fromConfig(c,d)),a.normal(f.gwt(b)),a.blocking(h(g,d))],!0)},H=function(b){return D("Image pasting",y,[a.normal(b.allowLocalImages===!1?f.noImages(j.noop):f.images())],!0)},I=function(){return D("Only plain text is available to paste",B,[a.normal(f.plain),a.normal(f.autolink)],!0)},J=function(){return D("Plain text pasting",A,[a.normal(f.plain),a.normal(f.autolink)],!0)},K=function(){return D("There is no valid way to paste",k.some,[a.normal(f.none)],!1)};return{internal:E,pastiche:F,gwt:G,image:H,text:J,onlyText:I,none:K}}),g("5b",["5c","2t","j","27","k","6h","29"],function(a,b,c,d,e,f,g){var h=function(){var a=b.detect(),c=a.os.isOSX();return c?["\u2318"]:["Ctrl"]},i=function(a){return e.fromHtml("<p>"+a("cement.dialog.flash.press-escape")+"</p>")},j=function(b){var c=e.fromTag("div");d.add(c,a.resolve("flashbin-helpcopy"));var f=h(),j=e.fromHtml("<p>"+b("cement.dialog.flash.trigger-paste")+"</p>"),k=e.fromHtml('<div><span class="ephox-polish-help-kbd">'+f+'</span> + <span class="ephox-polish-help-kbd">V</span></div>');return d.add(k,a.resolve("flashbin-helpcopy-kbd")),g.append(c,[j,k,i(b)]),c},k=function(b){var c=e.fromTag("div");d.add(c,a.resolve("flashbin-helpcopy"));var f=e.fromHtml("<p>"+b("cement.dialog.flash.missing")+"</p>");return g.append(c,[f,i(b)]),c},l=function(b){var h=e.fromTag("div");d.add(h,a.resolve("flashbin-loading"));var i=e.fromTag("div");d.add(i,a.resolve("flashbin-loading-spinner"));var j=e.fromTag("p"),k=b("loading.wait");return f.set(j,k),c.set(j,"aria-label",k),g.append(h,[i,j]),h};return{paste:j,noflash:k,indicator:l}}),h("5e",navigator),g("38",["5b","5c","2t","p","27","5d","k","1x","29","5e"],function(a,b,c,d,e,f,g,h,i,j){var k=c.detect(),l=function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash")},m=function(){try{var a=k.browser.isIE()?l():j.plugins["Shockwave Flash"];return void 0!==a}catch(b){return!1}},n=function(b,c,e,f){var g=a.noflash(f);return h.append(b,g),{reset:d.noop}},o=function(b,c,d,e){var g=a.paste(e),h=a.indicator(e);i.append(b,[h,g,c.element()]);var j=function(){f.setAll(h,{height:"0",padding:"0"})},k=function(){f.set(g,"display","block"),f.set(h,"display","none"),d()},l=function(){f.set(g,"display","none"),f.set(h,"display","block"),f.remove(h,"height"),f.remove(h,"padding"),d()};return c.events.spin.bind(l),c.events.reset.bind(k),c.events.hide.bind(j),{reset:k}};return function(a,c,f){var h=g.fromTag("div"),i="flashbin-wrapper-"+(k.os.isOSX()?"cmd":"ctrl");e.add(h,b.resolve(i));var j=m()?o:n,l=j(h,a,c,f.translations);return{element:d.constant(h),reset:l.reset}}}),h("5k",clearInterval),h("5m",setInterval),g("5f",["n","21","22","z","5k","5m"],function(a,b,c,d,e,f){var g=function(){var g=d(a.none()),h=c.create({crashed:b([]),timeout:b([])}),i=function(b,c,d,i){var j=c,k=f(function(){d()?e(k):j<=0?(h.trigger.timeout(),e(k)):i()&&(e(k),h.trigger.crashed()),j--},b);g.set(a.some(k))},j=function(){g.get().each(function(a){e(a)})};return{start:i,stop:j,events:h.registry}};return{responsive:g}}),g("5g",["1b","g","5k","5m"],function(a,b,c,d){return function(e,f,g){var h=function(c){return b.forall(f,function(b){return a.isFunction(c[b])})},i=function(){var b=e.dom();a.isFunction(b.PercentLoaded)&&100===b.PercentLoaded()&&h(b)&&(l(),g())},j=!0,k=d(i,500),l=function(){j&&(c(k),j=!1)};return{stop:l}}}),g("6t",["72"],function(a){var b=function(a,b){return void 0!==a[b]&&null!==a[b]||(a[b]={}),a[b]},c=function(c,d){for(var e=d||a,f=c.split("."),g=0;g<f.length;++g)e=b(e,f[g]);return e};return{namespace:c}}),g("5h",["6t"],function(a){var b=function(b){var c=a.namespace(b);c.callbacks={};var d=0,e=function(){var a="callback_"+d;return d++,a},f=function(a){return b+".callbacks."+a},g=function(a,b){var d=e();return c.callbacks[d]=function(){b||j(d),a.apply(null,arguments)},f(d)},h=function(a){return g(a,!1)},i=function(a){return g(a,!0)},j=function(a){var b=a.substring(a.lastIndexOf(".")+1);void 0!==c.callbacks[b]&&delete c.callbacks[b]};return c.ephemeral=h,c.permanent=i,c.unregister=j,c};return{install:b}}),g("5j",["p","n","3n","k","6n","3f","1g"],function(a,b,c,d,e,f,g){var h=function(a){a.dom().focus()},i=function(a){a.dom().blur()},j=function(a){var b=f.owner(a).dom();return a.dom()===b.activeElement},k=function(a){var c=void 0!==a?a.dom():g;return b.from(c.activeElement).map(d.fromDom)},l=function(b){var d=f.owner(b),g=k(d).filter(function(d){return e.closest(d,a.curry(c.eq,b))});g.fold(function(){h(b)},a.noop)},m=function(a){return k(f.owner(a)).filter(function(b){return a.dom().contains(b.dom())})};return{hasFocus:j,focus:h,blur:i,active:k,search:m,focusInside:l}}),h("5l",clearTimeout),h("5n",unescape),g("39",["5f","5g","5c","g","1c","1s","2t","5h","p","n","21","22","5i","27","5d","k","5j","1x","5k","5l","1f","5m","x","5n","11"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y){var z=h.install("ephox.flash"),A=g.detect(),B=j.none();return function(g){var h=l.create({response:k(["rtf"]),spin:k([]),cancel:k([]),error:k(["message"]),reset:k([]),hide:k([]),failed:k(["message"])}),j=!1,s=p.fromTag("div");n.add(s,c.resolve("flashbin-target"));var v=a.responsive();v.events.crashed.bind(function(){h.trigger.failed("flash.crashed")}),v.events.timeout.bind(function(){h.trigger.failed("flash.crashed")});var C=function(a){v.stop(),w(function(){""===a?h.trigger.error("flash.crashed"):h.trigger.response(x(a))},0)},D=function(){if(N.stop(),!j){j=!0;try{var a=L.dom();e.each(J,function(b,c){var d=a[c];if(void 0===d)throw'Flash object does not have the method "'+c+'"';d.call(a,b)}),h.trigger.reset(),S(),P()}catch(b){u.log("Flash dialog - Error during load: ",b)}}},E=z.permanent(D),F=function(){return!m.inBody(L)},G=function(){return!L.dom().SetVariable},H=function(){v.start(1e3,10,F,G),h.trigger.spin()},I=function(a){v.stop(),h.trigger.error(a)},J={setSpinCallback:z.permanent(H),setPasteCallback:z.permanent(C),setEscapeCallback:z.permanent(h.trigger.cancel),setErrorCallback:z.permanent(I),setStartPasteCallback:z.permanent(i.noop)},K=function(){var a=g.replace(/^https?:\/\//,"//"),b="onLoad="+E,c=' <param name="allowscriptaccess" value="always"> <param name="wmode" value="opaque"> <param name="FlashVars" value="'+b+'">';if(A.browser.isIE()&&10===A.browser.version.major){var d=f.generate("flash-bin");return p.fromHtml('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="'+d+'"><param name="movie" value="'+a+'">'+c+"</object>")}return p.fromHtml('<object type="application/x-shockwave-flash" data="'+a+'">'+c+"</object>")},L=K(),M=function(){o.setAll(L,{width:"2px",height:"2px"})};M();var N=b(L,e.keys(J),D);r.append(s,L);var O=function(){return s},P=function(){A.browser.isFirefox()&&y.getSelection().removeAllRanges(),q.focus(L)},Q=null,R=function(){n.add(s,c.resolve("flash-activate")),o.remove(L,"height"),o.remove(L,"width"),h.trigger.hide()},S=function(){t(Q),n.remove(s,c.resolve("flash-activate")),M()},T=function(){Q=w(R,3e3),h.trigger.spin(),o.set(s,"display","block"),P()},U=function(){o.set(s,"display","none"),B.each(function(a){d.each(a,function(a){a.unbind()})})},V=function(){U(),d.each(e.values(J),function(a){z.unregister(a)}),z.unregister(E),N.stop()};return{focus:P,element:O,activate:T,deactivate:U,destroy:V,events:h.registry}}}),g("1q",["38","39","21","22","w","k","11"],function(a,b,c,d,e,f,g){return function(h,i){var j=i.translations,k=d.create({response:c(["rtf","hide"]),cancel:c([]),error:c(["message"]),failed:c(["message"])}),l=function(){var c=b(i.swf);c.deactivate();var d=f.fromDom(g),l=e.bind(d,"mouseup",c.focus),m=function(){q()},n=function(){m(),k.trigger.cancel()};c.events.cancel.bind(n),c.events.response.bind(function(a){k.trigger.response(a.rtf(),m)}),c.events.error.bind(function(a){m(),k.trigger.error(a.message())}),c.events.failed.bind(function(a){m(),k.trigger.failed(a.message())});var o=h();o.setTitle(j("cement.dialog.flash.title"));var p=a(c,o.reflow,i);p.reset(),o.setContent(p.element()),o.events.close.bind(n),o.show(),c.activate();var q=function(){l.unbind(),c.destroy(),o.destroy()}};return{open:l,events:k.registry}}}),g("5p",[],function(){var a=function(a,b){return d(function(c,d,e){return d(a,b)})},b=function(a){return d(function(b,c,d){return b(a)})},c=function(a){return d(function(b,c,d){return d(a)})},d=function(a){return{fold:a}};return{on:a,before:b,after:c}}),g("5o",["5p","2c","k"],function(a,b,c){var d=b.immutable("start","soffset","finish","foffset"),e=b.immutable("start","soffset","finish","foffset"),f=b.immutable("start","finish"),g=function(b){var d=c.fromDom(b.startContainer),e=c.fromDom(b.endContainer);return f(a.on(d,b.startOffset),a.on(e,b.endOffset))};return{read:d,general:e,write:f,writeFromNative:g}}),g("5q",[],function(){var a=function(a,b){if(a.getSelection)return b(a,a.getSelection());throw"No selection model supported."};return{run:a}}),g("6v",["3n","3f"],function(a,b){var c=function(c,d,e,f){var g=b.owner(c),h=g.dom().createRange();h.setStart(c.dom(),d),h.setEnd(e.dom(),f);var i=a.eq(c,e)&&d===f;return h.collapsed&&!i};return{after:c}}),g("6u",["5o","6v","k","3f"],function(a,b,c,d){var e=function(a){return b.after(c.fromDom(a.anchorNode),a.anchorOffset,c.fromDom(a.focusNode),a.focusOffset)},f=function(b,d){var f=c.fromDom(d.startContainer),g=c.fromDom(d.endContainer);return e(b)?a.read(g,d.endOffset,f,d.startOffset):a.read(f,d.startOffset,g,d.endOffset)},g=function(a){return e(a)},h=function(a,b,c,e){return function(f){if(f.extend)f.collapse(a.dom(),b),f.extend(c.dom(),e);else{var g=d.owner(a).dom().createRange();g.setStart(c.dom(),e),g.setEnd(a.dom(),b),f.removeAllRanges(),f.addRange(g)}}},i=function(a,c,d,e){return b.after(a,c,d,e)},j=function(){return{flip:f,isRtl:g}},k=function(){return{flip:h,isRtl:i}};return{read:j,write:k}}),g("5s",["5o","6u","n","6v","k"],function(a,b,c,d,e){var f=function(b,d){var f=h(b,d.start(),d.finish());if(f.collapsed===!0){var g=h(b,d.finish(),d.start());return g.collapsed===!0?c.none():c.some(a.general(e.fromDom(g.endContainer),g.endOffset,e.fromDom(g.startContainer),g.startOffset))}return c.none()},g=function(a,b){var c=h(a,b.start(),b.finish());return c.collapsed===!0?h(a,b.finish(),b.start()):c},h=function(a,b,c){var d=m(a);return b.fold(function(a){d.setStartBefore(a.dom())},function(a,b){d.setStart(a.dom(),b)},function(a){d.setStartAfter(a.dom())}),c.fold(function(a){d.setEndBefore(a.dom())},function(a,b){d.setEnd(a.dom(),b)},function(a){d.setEndAfter(a.dom())}),d},i=function(a,b){return h(a,b.start(),b.finish())},j=function(a,b,c,e,f){var g=d.after(b,c,e,f),h=a.document.createRange();return g?(h.setStart(e.dom(),f),h.setEnd(b.dom(),c)):(h.setStart(b.dom(),c),h.setEnd(e.dom(),f)),h},k=function(a,b){var c=i(a,b);return function(a){a.addRange(c)}},l=function(a,c){var d=f(a,c);return d.fold(function(){return k(a,c)},function(a){return b.write().flip(a.start(),a.soffset(),a.finish(),a.foffset())})},m=function(a){return a.document.createRange()};return{create:m,build:l,toNative:i,forceRange:g,toExactNative:j}}),g("5r",["g","5s","k","1d","2a","2h"],function(a,b,c,d,e,f){var g=function(a,b,c){return a.selectNodeContents(c.dom()),a.compareBoundaryPoints(b.END_TO_START,b)<1&&a.compareBoundaryPoints(b.START_TO_END,b)>-1},h=function(b,c,d,h){var i=b.document.createRange(),j=f.is(c,h)?[c]:[],k=j.concat(e.descendants(c,h));return a.filter(k,function(a){return g(i,d,a)})},i=function(a,e,f){var g=b.forceRange(a,e),i=c.fromDom(g.commonAncestorContainer);return d.isElement(i)?h(a,i,g,f):[]};return{find:i}}),g("6w",["g","5o","5p","1d"],function(a,b,c,d){var e=function(b,e){var f=d.name(b);return"input"===f?c.after(b):a.contains(["br","img"],f)?0===e?c.before(b):c.after(b):c.on(b,e)},f=function(a){var d=a.start().fold(c.before,e,c.after),f=a.finish().fold(c.before,e,c.after);return b.write(d,f)};return{beforeSpecial:e,preprocess:f}}),g("6x",["g","k","1g"],function(a,b,c){var d=function(d,e){var f=e||c,g=f.createDocumentFragment();return a.each(d,function(a){g.appendChild(a.dom())}),b.fromDom(g)};return{fromElements:d}}),g("5t",["5o","6u","5s","6w","n","k","6x"],function(a,b,c,d,e,f,g){var h=function(a){return function(b,e){var f=d.preprocess(a),g=c.build(b,f);void 0!==e&&null!==e&&(e.removeAllRanges(),g(e))}},i=function(a){return function(b,d){var e=c.create(b);e.selectNodeContents(a.dom()),d.removeAllRanges(),d.addRange(e)}},j=function(a,b){var c=b.getRangeAt(0),d=b.getRangeAt(b.rangeCount-1),e=a.document.createRange();return e.setStart(c.startContainer,c.startOffset),e.setEnd(d.endContainer,d.endOffset),e},k=function(c,d){var e=f.fromDom(d.startContainer),g=f.fromDom(d.endContainer);return b.read().isRtl(c)?b.read().flip(c,d):a.read(e,d.startOffset,g,d.endOffset)},l=function(a,b){return void 0!==b&&null!==b&&b.rangeCount>0?e.from(j(a,b)):e.none()},m=function(a,b){var c=l(a,b);return c.map(function(a){return k(b,a)})},n=function(a){return function(b,c){var d=l(b,c);d.each(function(c){o(b,c,a)})}},o=function(a,b,c){var d=g.fromElements(c,a.document);b.deleteContents(),b.insertNode(d.dom())},p=function(a,b){return function(e,f){var g=d.preprocess(a),h=c.toNative(e,g);o(e,h,b)}},q=function(a,b,d,e){return function(f,g){var h=c.toExactNative(f,a,b,d,e);h.deleteContents()}},r=function(a,b,d,e){return function(g,h){var i=c.toExactNative(g,a,b,d,e),j=i.cloneContents();return f.fromDom(j)}},s=function(a,b,d,f){return function(g,h){var i=c.toExactNative(g,a,b,d,f),j=i.getClientRects(),k=j.length>0?j[0]:i.getBoundingClientRect();return k.width>0||k.height>0?e.some(k):e.none()}},t=function(a){return function(b,d){var f=c.create(b);f.selectNode(a.dom());var g=f.getBoundingClientRect();return g.width>0||g.height>0?e.some(g):e.none()}},u=function(a,b){a.getSelection().removeAllRanges()},v=function(a,b,d,e){return function(f,g){var h=c.toExactNative(f,a,b,d,e);return h.toString()}};return{get:m,set:h,selectElementContents:i,replace:n,replaceRange:p,deleteRange:q,cloneFragment:r,rectangleAt:s,bounds:t,clearSelection:u,stringAt:v}}),g("3a",["5o","5p","5q","5r","5s","5t","3n","k"],function(a,b,c,d,e,f,g,h){var i=function(a){return c.run(a,f.get)},j=function(a,b){c.run(a,f.set(b))},k=function(c,d,e,f,g){var h=a.write(b.on(d,e),b.on(f,g));j(c,h)},l=function(a,b){c.run(a,f.selectElementContents(b))},m=function(a,b){c.run(a,f.replace(b))},n=function(a,b,d){c.run(a,f.replaceRange(b,d))},o=function(a,b,d,e,g){c.run(a,f.deleteRange(b,d,e,g))},p=function(a,b,d,e,g){return c.run(a,f.cloneFragment(b,d,e,g))},q=function(a,b,c,d){return g.eq(a,c)&&b===d},r=function(a,b,d,e,g){return c.run(a,f.rectangleAt(b,d,e,g))},s=function(a,b){return c.run(a,f.bounds(b))},t=function(a,b,c){return d.find(a,b,c)},u=function(c,d,e,f,g,h){var i=a.write(b.on(d,e),b.on(f,g));return t(c,i,h)},v=function(b,c){var d=e.forceRange(b,c);return a.general(h.fromDom(d.startContainer),d.startOffset,h.fromDom(d.endContainer),d.endOffset)},w=function(a){c.run(a,f.clearSelection)},x=function(a,b,d,e,g){return c.run(a,f.stringAt(b,d,e,g))};return{get:i,set:j,setExact:k,selectElementContents:l,replace:m,replaceRange:n,deleteRange:o,isCollapsed:q,cloneFragment:p,rectangleAt:r,bounds:s,findWithin:t,findWithinExact:u,deriveExact:v,clearAll:w,stringAt:x}}),g("5u",["p","3n"],function(a,b){return function(c,d,e,f){var g=b.eq(c,e)&&d===f;return{startContainer:a.constant(c),startOffset:a.constant(d),endContainer:a.constant(e),endOffset:a.constant(f),collapsed:a.constant(g)}}}),g("3b",["5u","k","1x","1y","3f"],function(a,b,c,d,e){return function(f){var g=b.fromTag("br"),h=function(a,b){a.dom().focus()},i=function(a){var b=e.owner(a);return b.dom().defaultView},j=function(b,d){var e=i(d);e.focus(),c.append(d,g),f.set(e,a(g,0,g,0))},k=function(){d.remove(g)};return{cleanup:k,toOn:h,toOff:j}}}),g("3c",["p"],function(a){return function(){var b=function(a,b){a.dom().focus()},c=function(a,b){b.dom().focus()},d=a.identity;return{toOn:b,toOff:c,cleanup:d}}}),g("6y",["g","k","1x","29","1y","3f"],function(a,b,c,d,e,f){var g=function(a,b){f.nextSibling(a).filter(b).each(function(b){var c=f.children(b);d.append(a,c),e.remove(b)}),i(a,b)},h=function(a,g){var h=f.children(a),i=b.fromTag("div",f.owner(a).dom());d.append(i,h),c.before(a,i),e.remove(a)},i=function(b,c){var d=f.children(b);a.each(d,function(a){c(a)&&h(a,b)})};return{consolidate:g}}),g("6z",["3g"],function(a){var b=a.create("ephox-sloth");return{resolve:b.resolve}}),g("70",["5d"],function(a){var b=function(a,b){return function(d){return"rtl"===c(d)?b:a}},c=function(b){return"rtl"===a.get(b,"direction")?"rtl":"ltr"};return{onDirection:b,getDirection:c}}),g("5v",["1s","2c","6y","6z","j","27","3q","5d","70","k","6h","1x","1y","20","3f"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p=d.resolve("bin"),q=p+a.generate(""),r=i.onDirection("-100000px","100000px");return function(a){var d=j.fromTag("div");e.setAll(d,{contenteditable:"true","aria-hidden":"true"}),h.setAll(d,{position:"fixed",top:"0px",width:"100px",height:"100px",overflow:"hidden",opacity:"0"}),g.add(d,[p,q]);var i=function(a){m.empty(d),h.set(d,"left",r(a)),l.append(a,d)},s=function(){var b=n.ancestor(d,"body");b.each(function(b){a.toOff(b,d)})},t=function(a){return f.has(a,q)},u=function(){c.consolidate(d,t);var a=b.immutable("elements","html","container"),e=o.children(d),f=k.get(d);return a(e,f,d)},v=function(){m.remove(d)},w=function(){return d};return{attach:i,focus:s,contents:u,container:w,detach:v}}}),g("3d",["p","2x","21","22","2y","5v","3f"],function(a,b,c,d,e,f,g){return function(h,i){var j=f(h),k=function(){h.cleanup();var a=j.contents();j.detach(),n.trigger.after(a.elements(),a.html(),j.container())},l=b.tap(function(){n.trigger.before(),j.attach(i),j.focus(),e.run(g.owner(i),l,k)}),m=function(){l.instance()},n=d.create({before:c([]),after:c(["elements","html","container"])}),o=a.noop;return{instance:a.constant(m),destroy:o,events:n.registry}}}),g("1r",["2t","3a","21","22","3b","3c","3d","1d"],function(a,b,c,d,e,f,g,h){var i=a.detect(),j={set:function(a,c){b.setExact(a,c.startContainer(),c.startOffset(),c.endContainer(),c.endOffset())}},k=function(a){var b=i.browser.isIE()&&"body"!==h.name(a)?f:e;return b(j)};return function(a){var b=d.create({after:c(["container"])}),e=k(a),f=g(e,a);f.events.after.bind(function(c){e.toOn(a,c.container()),b.trigger.after(c.container())});var h=function(){f.instance()()};return{run:h,events:b.registry}}}),g("5y",["w","k","1g"],function(a,b,c){var d=function(d){if("complete"===c.readyState||"interactive"===c.readyState)d();else var e=a.bind(b.fromDom(c),"DOMContentLoaded",function(){d(),e.unbind()})};return{execute:d}}),g("3e",["2t","5h","p","5w","n","5x","5i","5d","w","k","1x","5y","1y"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=b.install("ephox.keurig.init"),o=e.none(),p=a.detect(),q=p.browser,r=q.isIE()||q.isSpartan()||p.deviceType.isiOS()||p.deviceType.isAndroid(),s=r?c.noop:d.cached(function(a){var b=j.fromTag("div");if(void 0===a)throw"baseUrl was undefined";var c=j.fromTag("iframe");h.setAll(b,{display:"none"});var d=i.bind(c,"load",function(){var g=function(a){o=e.some(a),q.isSafari()||m.remove(b)},h=n.ephemeral(g),i=a+"/wordimport.js";f.write(c,'<script type="text/javascript" src="'+i+'"></script><script type="text/javascript">function gwtInited () {parent.window.'+h+"(com.ephox.keurig.WordCleaner.cleanDocument);};</script>"),d.unbind()});l.execute(function(){k.append(g.body(),b),k.append(b,c)})}),t=function(a,b){return o.map(function(c){return c(a,b)})},u=function(){return o.isSome()};return{load:s,cleanDocument:t,ready:u}}),g("1t",["3e"],function(a){return function(b){return a.ready()||a.load(b),{cleanDocument:a.cleanDocument}}}),g("l",["1o","1p","1q","1r","g","1s","1t","p","n"],function(a,b,c,d,e,f,g,h,i){return function(j,k,l,m){var n=g(m.baseUrl),o=h.curry(c,k),p=d,q=function(){return{clipboardType:f.generate("clipboard-type"),findClipboardTags:i.none}},r=void 0!==m.intraFlag?m.intraFlag:q(),s=e.flatten([void 0!==m.intraFlag?[b.internal(l,p,j,r)]:[],[b.onlyText()],[b.gwt(n,k,m,o)],[b.image(m)]]),t=b.pastiche(k,m,l,p,j,o,r);return a(s,t)}}),g("m",["1o","1p"],function(a,b){return function(){return a([b.text()],b.none())}}),g("q",[],function(){return{officeStyles:"prompt",htmlStyles:"clean"}}),g("r",["j","k","1x","1y","1z","20","1g"],function(a,b,c,d,e,f,g){var h="powerpaste-styles",i="#"+h,j=function(d){if(!e.any(i)){var g="<style>.ephox-cement-flashbin-helpcopy-kbd {font-size: 3em !important; text-align: center !important; vertical-align: middle !important; margin: .5em 0} .ephox-cement-flashbin-helpcopy-kbd .ephox-polish-help-kbd {font-size: 3em !important; vertical-align: middle !important;} .ephox-cement-flashbin-helpcopy a {text-decoration: underline} .ephox-cement-flashbin-loading-spinner {background-image: url("+d+") !important; width: 96px !important; height:96px !important; display: block; margin-left: auto !important; margin-right: auto !important; margin-top: 2em !important; margin-bottom: 2em !important;} .ephox-cement-flashbin-loading p {text-align: center !important; margin: 2em 0 !important} .ephox-cement-flashbin-target {height: 1px !important;} .ephox-cement-flashbin-target.ephox-cement-flash-activate {height: 150px !important; width: 100% !important;} .ephox-cement-flashbin-target object {height: 1px !important;} .ephox-cement-flashbin-target.ephox-cement-flash-activate object {height: 150px !important; width: 100% !important;} .ephox-cement-flashbin-helpcopy p {white-space: normal;}</style>",j=b.fromHtml(g);a.set(j,"type","text/css"),a.set(j,"id",h);var k=f.first("head").getOrDie("Head element could not be found.");c.append(k,j)}},k=function(){if(e.any(i)){var a=f.first("head").getOrDie("Head element could not be found."),b=f.descendant(a,i).getOrDie("The style element could not be removed");d.remove(b)}};return{injectStyles:j,removeStyles:k}}),g("v",["g","k","j","1g"],function(a,b,c,d){var e=function(a){var b=d.createElement("div");b.appendChild(a.cloneNode(!0));var c=b.innerHTML;return b=a=null,c},f=function(d){a.each(a.map(d.getElementsByTagName("*"),b.fromDom),function(a){c.has(a,"data-mce-style")&&!c.has(a,"style")&&c.set(a,"style",c.get(a,"data-mce-style"))})};return{nodeToString:e,restoreStyleAttrs:f}}),g("t",["21","22","v","j","k","1x","1y","20"],function(a,b,c,d,e,f,g,h){return function(i){var j=function(){var j,k="",l="",m=[],n=null,o=b.create({close:a([])}),p=function(a){k=a},q=function(a){var b=c.nodeToString(a.dom());l=[{type:"container",html:b}],n=a},r=function(a){var b=[];a.forEach(function(a,c,d){b.push({text:a.text,onclick:a.click})}),m=b},s=function(a){o.trigger.close()},t=function(){j.off("close",s),j.close("close")},u=function(){0===m.length&&(m=[{text:"Close",onclick:function(){j.close()}}]);var a={title:k,spacing:10,padding:10,minWidth:300,minHeight:100,layout:"flex",items:l,buttons:m};j=i.windowManager.open(a);var b=e.fromDom(j.getEl()),c=h.descendant(b,"."+d.get(n,"class")).getOrDie("We must find this element or we cannot continue");f.before(c,n),g.remove(c),j.on("close",s)},v=function(){t()},w=function(){t()},x=function(){};return{events:o.registry,setTitle:p,setContent:q,setButtons:r,show:u,hide:v,destroy:w,reflow:x}};return{createDialog:j}}}),g("24",["2c","n"],function(a,b){var c=a.immutable("url","html"),d=function(a){return/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(a)},e=function(a){return d(a)&&/.(gif|jpe?g|png)$/.test(a)},f=function(a){var d=/^<a href="([^"]+)">([^<]+)<\/a>$/.exec(a);return b.from(d).bind(function(d){var e=c(d[1],a);return d[1]===d[2]?b.some(e):b.none()})};return{isAbsoluteUrl:d,isImageUrl:e,parseUrlFromLinkHtml:f}}),g("u",["g","n","23","24"],function(a,b,c,d){var e=function(a){return"extra"in a.undoManager},f=function(a,c,d){return e(a)?(a.undoManager.extra(function(){k(a,c)},d),b.some(!0)):b.none()},g=function(a,b){return f(a,b.html(),function(){a.insertContent('<img src="'+b.url()+'">')})},h=function(a,b){return f(a,b.html(),function(){a.execCommand("mceInsertLink",!1,b.url())})},i=function(a,c){return d.parseUrlFromLinkHtml(c).bind(function(c){var e=a.selection.isCollapsed()===!1&&d.isAbsoluteUrl(c.url());return e?h(a,c):b.none()})},j=function(a,c){return d.parseUrlFromLinkHtml(c).bind(function(c){return d.isImageUrl(c.url())?g(a,c):b.none()})},k=function(a,c){return a.insertContent(c,{merge:a.settings.paste_merge_formats!==!1,paste:!0}),b.some(!0)},l=function(a,b,d){var e=function(c){return c(a,b)};return c.findMap(d,e)};return{until:l,linkSelection:i,insertImage:j,insertContent:k}}),g("8",[],function(){var a=function(a,b){return a.hasEventListeners(b)},b=function(a,b){return a.fire("PastePreProcess",{content:b}).content},c=function(a,b){var c=a.dom.add(a.getBody(),"div",{style:"display:none"},b),d=a.fire("PastePostProcess",{node:c}).node.innerHTML;return a.dom.remove(c),d},d=function(c,d){return a(c,"PastePreProcess")?b(c,d):d},e=function(b,d){return a(b,"PastePostProcess")?c(b,d):d},f=function(a,b){return e(a,d(a,b))},g=function(a){var b=a.settings,c=a.plugins.powerpaste;b.paste_preprocess&&a.on("PastePreProcess",function(d){b.paste_preprocess.call(a,c,d)}),b.paste_postprocess&&a.on("PastePostProcess",function(d){b.paste_postprocess.call(a,c,d)})};return{process:f,registerEvents:g}}),g("6",["l","m","g","n","o","p","d","q","r","s","t","u","8","v","w","k","x","2"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){return function(s,t,u,v,w){var x,y,z,A,B;B=(v?v.jsUrl:u)+"/js",y=(v?v.swfUrl:u)+"/flash/textboxpaste.swf",z=(v?v.imgUrl:u)+"/img/spinner_96.gif",A=(v?v.cssUrl:u)+"/css/editorcss.css";var C=function(a){return a.settings.smart_paste!==!1},D=function(a){return function(b,c){return b.undoManager.transact(function(){l.insertContent(b,c),n.restoreStyleAttrs(b.getBody()),w.prepareImages(a)}),d.some(!0)}},E=function(a,b,c){var d=C(a)?[l.linkSelection,l.insertImage]:[];l.until(a,b,d.concat([D(c)]))},F=function(){x&&s.selection.moveToBookmark(x),x=null};s.on("init",function(d){i.injectStyles(z),s.dom.loadCSS(A);var l={baseUrl:B,swf:y,officeStyles:s.settings.powerpaste_word_import||h.officeStyles,htmlStyles:s.settings.powerpaste_html_import||h.htmlStyles,translations:g.translate,allowLocalImages:s.settings.powerpaste_allow_local_images!==!1,enableFlashImport:s.settings.powerpaste_enable_flash_import!==!1,preprocessor:function(a){return e.pure(a)}},r=k(s),u=p.fromDom(s.getBody()),v=function(a){a.events.cancel.bind(function(){F()}),a.events.error.bind(function(a){F(),s.notificationManager?s.notificationManager.open({text:g.translate(a.message()),type:"error"}):j.showDialog(s,g.translate(a.message()))}),a.events.insert.bind(function(a){var b=c.map(a.elements(),function(a){return n.nodeToString(a.dom())}).join("");s.focus(),q(function(){F(),E(s,m.process(s,b),a.assets()),w.uploadImages(a.assets())},1)})},C=a(u,r.createDialog,f.noop,l),D=b();c.each([C,D],v),o.bind(u,"paste",function(a){x||(x=s.selection.getBookmark());var b=t.isText()?D:C;b.paste(a.raw()),t.reset(),q(function(){s.windowManager.windows[0]&&s.windowManager.windows[0].getEl()&&s.windowManager.windows[0].getEl().focus()},1)})}),s.on("remove",function(a){1===r.editors.length&&i.removeStyles()})}}),g("7",["y","z"],function(a,b){var c=function(a){return tinymce.util.VK.metaKeyPressed(a)&&86==a.keyCode&&a.shiftKey};return function(d){var e=b(d.settings.paste_as_text),f=b(!1);d.on("keydown",function(a){c(a)&&(f.set(!0),tinymce.Env.ie&&tinymce.Env.ie<10&&(a.preventDefault(),d.fire("paste",{})))});var g=a(function(){var a=d.translate("Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.");d.notificationManager.open({text:a,type:"info"})}),h=function(){var a=this,b=!e.get();a.active(b),e.set(b),d.fire("PastePlainTextToggle",{state:b}),b===!0&&0!=d.settings.paste_plaintext_inform&&g(),d.focus()},i=function(){f.set(!1)},j=function(){return f.get()||e.get()};return{toggle:h,reset:i,isText:j}}}),g("10",[],function(){var a=0,b=1,c=-1,d=function(a){return parseInt(a,10)},e=function(a){return function(){return a}},f=function(a,b,c){return{major:e(a),minor:e(b),patch:e(c)}},g=function(a){var b=/([0-9]+)\.([0-9]+)\.([0-9]+)(?:(\-.+)?)/.exec(a);return b?f(d(b[1]),d(b[2]),d(b[3])):f(0,0,0)},h=function(d,e){var f=d-e;return 0===f?a:f>0?b:c},i=function(b,c){var d=h(b.major(),c.major());if(d!==a)return d;var e=h(b.minor(),c.minor());if(e!==a)return e;var f=h(b.patch(),c.patch());return f!==a?f:a};return{nu:f,parse:g,compare:i}}),g("9",["10"],function(a){var b=function(a){var b=[a.majorVersion,a.minorVersion].join(".");return b.split(".").slice(0,3).join(".")},c=function(c){return c?a.parse(b(c)):null},d=function(b,d){return a.compare(c(b),a.parse(d))<0};return{getVersion:c,isLessThan:d}}),g("a",["11"],function(a){var b=function(a,b){return function(){var c=a.console;c&&b in c&&c[b].apply(c,arguments)}};return{log:b(a,"log"),error:b(a,"error"),warn:b(a,"warm")}}),g("1",["3","4","5","6","7","8","9","a","2"],function(a,b,c,d,e,f,g,h,i){return function(j){return g.isLessThan(i,"4.0.0")?(h.error('The "powerpaste" plugin requires at least 4.0.0 version of TinyMCE.'),function(){}):function(g,h){var k=e(g),l=function(){var b=a(g);d(g,k,h,j,b),g.settings.powerpaste_block_drop||c(g,h,j,b)},m=function(){b(g,k,j)},n=function(){var a=this;a.active(k.isText()),g.on("PastePlainTextToggle",function(b){a.active(b.state)})};i.Env.ie&&i.Env.ie<10?m():l();var o=function(a){g.dom.bind(a,"drop dragstart dragend dragover dragenter dragleave dragdrop draggesture",function(a){return i.dom.Event.cancel(a)})};g.settings.powerpaste_block_drop&&g.on("init",function(a){o(g.getBody()),o(g.getDoc())}),f.registerEvents(g),g.addButton("pastetext",{icon:"pastetext",tooltip:"Paste as text",onclick:k.toggle,onPostRender:n}),g.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,onclick:k.toggle,onPostRender:n})}}}),g("0",["1","2"],function(a,b){return function(c){b.PluginManager.requireLangPack("powerpaste","ar,ca,cs,da,de,el,es,fa,fi,fr_FR,he_IL,hr,hu_HU,it,ja,kk,ko_KR,nb_NO,nl,pl,pt_BR,pt_PT,ro,ru,sk,sl_SI,sv_SE,th_TH,tr,uk,zh_CN,zh_TW"),b.PluginManager.add("powerpaste",a(c))}}),d("0")()}();