';
61 | html += '
';
62 | html +=
63 | '+-';
64 | html += ' ';
65 | if (this.hasMeme) {
66 | const memeTokens = this.meme.split('-');
67 | html += '' + memeTokens.shift() + '-' + memeTokens.join('-');
68 | }
69 | html += '
';
70 | html += '
' + this.sourceEscaped + '
';
71 | html += '
';
72 | return html;
73 | }
74 |
75 | /**
76 | * スタイルを更新する
77 | * 関連するCellと異なるソースであれば色を変える
78 | */
79 | updateStyle(leftCellsList: Cell[][]): void {
80 | if (!this.hasMeme || !leftCellsList.length) {
81 | this.$view.removeClass('changed1');
82 | this.$view.removeClass('changed2');
83 | } else if (leftCellsList.length === 1) {
84 | if (this.checkChanged([this], leftCellsList[0])) {
85 | this.$view.addClass('changed1');
86 | this.$view.removeClass('changed2');
87 | } else {
88 | this.$view.removeClass('changed1');
89 | this.$view.removeClass('changed2');
90 | }
91 | } else {
92 | const ch0 = this.checkChanged([this], leftCellsList[0]);
93 | const ch1 = this.checkChanged([this], leftCellsList[1]);
94 | const ch01 = this.checkChanged(leftCellsList[0], leftCellsList[1]);
95 | if (ch01) {
96 | if (!ch0) {
97 | this.$view.removeClass('changed1');
98 | this.$view.removeClass('changed2');
99 | } else if (!ch1) {
100 | this.$view.addClass('changed1');
101 | this.$view.removeClass('changed2');
102 | } else {
103 | this.$view.removeClass('changed1');
104 | this.$view.addClass('changed2');
105 | }
106 | } else {
107 | if (ch0 || ch1) {
108 | this.$view.addClass('changed1');
109 | this.$view.removeClass('changed2');
110 | } else {
111 | this.$view.removeClass('changed1');
112 | this.$view.removeClass('changed2');
113 | }
114 | }
115 | }
116 | }
117 |
118 | get hasMeme(): boolean {
119 | if (this.metaData['lc_cell_meme'] === undefined) {
120 | return false;
121 | }
122 | return this.metaData['lc_cell_meme']['current'] !== undefined;
123 | }
124 |
125 | /** このmemeを取得する */
126 | get meme(): string {
127 | return this.metaData['lc_cell_meme']['current'];
128 | }
129 |
130 | /** このmemeのUUIDを取得する */
131 | get memeUuid(): string {
132 | return this.meme ? this.meme.split('-').slice(0, 5).join('-') : '';
133 | }
134 |
135 | /** このmemeの枝番数を取得する */
136 | get memeBranchNumber(): number {
137 | const meme = this.meme || '';
138 | const numStr = meme.split('-').slice(5, 6).pop() || '';
139 | return numStr ? parseInt(numStr, 10) : 0;
140 | }
141 |
142 | /** 次のmemeを取得する */
143 | get nextMeme(): string {
144 | return this.metaData['lc_cell_meme']['next'];
145 | }
146 |
147 | /** 前のmemeを取得する */
148 | get prevMeme(): string {
149 | return this.metaData['lc_cell_meme']['previous'];
150 | }
151 |
152 | /** ソースを結合して取得する */
153 | get sourceEscaped(): string {
154 | let html = '';
155 | for (let i = 0; i < this.source.length; i++) {
156 | html += this.source[i] + '