Skip to content

Commit

Permalink
merge head plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
gmrchk committed May 23, 2018
1 parent 600ebb2 commit 9903336
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 0 deletions.
169 changes: 169 additions & 0 deletions dist/plugins/swupMergeHeadPlugin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["swupMergeHeadPlugin"] = factory();
else
root["swupMergeHeadPlugin"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = {
name: 'swupMergeHeadPlugin',
options: { runScripts: false },
exec: function exec(options, swup, getHTMLfromCache) {
document.addEventListener('swup:contentReplaced', function () {
var currentHead = document.querySelector('head');
var newHead = getHTMLfromCache().querySelector('head');
replaceHeadWithoutReplacingExistingTags(currentHead, newHead);
});

var replaceHeadWithoutReplacingExistingTags = function replaceHeadWithoutReplacingExistingTags(currentHead, newHead) {
var oldTags = currentHead.children;
var newTags = newHead.children;
var oldTagsToRemove = [];
var newTagsToRemove = [];

for (var i = 0; i < oldTags.length; i++) {
var oldTag = oldTags[i];
var oldTagIdentifier = oldTag.outerHTML;
var foundInNewHead = false;
var newTag = void 0;
for (var j = 0; j < newTags.length; j++) {
newTag = newTags[j];
var newTagIdentifier = newTag.outerHTML;

if (newTagIdentifier === oldTagIdentifier) {
foundInNewHead = true;
break;
}
}

if (foundInNewHead) {
newTagsToRemove.push(newTag);
} else {
oldTagsToRemove.push(oldTag);
}
}

for (var _i = 0; _i < newTagsToRemove.length; _i++) {
newHead.removeChild(newTagsToRemove[_i]);
}

for (var _i2 = 0; _i2 < oldTagsToRemove.length; _i2++) {
currentHead.removeChild(oldTagsToRemove[_i2]);
}

var added = newHead.children.length;
var removed = oldTagsToRemove.length;

var fragment = document.createDocumentFragment();
for (var _i3 = 0; _i3 < newHead.children.length; _i3++) {
fragment.appendChild(newHead.children[_i3]);
}
currentHead.appendChild(fragment);

if (options.runScripts) {
newHead.querySelectorAll('script').forEach(function (item) {
if (item.tagName == "SCRIPT" && (item.type == null || item.type == "" || item.type == "text/javascript")) {
var elem = document.createElement('script');
if (item.src != null && item.src != "") {
elem.src = item.src;
} else {
var inline = document.createTextNode(item.innerText);
elem.appendChild(inline);
}
if (item.type != null && item.type != "") {
elem.type = item.type;
}
currentHead.appendChild(elem);
} else {}
});
}

swup.log('Removed ' + removed + ' / added ' + added + ' tags in head');
};
}
};

/***/ })
/******/ ]);
});
1 change: 1 addition & 0 deletions dist/plugins/swupMergeHeadPlugin.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

80 changes: 80 additions & 0 deletions src/plugins/swupMergeHeadPlugin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
module.exports = {
name: 'swupMergeHeadPlugin',
options: {runScripts: false},
exec: function(options, swup, getHTMLfromCache) {
document.addEventListener('swup:contentReplaced', function () {
let currentHead = document.querySelector('head')
let newHead = getHTMLfromCache().querySelector('head')
replaceHeadWithoutReplacingExistingTags(currentHead, newHead)
})

let replaceHeadWithoutReplacingExistingTags = (currentHead, newHead) => {
let oldTags = currentHead.children;
let newTags = newHead.children;
let oldTagsToRemove = [];
let newTagsToRemove = [];

for (let i = 0; i < oldTags.length; i++) {
let oldTag = oldTags[i];
let oldTagIdentifier = oldTag.outerHTML;
let foundInNewHead = false;
let newTag;
for (let j = 0; j < newTags.length; j++) {
newTag = newTags[j];
let newTagIdentifier = newTag.outerHTML;

if (newTagIdentifier === oldTagIdentifier) {
foundInNewHead = true;
break;
}
}

if (foundInNewHead) {
newTagsToRemove.push(newTag)
} else {
oldTagsToRemove.push(oldTag)
}

}

for (let i = 0; i < newTagsToRemove.length; i++) {
newHead.removeChild(newTagsToRemove[i])
}

for (let i = 0; i < oldTagsToRemove.length; i++) {
currentHead.removeChild(oldTagsToRemove[i])
}

let added = newHead.children.length
let removed = oldTagsToRemove.length

let fragment = document.createDocumentFragment()
for (let i = 0; i < newHead.children.length; i++) {
fragment.appendChild(newHead.children[i])
}
currentHead.appendChild(fragment);

if (options.runScripts) {
newHead.querySelectorAll('script').forEach(item => {
if (item.tagName == "SCRIPT" && (item.type == null || item.type == "" || item.type == "text/javascript")) {
let elem = document.createElement('script')
if (item.src != null && item.src != "") {
elem.src = item.src
} else {
let inline = document.createTextNode(item.innerText)
elem.appendChild(inline)
}
if (item.type != null && item.type != "") {
elem.type = item.type
}
currentHead.appendChild(elem)
} else {

}
})
}

swup.log(`Removed ${removed} / added ${added} tags in head`)
}
}
}

0 comments on commit 9903336

Please sign in to comment.