Skip to content

Inconsistent string attribute syntax in Podlite specification #12

@zag

Description

@zag

Problem

The Podlite specification uses three different formats for string attributes with spaces, creating confusion:

Format 1: Parentheses with double quotes

 =for table :caption("Block configuration syntax")
 =begin table :caption("Types of Notification blocks")

Format 2: Parentheses with single quotes

 =begin nested :caption('Work on the next release continues!')
 =for table :caption('Table of contents')

Format 3: Angle brackets (appears in code examples)

=begin table :caption<Table of Contents>
=formula :caption<Quadratic Formula>

This inconsistency makes it unclear which syntax writers should use when creating Podlite documents.

Why angle brackets are incorrect

Angle brackets <> function as a word-quoting operator that splits content on whitespace:

  <Table of Contents>  →  ('Table', 'of', 'Contents')  # Creates a LIST

Therefore :caption<Table of Contents> creates a list of three separate values, not a single string.

Proposed solution

Standardize on three valid syntactic forms for multi-word string attributes

Parentheses form:

  :caption('Table of Contents')
  :caption("Table of Contents")

Direct quote form:

  :caption'Table of Contents'
  :caption"Table of Contents"

Corner bracket form:

 :caption「Table of Contents」

All three forms are equivalent and create a single string value.

Benefits

  • eliminates confusion about correct syntax
  • shorter syntax is easier to type
  • provides clear examples in the specification itself
  • offers verbose (parentheses), concise (direct quote), and visual (corner brackets) options
  • prevents errors where multi-word strings are accidentally split into lists

Historical Root cause

The old language spec (S02) doesn't explicitly document how to write multi-word strings in adverbial pair notation. The canonical table at
https://github.com/podlite/podlite-specs/blob/renaissance/S02-bits.pod?plain=1#L3604-L3619

    Fat arrow           Adverbial pair  Paren form
    =========           ==============  ==========
    a => True           :a
    a => False          :!a
    a => 0              :a(0)
    a => $x             :a($x)
    a => 'foo'          :a<foo>         :a(<foo>)
    a => <foo bar>      :a<foo bar>     :a(<foo bar>)
    a => «$foo @bar»    :$foo @bar»   :a(«$foo @bar»)
    a => {...}          :a{...}         :a({...})
    a => [...]          :a[...]         :a([...])
    a => $a             :$a
    a => @a             :@a
    a => %a             :%a
    a => &a             :&a
    a => %foo<a>        %foo<a>:p

shows:

  • Single word strings: a => 'foo' becomes :a<foo>
  • Word-quoted lists: a => <foo bar> becomes :a<foo bar>
  • Multi-word strings: Not documented

The parentheses form :key('value') is derived from the "Paren form" column and general bracketing rules, but it's never explicitly shown for this use case.

According to S02: angle brackets <> are a word-quoting operator that splits on whitespace:

<Table of Contents>  →  ('Table', 'of', 'Contents')  # Creates a LIST

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions