[neon/kde/kapidox/Neon/unstable] debian: Replace minified JS with original source.
Aurélien COUDERC
null at kde.org
Sun May 1 21:39:24 BST 2022
Git commit e13f1d43a23fcc0538157aa17f9976dcd3a90c63 by Aurélien COUDERC.
Committed on 28/01/2022 at 23:33.
Pushed by sitter into branch 'Neon/unstable'.
Replace minified JS with original source.
M +1 -0 debian/changelog
A +453 -0 debian/patches/replace-minified-js-with-original
A +1 -0 debian/patches/series
https://invent.kde.org/neon/kde/kapidox/commit/e13f1d43a23fcc0538157aa17f9976dcd3a90c63
diff --git a/debian/changelog b/debian/changelog
index 3df4c2c..73d2334 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -10,6 +10,7 @@ kapidox (5.90.0-1) UNRELEASED; urgency=medium
* New upstream release (5.90.0).
* Added myself to the uploaders.
* Refresh lintian overrides.
+ * Replace minified JS with original source.
-- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org> Mon, 13 Dec 2021 05:12:42 +0900
diff --git a/debian/patches/replace-minified-js-with-original b/debian/patches/replace-minified-js-with-original
new file mode 100644
index 0000000..69247fc
--- /dev/null
+++ b/debian/patches/replace-minified-js-with-original
@@ -0,0 +1,453 @@
+Description: Replace minified JS with its original source
+ The minified JS mentions « copied from develop.kde.org ».
+ This patch replaces the minified JS with the original source found in the
+ upstream website repo.
+Origin: https://inven.kde.org/documentation/develop-kde-org/-/tree/4b2787c0e4bd8769dabb434a2f95cec8edf5c005/assets/js
+---
+--- a/src/kapidox/data/htmlresource/js/main.js
++++ b/src/kapidox/data/htmlresource/js/main.js
+@@ -1,50 +1,395 @@
+-/** copied from develop.kde.org */
+-(function($){'use strict';$(function(){$('[data-toggle="tooltip"]').tooltip();$('[data-toggle="popover"]').popover();$('.popover-dismiss').popover({trigger:'focus'})});function bottomPos(element){return element.offset().top+element.outerHeight();}
+-$(function(){var promo=$(".js-td-cover");if(!promo.length){return}
+-var promoOffset=bottomPos(promo);var navbarOffset=$('.js-navbar-scroll').offset().top;var threshold=Math.ceil($('.js-navbar-scroll').outerHeight());if((promoOffset-navbarOffset)<threshold){$('.js-navbar-scroll').addClass('navbar-bg-onscroll');}
+-$(window).on('scroll',function(){var navtop=$('.js-navbar-scroll').offset().top-$(window).scrollTop();var promoOffset=bottomPos($('.js-td-cover'));var navbarOffset=$('.js-navbar-scroll').offset().top;if((promoOffset-navbarOffset)<threshold){$('.js-navbar-scroll').addClass('navbar-bg-onscroll');}else{$('.js-navbar-scroll').removeClass('navbar-bg-onscroll');$('.js-navbar-scroll').addClass('navbar-bg-onscroll--fade');}});});}(jQuery));function getOffsetSum(elem){var top=0,left=0
+-while(elem){top=top+parseInt(elem.offsetTop)
+-left=left+parseInt(elem.offsetLeft)
+-elem=elem.offsetParent}
+-return{top:top,left:left}}
+-function setActiveMenuItem(li){var isMenuItem=li.matches('#TableOfContents > ul > li')
+-var isSubMenuItem=li.matches('#TableOfContents > ul > li > ul > li')
+-var wasActive=li.classList.contains('active')
+-if(isMenuItem||!wasActive){var menuItem=document.querySelector('#TableOfContents > ul > li.active')
+-if(menuItem){menuItem.classList.remove('active')}
+-var menuItem=document.querySelector('#TableOfContents > ul > li > ul > li.active')
+-if(menuItem){menuItem.classList.remove('active')}}
+-li.classList.add('active')
+-if(isMenuItem){var firstSubMenuItem=li.querySelector('ul > li')
+-if(firstSubMenuItem){firstSubMenuItem.classList.add('active')}}else if(isSubMenuItem){var menuItem=li.parentNode.parentNode
+-menuItem.classList.add('active')}}
+-function getMenuItemElement(li){var id=li.querySelector('a').href.split('#',2)[1]
+-return document.getElementById(id)}
+-function updateTOC(){var viewTop=window.scrollY
+-var tocList=document.querySelectorAll('#TableOfContents li')
+-for(var i=0;i<tocList.length;i++){var curMenuItem=tocList[i]
+-var curElement=getMenuItemElement(curMenuItem)
+-var offset=getOffsetSum(curElement)
+-var offsetDiff=viewTop-offset.top
+-if(offsetDiff<0){if(i<=1){setActiveMenuItem(curMenuItem)}else{var prevMenuItem=tocList[i-1]
+-var prevElement=getMenuItemElement(prevMenuItem)
+-var prevOffset=getOffsetSum(prevElement)
+-var prevOffsetDiff=viewTop-prevOffset.top
+-var sectionReadRatio=(prevOffsetDiff)/prevMenuItem.offsetHeight
+-if(sectionReadRatio>=0.7){setActiveMenuItem(curMenuItem)}else{setActiveMenuItem(prevMenuItem)}}
+-break}else if(i==tocList.length-1){setActiveMenuItem(curMenuItem)}}}
+-var updating=false
+-function queueUpdateTOC(){if(!updating){updating=true
+-requestAnimationFrame(function(){updateTOC()
+-updating=false})}}
++// Imported from https://invent.kde.org/documentation/develop-kde-org/-/blob/cafdb9dfe7b37b8060e6a4fcc0709bcc80a42d15/assets/js/base.js
++/*
++ * Copyright 2018 Google LLC
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ https://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
++*/
++
++(function($) {
++
++ 'use strict';
++
++ $(function() {
++ $('[data-toggle="tooltip"]').tooltip();
++ $('[data-toggle="popover"]').popover();
++
++ $('.popover-dismiss').popover({
++ trigger: 'focus'
++ })
++ });
++
++
++ function bottomPos(element) {
++ return element.offset().top + element.outerHeight();
++ }
++
++ // Bootstrap Fixed Header
++ $(function() {
++ var promo = $(".js-td-cover");
++ if (!promo.length) {
++ return
++ }
++
++ var promoOffset = bottomPos(promo);
++ var navbarOffset = $('.js-navbar-scroll').offset().top;
++
++ var threshold = Math.ceil($('.js-navbar-scroll').outerHeight());
++ if ((promoOffset - navbarOffset) < threshold) {
++ $('.js-navbar-scroll').addClass('navbar-bg-onscroll');
++ }
++
++
++ $(window).on('scroll', function() {
++ var navtop = $('.js-navbar-scroll').offset().top - $(window).scrollTop();
++ var promoOffset = bottomPos($('.js-td-cover'));
++ var navbarOffset = $('.js-navbar-scroll').offset().top;
++ if ((promoOffset - navbarOffset) < threshold) {
++ $('.js-navbar-scroll').addClass('navbar-bg-onscroll');
++ } else {
++ $('.js-navbar-scroll').removeClass('navbar-bg-onscroll');
++ $('.js-navbar-scroll').addClass('navbar-bg-onscroll--fade');
++ }
++ });
++ });
++
++
++}(jQuery));
++
++function getOffsetSum(elem) {
++ var top=0, left=0
++ while (elem) {
++ top = top + parseInt(elem.offsetTop)
++ left = left + parseInt(elem.offsetLeft)
++ elem = elem.offsetParent
++ }
++ return { top: top, left: left }
++}
++
++function setActiveMenuItem(li) {
++ var isMenuItem = li.matches('#TableOfContents > ul > li')
++ var isSubMenuItem = li.matches('#TableOfContents > ul > li > ul > li')
++ var wasActive = li.classList.contains('active')
++
++ if (isMenuItem || !wasActive) {
++ // Unset current active item
++ var menuItem = document.querySelector('#TableOfContents > ul > li.active')
++ if (menuItem) {
++ menuItem.classList.remove('active')
++ }
++ var menuItem = document.querySelector('#TableOfContents > ul > li > ul > li.active')
++ if (menuItem) {
++ menuItem.classList.remove('active')
++ }
++ }
++ li.classList.add('active')
++
++ if (isMenuItem) {
++ var firstSubMenuItem = li.querySelector('ul > li')
++ if (firstSubMenuItem) {
++ firstSubMenuItem.classList.add('active')
++ }
++ } else if (isSubMenuItem) {
++ var menuItem = li.parentNode.parentNode // TODO: parentUntil('li')
++ menuItem.classList.add('active')
++ }
++
++ // Scroll to item
++ // li.scrollIntoView()
++}
++function getMenuItemElement(li) {
++ var id = li.querySelector('a').href.split('#', 2)[1]
++ return document.getElementById(id)
++}
++function updateTOC() {
++ var viewTop = window.scrollY
++ var tocList = document.querySelectorAll('#TableOfContents li')
++ // Binary Search maybe (since elements are in order)?
++ for (var i = 0; i < tocList.length; i++) {
++ var curMenuItem = tocList[i]
++ var curElement = getMenuItemElement(curMenuItem)
++ var offset = getOffsetSum(curElement)
++ var offsetDiff = viewTop - offset.top
++ if (offsetDiff < 0) {
++ if (i <= 1) {
++ // At top, select the first item
++ setActiveMenuItem(curMenuItem)
++ } else {
++ var prevMenuItem = tocList[i - 1]
++ var prevElement = getMenuItemElement(prevMenuItem)
++ var prevOffset = getOffsetSum(prevElement)
++ var prevOffsetDiff = viewTop - prevOffset.top
++ var sectionReadRatio = (prevOffsetDiff)/prevMenuItem.offsetHeight
++ if (sectionReadRatio >= 0.7) {
++ // Current item is being read
++ setActiveMenuItem(curMenuItem)
++ } else {
++ // Previous item is still being read
++ setActiveMenuItem(prevMenuItem)
++ }
++ }
++ break
++ } else if (i == tocList.length - 1) {
++ // At bottom, select last item
++ setActiveMenuItem(curMenuItem)
++ }
++ }
++}
++
++var updating = false
++function queueUpdateTOC() {
++ if (!updating) {
++ updating = true
++ requestAnimationFrame(function() {
++ updateTOC()
++ updating = false
++ })
++ }
++}
++
+ queueUpdateTOC()
+-window.addEventListener('scroll',queueUpdateTOC);(function($){'use strict';$(function(){var article=document.getElementsByTagName('main')[0];if(!article){return;}
+-var headings=article.querySelectorAll('h1, h2, h3, h4, h5, h6');headings.forEach(function(heading){if(heading.id){var a=document.createElement('a');a.style.visibility='hidden';a.setAttribute('aria-hidden','true');a.innerHTML=' <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>';a.href='#'+heading.id;heading.insertAdjacentElement('beforeend',a);heading.addEventListener('mouseenter',function(){a.style.visibility='initial';});heading.addEventListener('mouseleave',function(){a.style.visibility='hidden';});}});});}(jQuery));;(function($){'use strict';$(document).ready(function(){const $searchInput=$('.td-search-input');$searchInput.data('html',true);$searchInput.data('placement','bottom');$searchInput.data('template','<div class="popover offline-search-result" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>');$searchInput.on('change',(event)=>{render($(event.target));$searchInput.blur();});$searchInput.closest('form').on('submit',()=>{return false;});let idx=null;const resultDetails=new Map();$.ajax($searchInput.data('offline-search-index-json-src')).then((data)=>{idx=lunr(function(){this.ref('ref');this.field('title',{boost:2});this.field('body');data.forEach((doc)=>{this.add(doc);resultDetails.set(doc.ref,{title:doc.title,excerpt:doc.excerpt,});});});$searchInput.trigger('change');});const render=($targetSearchInput)=>{$targetSearchInput.popover('dispose');if(idx===null){return;}
+-const searchQuery=$targetSearchInput.val();if(searchQuery===''){return;}
+-const results=idx.query((q)=>{const tokens=lunr.tokenizer(searchQuery.toLowerCase());tokens.forEach((token)=>{const queryString=token.toString();q.term(queryString,{boost:100,});q.term(queryString,{wildcard:lunr.Query.wildcard.LEADING|lunr.Query.wildcard.TRAILING,boost:10,});q.term(queryString,{editDistance:2,});});}).slice(0,10);const $html=$('<div>');$html.append($('<div>').css({display:'flex',justifyContent:'space-between',marginBottom:'1em',}).append($('<span>').text('Search results').css({fontWeight:'bold'})).append($('<i>').addClass('fas fa-times search-result-close-button').css({cursor:'pointer',})));const $searchResultBody=$('<div>').css({maxHeight:`calc(100vh - ${
+-$targetSearchInput.offset().top-
+-$(window).scrollTop()+
+-180
+-}px)`,overflowY:'auto',});$html.append($searchResultBody);if(results.length===0){$searchResultBody.append($('<p>').text(`No results found for query "${searchQuery}"`));}else{results.forEach((r)=>{const $cardHeader=$('<div>').addClass('card-header');const doc=resultDetails.get(r.ref);const href=$searchInput.data('offline-search-base-href')+
+-r.ref.replace(/^\//,'');$cardHeader.append($('<a>').attr('href',href).text(doc.title));const $cardBody=$('<div>').addClass('card-body');$cardBody.append($('<p>').addClass('card-text text-muted').text(doc.excerpt));const $card=$('<div>').addClass('card');$card.append($cardHeader).append($cardBody);$searchResultBody.append($card);});}
+-$targetSearchInput.on('shown.bs.popover',()=>{$('.search-result-close-button').on('click',()=>{$targetSearchInput.val('');$targetSearchInput.trigger('change');});});$targetSearchInput.data('content',$html[0].outerHTML).popover('show');};});})(jQuery);
++window.addEventListener('scroll', queueUpdateTOC)
++
++// Imported from https://invent.kde.org/documentation/develop-kde-org/-/blob/cafdb9dfe7b37b8060e6a4fcc0709bcc80a42d15/assets/js/anchor.js
++/*
++ * Copyright 2018 Google LLC
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ https://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
++*/
++
++(function ($) {
++ 'use strict';
++
++ // Headers' anchor link that shows on hover
++ $(function () {
++ // append anchor links to headings in markdown.
++ var article = document.getElementsByTagName('main')[0];
++ if (!article) {
++ return;
++ }
++ var headings = article.querySelectorAll('h1, h2, h3, h4, h5, h6');
++ headings.forEach(function (heading) {
++ if (heading.id) {
++ var a = document.createElement('a');
++ // set visibility: hidden, not display: none to avoid layout change
++ a.style.visibility = 'hidden';
++ // [a11y] hide this from screen readers, etc..
++ a.setAttribute('aria-hidden', 'true');
++ // material insert_link icon in svg format
++ a.innerHTML = ' <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>';
++ a.href = '#' + heading.id;
++ heading.insertAdjacentElement('beforeend', a);
++ heading.addEventListener('mouseenter', function () {
++ a.style.visibility = 'initial';
++ });
++ heading.addEventListener('mouseleave', function () {
++ a.style.visibility = 'hidden';
++ });
++ }
++ });
++ });
++
++}(jQuery));
++
++// Imported from https://invent.kde.org/documentation/develop-kde-org/-/blob/cafdb9dfe7b37b8060e6a4fcc0709bcc80a42d15/assets/js/offline-search.js
++// Adapted from code by Matt Walters https://www.mattwalters.net/posts/hugo-and-lunr/
++
++(function ($) {
++ 'use strict';
++
++ $(document).ready(function () {
++ const $searchInput = $('.td-search-input');
++
++ //
++ // Options for popover
++ //
++
++ $searchInput.data('html', true);
++ $searchInput.data('placement', 'bottom');
++ $searchInput.data(
++ 'template',
++ '<div class="popover offline-search-result" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
++ );
++
++ //
++ // Register handler
++ //
++
++ $searchInput.on('change', (event) => {
++ render($(event.target));
++
++ // Hide keyboard on mobile browser
++ $searchInput.blur();
++ });
++
++ // Prevent reloading page by enter key on sidebar search.
++ $searchInput.closest('form').on('submit', () => {
++ return false;
++ });
++
++ //
++ // Lunr
++ //
++
++ let idx = null; // Lunr index
++ const resultDetails = new Map(); // Will hold the data for the search results (titles and summaries)
++
++ // Set up for an Ajax call to request the JSON data file that is created by Hugo's build process
++ $.ajax($searchInput.data('offline-search-index-json-src')).then(
++ (data) => {
++ idx = lunr(function () {
++ this.ref('ref');
++ this.field('title', { boost: 2 });
++ this.field('body');
++
++ data.forEach((doc) => {
++ this.add(doc);
++
++ resultDetails.set(doc.ref, {
++ title: doc.title,
++ excerpt: doc.excerpt,
++ });
++ });
++ });
++
++ $searchInput.trigger('change');
++ }
++ );
++
++ const render = ($targetSearchInput) => {
++ // Dispose the previous result
++ $targetSearchInput.popover('dispose');
++
++ //
++ // Search
++ //
++
++ if (idx === null) {
++ return;
++ }
++
++ const searchQuery = $targetSearchInput.val();
++ if (searchQuery === '') {
++ return;
++ }
++
++ const results = idx
++ .query((q) => {
++ const tokens = lunr.tokenizer(searchQuery.toLowerCase());
++ tokens.forEach((token) => {
++ const queryString = token.toString();
++ q.term(queryString, {
++ boost: 100,
++ });
++ q.term(queryString, {
++ wildcard:
++ lunr.Query.wildcard.LEADING |
++ lunr.Query.wildcard.TRAILING,
++ boost: 10,
++ });
++ q.term(queryString, {
++ editDistance: 2,
++ });
++ });
++ })
++ .slice(0, 10);
++
++ //
++ // Make result html
++ //
++
++ const $html = $('<div>');
++
++ $html.append(
++ $('<div>')
++ .css({
++ display: 'flex',
++ justifyContent: 'space-between',
++ marginBottom: '1em',
++ })
++ .append(
++ $('<span>')
++ .text('Search results')
++ .css({ fontWeight: 'bold' })
++ )
++ .append(
++ $('<i>')
++ .addClass('fas fa-times search-result-close-button')
++ .css({
++ cursor: 'pointer',
++ })
++ )
++ );
++
++ const $searchResultBody = $('<div>').css({
++ maxHeight: `calc(100vh - ${
++ $targetSearchInput.offset().top -
++ $(window).scrollTop() +
++ 180
++ }px)`,
++ overflowY: 'auto',
++ });
++ $html.append($searchResultBody);
++
++ if (results.length === 0) {
++ $searchResultBody.append(
++ $('<p>').text(`No results found for query "${searchQuery}"`)
++ );
++ } else {
++ results.forEach((r) => {
++ const $cardHeader = $('<div>').addClass('card-header');
++ const doc = resultDetails.get(r.ref);
++ const href =
++ $searchInput.data('offline-search-base-href') +
++ r.ref.replace(/^\//, '');
++
++ $cardHeader.append(
++ $('<a>').attr('href', href).text(doc.title)
++ );
++
++ const $cardBody = $('<div>').addClass('card-body');
++ $cardBody.append(
++ $('<p>')
++ .addClass('card-text text-muted')
++ .text(doc.excerpt)
++ );
++
++ const $card = $('<div>').addClass('card');
++ $card.append($cardHeader).append($cardBody);
++
++ $searchResultBody.append($card);
++ });
++ }
++
++ $targetSearchInput.on('shown.bs.popover', () => {
++ $('.search-result-close-button').on('click', () => {
++ $targetSearchInput.val('');
++ $targetSearchInput.trigger('change');
++ });
++ });
++
++ $targetSearchInput
++ .data('content', $html[0].outerHTML)
++ .popover('show');
++ };
++ });
++})(jQuery);
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..a741629
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+replace-minified-js-with-original
More information about the Neon-commits
mailing list