style: split resource URLs into separate rows
This commit is contained in:
+32
-28
@@ -3108,7 +3108,7 @@ def resource_header_level_values(card: dict) -> tuple[str, str, str, str, str, s
|
||||
|
||||
|
||||
def resource_header_layout(data: dict, sheet_value: str) -> list[list[dict]]:
|
||||
"""Describe the four-row, 119 mm center grid shared by all renderers."""
|
||||
"""Describe the five-row, 119 mm center grid shared by all renderers."""
|
||||
card = data["card"]
|
||||
fields = title_block_fields(data)
|
||||
subject, program, ko_date, scope, level, position = resource_header_level_values(card)
|
||||
@@ -3144,9 +3144,17 @@ def resource_header_layout(data: dict, sheet_value: str) -> list[list[dict]]:
|
||||
[
|
||||
{
|
||||
"width": 119,
|
||||
"kind": "urls",
|
||||
"repository_url": str(fields.get("repository_url", "")),
|
||||
"url": str(fields.get("url", "")),
|
||||
"kind": "resource_url",
|
||||
"label": "GITEA",
|
||||
"target": str(fields.get("repository_url", "")),
|
||||
},
|
||||
],
|
||||
[
|
||||
{
|
||||
"width": 119,
|
||||
"kind": "resource_url",
|
||||
"label": "HTML",
|
||||
"target": str(fields.get("url", "")),
|
||||
},
|
||||
],
|
||||
]
|
||||
@@ -3296,13 +3304,12 @@ def render_page_header_html(data: dict, page: int, total: int) -> str:
|
||||
f'<b class="resource-author">AUTHOR {html_escape(field.get("author", ""))}</b></span>'
|
||||
'</div>'
|
||||
)
|
||||
if kind == "urls":
|
||||
repository_target = str(field.get("repository_url", ""))
|
||||
html_target = str(field.get("url", ""))
|
||||
if kind == "resource_url":
|
||||
target = str(field.get("target", ""))
|
||||
return (
|
||||
'<div class="resource-header-field resource-header-field--urls">'
|
||||
f'<a href="{html_escape(repository_target)}"><b>GITEA</b> {html_escape(repository_target)}</a>'
|
||||
f'<a href="{html_escape(html_target)}"><b>HTML</b> {html_escape(html_target)}</a>'
|
||||
'<div class="resource-header-field resource-header-field--url-row">'
|
||||
f'<a href="{html_escape(target)}"><b>{html_escape(field.get("label", ""))}</b> '
|
||||
f'{html_escape(target)}</a>'
|
||||
'</div>'
|
||||
)
|
||||
classes = ["resource-header-field"]
|
||||
@@ -3367,7 +3374,7 @@ def render_page_footer_html(data: dict, page: int, total: int) -> str:
|
||||
def page_resource_header_css(data: dict) -> str:
|
||||
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}
|
||||
.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-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 2fr 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: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--url-row{display:flex;align-items:stretch;justify-content:center;padding:.2mm .55mm}.resource-header-field--url-row 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--url-row 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}
|
||||
""".replace("__RESOURCE_HEADER_HEIGHT__", f"{resource_header_height_mm(data):g}mm")
|
||||
|
||||
@@ -3403,7 +3410,7 @@ def page_resource_print_css(data: dict) -> str:
|
||||
repository_qr_background = qr_background(source_url, repository_qr_enabled)
|
||||
sheet_token = "§"
|
||||
print_layout = resource_header_layout(data, sheet_token)
|
||||
row_units = [3, 3, 3, 4]
|
||||
row_units = [3, 3, 3, 2, 2]
|
||||
unit_height_mm = header_height_mm / sum(row_units)
|
||||
row_starts_mm: list[float] = []
|
||||
current_y_mm = 0.0
|
||||
@@ -3412,7 +3419,7 @@ def page_resource_print_css(data: dict) -> str:
|
||||
current_y_mm += unit_height_mm * units
|
||||
grid_paths = [
|
||||
f"M0 {sum(row_units[:row_index]) * unit_height_mm:g}H119"
|
||||
for row_index in range(1, 4)
|
||||
for row_index in range(1, len(row_units))
|
||||
]
|
||||
for row_index, row in enumerate(print_layout):
|
||||
boundary = 0.0
|
||||
@@ -3440,14 +3447,11 @@ def page_resource_print_css(data: dict) -> str:
|
||||
)
|
||||
|
||||
def print_row(row: list[dict], total_characters: int) -> list[str]:
|
||||
if len(row) == 1 and row[0].get("kind") == "urls":
|
||||
repository = f'GITEA {row[0].get("repository_url", "")}'
|
||||
html_url = f'HTML {row[0].get("url", "")}'
|
||||
if len(row) == 1 and row[0].get("kind") == "resource_url":
|
||||
url_line = f'{row[0].get("label", "")} {row[0].get("target", "")}'
|
||||
return [
|
||||
" " * total_characters,
|
||||
repository[:total_characters].ljust(total_characters),
|
||||
html_url[:total_characters].ljust(total_characters),
|
||||
" " * total_characters,
|
||||
url_line[:total_characters].ljust(total_characters),
|
||||
]
|
||||
character_widths: list[int] = []
|
||||
assigned = 0
|
||||
@@ -3539,8 +3543,10 @@ def render_page_header_tex_macro(data: dict) -> list[str]:
|
||||
)
|
||||
source_qr = rf"\qrcode[level=L,height=22mm]{{{source_url}}}" if dual_qr else ""
|
||||
layout = resource_header_layout(data, r"\thepage/\pageref{LastPage}")
|
||||
row_units = [3, 3, 3, 4]
|
||||
unit_height_mm = (inner_height_mm - (3 * 0.35 * 0.35146)) / sum(row_units)
|
||||
row_units = [3, 3, 3, 2, 2]
|
||||
unit_height_mm = (
|
||||
inner_height_mm - ((len(row_units) - 1) * 0.35 * 0.35146)
|
||||
) / sum(row_units)
|
||||
row_heights_mm = [unit_height_mm * units for units in row_units]
|
||||
|
||||
def tex_header_cell(field: dict, height_mm: float) -> str:
|
||||
@@ -3558,15 +3564,13 @@ def render_page_header_tex_macro(data: dict) -> list[str]:
|
||||
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":
|
||||
repository = str(field.get("repository_url", ""))
|
||||
html_url = str(field.get("url", ""))
|
||||
if kind == "resource_url":
|
||||
target = str(field.get("target", ""))
|
||||
label = tex_escape(field.get("label", ""))
|
||||
return (
|
||||
rf"\parbox[c][{height_mm:g}mm][c]{{\linewidth}}{{\hspace{{0.45mm}}"
|
||||
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\bfseries GITEA}} "
|
||||
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\href{{{repository}}}{{\nolinkurl{{{repository}}}}}}}\par\nointerlineskip"
|
||||
rf"\hspace{{0.45mm}}{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\bfseries HTML}} "
|
||||
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\href{{{html_url}}}{{\nolinkurl{{{html_url}}}}}}}}}"
|
||||
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\bfseries {label}}} "
|
||||
rf"{{\fontsize{{4.5}}{{4.85}}\selectfont\ttfamily\href{{{target}}}{{\nolinkurl{{{target}}}}}}}}}"
|
||||
)
|
||||
label = str(field.get("label", ""))
|
||||
value = str(field.get("value", "") or "—")
|
||||
|
||||
Reference in New Issue
Block a user