style: improve resource header typography
This commit is contained in:
+40
-33
@@ -3289,10 +3289,10 @@ def render_page_header_html(data: dict, page: int, total: int) -> str:
|
|||||||
if kind == "identity":
|
if kind == "identity":
|
||||||
return (
|
return (
|
||||||
'<div class="resource-header-field resource-header-field--identity">'
|
'<div class="resource-header-field resource-header-field--identity">'
|
||||||
'<span><b>GITEA UUID</b> '
|
'<span><b>GITEA UUID</b>'
|
||||||
f'{html_escape(field.get("uuid_gitea", ""))}</span>'
|
f'<span class="resource-identity-value">{html_escape(field.get("uuid_gitea", ""))}</span></span>'
|
||||||
'<span><b>CARD UUID</b> '
|
'<span><b>CARD UUID</b>'
|
||||||
f'{html_escape(field.get("uuid_card", ""))}'
|
f'<span class="resource-identity-value">{html_escape(field.get("uuid_card", ""))}</span>'
|
||||||
f'<b class="resource-author">AUTHOR {html_escape(field.get("author", ""))}</b></span>'
|
f'<b class="resource-author">AUTHOR {html_escape(field.get("author", ""))}</b></span>'
|
||||||
'</div>'
|
'</div>'
|
||||||
)
|
)
|
||||||
@@ -3367,7 +3367,7 @@ def render_page_footer_html(data: dict, page: int, total: int) -> str:
|
|||||||
def page_resource_header_css(data: dict) -> str:
|
def page_resource_header_css(data: dict) -> str:
|
||||||
return r"""
|
return r"""
|
||||||
.page-resource-header{width:100%;height:__RESOURCE_HEADER_HEIGHT__;min-height:__RESOURCE_HEADER_HEIGHT__;max-height:__RESOURCE_HEADER_HEIGHT__;background:#fff;color:#111;overflow:hidden;font-family:ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;line-height:1.08}
|
.page-resource-header{width:100%;height:__RESOURCE_HEADER_HEIGHT__;min-height:__RESOURCE_HEADER_HEIGHT__;max-height:__RESOURCE_HEADER_HEIGHT__;background:#fff;color:#111;overflow:hidden;font-family:ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;line-height:1.08}
|
||||||
.resource-header-table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;border:1px solid #111}.resource-header-table>tbody>tr{height:100%}.resource-header-center{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-header-grid{display:grid;grid-template-rows:1fr 1fr 1fr 2fr;width:100%;height:100%}.resource-header-row{display:grid;min-width:0;min-height:0}.resource-header-field{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:.08mm;min-width:0;padding:.12mm .55mm;border-right:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden;white-space:nowrap}.resource-header-row .resource-header-field:last-child{border-right:0}.resource-header-row:last-child .resource-header-field{border-bottom:0}.resource-header-field a{display:flex;flex-direction:column;align-items:flex-start;gap:.08mm;min-width:0;color:#111;text-decoration:none}.resource-label{font:800 2.8pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;text-transform:uppercase;flex:none}.resource-value{font:700 5.6pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resource-header-field--title .resource-value{font-size:6.8pt;font-weight:800}.resource-header-field--emphasis .resource-value{font-size:5.8pt;font-weight:800}.resource-header-field--compact{gap:.05mm;padding-inline:.18mm}.resource-header-field--compact .resource-label{font-size:2.5pt}.resource-header-field--compact .resource-value{font-size:3.9pt}.resource-header-field--identity{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.1mm;padding:.1mm .45mm;font:700 3.25pt/1.12 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--identity span{display:flex;align-items:baseline;gap:.3mm;min-width:0}.resource-header-field--identity b{font-weight:800}.resource-header-field--identity .resource-author{margin-left:auto;text-align:right}.resource-header-field--urls{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.35mm;padding:.3mm .55mm}.resource-header-field--urls a{display:block;overflow:hidden;text-overflow:clip;font:700 4.6pt/1.05 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--urls b{font-weight:800}
|
.resource-header-table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;border:1px solid #111}.resource-header-table>tbody>tr{height:100%}.resource-header-center{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-header-grid{display:grid;grid-template-rows:3fr 3fr 3fr 4fr;width:100%;height:100%}.resource-header-row{display:grid;min-width:0;min-height:0}.resource-header-field{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;gap:.08mm;min-width:0;padding:.28mm .55mm;border-right:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden;white-space:nowrap}.resource-header-row .resource-header-field:last-child{border-right:0}.resource-header-row:last-child .resource-header-field{border-bottom:0}.resource-header-field a{display:flex;flex-direction:column;align-items:flex-start;gap:.08mm;min-width:0;color:#111;text-decoration:none}.resource-label{align-self:flex-start;font:800 3.2pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;text-transform:uppercase;flex:none}.resource-value{align-self:flex-end;max-width:100%;text-align:right;font:700 6.4pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resource-header-field--title .resource-value{font-size:7.7pt;font-weight:800}.resource-header-field--emphasis .resource-value{font-size:6.6pt;font-weight:800}.resource-header-field--compact{gap:.05mm;padding:.2mm .2mm}.resource-header-field--compact .resource-label{font-size:2.85pt}.resource-header-field--compact .resource-value{font-size:4.45pt}.resource-header-field--identity{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.15mm;padding:.12mm .45mm;font:700 3.55pt/1.1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--identity>span{display:flex;align-items:baseline;gap:.3mm;min-width:0}.resource-header-field--identity b{font-weight:800;flex:none}.resource-header-field--identity .resource-identity-value{margin-left:auto;text-align:right}.resource-header-field--identity .resource-author{margin-left:auto;text-align:right}.resource-header-field--urls{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.35mm;padding:.3mm .55mm}.resource-header-field--urls a{display:block;overflow:hidden;text-overflow:clip;font:700 4.9pt/1.05 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--urls b{font-weight:800}
|
||||||
.resource-qr-cell{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-qr-cell--left{border-right:1px solid #777}.resource-qr-cell--right{border-left:1px solid #777}.resource-qr{box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:.4mm;color:#333;text-decoration:none}.resource-qr .title-qr{display:block;width:22mm;height:22mm;max-width:22mm;max-height:22mm;flex:none}.resource-qr-empty{text-align:center}.resource-qr-empty span,.resource-qr-empty strong{display:block;font:600 5pt/1.15 ui-monospace,SFMono-Regular,Consolas,monospace}
|
.resource-qr-cell{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-qr-cell--left{border-right:1px solid #777}.resource-qr-cell--right{border-left:1px solid #777}.resource-qr{box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:.4mm;color:#333;text-decoration:none}.resource-qr .title-qr{display:block;width:22mm;height:22mm;max-width:22mm;max-height:22mm;flex:none}.resource-qr-empty{text-align:center}.resource-qr-empty span,.resource-qr-empty strong{display:block;font:600 5pt/1.15 ui-monospace,SFMono-Regular,Consolas,monospace}
|
||||||
""".replace("__RESOURCE_HEADER_HEIGHT__", f"{resource_header_height_mm(data):g}mm")
|
""".replace("__RESOURCE_HEADER_HEIGHT__", f"{resource_header_height_mm(data):g}mm")
|
||||||
|
|
||||||
@@ -3403,7 +3403,7 @@ def page_resource_print_css(data: dict) -> str:
|
|||||||
repository_qr_background = qr_background(source_url, repository_qr_enabled)
|
repository_qr_background = qr_background(source_url, repository_qr_enabled)
|
||||||
sheet_token = "§"
|
sheet_token = "§"
|
||||||
print_layout = resource_header_layout(data, sheet_token)
|
print_layout = resource_header_layout(data, sheet_token)
|
||||||
row_units = [1, 1, 1, 2]
|
row_units = [3, 3, 3, 4]
|
||||||
unit_height_mm = header_height_mm / sum(row_units)
|
unit_height_mm = header_height_mm / sum(row_units)
|
||||||
row_starts_mm: list[float] = []
|
row_starts_mm: list[float] = []
|
||||||
current_y_mm = 0.0
|
current_y_mm = 0.0
|
||||||
@@ -3456,32 +3456,36 @@ def page_resource_print_css(data: dict) -> str:
|
|||||||
character_widths.append(width)
|
character_widths.append(width)
|
||||||
assigned += width
|
assigned += width
|
||||||
character_widths.append(total_characters - assigned)
|
character_widths.append(total_characters - assigned)
|
||||||
key_cells: list[str] = []
|
top_cells: list[str] = []
|
||||||
value_cells: list[str] = []
|
middle_cells: list[str] = []
|
||||||
|
bottom_cells: list[str] = []
|
||||||
for field, width in zip(row, character_widths):
|
for field, width in zip(row, character_widths):
|
||||||
if field.get("kind") == "identity":
|
if field.get("kind") == "identity":
|
||||||
host_uuid = str(field.get("uuid_gitea", ""))
|
host_uuid = str(field.get("uuid_gitea", ""))
|
||||||
card_uuid = str(field.get("uuid_card", ""))
|
card_uuid = str(field.get("uuid_card", ""))
|
||||||
gitea_identity = f' GITEA UUID {host_uuid}'
|
gitea_key = " GITEA UUID"
|
||||||
|
gitea_identity = gitea_key + host_uuid.rjust(max(1, width - len(gitea_key)))
|
||||||
card_identity = f' CARD UUID {card_uuid}'
|
card_identity = f' CARD UUID {card_uuid}'
|
||||||
author = f'AUTHOR {field.get("author", "")}'
|
author = f'AUTHOR {field.get("author", "")}'
|
||||||
key_cells.append(gitea_identity[:width].ljust(width))
|
top_cells.append(gitea_identity[:width].ljust(width))
|
||||||
available = max(1, width - len(author))
|
available = max(1, width - len(author))
|
||||||
value_cells.append(
|
middle_cells.append(
|
||||||
(card_identity[:available].ljust(available) + author)[:width].ljust(width)
|
(card_identity[:available].ljust(available) + author)[:width].ljust(width)
|
||||||
)
|
)
|
||||||
|
bottom_cells.append(" " * width)
|
||||||
continue
|
continue
|
||||||
label = str(field.get("label", ""))
|
label = str(field.get("label", ""))
|
||||||
value = str(field.get("value", "") or "—")
|
value = str(field.get("value", "") or "—")
|
||||||
key_text = f" {label}" if label else ""
|
key_text = f" {label}" if label else ""
|
||||||
value_text = f" {value}"
|
value_text = f"{value} "
|
||||||
if len(key_text) > width:
|
if len(key_text) > width:
|
||||||
key_text = key_text[: max(1, width - 1)] + "…"
|
key_text = key_text[: max(1, width - 1)] + "…"
|
||||||
if len(value_text) > width:
|
if len(value_text) > width:
|
||||||
value_text = value_text[: max(1, width - 1)] + "…"
|
value_text = "…" + value_text[-max(1, width - 1) :]
|
||||||
key_cells.append(key_text.ljust(width))
|
top_cells.append(key_text.ljust(width))
|
||||||
value_cells.append(value_text.ljust(width))
|
middle_cells.append(" " * width)
|
||||||
return ["".join(key_cells), "".join(value_cells)]
|
bottom_cells.append(value_text.rjust(width))
|
||||||
|
return ["".join(top_cells), "".join(middle_cells), "".join(bottom_cells)]
|
||||||
|
|
||||||
print_characters = 139 if repository_qr_enabled else 166
|
print_characters = 139 if repository_qr_enabled else 166
|
||||||
print_lines = [line for row in print_layout for line in print_row(row, print_characters)]
|
print_lines = [line for row in print_layout for line in print_row(row, print_characters)]
|
||||||
@@ -3535,7 +3539,7 @@ def render_page_header_tex_macro(data: dict) -> list[str]:
|
|||||||
)
|
)
|
||||||
source_qr = rf"\qrcode[level=L,height=22mm]{{{source_url}}}" if dual_qr else ""
|
source_qr = rf"\qrcode[level=L,height=22mm]{{{source_url}}}" if dual_qr else ""
|
||||||
layout = resource_header_layout(data, r"\thepage/\pageref{LastPage}")
|
layout = resource_header_layout(data, r"\thepage/\pageref{LastPage}")
|
||||||
row_units = [1, 1, 1, 2]
|
row_units = [3, 3, 3, 4]
|
||||||
unit_height_mm = (inner_height_mm - (3 * 0.35 * 0.35146)) / sum(row_units)
|
unit_height_mm = (inner_height_mm - (3 * 0.35 * 0.35146)) / sum(row_units)
|
||||||
row_heights_mm = [unit_height_mm * units for units in row_units]
|
row_heights_mm = [unit_height_mm * units for units in row_units]
|
||||||
|
|
||||||
@@ -3546,39 +3550,41 @@ def render_page_header_tex_macro(data: dict) -> list[str]:
|
|||||||
uuid_card = tex_escape(field.get("uuid_card", ""))
|
uuid_card = tex_escape(field.get("uuid_card", ""))
|
||||||
author = tex_escape(field.get("author", ""))
|
author = tex_escape(field.get("author", ""))
|
||||||
return (
|
return (
|
||||||
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{\hspace{{0.35mm}}"
|
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{"
|
||||||
rf"{{\fontsize{{3.15}}{{3.55}}\selectfont\ttfamily\bfseries GITEA UUID}} "
|
rf"\hbox to\linewidth{{\hspace{{0.35mm}}"
|
||||||
rf"{{\fontsize{{3.15}}{{3.55}}\selectfont\ttfamily {uuid_gitea}}}\par\nointerlineskip"
|
rf"{{\fontsize{{3.4}}{{3.75}}\selectfont\ttfamily\bfseries GITEA UUID}}\hfill"
|
||||||
rf"\hspace{{0.35mm}}{{\fontsize{{3.15}}{{3.55}}\selectfont\ttfamily\bfseries CARD UUID}} "
|
rf"{{\fontsize{{3.4}}{{3.75}}\selectfont\ttfamily {uuid_gitea}}}\hspace{{0.35mm}}}}\par\nointerlineskip"
|
||||||
rf"{{\fontsize{{3.15}}{{3.55}}\selectfont\ttfamily {uuid_card}}}"
|
rf"\hbox to\linewidth{{\hspace{{0.35mm}}{{\fontsize{{3.4}}{{3.75}}\selectfont\ttfamily\bfseries CARD UUID}} "
|
||||||
rf"\hfill{{\fontsize{{3.15}}{{3.55}}\selectfont\ttfamily\bfseries AUTHOR {author}}}\hspace{{0.35mm}}}}"
|
rf"{{\fontsize{{3.4}}{{3.75}}\selectfont\ttfamily {uuid_card}}}"
|
||||||
|
rf"\hfill{{\fontsize{{3.4}}{{3.75}}\selectfont\ttfamily\bfseries AUTHOR {author}}}\hspace{{0.35mm}}}}}}"
|
||||||
)
|
)
|
||||||
if kind == "urls":
|
if kind == "urls":
|
||||||
repository = str(field.get("repository_url", ""))
|
repository = str(field.get("repository_url", ""))
|
||||||
html_url = str(field.get("url", ""))
|
html_url = str(field.get("url", ""))
|
||||||
return (
|
return (
|
||||||
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{\hspace{{0.45mm}}"
|
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{\hspace{{0.45mm}}"
|
||||||
rf"{{\fontsize{{4.15}}{{4.5}}\selectfont\ttfamily\bfseries GITEA}} "
|
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\bfseries GITEA}} "
|
||||||
rf"{{\fontsize{{4.15}}{{4.5}}\selectfont\ttfamily\href{{{repository}}}{{\nolinkurl{{{repository}}}}}}}\par\nointerlineskip"
|
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\href{{{repository}}}{{\nolinkurl{{{repository}}}}}}}\par\nointerlineskip"
|
||||||
rf"\hspace{{0.45mm}}{{\fontsize{{4.15}}{{4.5}}\selectfont\ttfamily\bfseries HTML}} "
|
rf"\hspace{{0.45mm}}{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\bfseries HTML}} "
|
||||||
rf"{{\fontsize{{4.15}}{{4.5}}\selectfont\ttfamily\href{{{html_url}}}{{\nolinkurl{{{html_url}}}}}}}}}"
|
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\href{{{html_url}}}{{\nolinkurl{{{html_url}}}}}}}}}"
|
||||||
)
|
)
|
||||||
label = str(field.get("label", ""))
|
label = str(field.get("label", ""))
|
||||||
value = str(field.get("value", "") or "—")
|
value = str(field.get("value", "") or "—")
|
||||||
value_tex = value if field.get("key") == "sheet" else tex_escape(value)
|
value_tex = value if field.get("key") == "sheet" else tex_escape(value)
|
||||||
if field.get("title"):
|
if field.get("title"):
|
||||||
value_size, value_leading = 6.8, 7.0
|
value_size, value_leading = 7.7, 7.9
|
||||||
elif field.get("emphasis"):
|
elif field.get("emphasis"):
|
||||||
value_size, value_leading = 5.8, 6.0
|
value_size, value_leading = 6.6, 6.8
|
||||||
elif field.get("url"):
|
elif field.get("url"):
|
||||||
value_size, value_leading = 5.3, 5.6
|
value_size, value_leading = 5.3, 5.6
|
||||||
elif field.get("compact"):
|
elif field.get("compact"):
|
||||||
value_size, value_leading = 3.9, 4.1
|
value_size, value_leading = 4.45, 4.65
|
||||||
else:
|
else:
|
||||||
value_size, value_leading = 5.6, 5.8
|
value_size, value_leading = 6.4, 6.6
|
||||||
compact = bool(field.get("compact"))
|
compact = bool(field.get("compact"))
|
||||||
label_size, label_leading = (2.5, 2.7) if compact else (2.8, 3.0)
|
label_size, label_leading = (2.85, 3.0) if compact else (3.2, 3.4)
|
||||||
left_padding_mm = 0.15 if compact else 0.45
|
left_padding_mm = 0.15 if compact else 0.45
|
||||||
|
right_padding_mm = 0.15 if compact else 0.45
|
||||||
label_tex = (
|
label_tex = (
|
||||||
rf"{{\fontsize{{{label_size:g}}}{{{label_leading:g}}}\selectfont\ttfamily\bfseries {tex_escape(label)}}}"
|
rf"{{\fontsize{{{label_size:g}}}{{{label_leading:g}}}\selectfont\ttfamily\bfseries {tex_escape(label)}}}"
|
||||||
if label
|
if label
|
||||||
@@ -3593,7 +3599,8 @@ def render_page_header_tex_macro(data: dict) -> list[str]:
|
|||||||
return (
|
return (
|
||||||
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{"
|
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{"
|
||||||
rf"\hspace{{{left_padding_mm:g}mm}}{label_tex}\par\nointerlineskip\vspace{{0.12mm}}"
|
rf"\hspace{{{left_padding_mm:g}mm}}{label_tex}\par\nointerlineskip\vspace{{0.12mm}}"
|
||||||
rf"\hspace{{{left_padding_mm:g}mm}}{value_content}\hspace{{0.15mm}}}}"
|
rf"\noindent\makebox[\linewidth][r]{{{value_content}\hspace{{{right_padding_mm:g}mm}}}}"
|
||||||
|
rf"\par}}"
|
||||||
)
|
)
|
||||||
|
|
||||||
def tex_header_row(row: list[dict], height_mm: float) -> list[str]:
|
def tex_header_row(row: list[dict], height_mm: float) -> list[str]:
|
||||||
|
|||||||
Reference in New Issue
Block a user