Skip to content

Commit 15e498a

Browse files
committed
Added striking through of withdrawn items
1 parent 951fefd commit 15e498a

File tree

6 files changed

+83
-32
lines changed

6 files changed

+83
-32
lines changed

src/helpers/NaturalSorter.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export function naturalCompare(first: string, second: string): number {
2+
return first.localeCompare(second, undefined, {
3+
numeric: true,
4+
sensitivity: 'base'
5+
});
6+
}

src/markdown/MarkdownTableFactory.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Image, PhrasingContent, Table, TableCell, TableRow, Text } from 'mdast';
1+
import { Delete, Image, PhrasingContent, Table, TableCell, TableRow, Text } from 'mdast';
22

33
export class MarkdownTableFactory {
44
table(header: TableRow, rows: TableRow[]): Table {
@@ -24,6 +24,10 @@ export class MarkdownTableFactory {
2424
return this.tableCellNode([this.textNode(text)]);
2525
}
2626

27+
deletedTextTableCellNode(text: string): TableCell {
28+
return this.tableCellNode([this.deletedTextNode(text)]);
29+
}
30+
2731
imageTableCellNode(url: string, size: number): TableCell {
2832
return this.tableCellNode([this.imageNode(url, size)]);
2933
}
@@ -42,6 +46,13 @@ export class MarkdownTableFactory {
4246
};
4347
}
4448

49+
deletedTextNode(text: string): Delete {
50+
return {
51+
type: 'delete',
52+
children: [this.textNode(text)]
53+
};
54+
}
55+
4556
imageNode(url: string, size: number): Image {
4657
return {
4758
type: 'image',

src/recipes/hanayama_huzzles/HanayamaHuzzlesRecipe.ts

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { TableCell } from 'mdast';
2+
import { naturalCompare } from 'src/helpers/NaturalSorter';
13
import { MarkdownTableConverter } from 'src/markdown/MarkdownTableConverter';
24
import { MarkdownTableFactory } from 'src/markdown/MarkdownTableFactory';
35
import { RegexFactory } from 'src/regex/RegexFactory';
@@ -116,24 +118,47 @@ export class HanayamaHuzzlesRecipe implements Recipe {
116118
);
117119
}
118120

119-
#huzzlesToMarkdownTableString(headers: string[], huzzles: HanayamaHuzzle[]): string {
121+
#huzzlesToMarkdownTableString(headers: string[], syncedHuzzles: HanayamaHuzzle[], withdrawnModifiedHuzzles: HanayamaHuzzle[]): string {
120122
const headerRow = this.markdownTableFactory.tableRowNode(
121123
headers.map(header => this.markdownTableFactory.textTableCellNode(header))
122124
);
123-
const huzzleRows = huzzles.map(huzzle =>
124-
this.markdownTableFactory.tableRowNode([
125-
this.markdownTableFactory.textTableCellNode(huzzle.level),
126-
this.markdownTableFactory.textTableCellNode(huzzle.index),
127-
this.markdownTableFactory.textTableCellNode(huzzle.name),
128-
this.markdownTableFactory.tableCellNode(
129-
this.markdownTableFactory.interleave(
130-
huzzle.imageLinks.map(imageLink => this.markdownTableFactory.imageNode(imageLink, 100)),
131-
this.markdownTableFactory.textNode(' ')
132-
)
133-
),
134-
this.markdownTableFactory.textTableCellNode(huzzle.status)
135-
])
136-
);
125+
const huzzleRows = [
126+
...syncedHuzzles,
127+
...withdrawnModifiedHuzzles
128+
]
129+
.sort((first, second) => {
130+
const stringToNumber = (string: string) =>
131+
isNaN(Number(string)) ? Infinity : Number(string);
132+
const compare = (first: number, second: number) =>
133+
first < second ? -1 : first > second ? 1 : 0;
134+
135+
return (
136+
compare(stringToNumber(first.level), stringToNumber(second.level))
137+
|| compare(stringToNumber(first.index), stringToNumber(second.index))
138+
|| naturalCompare(first.name, second.name)
139+
);
140+
})
141+
.map(huzzle => {
142+
let nameTableCell: TableCell;
143+
if (withdrawnModifiedHuzzles.includes(huzzle)) {
144+
nameTableCell = this.markdownTableFactory.deletedTextTableCellNode(huzzle.name);
145+
} else {
146+
nameTableCell = this.markdownTableFactory.textTableCellNode(huzzle.name);
147+
}
148+
149+
return this.markdownTableFactory.tableRowNode([
150+
this.markdownTableFactory.textTableCellNode(huzzle.level),
151+
this.markdownTableFactory.textTableCellNode(huzzle.index),
152+
nameTableCell,
153+
this.markdownTableFactory.tableCellNode(
154+
this.markdownTableFactory.interleave(
155+
huzzle.imageLinks.map(imageLink => this.markdownTableFactory.imageNode(imageLink, 100)),
156+
this.markdownTableFactory.textNode(' ')
157+
)
158+
),
159+
this.markdownTableFactory.textTableCellNode(huzzle.status)
160+
]);
161+
});
137162
const table = this.markdownTableFactory.table(headerRow, huzzleRows);
138163

139164
return this.markdownTableConverter.tableToString(table);

src/recipes/helpers/RecipeListUpdater.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ export class RecipeListUpdater<RecipeItem extends Trackable> {
1313
content: string,
1414
markdownTableStringToTrackables: (markdownTableString: string) => RecipeItem[],
1515
scrapeTrackables: () => Promise<RecipeItem[]>,
16-
trackablesToMarkdownTableString: (headers: readonly string[], trackables: RecipeItem[]) => string
16+
trackablesToMarkdownTableString: (headers: readonly string[], syncedTrackables: RecipeItem[], withdrawnModifiedTrackables: RecipeItem[]) => string
1717
): Promise<string> {
1818
return this.recipeMarkdownListUpdater.update(content, async markdownList => {
1919
const currentTrackables = markdownList != null ? markdownTableStringToTrackables(markdownList) : [];
2020
const newTrackables = await scrapeTrackables();
21-
const updatedTrackables = this.trackablesUpdater.updatedTrackables(currentTrackables, newTrackables);
21+
const [updatedSyncedTrackables, updatedwithdrawnModifiedTrackables] = this.trackablesUpdater.updatedTrackables(currentTrackables, newTrackables);
2222

23-
return trackablesToMarkdownTableString(this.headers, updatedTrackables);
23+
return trackablesToMarkdownTableString(this.headers, updatedSyncedTrackables, updatedwithdrawnModifiedTrackables);
2424
});
2525
}
2626
}

src/recipes/name_and_image/NameAndImageRecipe.ts

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { TableCell } from 'mdast';
2+
import { naturalCompare } from 'src/helpers/NaturalSorter';
13
import { MarkdownTableConverter } from 'src/markdown/MarkdownTableConverter';
24
import { MarkdownTableFactory } from 'src/markdown/MarkdownTableFactory';
35
import { RegexFactory } from 'src/regex/RegexFactory';
@@ -53,24 +55,31 @@ export class NameAndImageRecipe<ParsedElement extends NameAndImage> implements R
5355
);
5456
}
5557

56-
#itemsToMarkdownTableString(headers: string[], items: ParsedElement[]): string {
58+
#itemsToMarkdownTableString(headers: string[], syncedItems: ParsedElement[], withdrawnModifiedItems: ParsedElement[]): string {
5759
const headerRow = this.markdownTableFactory.tableRowNode(
5860
headers.map(header => this.markdownTableFactory.textTableCellNode(header))
5961
);
60-
const itemRows = items
62+
const itemRows = [
63+
...syncedItems,
64+
...withdrawnModifiedItems
65+
]
6166
.sort((first, second) =>
62-
first.name.localeCompare(second.name, undefined, {
63-
numeric: true,
64-
sensitivity: 'base'
65-
})
67+
naturalCompare(first.name, second.name)
6668
)
67-
.map(item =>
68-
this.markdownTableFactory.tableRowNode([
69-
this.markdownTableFactory.textTableCellNode(item.name),
69+
.map(item => {
70+
let nameTableCell: TableCell;
71+
if (withdrawnModifiedItems.includes(item)) {
72+
nameTableCell = this.markdownTableFactory.deletedTextTableCellNode(item.name);
73+
} else {
74+
nameTableCell = this.markdownTableFactory.textTableCellNode(item.name);
75+
}
76+
77+
return this.markdownTableFactory.tableRowNode([
78+
nameTableCell,
7079
this.markdownTableFactory.imageTableCellNode(item.imageLink, 100),
7180
this.markdownTableFactory.textTableCellNode(item.status)
72-
])
73-
);
81+
]);
82+
});
7483
const table = this.markdownTableFactory.table(headerRow, itemRows);
7584

7685
return this.markdownTableConverter.tableToString(table);

src/tracking/TrackablesUpdater.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Trackable } from './Trackable';
22

33
export class TrackablesUpdater {
4-
updatedTrackables<T extends Trackable>(currentTrackables: T[], newTrackables: T[]): T[] {
4+
updatedTrackables<T extends Trackable>(currentTrackables: T[], newTrackables: T[]): [syncedTrackables: T[], withdrawnModifiedTrackables: T[]] {
55
const indexedCurrentTrackables = currentTrackables.reduce((map, trackable) => {
66
map[trackable.identifier] = trackable;
77

@@ -22,6 +22,6 @@ export class TrackablesUpdater {
2222
const withdrawnTrackables = Object.keys(indexedCurrentTrackables).map(key => indexedCurrentTrackables[key]);
2323
const withdrawnModifiedTrackables = withdrawnTrackables.filter(trackable => trackable.status !== '');
2424

25-
return [...syncedTrackables, ...withdrawnModifiedTrackables];
25+
return [syncedTrackables, withdrawnModifiedTrackables];
2626
}
2727
}

0 commit comments

Comments
 (0)