Private/Get-DiffHtmlScript.ps1
|
#Requires -Version 5.1 function Get-DiffHtmlScript { <# .SYNOPSIS 左右のペインのスクロール位置の同期と、差分マップのクリックによる移動を行う JavaScript を返す。 .OUTPUTS [string] #> [CmdletBinding()] [OutputType([string])] param() return @' // 左右のペインのスクロール位置を同期する。 // 同期はセクションごとに行う。文書全体で行うと、1 つのセクションのスクロールで他のセクションまで動く。 // 動かない環境でも各ペインは独立にスクロールできるため、閲覧自体は成立する。 (function () { Array.prototype.forEach.call(document.querySelectorAll('.panes'), function (group) { var panes = Array.prototype.slice.call(group.querySelectorAll('.pane')); var syncing = false; panes.forEach(function (pane) { pane.addEventListener('scroll', function () { if (syncing) { return; } syncing = true; panes.forEach(function (other) { if (other !== pane) { other.scrollLeft = pane.scrollLeft; other.scrollTop = pane.scrollTop; } }); syncing = false; }); }); }); })(); // 差分マップをクリックすると、その位置の行をペインの中央に表示する。 // 印の位置は行の位置に比例するため、クリックした高さの割合をスクロール量に換算する。 // 動かない環境でも印は表示されるため、差分の位置は分かる。 (function () { Array.prototype.forEach.call(document.querySelectorAll('.map'), function (map) { var pane = map.parentNode.querySelector('.pane'); map.addEventListener('click', function (event) { var ratio = (event.clientY - map.getBoundingClientRect().top) / map.clientHeight; pane.scrollTop = ratio * pane.scrollHeight - pane.clientHeight / 2; }); }); })(); '@ } |