Escher-js / SkimmedMilk

0 stars 0 forks source link

mouseover -> show diff #23

Closed psmuler closed 1 year ago

psmuler commented 1 year ago

コミットリスト上の各コミットにマウスオーバーすると差分を表示するようにしましょう。コミット一覧はshowcommitlist()関数で定義されています

psmuler commented 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>

これで、コミットリスト上の各コミットにマウスオーバーすると、そのコミットの差分が表示されるようになります。

psmuler commented 1 year ago

変更点だけを、変更前後を横に並べて表示するようにしましょう。

psmuler commented 1 year ago

変更点を変更前後で横に並べて表示するには、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>

これで、マウスオーバー時にコミットの変更点が変更前後で横に並べて表示されるようになります。

psmuler commented 1 year ago

error...

psmuler commented 1 year ago

renderer.js:240 Uncaught (in promise) TypeError: Cannot read property 'getPrettyHtml' of undefined at showDiff (renderer.js:240) at HTMLLIElement. (renderer.js:210)

psmuler commented 1 year ago

すみません、おそらくDiff2Htmlのインポート方法が間違っていました。

renderer.js の先頭に以下のように変更してみてください。

const { Diff2Html } = require('diff2html').default;

// ...

これでDiff2Htmlが正しくインポートされ、getPrettyHtml関数が定義されるはずです。再度試してみてください。

psmuler commented 1 year ago

Uncaught TypeError: Cannot destructure property 'Diff2Html' of 'require(...).default' as it is undefined.

psmuler commented 1 year ago

すみません、間違った情報をお伝えしました。

diff2html のバージョンが異なる可能性があります。まず、package.json を開いて、diff2html のバージョンが 3.x.x であることを確認してください。もし、バージョンが異なる場合は、3.x.x にアップデートしてください。

次に、renderer.js のインポート部分を以下のように修正してみてください。

const Diff2Html = require('diff2html').Diff2Html;

// ...

これで問題が解決するはずです。もし、まだ問題が解決しない場合は、お手数ですがお知らせください。

psmuler commented 1 year ago

diff2htmlがインポートできているか確認する簡単なコマンド、例えばバージョン番号の表示などを行ない、確かめましょう

psmuler commented 1 year ago

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が正しくインポートされていることを確認できます。

psmuler commented 1 year ago

Uncaught TypeError: Cannot read property 'version' of undefined インポートできていないようです

psmuler commented 1 year ago

すみません、diff2htmlのバージョン表示方法に誤りがありました。diff2htmlを使用するには、まずrequireでモジュールをインポートし、Diff2Htmlオブジェクトを生成する必要があります。renderer.jsの先頭に以下のコードを追加してください。

const { Diff2Html } = require('diff2html');

次に、バージョン番号を表示するコードを以下のように修正します。

console.log(`Diff2Html version: ${Diff2Html.getVersion()}`);

これで、アプリケーションを実行し、デベロッパーツールのコンソールを開くと、diff2htmlのバージョン番号が表示されるはずです。

psmuler commented 1 year ago

electronではes modulesをサポートしていないので、外部ライブラリをimportやrequireの形で読み込めないですよね?

psmuler commented 1 year ago

Electronは、ESモジュールとCommonJSモジュールの両方をサポートしています。Electronアプリケーションで外部ライブラリをインポートする際には、import(ESモジュール)またはrequire(CommonJSモジュール)を使用して読み込むことができます。

Electron v14以降では、デフォルトでJavaScriptモジュール(ESモジュール)を使用します。ただし、renderer.jsmain.jsなどのファイルで、requireを使用して外部ライブラリを読み込むこともできます。

以下は、Electronで外部ライブラリを読み込む方法を示しています。

  1. ESモジュールを使用する場合:

renderer.jsまたはmain.jsimportを使用して外部ライブラリを読み込みます。

import fs from 'fs';
import path from 'path';
  1. CommonJSモジュールを使用する場合:

renderer.jsまたはmain.jsrequireを使用して外部ライブラリを読み込みます。

const fs = require('fs');
const path = require('path');

ESモジュールとCommonJSモジュールの混在は、一部の制限事項がありますが、Electronアプリケーションで外部ライブラリを読み込む際に問題はありません。importまたはrequireのどちらか一方を使用して、外部ライブラリを読み込むことができます。