#!/bin/sh set -eu root_dir=$(cd "$(dirname "$0")" && pwd) . "$root_dir/../shared/build-lib.sh" src_html="$root_dir/template.html" output_dir="$root_dir/dist" output_html="$output_dir/browse.html" mkdir -p "$output_dir" ensure_exists "$src_html" css_temp=$(mktemp) js_raw=$(mktemp) js_temp=$(mktemp) cleanup() { rm -f "$css_temp" "$js_raw" "$js_temp"; } trap cleanup EXIT # CSS files: shared base first, then browse-specific. Toast UI's CSS # is bundled because the markdown plugin uses Toast UI inside the # preview pane (.md files render as a full editor). concat_files \ "../shared/fonts.css" \ "../shared/base.css" \ "../shared/toast.css" \ "../shared/logo.css" \ "../shared/vendor/toastui-editor.min.css" \ "../shared/vendor/codemirror-yaml.min.css" \ "../shared/context-menu.css" \ "../shared/elevation.css" \ "css/base.css" \ "css/tree.css" \ "css/preview-yaml.css" \ > "$css_temp" # JS files: shared canonical helpers, then browse modules. # init.js must come first so window.app exists when later modules # attach to it. JSZip is vendored (rather than CDN-loaded) so ZIP # expansion in the tree works under restrictive networks / CSPs and # without an external HTTP dependency. concat_files \ "../shared/vendor/jszip.min.js" \ "../shared/vendor/utif.min.js" \ "../shared/vendor/js-yaml.min.js" \ "../shared/vendor/codemirror-yaml.min.js" \ "../shared/vendor/toastui-editor-all.min.js" \ "../shared/zddc.js" \ "../shared/zddc-filter.js" \ "../shared/zip-source.js" \ "../shared/theme.js" \ "../shared/toast.js" \ "../shared/logo.js" \ "../shared/help.js" \ "../shared/preview-lib.js" \ "../shared/context-menu.js" \ "../shared/elevation.js" \ "../shared/cap.js" \ "../shared/icons.js" \ "../shared/zddc-source.js" \ "js/init.js" \ "js/loader.js" \ "js/tree.js" \ "js/preview.js" \ "js/preview-markdown.js" \ "js/preview-yaml.js" \ "js/hovercard.js" \ "js/grid.js" \ "js/upload.js" \ "js/download.js" \ "js/plan-review.js" \ "js/accept-transmittal.js" \ "js/stage.js" \ "js/create-transmittal.js" \ "js/events.js" \ "js/app.js" \ > "$js_raw" # Escape any literal ` block doesn't get terminated prematurely. escape_js_close_tags "$js_raw" "$js_temp" tool=browse compute_build_label "$tool" "$@" # Replace template placeholders with concatenated CSS/JS + label. # Non-stable build labels (alpha/beta/dev-dirty) are wrapped in a red # span — same convention as every other tool (compute_build_label # sets $is_red=1 for non-stable cuts). Keeps the visual cue # consistent across tool headers. awk -v css_file="$css_temp" -v js_file="$js_temp" \ -v build_label="$build_label" -v is_red="$is_red" \ -v favicon="$favicon_data_uri" ' /\{\{CSS_PLACEHOLDER\}\}/ { while ((getline line < css_file) > 0) print line close(css_file); next } /\{\{JS_PLACEHOLDER\}\}/ { while ((getline line < js_file) > 0) print line close(js_file); next } /\{\{BUILD_LABEL\}\}/ { if (is_red == "1") { gsub(/\{\{BUILD_LABEL\}\}/, "" build_label "") } else { gsub(/\{\{BUILD_LABEL\}\}/, build_label) } print; next } { gsub(/\{\{FAVICON\}\}/, favicon) print } ' "$src_html" > "$output_html" echo "Wrote $output_html" # Promote AFTER the dist file exists so promote_release can copy from # $output_html. (The order matters — _promote_stable does cp $output_html ...) # Only fires on a release cut; plain dev builds leave release-output alone. if [ "$is_release" = "1" ]; then promote_release "$tool" fi