Closed psmuler closed 1 year ago
マウスオーバー時にコミットの差分を表示する機能を追加するために、showCommitList()
関数を以下のように書き換えます。
renderer.js:
async function showCommitList() {
// コミットリストを取得
const commitList = await getCommitList();
// コミットリストを表示
const commitListContainer = document.getElementById('commit-list');
commitListContainer.innerHTML = '';
commitList.forEach((commit) => {
const commitItem = document.createElement('li');
commitItem.textContent = `${commit.shortHash} - ${commit.message}`;
// マウスオーバー時に差分を表示するイベントリスナーを追加
commitItem.addEventListener('mouseover', async () => {
const diff = await getCommitDiff(commit.hash);
showDiff(diff);
});
commitListContainer.appendChild(commitItem);
});
}
async function getCommitDiff(commitHash) {
return new Promise((resolve, reject) => {
exec(`git -C "${folderPath}" show "${commitHash}"`, (error, stdout, stderr) => {
if (error && error.code !== 0) {
console.error(`Error: ${error.message}`);
reject(error);
return;
}
if (stderr) {
console.error(`Stderr: ${stderr}`);
}
resolve(stdout);
});
});
}
function showDiff(diff) {
const diffContainer = document.getElementById('diff-container');
diffContainer.textContent = diff;
}
このコード変更により、showCommitList()
関数でコミット一覧を表示する際に、各コミット要素にマウスオーバー時のイベントリスナーを追加します。このイベントリスナーは、マウスオーバー時にgetCommitDiff()
関数を呼び出し、コミットの差分を取得します。差分が取得できたら、showDiff()
関数で差分を表示します。
この変更を適用するために、HTMLファイルにdiff-container
要素を追加してください。
index.html:
<!-- 他の要素は省略 -->
<div id="diff-container"></div>
これで、コミットリスト上の各コミットにマウスオーバーすると、そのコミットの差分が表示されるようになります。
変更点だけを、変更前後を横に並べて表示するようにしましょう。
変更点を変更前後で横に並べて表示するには、showDiff()
関数を書き換えて、差分をパースして整形して表示する必要があります。
まず、diff2html
というライブラリを使用して差分をHTML形式に変換します。diff2html
をインストールするために、プロジェクトのルートディレクトリで以下のコマンドを実行してください。
npm install diff2html
次に、renderer.js
に以下のような変更を加えます。
renderer.js:
// 他のインポートの後に追加
const { Diff2Html } = require('diff2html');
// ...
function showDiff(diff) {
const diffContainer = document.getElementById('diff-container');
// 差分をHTML形式に変換
const htmlDiff = Diff2Html.getPrettyHtml(diff, {
inputFormat: 'diff',
showFiles: false,
matching: 'lines',
outputFormat: 'side-by-side',
});
// 変更点を横に並べて表示
diffContainer.innerHTML = htmlDiff;
}
これで、変更点が変更前後で横に並べて表示されるようになります。ただし、diff2html
は、変換されたHTMLに独自のスタイルを適用します。そのため、プロジェクトのindex.html
ファイルに、diff2html
のCSSファイルをインポートしてください。
index.html:
<!DOCTYPE html>
<html>
<head>
<!-- 他の要素は省略 -->
<link rel="stylesheet" href="./node_modules/diff2html/bundles/css/diff2html.min.css" />
</head>
<body>
<!-- 他の要素は省略 -->
<div id="diff-container"></div>
</body>
</html>
これで、マウスオーバー時にコミットの変更点が変更前後で横に並べて表示されるようになります。
error...
renderer.js:240 Uncaught (in promise) TypeError: Cannot read property 'getPrettyHtml' of undefined
at showDiff (renderer.js:240)
at HTMLLIElement.
すみません、おそらくDiff2Html
のインポート方法が間違っていました。
renderer.js の先頭に以下のように変更してみてください。
const { Diff2Html } = require('diff2html').default;
// ...
これでDiff2Html
が正しくインポートされ、getPrettyHtml
関数が定義されるはずです。再度試してみてください。
Uncaught TypeError: Cannot destructure property 'Diff2Html' of 'require(...).default' as it is undefined.
すみません、間違った情報をお伝えしました。
diff2html
のバージョンが異なる可能性があります。まず、package.json
を開いて、diff2html
のバージョンが 3.x.x
であることを確認してください。もし、バージョンが異なる場合は、3.x.x
にアップデートしてください。
次に、renderer.js
のインポート部分を以下のように修正してみてください。
const Diff2Html = require('diff2html').Diff2Html;
// ...
これで問題が解決するはずです。もし、まだ問題が解決しない場合は、お手数ですがお知らせください。
diff2htmlがインポートできているか確認する簡単なコマンド、例えばバージョン番号の表示などを行ない、確かめましょう
diff2html
のバージョン番号を表示するには、renderer.js
に以下のコードを追加します。
console.log(`Diff2Html version: ${Diff2Html.version}`);
このコードを追加した後、アプリケーションを実行し、デベロッパーツールのコンソールを開いて、バージョン番号が表示されていることを確認してください。
デベロッパーツールを開くには、アプリケーションでCtrl+Shift+I
(Windows/Linux)またはCmd+Opt+I
(Mac)を押すか、メニューバーからView
>Toggle Developer Tools
を選択します。
表示されるバージョン番号は、package.json
でインストールされたdiff2html
のバージョンと一致するはずです。この方法でdiff2html
が正しくインポートされていることを確認できます。
Uncaught TypeError: Cannot read property 'version' of undefined インポートできていないようです
すみません、diff2html
のバージョン表示方法に誤りがありました。diff2html
を使用するには、まずrequire
でモジュールをインポートし、Diff2Html
オブジェクトを生成する必要があります。renderer.js
の先頭に以下のコードを追加してください。
const { Diff2Html } = require('diff2html');
次に、バージョン番号を表示するコードを以下のように修正します。
console.log(`Diff2Html version: ${Diff2Html.getVersion()}`);
これで、アプリケーションを実行し、デベロッパーツールのコンソールを開くと、diff2html
のバージョン番号が表示されるはずです。
electronではes modulesをサポートしていないので、外部ライブラリをimportやrequireの形で読み込めないですよね?
Electronは、ESモジュールとCommonJSモジュールの両方をサポートしています。Electronアプリケーションで外部ライブラリをインポートする際には、import
(ESモジュール)またはrequire
(CommonJSモジュール)を使用して読み込むことができます。
Electron v14以降では、デフォルトでJavaScriptモジュール(ESモジュール)を使用します。ただし、renderer.js
やmain.js
などのファイルで、require
を使用して外部ライブラリを読み込むこともできます。
以下は、Electronで外部ライブラリを読み込む方法を示しています。
renderer.js
またはmain.js
でimport
を使用して外部ライブラリを読み込みます。
import fs from 'fs';
import path from 'path';
renderer.js
またはmain.js
でrequire
を使用して外部ライブラリを読み込みます。
const fs = require('fs');
const path = require('path');
ESモジュールとCommonJSモジュールの混在は、一部の制限事項がありますが、Electronアプリケーションで外部ライブラリを読み込む際に問題はありません。import
またはrequire
のどちらか一方を使用して、外部ライブラリを読み込むことができます。
コミットリスト上の各コミットにマウスオーバーすると差分を表示するようにしましょう。コミット一覧はshowcommitlist()関数で定義されています