diff --git a/preview/glossy/README.md b/preview/glossy/README.md index 01fedeb..01fe0b2 100644 --- a/preview/glossy/README.md +++ b/preview/glossy/README.md @@ -43,7 +43,7 @@ different goals: ### Import the package ```typst -#import "@preview/glossy:0.1.0": * +#import "@preview/glossy:0.1.1": * ``` @@ -149,7 +149,7 @@ sections, groups, and entries are displayed. - **section**: This is a main glossary section. It contains multiple glossary groups. - **group**: A group within the main glossary section. Contains multiple - entries. Can be `none`. + entries. Can be an empty string for terms with no group (`""`). - **entry**: A single entry within a group. This is the actual term, and can include any of the fields in entry. Contains the following fields: - `key`: The term key. (always present and unique) @@ -166,8 +166,9 @@ Example of a minimal theme: heading(level: 1, title) body }, - group: (name, body) => { - if name != none and name != "" { + group: (name, i, n, body) => { + // i is the group's index, n is total number of groups + if name != "" and n > 1 { heading(level: 2, name) } body diff --git a/preview/glossy/examples/readme.pdf b/preview/glossy/examples/readme.pdf index 6f72eeb..8b6f6ee 100644 Binary files a/preview/glossy/examples/readme.pdf and b/preview/glossy/examples/readme.pdf differ diff --git a/preview/glossy/examples/readme.typ b/preview/glossy/examples/readme.typ index e9d70db..a2b987d 100644 --- a/preview/glossy/examples/readme.typ +++ b/preview/glossy/examples/readme.typ @@ -1,6 +1,6 @@ // a minimal example, also listed in the README -#import "@preview/glossy:0.1.0": * +#import "@preview/glossy:0.1.1": * #let myGlossary = ( (key: "html", short: "HTML", long: "Hypertext Markup Language", description: "A standard language for creating web pages", group: "Web"), @@ -11,10 +11,15 @@ #show: init-glossary.with(myGlossary) +#set heading(numbering: "1.1") + += Hello, `glossy`! + In modern web development, languages like @html and @css are essential. Now make sure I get your @tps:short reports by 2pm! += Examples with modifiers #table( columns: 2, @@ -29,13 +34,31 @@ Now make sure I get your @tps:short reports by 2pm! [`@tps:both:pl:cap`], [@tps:both:pl:cap], ) +== Using conflicting modifiers (short, long, both) + +These modifiers are semantically mutually exclusive, by they can be combined +syntactically. When multiple are used, `glossy` tries to make a smart choice on +which one to display. + +#table( + columns: 2, + table.header([*Input*], [*Output*]), + +[`@tps:short:long` ], [@tps:short:long], +[`@tps:long:short` ], [@tps:long:short], +[`@tps:short:both` ], [@tps:short:both], +[`@tps:long:both` ], [@tps:long:both], +[`@tps:short:long:both` ], [@tps:short:long:both], +[`@tps:long:pl` ], [@tps:long:pl], +) + #let my-theme = ( section: (title, body) => { heading(level: 1, title) body }, - group: (name, body) => { - if name != none and name != "" { + group: (name, i, n, body) => { + if name != "" and n > 1 { heading(level: 2, name) } body @@ -61,3 +84,5 @@ Now make sure I get your @tps:short reports by 2pm! ) #glossary(theme: my-theme) +#glossary(title: "Glossary with just empty group", groups: ("",), theme: my-theme) +#glossary(title: "Glossary with just Web group", groups: ("Web",), theme: my-theme) diff --git a/preview/glossy/src/gloss.typ b/preview/glossy/src/gloss.typ index 28e1979..8c70355 100644 --- a/preview/glossy/src/gloss.typ +++ b/preview/glossy/src/gloss.typ @@ -128,35 +128,32 @@ if "cap" in modifiers { upper(term.first()) + term.slice(1) } else { term } } + // Helper: Format a term with pluralization and capitalization + let format_term = (term, plural) => { + capitalize_term(pluralize_term(term, plural)) + } + // Helper: Select and format the displayed term (long, short, or both) let select_term = (is_long_mode, use_both) => { // Derive pluralized and capitalized versions of the long and short forms - let long_form = capitalize_term(pluralize_term(entry.long, entry.longplural)) - let short_form = capitalize_term(pluralize_term(entry.short, entry.plural)) + let short_form = format_term(entry.short, entry.plural) + let long_form = if entry.long != none { format_term(entry.long, entry.longplural) } else { none } - // If "both" modifier is present, show both the long form and short form - if use_both { - // If the long form exists, show "Long Form (Short Form)" - if long_form != none { - [#long_form (#short_form)] - } - // Fallback: If no long form exists, just show the short form - else { - [#short_form] - } - } - // If in "long mode", show the long form, fallback to short if long form is missing - else if is_long_mode { - if long_form != none { - [#long_form] - } - // Fallback: if no long form, show short - else { - [#short_form] - } - } - // Default case: Just show the short form - else { + // Return logic for term selection: + if use_both and long_form != none { + // 1. If "both" is requested AND we have a long form available: + // Show "Long Form (Short Form)" + [#long_form (#short_form)] + } else if is_long_mode and long_form != none { + // 2. If long mode is requested AND we have a long form available: + // Show just the long form + [#long_form] + } else { + // 3. Fallback case - use short form when: + // - "both" was requested but no long form exists + // - long mode was requested but no long form exists + // - short form was explicitly requested + // - no specific mode was requested [#short_form] } } @@ -296,7 +293,7 @@ } } if cur.len() > 0 { - if g == "" { g = none } + if g == none { g = "" } output.insert(g, cur.sorted(key: e => e.short)) } } @@ -305,16 +302,24 @@ // with no group)?? -- in this case should we just not use the theme.group() // function? + // index for group because dictionary don't have enumerate() + let i_group = 0; + // render it using our theme (theme.section)( title, + // section body (all groups) for (group, entries) in output { (theme.group)( group, + i_group, + output.len(), + // group body (all entries) for (i,e) in entries.enumerate() { (theme.entry)(e, i, entries.len()) }, ) + i_group += 1 } ) } diff --git a/preview/glossy/src/themes.typ b/preview/glossy/src/themes.typ index 3cadd63..2f61ee1 100644 --- a/preview/glossy/src/themes.typ +++ b/preview/glossy/src/themes.typ @@ -5,8 +5,8 @@ columns(2, body) }, - group: (name, body) => { - if name != none { + group: (name, i, n, body) => { + if name != "" and n > 1 { heading(level: 2, name) } body diff --git a/preview/glossy/thumbnail.png b/preview/glossy/thumbnail.png index b93bf7c..503272e 100644 Binary files a/preview/glossy/thumbnail.png and b/preview/glossy/thumbnail.png differ