diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index 9e66a0640..f38bd71df 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -107,14 +107,6 @@ class HomeController extends Controller
return view('home.default', $commonData);
}
- /**
- * Get custom head HTML, Used in ajax calls to show in editor.
- */
- public function customHeadContent()
- {
- return view('common.custom-head');
- }
-
/**
* Show the view for /robots.txt.
*/
diff --git a/resources/js/components/markdown-editor.js b/resources/js/components/markdown-editor.js
index a14047d2f..e41ab15f6 100644
--- a/resources/js/components/markdown-editor.js
+++ b/resources/js/components/markdown-editor.js
@@ -98,11 +98,6 @@ class MarkdownEditor {
toolbarLabel.closest('.markdown-editor-wrap').classList.add('active');
});
- window.$events.listen('editor-markdown-update', value => {
- this.cm.setValue(value);
- this.updateAndRender();
- });
-
this.codeMirrorSetup();
this.listenForBookStackEditorEvents();
diff --git a/resources/js/components/page-editor.js b/resources/js/components/page-editor.js
index 5f35e6499..dae807122 100644
--- a/resources/js/components/page-editor.js
+++ b/resources/js/components/page-editor.js
@@ -158,8 +158,10 @@ class PageEditor {
this.draftDisplay.innerText = this.editingPageText;
this.toggleDiscardDraftVisibility(false);
- window.$events.emit('editor-html-update', response.data.html || '');
- window.$events.emit('editor-markdown-update', response.data.markdown || response.data.html);
+ window.$events.emit('editor::replace', {
+ html: response.data.html,
+ markdown: response.data.markdown,
+ });
this.titleElem.value = response.data.name;
window.setTimeout(() => {
diff --git a/resources/js/wysiwyg/config.js b/resources/js/wysiwyg/config.js
index f1eca3348..0b43b9c79 100644
--- a/resources/js/wysiwyg/config.js
+++ b/resources/js/wysiwyg/config.js
@@ -138,16 +138,16 @@ function gatherPlugins(options) {
}
/**
- * Load custom HTML head content from the settings into the editor.
- * TODO: We should be able to get this from current parent page?
- * @param {Editor} editor
+ * Fetch custom HTML head content from the parent page head into the editor.
*/
-function loadCustomHeadContent(editor) {
- window.$http.get(window.baseUrl('/custom-head-content')).then(resp => {
- if (!resp.data) return;
- let head = editor.getDoc().querySelector('head');
- head.innerHTML += resp.data;
- });
+function fetchCustomHeadContent() {
+ const headContentLines = document.head.innerHTML.split("\n");
+ const startLineIndex = headContentLines.findIndex(line => line.trim() === '');
+ const endLineIndex = headContentLines.findIndex(line => line.trim() === '');
+ if (startLineIndex === -1 || endLineIndex === -1) {
+ return ''
+ }
+ return headContentLines.slice(startLineIndex + 1, endLineIndex).join('\n');
}
/**
@@ -176,15 +176,6 @@ function getSetupCallback(options) {
window.$events.emit('editor-html-change', content);
}
- // TODO - Update to standardise across both editors
- // Use events within listenForBookStackEditorEvents instead (Different event signature)
- window.$events.listen('editor-html-update', html => {
- editor.setContent(html);
- editor.selection.select(editor.getBody(), true);
- editor.selection.collapse(false);
- editorChange(html);
- });
-
// Custom handler hook
window.$events.emitPublic(options.containerElement, 'editor-tinymce::setup', {editor});
@@ -253,7 +244,9 @@ export function build(options) {
}
},
init_instance_callback(editor) {
- loadCustomHeadContent(editor);
+ let head = editor.getDoc().querySelector('head');
+ console.log(fetchCustomHeadContent());
+ head.innerHTML += fetchCustomHeadContent();
},
setup(editor) {
for (const [key, config] of Object.entries(toolBarGroupButtons)) {
diff --git a/resources/views/common/custom-head.blade.php b/resources/views/common/custom-head.blade.php
index 6f88bd43f..7f2e93cdc 100644
--- a/resources/views/common/custom-head.blade.php
+++ b/resources/views/common/custom-head.blade.php
@@ -1,7 +1,7 @@
@inject('headContent', 'BookStack\Theming\CustomHtmlHeadContentProvider')
@if(setting('app-custom-head') && \Route::currentRouteName() !== 'settings')
-
+
{!! $headContent->forWeb() !!}
-
+
@endif
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 7a12acc31..ad4fb9067 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -206,7 +206,6 @@ Route::middleware('auth')->group(function () {
// Other Pages
Route::get('/', [HomeController::class, 'index']);
Route::get('/home', [HomeController::class, 'index']);
- Route::get('/custom-head-content', [HomeController::class, 'customHeadContent']);
// Settings
Route::get('/settings', [SettingController::class, 'index'])->name('settings');
diff --git a/tests/Settings/CustomHeadContentTest.php b/tests/Settings/CustomHeadContentTest.php
index 36c8a4c0f..eeeab3f45 100644
--- a/tests/Settings/CustomHeadContentTest.php
+++ b/tests/Settings/CustomHeadContentTest.php
@@ -14,6 +14,15 @@ class CustomHeadContentTest extends TestCase
$resp->assertSee('console.log("cat")', false);
}
+ public function test_content_wrapped_in_specific_html_comments()
+ {
+ // These comments are used to identify head content for editor injection
+ $this->setSettings(['app-custom-head' => '']);
+ $resp = $this->get('/login');
+ $resp->assertSee('', false);
+ $resp->assertSee('', false);
+ }
+
public function test_configured_content_does_not_show_on_settings_page()
{
$this->setSettings(['app-custom-head' => '']);