diff --git a/build.ps1 b/build.ps1 index cffe97d..951123d 100644 --- a/build.ps1 +++ b/build.ps1 @@ -112,9 +112,14 @@ if ($Standalone) { $exeName = "hpl-toolbox-$version.exe" $exeOut = Join-Path $distDir $exeName - go build -ldflags="-s -w -H windowsgui -X main.AppVersion=$version" -trimpath -o $exeOut . - if ($LASTEXITCODE -ne 0) { Write-Error "go build failed"; exit 1 } - Copy-Item -Path (Join-Path $repoRoot "README.md") -Destination (Join-Path $distDir "README.md") -Force + $embeddedReadme = Join-Path (Get-Location) "README.md" + Copy-Item -Path (Join-Path $repoRoot "README.md") -Destination $embeddedReadme -Force + try { + go build -tags release -ldflags="-s -w -H windowsgui -X main.AppVersion=$version" -trimpath -o $exeOut . + if ($LASTEXITCODE -ne 0) { Write-Error "go build failed"; exit 1 } + } finally { + Remove-Item -Path $embeddedReadme -Force -ErrorAction SilentlyContinue + } $summary += [pscustomobject]@{ Artifact = $exeName diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index 59c1382..0000000 --- a/dist/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# HPL Toolbox - -Bundled VS Code extension and standalone tools for playable ad workflows. - -# Changelog - -**v0.1.2** -``` -Added - - Added local hosting for HTML files. - - Added the standalone app. -``` - -**v0.1.3** -``` -Added - - Added QR regeneration for AppLovin previews that fail to render. - - Added Save QR and Save All QRs actions. - -Changed - - Updated AppLovin Demo Upload. - - Improved the file selection workflow. -``` - -**v0.1.5** -``` -Added - - Added multi-file selection for PLEC Upload. - - Added automatic iteration name detection. - -Changed - - Improved PLEC Upload file selection. - - Moved standalone temporary files into the user temp folder. -``` - -**v0.1.6** -``` -Added - - Added beta tools for further testing: - - Playworks Converter for converting Playworks UnityAds HTML into other network variants. - - MRAID Checker for scanning HTML files against MRAID requirements and best practices. - -Changed - - Simplified the UI. -``` - -**v0.1.7** -``` -Added - - Added standalone drag-and-drop file/folder selection for HTML inputs across supported tools. - - Added status throbber/progress updates for batch scans, uploads, sharing, and conversions. - - Added streamed standalone progress updates so long-running actions update the status bar before completion. - -Changed - - MRAID Checker is no longer marked as beta in extension or standalone. - - Playworks Converter source selection now matches the other file-selection UIs more closely. - - Playworks Converter default output folder now resolves to the input file location's Output folder. - - Progress text now follows the format: [throbber] Verb count file. - -Fixed - - Fixed standalone drag-and-drop handling for multiple files and multiple folders. - - Fixed cleanup behavior for temporary dropped files when clearing or removing rows. - - Fixed standalone PLEC Upload Open button using an incorrect/mangled URL by switching to the Windows URL protocol handler. -``` diff --git a/dist/hpl-toolbox-0.1.7.exe b/dist/hpl-toolbox-0.1.7.exe index 7268b18..3ca27a5 100644 Binary files a/dist/hpl-toolbox-0.1.7.exe and b/dist/hpl-toolbox-0.1.7.exe differ diff --git a/dist/hpl-toolbox-0.1.7.vsix b/dist/hpl-toolbox-0.1.7.vsix index d6a6cfa..bc8aaba 100644 Binary files a/dist/hpl-toolbox-0.1.7.vsix and b/dist/hpl-toolbox-0.1.7.vsix differ diff --git a/src/changelogView.ts b/src/changelogView.ts index 4d461f0..f1ae250 100644 --- a/src/changelogView.ts +++ b/src/changelogView.ts @@ -50,6 +50,14 @@ function getHtml(content: string): string { font-size: 15px; line-height: 1.3; } + h3 { + margin: 14px 0 6px; + font-size: 13px; + line-height: 1.3; + } + strong { + font-weight: 600; + } ul { margin: 6px 0 12px; padding-left: 20px; @@ -62,6 +70,30 @@ function getHtml(content: string): string { margin: 8px 0; line-height: 1.5; } + code { + font-family: var(--vscode-editor-font-family, monospace); + font-size: 0.95em; + background: var(--vscode-textCodeBlock-background); + padding: 1px 4px; + border-radius: 3px; + } + .changelog-block { + margin: 8px 0 18px; + padding: 10px 12px; + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + background: var(--vscode-textCodeBlock-background); + } + .change-section { + margin: 8px 0 4px; + font-weight: 600; + } + .changelog-block ul { + margin: 4px 0 10px; + } + .changelog-block li.nested { + margin-left: 18px; + } @@ -74,6 +106,73 @@ function renderMarkdown(markdown: string): string { const lines = markdown.replace(/\r\n/g, '\n').split('\n'); const html: string[] = []; let inList = false; + let inCodeBlock = false; + let codeLines: string[] = []; + + const closeList = () => { + if (inList) { + html.push(''); + inList = false; + } + }; + + for (const rawLine of lines) { + if (rawLine.trim() === '```') { + closeList(); + if (inCodeBlock) { + html.push(renderChangelogBlock(codeLines)); + codeLines = []; + inCodeBlock = false; + } else { + inCodeBlock = true; + } + continue; + } + if (inCodeBlock) { + codeLines.push(rawLine); + continue; + } + + const line = rawLine.trim(); + if (!line) { + closeList(); + continue; + } + const heading = line.match(/^(#{1,3})\s+(.+)$/); + if (heading) { + closeList(); + const level = Math.min(heading[1].length, 2); + html.push(`${renderInlineMarkdown(heading[2])}`); + continue; + } + const boldHeading = line.match(/^\*\*(.+)\*\*$/); + if (boldHeading) { + closeList(); + html.push(`

${escapeHtml(boldHeading[1])}

`); + continue; + } + const listItem = line.match(/^-\s+(.+)$/); + if (listItem) { + if (!inList) { + html.push('") @@ -80,6 +91,22 @@ func renderChangelogMarkdown(markdown string) string { } for _, rawLine := range lines { + if strings.TrimSpace(rawLine) == "```" { + closeList() + if inCodeBlock { + out.WriteString(renderChangelogBlock(codeLines)) + codeLines = []string{} + inCodeBlock = false + } else { + inCodeBlock = true + } + continue + } + if inCodeBlock { + codeLines = append(codeLines, rawLine) + continue + } + line := strings.TrimSpace(rawLine) if line == "" { closeList() @@ -87,17 +114,22 @@ func renderChangelogMarkdown(markdown string) string { } if strings.HasPrefix(line, "### ") { closeList() - out.WriteString("

" + html.EscapeString(strings.TrimSpace(line[4:])) + "

") + out.WriteString("

" + renderInlineMarkdown(strings.TrimSpace(line[4:])) + "

") continue } if strings.HasPrefix(line, "## ") { closeList() - out.WriteString("

" + html.EscapeString(strings.TrimSpace(line[3:])) + "

") + out.WriteString("

" + renderInlineMarkdown(strings.TrimSpace(line[3:])) + "

") continue } if strings.HasPrefix(line, "# ") { closeList() - out.WriteString("

" + html.EscapeString(strings.TrimSpace(line[2:])) + "

") + out.WriteString("

" + renderInlineMarkdown(strings.TrimSpace(line[2:])) + "

") + continue + } + if strings.HasPrefix(line, "**") && strings.HasSuffix(line, "**") && len(line) > 4 { + closeList() + out.WriteString("

" + html.EscapeString(strings.TrimSuffix(strings.TrimPrefix(line, "**"), "**")) + "

") continue } if strings.HasPrefix(line, "- ") { @@ -105,12 +137,93 @@ func renderChangelogMarkdown(markdown string) string { out.WriteString("") + inList = false + } + } + + out.WriteString(`
`) + for _, rawLine := range lines { + line := strings.TrimSpace(rawLine) + if line == "" { + closeList() + continue + } + if strings.HasPrefix(line, "- ") { + if !inList { + out.WriteString("
") + return out.String() +} + +func renderInlineMarkdown(value string) string { + escaped := html.EscapeString(value) + escaped = replaceDelimited(escaped, "**", "strong") + escaped = replaceDelimited(escaped, "`", "code") + return escaped +} + +func replaceDelimited(value, marker, tag string) string { + var out strings.Builder + for { + start := strings.Index(value, marker) + if start < 0 { + out.WriteString(value) + break + } + end := strings.Index(value[start+len(marker):], marker) + if end < 0 { + out.WriteString(value) + break + } + end += start + len(marker) + out.WriteString(value[:start]) + out.WriteString("<" + tag + ">") + out.WriteString(value[start+len(marker) : end]) + out.WriteString("") + value = value[end+len(marker):] + } + return out.String() +} + +func leadingSpaceCount(value string) int { + count := 0 + for _, ch := range value { + if ch != ' ' { + break + } + count++ + } + return count +} diff --git a/standalone/readme_embed_dev.go b/standalone/readme_embed_dev.go new file mode 100644 index 0000000..d702b71 --- /dev/null +++ b/standalone/readme_embed_dev.go @@ -0,0 +1,5 @@ +//go:build !release + +package main + +const embeddedReadme = "" diff --git a/standalone/readme_embed_release.go b/standalone/readme_embed_release.go new file mode 100644 index 0000000..b427a22 --- /dev/null +++ b/standalone/readme_embed_release.go @@ -0,0 +1,8 @@ +//go:build release + +package main + +import _ "embed" + +//go:embed README.md +var embeddedReadme string