内部処理について

警告

このページは Chroniclinerに謎の動作をされて困っているJavaScriptがわかる人 、 単純に中身が知りたいJavaScriptのわかる物好き 、 GitHub Contributor 向けです

注釈

不明点の問い合わせについては Contact も併せてご参照ください

1. 概要

Chronicliner v2.0.0は、Vueフレームワーク上で動作しています。Vueの基本的な仕様については、 Vue.jsドキュメント を参照してください。

また、UI(CSS styling)はVuetify.jsを使用しています。Vuetify.js特有のHTMLタグや属性については、 Vuetify.jsドキュメント を参照してください。

2. ファイル指定時の処理

2.1. ファイル読み込み -> readFile()

SheetJS ライブラリを用い、指定されたエクセルファイルの読み込みを行います。読み込み後、処理に必要なシート・列が存在するかを検証し、存在しない場合はエラーを返します。

2.2. データの作成 -> init()

readFile() 関数でファイルが読み込まれたことをVueが検知し、自動で init() を呼び出します。 init() 関数は各ステータス変数の更新と各シートのデータの読み込み・フォーマット、年表用データの作成を行います。

2.2.1. 各ステータス変数の更新

データ処理中かどうか、データ処理が完了したか、エラーメッセージ等の各ステータス変数を初期化・更新します。 init() 関数の終了時にも変数の更新を行います。

2.2.2. データの読み込み・フォーマット -> formatData()

カテゴリー、教育課程、キャラクター、キャラクターの所属教育課程、期間イベント、イベント、サマリーの順に処理を行います。

2.2.2.1. カテゴリデータの読み込み・フォーマット -> createCategory()

カテゴリのデータを読み込み、カテゴリ名をキーとする辞書形式にフォーマットします。

2.2.2.2. キャラクタデータの読み込み・フォーマット -> createCharacter()

キャラクタのデータを読み込み、キャラクタ名をキーとする辞書形式にフォーマットします。

2.2.2.3. 教育課程データの読み込み・フォーマット -> createCharacterSchoolInfo()

教育課程のデータを読み込み、所属開始日・終了日・学年計算起算日等を算出、 createCharacter() で作成したキャラクタの辞書に格納します。誕生年自動計算を TRUE に設定していた場合、ここでキャラクタの誕生年の更新を行います。

2.2.2.4. 期間イベントデータの読み込み・フォーマット -> createPeriodEvent()

期間イベントのデータを読み込み、キャラクタ名をキーとする辞書形式にフォーマットします。また、開始・終了イベントのデータを作成します。

2.2.2.5. イベントデータの読み込み・フォーマット -> createEvent()

createCharacterBirthday() 、 createCharacterDeathday() 関数を呼び出し、キャラクタの誕生日・死亡日データを作成します。その後、作成した誕生日・死亡日イベント、及び createPeriodEvent() で作成した開始・終了イベントのデータ、読み込んだイベントのデータを、イベント日時、以下を無視、以前以降の設定値によって決定する値をキーとする辞書形式にフォーマットします。

イベント辞書のキーの設定値

{yyyy-MM-dd}T{hh:mm:ss}+09:00{以下を無視}{以前以降}

  • 以下を無視 : { "month": 0, "day": 1, "hour": 2, "minute": 3, "second": 4 }

  • 以前以降 : { "以前": 0, "": 1, "期間": 1, "以降": 2 }

2.2.2.6. サマリーデータのフォーマット -> createYearSummary()

createEvent() で作成したイベント辞書のキーから、存在する年をキーとする辞書を作成します。ここではデータの初期設定のみを行い、イベント件数の集計は行いません。

2.2.3. キャラクターの選択状態の変更 -> selectAllCharactersInCategory()

各カテゴリごとにforEachループを回し、存在するキャラクター全員を選択状態にします。この処理の結果、Vueはキャラクターの選択状態の変更を検知し update() を呼び出します。

2.2.4. テーブルデータ作成 -> createTimelineData()

イベント辞書のキーを昇順にソートし、年表の表示行順に処理を行います。年表示列の設定と各キャラクタのタイムライン列・イベントカード列に対するイベントデータ・教育課程データの紐付けを行います。

また、キャラクターごとにイベント件数の集計を行います。

2.2.5. サマリーデータの更新 -> updateYearSummary()

createTimelineData() で集計したイベント件数をもとに、サマリーカードに表示する文章を更新します。

2.2.6. テーブルデータ更新 -> updateTimelineData()

キャラクターの選択状態、及び年の展開状態に応じ、行表示状態の設定と年齢変更・生存・死亡状態による矢印の色及び区切り線の表示設定を行います。

3. 表示設定変更・年折りたたみ時の処理 -> update()

キャラクター表示設定の変更時はVueが変更を自動検知、タグ表示設定の変更時と年折りたたみ時は @click により、更新処理のための関数を呼び出します。

3.1. テーブルヘッダーデータの作成 -> createTimelineData()

キャラクターの選択状態に応じ、表示する列のデータを作成します。これにより、非選択状態のキャラクターのデータは非表示になります。

3.2. テーブルデータの更新 -> updateTimelineData()

キャラクターの選択状態、及び年の展開状態に応じ、行表示状態の設定と年齢変更・生存・死亡状態による矢印の色及び区切り線の表示設定を行います。

3.3. キャラクター死亡後のタイムライン列矢印の設定 -> setArrowFirstDied()

キャラクター死亡後最初の表示行にある矢印のsvg画像の色を、キャラクターのカテゴリに設定された色に変更します。

3.4. タイムライン列ホバーの当たり判定領域拡張 -> setInnerTdHeight()

this.$nextTick(function(){FUNCTION}) を使用し、その他のDOM要素を更新後、タイムライン列の当たり判定に使用している <v-sheet> の height を親要素の <td> の height と同じ高さまで拡張します。

4. ウィンドウサイズ変更時の処理

4.1. 初期設定 -> mounted / beforeDestroy

DOM要素のマウント時、 window.addEventListener('resize', this.windowResized); でウィンドウサイズの変更を検知するように設定してします。DOM要素破棄時には window.addRemoveListener('resize', this.windowResized); でイベントリスナーを破棄します。

4.2. イベント発生時 -> windowResized()

変更された window.innerHeight と各要素の padding 、及び getBoundingClientRect().y で取得できる年表の上端座標からアプリケーションが画面内に収まる高さの最大値を算出し、年表テーブルの height を書き換えます。

注釈

resize イベントは発火頻度が高くブラウザに対する負荷が大きいので、lodashを使用して発火頻度を落としています