Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 10x 10x 10x 10x 6x 6x 6x 20x 10x 6x 2x 10x 215x 6x 215x 4x 89x 38x | import markdownFile from "../../../../../CHANGELOG.md"
import { Component, Inject } from "@angular/core"
import { MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from "@angular/material/dialog"
import { marked } from "marked"
import { MatToolbar } from "@angular/material/toolbar"
import { CdkScrollable } from "@angular/cdk/scrolling"
import { MatButton } from "@angular/material/button"
import { KeyValuePipe } from "@angular/common"
@Component({
selector: "cc-change-log-dialog",
templateUrl: "./changelogDialog.component.html",
standalone: true,
imports: [MatToolbar, CdkScrollable, MatDialogContent, MatDialogActions, MatButton, MatDialogClose, KeyValuePipe]
})
export class ChangelogDialogComponent {
changes: Record<string, string>
constructor(@Inject(MAT_DIALOG_DATA) public data: { previousVersion: string; currentVersion: string }) {
this.changes = this.getChangelogChanges()
}
private getChangelogChanges() {
const parsedMarkdownFile = marked.parse(markdownFile, { headerIds: false })
let changelogLines = parsedMarkdownFile.split("\n")
const currentVersionFirstLine = this.findVersionLine(changelogLines, this.data.currentVersion)
const lastOpenedVersionFirstLine = this.findVersionLine(changelogLines, this.data.previousVersion)
//Add 1 to keep the version line so that it detects the end of the last set of changes
changelogLines = changelogLines.slice(currentVersionFirstLine, lastOpenedVersionFirstLine + 1)
const titles = ["Added 🚀", "Fixed 🐞", "Changed", "Removed 🗑", "Chore 👨💻 👩💻"]
const changes = {}
for (const title of titles) {
const titlePattern = new RegExp(`<h3>${title}</h3>`)
const titleLinesIndexes = this.getAllIndexes(changelogLines, titlePattern)
const changelogTypes: string[] = []
for (const lineIndex of titleLinesIndexes) {
// Add 2 to remove the headline and the <ul> tag
const start = lineIndex + 2
const end = this.findEndChangesLine(changelogLines, lineIndex)
for (const changeLine of changelogLines.slice(start, end)) {
changelogTypes.push(`${changeLine}<br>`)
}
}
if (changelogTypes.length > 0) {
changes[title] = changelogTypes.join("\n")
}
}
return changes
}
private getAllIndexes(titles: string[], pattern: RegExp) {
return titles.reduce((matchingTitleIndexes: number[], title, index) => {
if (pattern.test(title)) {
matchingTitleIndexes.push(index)
}
return matchingTitleIndexes
}, [])
}
private findVersionLine(lines: string[], version: string): number {
const versionPattern = new RegExp(`\\[${version}]`)
return lines.findIndex(element => versionPattern.test(element))
}
private findEndChangesLine(lines: string[], startLine: number): number {
return startLine + lines.slice(startLine + 1).findIndex(element => /<h3>/.test(element) || /<h2>/.test(element))
}
}
|