### Install Dependencies and Start Server
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-nodejs
Navigate to the project directory, install npm packages, and start the development server.
```bash
$ cd tinydrive-nodejs-starter
$ npm i
$ npm run start
```
--------------------------------
### Install Dependencies and Start Dev Server
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-java
Navigate to the project directory, install NPM packages, and then start the development server using Gradle. Ensure Java 10+ and Gradle 4+ are installed.
```bash
cd tinydrive-java-spring-starter
gradle bootRun
```
--------------------------------
### Initialize Editor with Event Listener using `setup`
Source: https://www.tiny.cloud/docs/tinymce/latest/events
The `setup` option allows binding an event listener, such as 'init', before the editor instance is fully initialized. This example logs a message when the editor is initialized.
```javascript
tinymce.init({
selector: 'textarea',
setup: (editor) => {
editor.on('init', (e) => {
console.log('Editor is initialized.');
});
}
});
```
--------------------------------
### Compare Basic Configurations
Source: https://www.tiny.cloud/docs/tinymce/latest/migration-from-froala
Full page examples showing the transition from a Froala 3 setup to a TinyMCE 8 setup.
```html
```
```html
```
--------------------------------
### Installation and Configuration
Source: https://www.tiny.cloud/docs/tinymce/latest/introduction-to-mediaembed
Instructions for installing and configuring the Enhanced Media Embed plugin, including cloud and self-hosted setups.
```APIDOC
## Installation
1. Ensure the `media` plugin is added to the `plugins` list.
2. Add the `mediaembed` plugin to the `plugins` list.
### Example Cloud Configuration
Tiny Cloud automatically configures the service URL. Specify the `media` and `mediaembed` plugins, and optionally `mediaembed_max_width`.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'media mediaembed',
mediaembed_max_width: 450
});
```
### Example Self-hosted Configuration
For self-hosted installations, configure the service URL using the `mediaembed_service_url` parameter.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'media mediaembed',
mediaembed_service_url: 'SERVICE_URL',
mediaembed_max_width: 450
});
```
```
--------------------------------
### Project Setup with Composer
Source: https://www.tiny.cloud/docs/tinymce/latest/export-to-pdf-with-jwt-authentication-php
Set up a new project directory and install the firebase/php-jwt package using Composer.
```bash
# Create and enter project directory
mkdir tinymce-app
cd tinymce-app
# Initialize Composer
composer require firebase/php-jwt
```
--------------------------------
### Execute Setup Function Before Render
Source: https://www.tiny.cloud/docs/tinymce/latest/webcomponent-ref
Use the 'setup' attribute to execute a JavaScript callback function before the editor instance is rendered. This example logs a message when the editor is clicked.
```javascript
function setupEditor(editor) {
editor.on('click', function () {
console.log('Editor was clicked');
});
}
```
```html
```
--------------------------------
### Example: Sidebar within `tinymce.init`
Source: https://www.tiny.cloud/docs/tinymce/latest/customsidebar
Demonstrates how to register and configure a sidebar directly within the `tinymce.init` configuration using the `setup` callback.
```APIDOC
## Example: Sidebar within `tinymce.init`
### Description
This example shows how to define a custom sidebar, including its `onSetup`, `onShow`, and `onHide` behaviors, directly within the `tinymce.init` configuration. The sidebar is also added to the toolbar.
### Code
```javascript
tinymce.init({
selector: 'textarea',
toolbar: 'mysidebar',
setup: (editor) => {
editor.ui.registry.addSidebar('mysidebar', {
tooltip: 'My sidebar',
icon: 'comment',
onSetup: (api) => {
console.log('Render panel', api.element());
return () => {
console.log('Removing sidebar');
};
},
onShow: (api) => {
console.log('Show panel', api.element());
api.element().innerHTML = 'Hello world!';
},
onHide: (api) => {
console.log('Hide panel', api.element());
}
});
}
});
```
```
--------------------------------
### Server Setup (jwt.js)
Source: https://www.tiny.cloud/docs/tinymce/latest/export-to-pdf-with-jwt-authentication-nodejs
Example Node.js server setup using Express and JSONwebtoken to create a JWT endpoint.
```javascript
const express = require('express'); // Sets up the web server.
const jwt = require('jsonwebtoken'); // Generates and signs JWTs.
const cors = require('cors'); // Allows cross-origin requests.
const path = require('path'); // Handles file paths.
const app = express();
app.use(cors());
// Your private key (Replace this with your actual key)
const privateKey = `
----BEGIN PRIVATE KEY-----
{Your private PKCS8 key goes here}
-----END PRIVATE KEY-----
`;
app.use(express.static(path.join(__dirname, 'public')));
// JWT token generation endpoint
app.post('/jwt', (req, res) => {
const payload = {
aud: 'no-api-key', // Replace with your actual API key
iat: Math.floor(Date.now() / 1000), // Issue timestamp
exp: Math.floor(Date.now() / 1000) + (60 * 10) // Expiration time (10 minutes)
};
try {
// Tokens are signed with the RS256 algorithm using your private key
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' });
res.json({ token });
} catch (error) {
res.status(500).send('Failed to generate JWT token.');
console.error(error.message);
}
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
```
--------------------------------
### Configure URL Dialog Example
Source: https://www.tiny.cloud/docs/tinymce/latest/urldialog
Setup for a toolbar button that opens an external URL in a dialog.
```html
```
```javascript
tinymce.init({
selector: 'textarea#url-dialog',
toolbar: 'urldialog',
height: 300,
setup: (editor) => {
editor.ui.registry.addButton('urldialog', {
icon: 'code-sample',
onAction: () => editor.windowManager.openUrl({
title: 'URL Dialog Demo',
url: 'external-page.html',
height: 640,
width: 640
})
})
},
content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
});
```
--------------------------------
### Example Skin Required Files
Source: https://www.tiny.cloud/docs/tinymce/latest/bundling-skins
These are the essential files for the 'example' skin. Ensure these are included when bundling.
```text
./skins/ui/example/content.css
./skins/ui/example/skin.css
```
--------------------------------
### Configure package.json for Post-Install Script
Source: https://www.tiny.cloud/docs/tinymce/latest/jquery-pm
Add a 'postinstall' script to your package.json to automatically run the setup script after npm installations. This ensures assets are always up-to-date.
```json
{
// ... snip ...
"scripts": {
"postinstall": "node ./postinstall.js"
}
}
```
--------------------------------
### Basic TinyMCE Setup with Accordion Plugin
Source: https://www.tiny.cloud/docs/tinymce/latest/accordion
This example demonstrates the minimal configuration required to enable the Accordion plugin and its toolbar button in TinyMCE.
```javascript
tinymce.init({
selector: 'textarea', // change this value according to your HTML
plugins: 'accordion',
toolbar: 'accordion',
});
```
--------------------------------
### Full Example Initialization
Source: https://www.tiny.cloud/docs/tinymce/latest/anchor
A comprehensive example of initializing TinyMCE with the Anchor plugin and other common plugins.
```APIDOC
```javascript
tinymce.init({
selector: 'textarea#anchor-demo',
height: 500,
plugins: [
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
"help", "image", "insertdatetime", "link", "lists", "media",
"preview", "searchreplace", "table", "visualblocks",
],
toolbar: "anchor |undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
menubar: "file edit view insert format tools table help",
content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
});
```
```
--------------------------------
### start()
Source: https://www.tiny.cloud/docs/tinymce/latest/apis/tinymce.html.writer
Writes a start element tag.
```APIDOC
## start()
### Description
Writes a start element, such as `
`.
### Method
`start(name: String, attrs: Array, empty: Boolean)`
### Parameters
#### Path Parameters
- **name** (String) - Required - Name of the element.
- **attrs** (Array) - Optional - Array of objects containing an attribute name and value, or undefined if the element has no attributes.
- **empty** (Boolean) - Optional - Empty state if the tag should serialize as a void element. For example: ``.
### Request Example
```javascript
const writer = tinymce.html.Writer();
writer.start('p', [{ key: 'id', value: 'a' }]);
writer.start('img', null, true);
console.log(writer.getContent());
```
### Response Example
```html
```
```
--------------------------------
### Menu Button Example
Source: https://www.tiny.cloud/docs/tinymce/latest/custom-menu-toolbar-button
A basic example demonstrating the implementation of a toolbar menu button.
```APIDOC
## Menu button example and explanation
The following is a simple toolbar menu button example:
* TinyMCE
* HTML
* JS
* Edit on CodePen
Welcome to the TinyMCE editor demo!
Select a menu item from the listbox above and it will insert contents into the editor at the caret position.
Got questions or need help?
Our documentation is a great resource for learning how to configure TinyMCE.
If you think you have found a bug please create an issue on the GitHub repo to report it to the developers.
Finally ...
Need file uploads in your app? Consider using Uploadcare with TinyMCE for a fast, modern upload experience.
Thanks for supporting TinyMCE! We hope it helps you and your users create great content. All the best from the TinyMCE team.
My button
## Welcome to the TinyMCE editor demo!
Select a menu item from the listbox above and it will insert contents into the editor at the caret position.
## Got questions or need help?
* Our documentation is a great resource for learning how to configure TinyMCE.
* Have a specific question? Try the `tinymce` tag at Stack Overflow.
* We also offer enterprise grade support as part of TinyMCE premium plans.
## Found a bug?
If you think you have found a bug please create an issue on the GitHub repo to report it to the developers.
```
--------------------------------
### Install dependencies
Source: https://www.tiny.cloud/docs/tinymce/latest/react-zip-bundle
Install the TinyMCE React component and the script-loader package.
```bash
cd tinymce-react-demo && npm install @tinymce/tinymce-react
```
```bash
npm install script-loader
```
--------------------------------
### Navigate to Project Directory
Source: https://www.tiny.cloud/docs/tinymce/latest/vue-cloud
Change into the newly created project directory to proceed with setup.
```bash
cd tinymce-vue-demo
```
--------------------------------
### Basic Setup
Source: https://www.tiny.cloud/docs/tinymce/latest/help
Demonstrates how to initialize TinyMCE with the Help plugin enabled.
```APIDOC
## Basic Setup
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'help',
toolbar: 'help'
});
```
```
--------------------------------
### Spelling Service Startup Logs
Source: https://www.tiny.cloud/docs/tinymce/latest/individual-spelling-container
Example output showing successful service initialization and configuration loading.
```text
2025-09-15 05:31:43.758Z [io-compute-8] INFO ironbark - ironbark
...
2025-09-15 05:31:44.093Z [io-compute-blocker-8] INFO ironbark - -> Raw Config assembled from various sources: ConfigOrigin(merge of /app/application.conf: 1,system properties,reference.conf @ jar:file:/app/ironbark.jar!/reference.conf: 1)
2025-09-15 05:31:44.120Z [io-compute-blocker-8] WARN c.e.d.config.AllowedOriginsConfig$ - No allowed-origins specified in config!
2025-09-15 05:31:44.128Z [io-compute-blocker-8] INFO ironbark - ironbark config loaded successfully: IronbarkConfig(Logger[ironbark],SpellingConfig(None,200,None,5,0.8,500),OriginWhitelist(List(),OriginPrecision(true)),None,None,StaticCustomDictionaryScanConfig)
2025-09-15 05:31:44.178Z [io-compute-blocker-8] INFO com.ephox.nectar.data.Bees$ - Loading all dictionaries from WinterTree
2025-09-15 05:31:44.680Z [io-compute-blocker-4] INFO com.ephox.nectar.data.Bees$ - Loading all dictionaries from WinterTree
2025-09-15 05:31:45.415Z [io-compute-blocker-8] INFO o.h.b.c.nio1.NIO1SocketServerGroup - Service bound to address /[0:0:0:0:0:0:0:0]:18080
2025-09-15 05:31:45.425Z [io-compute-blocker-8] INFO o.h.blaze.server.BlazeServerBuilder -
_ _ _ _ _
| |_| |_| |_ _ __| | | ___
| ' \ _| _| '_ \_ _(_-<
|_||_\__|\__| .__/ |_|/__/
|_|
2025-09-15 05:31:45.434Z [io-compute-blocker-8] INFO o.h.blaze.server.BlazeServerBuilder - http4s v0.23.27 on blaze v0.23.16 started at http://[::]:18080/
```
--------------------------------
### TinyMCE Self-hosted Installation Example
Source: https://www.tiny.cloud/docs/tinymce/latest/introduction-to-tiny-spellchecker?keyword=docs
Use this configuration for self-hosted TinyMCE installations. Ensure the server-side component is deployed and accessible via `spellchecker_rpc_url`.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'tinymcespellchecker',
spellchecker_rpc_url: 'localhost/ephox-spelling',
spellchecker_language: 'en-US' // Note: Using RFC5646 format with hyphen
});
```
--------------------------------
### Start the development server
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-dotnet
Navigate to the project directory and execute the .NET run command to start the local server.
```sh
$ cd tinydrive-dotnet-starter
$ dotnet run
```
--------------------------------
### Navigate to Project Directory
Source: https://www.tiny.cloud/docs/tinymce/latest/vue-zip
Change into the newly created project directory to proceed with installations.
```bash
cd tinymce-vue-demo
shCopied!
```
--------------------------------
### Start the local development server
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-php
Navigate to the project directory and launch the PHP built-in server to test the implementation.
```sh
$ cd tinydrive-php-starter
$ php -S localhost:3000
```
--------------------------------
### Basic Setup
Source: https://www.tiny.cloud/docs/tinymce/latest/save
Demonstrates how to initialize TinyMCE with the save plugin and add the save button to the toolbar.
```APIDOC
## POST /api/users
### Description
This endpoint allows for the creation of new user accounts.
### Method
POST
### Endpoint
/api/users
### Parameters
#### Query Parameters
- **fields** (string) - Optional - Comma-separated list of fields to include in the response.
#### Request Body
- **username** (string) - Required - The desired username for the new account.
- **email** (string) - Required - The email address for the new account.
- **password** (string) - Required - The password for the new account.
### Request Example
```json
{
"username": "johndoe",
"email": "john.doe@example.com",
"password": "securepassword123"
}
```
### Response
#### Success Response (201)
- **id** (string) - The unique identifier for the newly created user.
- **username** (string) - The username of the created user.
- **email** (string) - The email address of the created user.
#### Response Example
```json
{
"id": "user_abc123",
"username": "johndoe",
"email": "john.doe@example.com"
}
```
```
--------------------------------
### Basic `importword_service_url` Configuration
Source: https://www.tiny.cloud/docs/tinymce/latest/importword?keyword=docs
Example of setting the `importword_service_url` option for on-premise setups. This option is required for self-hosted configurations.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'importword',
toolbar: 'importword',
importword_service_url: '' // required for On-premise setups only
});
```
--------------------------------
### Run the development server
Source: https://www.tiny.cloud/docs/tinymce/latest/react-cloud
Starts the local development server to preview the application.
```bash
npm run dev
```
--------------------------------
### Configure a split button in TinyMCE
Source: https://www.tiny.cloud/docs/tinymce/latest/custom-split-toolbar-button
Example demonstrating the setup of a split button with a text label and a static dropdown menu.
```javascript
tinymce.init({
selector: 'textarea',
toolbar: 'mybutton',
setup: (editor) => {
editor.ui.registry.addSplitButton('mybutton', {
text: 'My Button',
onAction: () => {
editor.insertContent(' Primary button clicked! ');
},
fetch: (callback) => {
const items = [
{ type: 'choiceitem', text: 'Menu item 1', value: '1' },
{ type: 'choiceitem', text: 'Menu item 2', value: '2' }
];
callback(items);
},
onItemAction: (api, value) => {
editor.insertContent(' Menu item ' + value + ' clicked! ');
}
});
}
});
```
--------------------------------
### Create Project Files
Source: https://www.tiny.cloud/docs/tinymce/latest/tinymceai-with-jwt-authentication-php
Commands to generate the initial web and server files.
```bash
# Create the public folder for web files
touch index.html
touch jwt.php
```
--------------------------------
### Bind TinyMCE Events using 'setup' Attribute
Source: https://www.tiny.cloud/docs/tinymce/latest/webcomponent-ref
Bind events for the TinyMCE Web Component using the 'setup' attribute, which accepts a function that receives the editor instance. This allows for custom event handling logic. The example shows how to log a message when the editor is clicked.
```html
```
--------------------------------
### Hyperlinking Service Startup Logs
Source: https://www.tiny.cloud/docs/tinymce/latest/individual-hyperlinking-container
Example output from the service logs indicating successful startup and configuration loading.
```text
2025-09-15 04:46:17 [io-compute-3] INFO navi - navi
...
2025-09-15 04:46:17 [io-compute-blocker-3] INFO navi - -> Raw Config assembled from various sources: ConfigOrigin(merge of /app/application.conf: 1,system properties,reference.conf @ jar:file:/app/navi.jar!/reference.conf: 1)
2025-09-15 04:46:17 [io-compute-blocker-3] WARN c.e.d.config.AllowedOriginsConfig$ - No allowed-origins specified in config!
2025-09-15 04:46:17 [io-compute-blocker-3] WARN c.e.d.config.AllowedOriginsConfig$ - No allowed-origins specified in config!
2025-09-15 04:46:17 [io-compute-blocker-3] INFO navi - navi config loaded successfully: NaviConfig(LinkCheckerConfig(true,ReturnUnknown),true,CacheConfig(10000,86400 seconds,3600 seconds),SdkServiceWithClientConfig(HttpConfig(100,10,10,3,HttpConfigTimeouts(10,10,10),JvmTrustModel()),None,OriginWhitelist(List(),OriginPrecision(true))),SelfHostedMediaSourcesConfig(CustomEmbedPlugins(UrlTrie(Branch(None,TreeMap()),Branch(None,TreeMap()))),None),OriginWhitelist(List(),OriginPrecision(true)),Logger[navi])
2025-09-15 04:46:18 [io-compute-blocker-3] INFO o.h.b.c.nio1.NIO1SocketServerGroup - Service bound to address /[0:0:0:0:0:0:0:0]:19100
2025-09-15 04:46:18 [io-compute-blocker-3] INFO o.h.blaze.server.BlazeServerBuilder -
_ _ _ _ _
| |_| |_| |_ _ __| | | ___
| ' \ _| _| '_ \_ _(_-<
|_||_\__|\__| .__/ |_|/__/
|_|
2025-09-15 04:46:18 [io-compute-blocker-3] INFO o.h.blaze.server.BlazeServerBuilder - http4s v0.23.27 on blaze v0.23.16 started at http://[::]:19100/
```
--------------------------------
### TinyMCE Cloud Installation Example
Source: https://www.tiny.cloud/docs/tinymce/latest/introduction-to-tiny-spellchecker?keyword=docs
Use this configuration to enable the TinyMCE Enterprise Spellchecking plugin with Tiny Cloud. The server-side component is automatically configured.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'tinymcespellchecker',
spellchecker_language: 'en-US' // Note: Using RFC5646 format with hyphen
});
```
--------------------------------
### View Initiation Logs
Source: https://www.tiny.cloud/docs/tinymce/latest/individual-spelling-container
Example of successful service startup logs indicating correct configuration loading.
```log
✔ Container spelling-tiny-spelling-tiny-1 Created 0.1s
Attaching to spelling-tiny-1
spelling-tiny-1 | 2025-09-15 05:37:52.505Z [io-compute-0] INFO ironbark - ironbark
...
spelling-tiny-1 | 2025-09-15 05:37:52.816Z [io-compute-blocker-0] INFO ironbark - -> Raw Config assembled from various sources: ConfigOrigin(merge of /app/application.conf: 1,system properties,reference.conf @ jar:file:/app/ironbark.jar!/reference.conf: 1)
spelling-tiny-1 | 2025-09-15 05:37:52.874Z [io-compute-blocker-0] INFO c.e.d.config.AllowedOriginsConfig$ - Read allowed-origins config (ignoring ports = true) as:
spelling-tiny-1 | - localhost:8000
spelling-tiny-1 | - example.com
spelling-tiny-1 | - good.com
spelling-tiny-1 | - my.company.org
spelling-tiny-1 | 2025-09-15 05:37:52.877Z [io-compute-blocker-0] INFO ironbark - ironbark config loaded successfully: IronbarkConfig(Logger[ironbark],SpellingConfig(None,200,None,5,0.8,500),OriginWhitelist(List(localhost:8000, example.com, good.com, my.company.org),OriginPrecision(true)),Some(CustomDictionaryPath(/app/resources/custom-dictionaries)),Some(HunspellDictionaryPath(/app/resources/hunspell-dictionaries)),StaticCustomDictionaryScanConfig)
spelling-tiny-1 | 2025-09-15 05:37:52.959Z [io-compute-6] INFO com.ephox.nectar.data.Bees$ - Loading all dictionaries from WinterTree
spelling-tiny-1 | 2025-09-15 05:37:54.143Z [io-compute-blocker-0] INFO o.h.b.c.nio1.NIO1SocketServerGroup - Service bound to address /[0:0:0:0:0:0:0:0]:18080
spelling-tiny-1 | 2025-09-15 05:37:54.149Z [io-compute-blocker-0] INFO o.h.blaze.server.BlazeServerBuilder -
spelling-tiny-1 | _ _ _ _ _
spelling-tiny-1 | | |_| |_| |_ _ __| | | ___
spelling-tiny-1 | | ' \ _| _| '_ \_ _(_-<
spelling-tiny-1 | |_||_\__|\__| .__/ |_|/__/
spelling-tiny-1 | |_|
spelling-tiny-1 | 2025-09-15 05:37:54.157Z [io-compute-blocker-0] INFO o.h.blaze.server.BlazeServerBuilder - http4s v0.23.27 on blaze v0.23.16 started at http://[::]:18080/
```
--------------------------------
### Initialize Merge Tags with HTML content
Source: https://www.tiny.cloud/docs/tinymce/latest/mergetags?keyword=docs
Example showing the HTML textarea setup and the corresponding TinyMCE initialization with specific merge tag configurations.
```html
```
```javascript
tinymce.init({
selector: "textarea#mergetags",
plugins: "powerpaste a11ychecker linkchecker wordcount table advtable editimage autosave advlist anchor advcode image link lists media mediaembed searchreplace visualblocks mergetags",
toolbar: "mergetags | undo redo | styles | bold italic underline | link | align bullist numlist",
mergetags_prefix: '{*',
mergetags_suffix: '*}',
mergetags_list: [
{
title: 'Client',
menu: [
{
value: 'Client.LastCallDate',
title: 'Call date'
},
{
value: 'Client.Name',
title: 'Client name'
}
]
},
{
title: 'Proposal',
menu: [
{
value: 'Proposal.SubmissionDate',
title: 'Submission date'
}
]
},
{
value: 'Consultant',
title: 'Consultant'
},
{
value: 'Salutation',
title: 'Salutation'
}
]
});
```
--------------------------------
### Configure license key
Source: https://www.tiny.cloud/docs/tinymce/latest/vue-ref
Examples for setting commercial or GPL license keys.
```html
```
```html
```
--------------------------------
### View Initiation Logs
Source: https://www.tiny.cloud/docs/tinymce/latest/individual-hyperlinking-container
Example output logs indicating successful service startup and configuration loading.
```text
✔ Container hyperlinking-tiny-hyperlinking-tiny-1 Created 0.1s
Attaching to hyperlinking-tiny-1
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-7] INFO navi - navi
...
-> Found value for property: /app/application.conf
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * Parsing config defined by /app/application.conf from property: ephox.config.file
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - -> Processing file: /app/application.conf
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * External application.conf => /opt/ephox/application.conf
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * Optional File (/opt/ephox/application.conf). Defaults to empty if file not found
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * Internal Configuration
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - -> No extra internal configuration specified - skipping
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * Default (Reference) Configuration
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - * Loading configuration files from classpath (reference.conf and integration.conf). Neither is required.
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - -> Raw Config assembled from various sources: ConfigOrigin(merge of /app/application.conf: 1,system properties,reference.conf @ jar:file:/app/navi.jar!/reference.conf: 1)
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO c.e.d.config.AllowedOriginsConfig$ - Read allowed-origins config (ignoring ports = true) as:
hyperlinking-tiny-1 | - localhost:8000
hyperlinking-tiny-1 | - example.com
hyperlinking-tiny-1 | - good.com
hyperlinking-tiny-1 | - my.company.org
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO c.e.d.config.AllowedOriginsConfig$ - Read allowed-origins config (ignoring ports = true) as:
hyperlinking-tiny-1 | - localhost:8000
hyperlinking-tiny-1 | - example.com
hyperlinking-tiny-1 | - good.com
hyperlinking-tiny-1 | - my.company.org
hyperlinking-tiny-1 | 2025-09-15 04:57:29 [io-compute-blocker-7] INFO navi - navi config loaded successfully: NaviConfig(LinkCheckerConfig(true,ReturnUnknown),true,CacheConfig(10000,86400 seconds,3600 seconds),SdkServiceWithClientConfig(HttpConfig(100,10,10,3,HttpConfigTimeouts(15,15,15),JvmTrustModel()),None,OriginWhitelist(List(localhost:8000, example.com, good.com, my.company.org),OriginPrecision(true))),SelfHostedMediaSourcesConfig(CustomEmbedPlugins(UrlTrie(Branch(None,TreeMap()),Branch(None,TreeMap(org -> Branch(None,TreeMap(wikipedia -> Branch(None,TreeMap(en -> Branch(Some(PathMatcher(List((wiki/.*,WikipediaEmbedPlugin(https://en.wikipedia.org/w/api.php,10))))),TreeMap()))))))))),None),OriginWhitelist(List(localhost:8000, example.com, good.com, my.company.org),OriginPrecision(true)),Logger[navi])
hyperlinking-tiny-1 | 2025-09-15 04:57:30 [io-compute-blocker-7] INFO o.h.b.c.nio1.NIO1SocketServerGroup - Service bound to address /[0:0:0:0:0:0:0:0]:19100
hyperlinking-tiny-1 | 2025-09-15 04:57:30 [io-compute-blocker-7] INFO o.h.blaze.server.BlazeServerBuilder -
```
--------------------------------
### Example Usage: Creating Links to Anchors
Source: https://www.tiny.cloud/docs/tinymce/latest/anchor
A step-by-step guide on how to create links that navigate to specific anchors within the document using the TinyMCE editor.
```APIDOC
## How to Create Links to Anchors
To create a link that jumps to an anchor:
1. Select the text you want to turn into a link
2. Click the link button in the toolbar or use Insert → Link from the menu
3. In the Insert/Edit Link dialog, click the "Anchors" dropdown list
4. Select the anchor you want to link to from the dropdown
5. Click Save to create the link
After creating anchors and links, you can test them by clicking on the links. The editor will automatically scroll to the anchor location in the document.
```
--------------------------------
### Initialize Project Scaffolding
Source: https://www.tiny.cloud/docs/tinymce/latest/vite-es6-npm
Create a new project directory with Vite and install the TinyMCE package.
```shell
npm create vite@5 . && npm install tinymce
```
--------------------------------
### Configure TinyMCE with Commercial License Key
Source: https://www.tiny.cloud/docs/tinymce/latest/webcomponent-ref
Example of setting a commercial license key for TinyMCE when using a self-hosted deployment. This is required for commercial TinyMCE installations.
```html
```
--------------------------------
### Basic Setup
Source: https://www.tiny.cloud/docs/tinymce/latest/code
This section shows how to initialize TinyMCE with the Code plugin enabled.
```APIDOC
## Basic setup
```javascript
tinymce.init({
selector: 'textarea', // change this value according to your HTML
plugins: 'code',
toolbar: 'code',
});
```
```
--------------------------------
### Basic Setup
Source: https://www.tiny.cloud/docs/tinymce/latest/anchor
This snippet shows the minimal configuration required to enable the Anchor plugin and its associated toolbar button.
```APIDOC
## Basic setup
```javascript
tinymce.init({
selector: "textarea",
plugins: [
"anchor", "link", // Link plugin is required for linking to anchors
],
toolbar: "link | anchor",
});
```
```
--------------------------------
### Configure a Dialog Footer Submit Button
Source: https://www.tiny.cloud/docs/tinymce/latest/dialog-footer-buttons
Example configuration for a submit type footer button. This button is styled as primary, aligned to the start, and active only in design mode.
```javascript
{
type: 'submit', // button type
name: 'submitButton', // identifying name
text: 'Submit', // text for the button
// icon: 'checkmark', // will replace the text if configured
enabled: true, // button is active when the dialog opens
buttonType: 'primary', // style the button as a primary button
align: 'start', // align the button to the left of the dialog footer
context: 'mode:design' // button is active when the editor is in design mode, only effective if enabled is true
}
```
--------------------------------
### Configure TinyMCE Editor in JavaScript
Source: https://www.tiny.cloud/docs/tinymce/latest/webpack-cjs-download
Imports and initializes TinyMCE with specified themes, models, skins, and plugins. This example demonstrates how to bundle TinyMCE assets for a self-hosted setup.
```javascript
/* Import TinyMCE */
const tinymce = require('../tinymce/js/tinymce/tinymce.js');
/* Default icons are required. After that, import custom icons if applicable */
require('../tinymce/js/tinymce/icons/default/icons.js');
/* Required TinyMCE components */
require('../tinymce/js/tinymce/themes/silver/theme.js');
require('../tinymce/js/tinymce/models/dom/model.js');
/* Import the default skin (oxide). Replace with a custom skin if required. */
require('../tinymce/js/tinymce/skins/ui/oxide/skin.css');
/* Import plugins - include the relevant plugin in the 'plugins' option. */
require('../tinymce/js/tinymce/plugins/advlist');
require('../tinymce/js/tinymce/plugins/code');
require('../tinymce/js/tinymce/plugins/emoticons');
require('../tinymce/js/tinymce/plugins/emoticons/js/emojis');
require('../tinymce/js/tinymce/plugins/link');
require('../tinymce/js/tinymce/plugins/lists');
require('../tinymce/js/tinymce/plugins/table');
require('../tinymce/js/tinymce/plugins/help');
require('../tinymce/js/tinymce/plugins/help/js/i18n/keynav/en');
/* content UI CSS is required (using the default oxide skin) */
const contentUiSkinCss = require('../tinymce/js/tinymce/skins/ui/oxide/content.css');
/* The default content CSS can be changed or replaced with appropriate CSS for the editor content. */
const contentCss = require('../tinymce/js/tinymce/skins/content/default/content.css');
/* Initialize TinyMCE */
exports.render = () => {
tinymce.init({
selector: 'textarea#editor',
/* All plugins need to be imported and added to the plugins option. */
plugins: 'advlist code emoticons link lists table help',
toolbar: 'bold italic | bullist numlist | link emoticons',
skin: false,
content_css: false,
content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString(),
/* Optional: Configure external_plugins for lazy loading premium plugins
* Remove the import or require statement for any premium plugin you want to lazy load,
* then uncomment and configure external_plugins below:
*/
// external_plugins: {
// 'advcode': '/plugins/advcode/plugin.min.js',
// 'tinycomments': '/plugins/tinycomments/plugin.min.js'
// },
});
};
```
--------------------------------
### Clone the Tiny Drive .NET starter repository
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-dotnet
Use this command to download the starter project from GitHub.
```sh
$ git clone git@github.com:tinymce/tinydrive-dotnet-starter.git
```
--------------------------------
### Setup Post-Install Script for Copying Packages
Source: https://www.tiny.cloud/docs/tinymce/latest/jquery-pm
This JavaScript script copies installed packages from node_modules to a public directory. It ensures TinyMCE and its jQuery integration are accessible for the frontend.
```javascript
const fse = require('fs-extra');
const path = require('path');
const nodeModulesDir = path.join(__dirname, 'node_modules');
const publicDir = path.join(__dirname, 'public');
fse.emptyDirSync(path.join(publicDir, 'jquery'));
fse.emptyDirSync(path.join(publicDir, 'tinymce'));
fse.emptyDirSync(path.join(publicDir, 'tinymce-jquery'));
fse.copySync(path.join(nodeModulesDir, 'jquery', 'dist'), path.join(publicDir, 'jquery'), { overwrite: true });
fse.copySync(path.join(nodeModulesDir, 'tinymce'), path.join(publicDir, 'tinymce'), { overwrite: true });
fse.copySync(path.join(nodeModulesDir, '@tinymce', 'tinymce-jquery', 'dist'), path.join(publicDir, 'tinymce-jquery'), { overwrite: true });
```
--------------------------------
### Basic Full Page HTML Plugin Setup
Source: https://www.tiny.cloud/docs/tinymce/latest/fullpagehtml
Add 'fullpagehtml' to the plugins and toolbar options to enable the Full Page HTML plugin. This example sets a default doctype.
```javascript
tinymce.init({
selector: 'textarea',
plugins: 'fullpagehtml',
toolbar: 'fullpagehtml',
fullpagehtml_default_doctype: ''
});
```
--------------------------------
### Initialize TinyMCE with Quickbars
Source: https://www.tiny.cloud/docs/tinymce/latest/quickbars
Configuration examples for initializing TinyMCE with the Quickbars plugin in different editor modes.
```javascript
tinymce.init({
selector: 'textarea#iframe',
plugins: 'quickbars table image link lists media autoresize help',
toolbar: 'undo redo | blocks | bold italic | alignleft aligncentre alignright alignjustify | indent outdent | bullist numlist',
content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
});
tinymce.init({
selector: 'div#inline-distraction-free',
menubar: false,
inline: true,
plugins: [
'autolink', 'autoresize', 'codesample', 'link', 'lists', 'media',
'powerpaste', 'table', 'image', 'quickbars', 'codesample', 'help'
],
toolbar: false,
quickbars_insert_toolbar: 'quicktable image media codesample',
quickbars_selection_toolbar: 'bold italic underline | blocks | bullist numlist | blockquote quicklink',
contextmenu: 'undo redo | inserttable | cell row column deletetable | help',
powerpaste_word_import: 'clean',
powerpaste_html_import: 'clean',
});
```
```javascript
tinymce.init({
selector: 'textarea', // change this value according to your HTML
plugins: 'quickbars'
});
```
--------------------------------
### Clone the Tiny Drive PHP starter repository
Source: https://www.tiny.cloud/docs/tinymce/latest/tinydrive-php
Use this command to download the starter project from GitHub.
```sh
$ git clone git@github.com:tinymce/tinydrive-php-starter.git
```
--------------------------------
### Configure TinyMCE Editor Initialization
Source: https://www.tiny.cloud/docs/tinymce/latest/rollup-es6-npm
Imports required TinyMCE components, themes, models, skins, and plugins for editor setup. This example includes premium plugins and custom content styling.
```javascript
/* Import TinyMCE */
import tinymce from 'tinymce';
/* Default icons are required. After that, import custom icons if applicable */
import 'tinymce/icons/default';
/* Required TinyMCE components */
import 'tinymce/themes/silver';
import 'tinymce/models/dom';
/* Import the default skin (oxide). Replace with a custom skin if required. */
import 'tinymce/skins/ui/oxide/skin.css';
/* Import plugins */
import 'tinymce/plugins/advlist';
import 'tinymce/plugins/code';
import 'tinymce/plugins/emoticons';
import 'tinymce/plugins/emoticons/js/emojis';
import 'tinymce/plugins/link';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/table';
import 'tinymce/plugins/help';
import 'tinymce/plugins/help/js/i18n/keynav/en';
// Import premium plugins from NPM
import 'tinymce-premium/plugins/advcode';
import 'tinymce-premium/plugins/tinycomments';
// Always include the licensekeymanager plugin when using premium plugins with a commercial license.
import 'tinymce-premium/plugins/licensekeymanager';
/* content UI CSS is required (using the default oxide skin) */
import contentUiSkinCss from 'tinymce/skins/ui/oxide/content.css';
/* The default content CSS can be changed or replaced with appropriate CSS for the editor content. */
import contentCss from 'tinymce/skins/content/default/content.css';
/* Initialize TinyMCE */
export function render () {
tinymce.init({
selector: 'textarea#editor',
plugins: 'advlist code emoticons link lists table help',
toolbar: 'bold italic | bullist numlist | link emoticons',
skin: false,
content_css: false,
content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString(),
/* Alternatively to importing premium plugins directly, you can configure external_plugins to load premium plugins in a different location.
* Remember to include the licensekeymanager plugin when using premium plugins.
*/
// external_plugins: {
// 'advcode': '/advcode/plugin.min.js',
// 'tinycomments': '/tinycomments/plugin.min.js'
// 'licensekeymanager': '/licensekeymanager/plugin.min.js',
// },
});
};
```
--------------------------------
### Bind `ResizeEditor` Event Before Initialization
Source: https://www.tiny.cloud/docs/tinymce/latest/events
This example demonstrates binding an editor core event like `ResizeEditor` using the `setup` option. The `e` parameter is not used as this event does not return data.
```javascript
tinymce.init({
selector: 'textarea',
setup: (editor) => {
editor.on('ResizeEditor', (e) => {
console.log('Editor was resized.');
});
}
});
```
--------------------------------
### Start the development server
Source: https://www.tiny.cloud/docs/tinymce/latest/laravel-tiny-cloud
Launch the local Laravel development server to preview the application.
```sh
php artisan serve
```