hyperlist 1.9.5 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -0
  3. data/hyperlist +56 -40
  4. data/hyperlist.gemspec +1 -1
  5. metadata +3 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07b8bfdcbc6501393a3b58a126ece4c2af50b362723da3003ea7fc581c8b9359
4
- data.tar.gz: 6e9297f7765fc279805b9dbe27af5deda86a0b3cbecdaf75025f23d81f139692
3
+ metadata.gz: 29de7b1cd2d218f83a202716aee22e7482faae29c441581a6c6f3ee6df3d0f76
4
+ data.tar.gz: c9f90af14cf2a878a27c5b65d5315ea38a6e97a4bf5846ea398fe5483e165d01
5
5
  SHA512:
6
- metadata.gz: e9fc8ad2e75bbbfe84bd8462651905308328291daaf24a339b0ab5b86a3558841bf83c57f60920c51b7d2efae5069882046e469291eb3356e03ebb5670a1f5f6
7
- data.tar.gz: 0eee2499aff88ec3d695a13ae5719803fbc345ce0725eec43bb52d3a31db890290c8a7a2c62903da53161c9aab750260df9590f74773832ff019f90ef34a8376
6
+ metadata.gz: 4e4ac0f6c1ea821bed75348a1a700fc7717217c897c4a7f45ed092d419f4d9f91e99996f873b8205f4bf138aebe35353d46868298e25fa884886bdfedee8abc8
7
+ data.tar.gz: 3b46de1faf666012364789efee80fadd5b7bd489686487389895f056905db53fffd1160b30a6d46217433bbc2e1dca5d428b41fce72438496c835c89091029cb
data/CHANGELOG.md CHANGED
@@ -2,6 +2,45 @@
2
2
 
3
3
  All notable changes to the HyperList Ruby TUI will be documented in this file.
4
4
 
5
+ ## [1.11.0] - 2026-08-13
6
+
7
+ ### Changed
8
+ - Starters are magenta rather than red. `+` and `-` are line-leading
9
+ structure markers, the same role a numbering Identifier plays, so they
10
+ share its colour instead of sitting with Properties and dates.
11
+ - The `-` Starter is now coloured as well, not only `+`.
12
+
13
+ ## [1.10.0] - 2026-08-11
14
+
15
+ ### Changed
16
+ - HyperList definition v2.8: `+` and `-` are Neutral Starters marking where
17
+ an Item begins, carrying no further meaning. A Starter is required only on
18
+ an Item that spans more than one line, and its following lines are now
19
+ indented two spaces beyond the Item's own indent rather than one. The rule
20
+ forcing every sibling at the same indent to carry a Starter has been
21
+ dropped. Built-in syntax reference and embedded self-definition updated.
22
+
23
+ ## [1.9.7] - 2026-08-10
24
+
25
+ ### Added
26
+ - HyperList definition v2.7: the `[?!]` fallback Qualifier, read as
27
+ "otherwise". Applies when no preceding sibling Qualifier at the same
28
+ indent did, so a fallback binds to the Items above it instead of
29
+ restating the condition negated. Added to the built-in syntax
30
+ reference and the embedded self-definition.
31
+
32
+ ### Fixed
33
+ - Graphviz export treated `[?!]` as an ordinary condition and emitted
34
+ `tooltip="Condition: ?!"`. It now renders as a dashed diamond with no
35
+ tooltip, since a fallback is not a condition.
36
+
37
+ ## [1.9.6] - 2026-05-11
38
+
39
+ ### Fixed
40
+ - Rename rcurses string-styling methods to match rcurses 7.0.0:
41
+ `.b → .bd`, `.i → .it`, `.u → .ul`. Without this, HyperList crashed
42
+ on first render against rcurses 7+. Fixes #1.
43
+
5
44
  ## [1.9.4] - 2025-12-02
6
45
 
7
46
  ### Enhanced
data/hyperlist CHANGED
@@ -73,7 +73,7 @@ class HyperListApp
73
73
  include Rcurses::Input
74
74
  include Rcurses::Cursor
75
75
 
76
- VERSION = "1.9.4"
76
+ VERSION = "1.11.0"
77
77
 
78
78
  def initialize(filename = nil)
79
79
  @filename = filename ? File.expand_path(filename) : nil
@@ -1207,7 +1207,7 @@ class HyperListApp
1207
1207
 
1208
1208
  def wrap_line(text, width, indent_level)
1209
1209
  # Wrap a line per HyperList spec:
1210
- # Multi-line items start with '+' on first line
1210
+ # Multi-line items start with a Neutral Starter ('+' or '-')
1211
1211
  # Continuation lines have just a space prefix
1212
1212
  return [text] unless @wrap
1213
1213
 
@@ -1514,7 +1514,7 @@ class HyperListApp
1514
1514
  marker = $2
1515
1515
  content = $3 || ""
1516
1516
  # Apply underline to content after the marker
1517
- result = prefix + marker + content.u
1517
+ result = prefix + marker + content.ul
1518
1518
  end
1519
1519
  elsif @st_underline_mode == 2
1520
1520
  # Underline transitions
@@ -1523,7 +1523,7 @@ class HyperListApp
1523
1523
  marker = $2
1524
1524
  content = $3 || ""
1525
1525
  # Apply underline to content after the marker
1526
- result = prefix + marker + content.u
1526
+ result = prefix + marker + content.ul
1527
1527
  end
1528
1528
  end
1529
1529
 
@@ -1575,10 +1575,11 @@ class HyperListApp
1575
1575
  result = result.sub(/^[0-9][0-9A-Z.]*\s/, identifier.fg(colors["magenta"])) # Magenta for identifiers
1576
1576
  end
1577
1577
 
1578
- # Handle multi-line indicator at the beginning (+ with space)
1579
- # Based on hyperlist.vim: '^\(\t\|\*\)*+ '
1580
- if result =~ /^\+\s/
1581
- result = result.sub(/^(\+\s)/, "+".fg(colors["red"]) + " ") # Red for multi-line indicator
1578
+ # Handle the Starter at the beginning (+ or - with space)
1579
+ # Based on hyperlist.vim: '^\(\t\|\*\)*[+-] '. Magenta, the same as a
1580
+ # numbering Identifier: both are line-leading structure markers.
1581
+ if result =~ /^[+-]\s/
1582
+ result = result.sub(/^([+-])\s/) { "#{$1}".fg(colors["magenta"]) + " " }
1582
1583
  end
1583
1584
 
1584
1585
  # Handle continuation markers (+ at start of indented lines in References section)
@@ -1596,7 +1597,7 @@ class HyperListApp
1596
1597
  processed_checkbox = true
1597
1598
  elsif result =~ /^(\s*)(\[O\])/
1598
1599
  spaces = $1
1599
- colored = "[O]".fg(colors["green"]).b
1600
+ colored = "[O]".fg(colors["green"]).bd
1600
1601
  result = result.sub(/^(\s*)(\[O\])/, "#{spaces}#{colored}") # Bold bright green for in-progress
1601
1602
  processed_checkbox = true
1602
1603
  elsif result =~ /^(\s*)(\[-\])/
@@ -1734,13 +1735,13 @@ class HyperListApp
1734
1735
  # Handle text formatting (bold, italic, underline)
1735
1736
  # Based on hyperlist.vim patterns with tab/space boundaries
1736
1737
  # Bold: '\(\t\| \)\@<=\*.\{-}\*\($\| \)\@='
1737
- result.gsub!(/(?<=\s|\A)\*([^*]+)\*(?=\s|\z)/) { $1.b }
1738
+ result.gsub!(/(?<=\s|\A)\*([^*]+)\*(?=\s|\z)/) { $1.bd }
1738
1739
 
1739
1740
  # Italic: '\(\t\| \)\@<=/.\{-}/\($\| \)\@='
1740
- result.gsub!(/(?<=\s|\A)\/([^\/]+)\/(?=\s|\z)/) { $1.i }
1741
+ result.gsub!(/(?<=\s|\A)\/([^\/]+)\/(?=\s|\z)/) { $1.it }
1741
1742
 
1742
1743
  # Underline: '\(\t\| \)\@<=_.\{-}_\($\| \)\@='
1743
- result.gsub!(/(?<=\s|\A)_([^_]+)_(?=\s|\z)/) { $1.u }
1744
+ result.gsub!(/(?<=\s|\A)_([^_]+)_(?=\s|\z)/) { $1.ul }
1744
1745
 
1745
1746
  result
1746
1747
  end
@@ -3772,7 +3773,7 @@ class HyperListApp
3772
3773
  help_lines = []
3773
3774
  help_lines << " Press #{"?".fg("10")} for full documentation, #{"UP/DOWN".fg("10")} to scroll, or any other key to return"
3774
3775
  help_lines << " "
3775
- help_lines << "#{"HYPERLIST KEY BINDINGS".b}"
3776
+ help_lines << "#{"HYPERLIST KEY BINDINGS".bd}"
3776
3777
  help_lines << " "
3777
3778
  help_lines << "#{"NAVIGATION".fg("14")}"
3778
3779
  help_lines << help_line("#{"j/↓".fg("10")}", "Move down", "#{"k/↑".fg("10")}", "Move up")
@@ -3848,7 +3849,7 @@ class HyperListApp
3848
3849
  help_lines << help_line("#{"q".fg("10")}", "Quit (asks to save)", "#{"Q".fg("10")}", "Force quit")
3849
3850
  help_lines << ""
3850
3851
  help_lines << "#{"COLOR SCHEME".fg("14")}"
3851
- help_lines << help_line("#{"[X]".fg("10")}", "Completed", "#{"[O]".fg("10").b}", "In progress")
3852
+ help_lines << help_line("#{"[X]".fg("10")}", "Completed", "#{"[O]".fg("10").bd}", "In progress")
3852
3853
  help_lines << help_line("#{"[ ]".fg("22")}", "Unchecked", "#{"[-]".fg("2")}", "Partial")
3853
3854
  help_lines << help_line("#{"[?]".fg("2")}", "Conditionals", "#{"AND:".fg("4")}", "Operators")
3854
3855
  help_lines << help_line("#{"Date:".fg("1")}", "Properties", "#{"<ref>".fg("5")}", "References")
@@ -3920,7 +3921,7 @@ class HyperListApp
3920
3921
  def show_documentation
3921
3922
  doc = <<~DOC
3922
3923
 
3923
- #{"HYPERLIST DOCUMENTATION".b}
3924
+ #{"HYPERLIST DOCUMENTATION".bd}
3924
3925
  #{"Version 2.6 - Complete Specification".fg("245")}
3925
3926
 
3926
3927
  #{"Official HyperList Page:".fg("14")} #{"https://isene.org/hyperlist/".fg("5")}
@@ -3928,7 +3929,7 @@ class HyperListApp
3928
3929
 
3929
3930
  #{"═" * 60}
3930
3931
 
3931
- #{"OVERVIEW".b}
3932
+ #{"OVERVIEW".bd}
3932
3933
 
3933
3934
  HyperList represents a way to describe anything - any state or any
3934
3935
  transition. It represents data in tree-structure lists with a very
@@ -3943,13 +3944,15 @@ class HyperListApp
3943
3944
 
3944
3945
  #{"═" * 60}
3945
3946
 
3946
- #{"HYPERLIST ITEM STRUCTURE".b}
3947
+ #{"HYPERLIST ITEM STRUCTURE".bd}
3947
3948
 
3948
3949
  A HyperList Item consists of these parts in sequence:
3949
3950
 
3950
3951
  1. #{"Starter".fg("5")} (optional)
3951
- Identifier: Numbers (1.1.1) or mixed (1A1A)
3952
- Multi-line indicator: + (plus sign)
3952
+ Neutral Starter: "+ " or "- " — marks where an Item begins
3953
+ Identifier: Numbers (1.1.1) or mixed (1A1A) — also unique
3954
+ Required only when an Item spans more than one line; its following
3955
+ lines are indented two spaces beyond the Item's own indent
3953
3956
 
3954
3957
  2. #{"Type".fg("5")} (optional)
3955
3958
  • State: S: or |
@@ -3965,14 +3968,14 @@ class HyperListApp
3965
3968
 
3966
3969
  #{"═" * 60}
3967
3970
 
3968
- #{"BASIC STRUCTURE".b}
3971
+ #{"BASIC STRUCTURE".bd}
3969
3972
 
3970
3973
  • Items are organized hierarchically using TAB indentation
3971
3974
  • Each level of indentation represents a deeper level
3972
3975
  • Children add information to their parents
3973
3976
  • A separator between items reads as "then" or "and"
3974
3977
 
3975
- #{"CHECKBOXES".b}
3978
+ #{"CHECKBOXES".bd}
3976
3979
 
3977
3980
  [_] Unchecked item (underscore placeholder)
3978
3981
  [ ] Unchecked item (space placeholder)
@@ -3985,12 +3988,13 @@ class HyperListApp
3985
3988
  Use 'V' to toggle with automatic timestamp on completion.
3986
3989
  Format: [x] YYYY-MM-DD HH.MM: (timestamp after checkbox)
3987
3990
 
3988
- #{"QUALIFIERS".b}
3991
+ #{"QUALIFIERS".bd}
3989
3992
 
3990
3993
  Qualifiers in square brackets tell how many times, when, or under
3991
3994
  what conditions an item exists or is executed:
3992
3995
 
3993
3996
  [?] Optional item
3997
+ [?!] Otherwise (no preceding sibling Qualifier applied)
3994
3998
  [3] Do item 3 times
3995
3999
  [1+] Do item 1 or more times
3996
4000
  [2..5] Do item 2 to 5 times
@@ -4004,7 +4008,7 @@ class HyperListApp
4004
4008
  Complex example:
4005
4009
  [2..7, Raining, Temp<5°C] Do item 2-7 times while raining and cold
4006
4010
 
4007
- #{"TIMESTAMPS".b}
4011
+ #{"TIMESTAMPS".bd}
4008
4012
 
4009
4013
  ISO-8601 format: YYYY-MM-DD HH.MM.SS (can be shortened)
4010
4014
 
@@ -4023,7 +4027,7 @@ class HyperListApp
4023
4027
  [YYYY-MM-03] Every 3rd of every month
4024
4028
  [Tue,Fri 12.00] Noon every Tuesday and Friday
4025
4029
 
4026
- #{"PROPERTIES".b}
4030
+ #{"PROPERTIES".bd}
4027
4031
 
4028
4032
  Any text followed by colon is a property (displayed in red):
4029
4033
 
@@ -4032,7 +4036,7 @@ class HyperListApp
4032
4036
  2025-08-11 14.30: Meeting starts
4033
4037
  State: Active
4034
4038
 
4035
- #{"OPERATORS".b}
4039
+ #{"OPERATORS".bd}
4036
4040
 
4037
4041
  ALL CAPS followed by colon (displayed in blue):
4038
4042
 
@@ -4051,7 +4055,7 @@ class HyperListApp
4051
4055
  EXAMPLES: List of examples follows
4052
4056
  CHOOSE: Select from options
4053
4057
 
4054
- #{"REFERENCES".b}
4058
+ #{"REFERENCES".bd}
4055
4059
 
4056
4060
  Enclosed in angle brackets < > (displayed in magenta):
4057
4061
 
@@ -4074,7 +4078,7 @@ class HyperListApp
4074
4078
  <https://url.com> External URL
4075
4079
  <file:/path/to/file> File reference
4076
4080
 
4077
- #{"TEXT FORMATTING".b}
4081
+ #{"TEXT FORMATTING".bd}
4078
4082
 
4079
4083
  *bold text* Bold formatting
4080
4084
  /italic text/ Italic formatting
@@ -4082,7 +4086,7 @@ class HyperListApp
4082
4086
 
4083
4087
  Formatting can be combined and nested.
4084
4088
 
4085
- #{"ADDITIVES".b}
4089
+ #{"ADDITIVES".bd}
4086
4090
 
4087
4091
  #{"Comments".fg("6")} (in parentheses):
4088
4092
  (This is a comment) Not executed in transitions
@@ -4097,7 +4101,7 @@ class HyperListApp
4097
4101
  #TODO #important Markers for categorization
4098
4102
  #ProjectAlpha No spaces allowed in tags
4099
4103
 
4100
- #{"SUBSTITUTIONS".b}
4104
+ #{"SUBSTITUTIONS".bd}
4101
4105
 
4102
4106
  Use curly brackets for variable substitution:
4103
4107
 
@@ -4107,7 +4111,7 @@ class HyperListApp
4107
4111
  Ask user for input; Use {input}
4108
4112
  → Variable from user interaction
4109
4113
 
4110
- #{"MULTI-LINE ITEMS".b}
4114
+ #{"MULTI-LINE ITEMS".bd}
4111
4115
 
4112
4116
  Use + prefix for items spanning multiple lines:
4113
4117
 
@@ -4117,7 +4121,7 @@ class HyperListApp
4117
4121
  If one item at a level is multi-line, all items at that
4118
4122
  level must start with + or an identifier.
4119
4123
 
4120
- #{"SEPARATORS".b}
4124
+ #{"SEPARATORS".bd}
4121
4125
 
4122
4126
  Newline → "then" (for sequence) or "and" (for children)
4123
4127
  Semicolon → Compact multiple items on one line
@@ -4131,7 +4135,7 @@ class HyperListApp
4131
4135
  Task A; Task B; Task C
4132
4136
  → Task A then Task B then Task C
4133
4137
 
4134
- #{"CHANGE MARKUP".b}
4138
+ #{"CHANGE MARKUP".bd}
4135
4139
 
4136
4140
  Special tags for document editing:
4137
4141
 
@@ -4141,7 +4145,7 @@ class HyperListApp
4141
4145
  ##-> Indent item right
4142
4146
  ##Text## Mark item as changed
4143
4147
 
4144
- #{"LITERAL BLOCKS".b}
4148
+ #{"LITERAL BLOCKS".bd}
4145
4149
 
4146
4150
  Escape HyperList interpretation with backslash blocks:
4147
4151
 
@@ -4151,7 +4155,7 @@ class HyperListApp
4151
4155
  Until the closing backslash
4152
4156
  \\
4153
4157
 
4154
- #{"EXAMPLES".b}
4158
+ #{"EXAMPLES".bd}
4155
4159
 
4156
4160
  #{"Simple Todo List:".fg("1")}
4157
4161
  [ ] Buy groceries
@@ -4187,17 +4191,20 @@ class HyperListApp
4187
4191
 
4188
4192
  #{"═" * 60}
4189
4193
 
4190
- #{"COMPLETE HYPERLIST DEFINITION (from specification v2.6)".b}
4194
+ #{"COMPLETE HYPERLIST DEFINITION (from specification v2.6)".bd}
4191
4195
 
4192
4196
  HyperList
4193
4197
  [1+] HyperList Item
4194
4198
  [?] Starter; OR:
4199
+ Neutral Starter = "+ " or "- "
4200
+ Marks where an Item begins and carries no further meaning
4195
4201
  Identifier (Numbers: Format = "1.1.1.1", Mixed: Format = "1A1A")
4196
- [? Multi-line Item] The Identifier acts like the plus sign ("+")
4197
- Multi-line Indicator = "+"
4198
- + If one Item on a certain indent is multi-line, all Items on the same indent
4199
- (including single-line Items) must start with a plus sign ("+") or <Identifier>
4200
- and all lines on the same indent after the first line must start with a space
4202
+ Unique, so the Item can be referred to; also acts as a Starter
4203
+ + An Item spanning more than one line must have a Starter, and its
4204
+ following lines are indented two spaces beyond the Item's own indent
4205
+ One level of indentation is at least three columns wide, so a
4206
+ continuation line can never be read as a child
4207
+ No requirement falls on the other Items at the same indent
4201
4208
  [?] Type
4202
4209
  OR:
4203
4210
  State = "S:" or "|"
@@ -4251,6 +4258,10 @@ class HyperListApp
4251
4258
  Do Item 1 or more times while "Bob is polite" = "[1+, Bob is polite]"
4252
4259
  Do Item up to 4 times only while "zoo=0" = "[<4, zoo=0]"
4253
4260
  Optional Item = "[?]"
4261
+ Fallback Item = "[?!]"
4262
+ Read as "otherwise"
4263
+ Applies when no preceding sibling Qualifier applied
4264
+ Valid only as the last Item of such a group
4254
4265
  Timestamp Qualifier = "[YYYY-MM-DD hh.mm.ss]"
4255
4266
  Shorten the format to the appropriate granularity
4256
4267
  Time relations
@@ -6190,6 +6201,11 @@ class HyperListApp
6190
6201
  case qualifier
6191
6202
  when "?"
6192
6203
  attributes << "shape=diamond" # Optional items as diamonds
6204
+ when "?!"
6205
+ # Fallback ("otherwise"): the branch taken when no preceding
6206
+ # sibling Qualifier applied. Not a condition, so no tooltip.
6207
+ attributes << "shape=diamond"
6208
+ attributes << "style=dashed"
6193
6209
  when "_"
6194
6210
  label = "☐ #{label}"
6195
6211
  attributes[0] = "label=\"#{label}\""
data/hyperlist.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "hyperlist"
3
- spec.version = "1.9.5"
3
+ spec.version = "1.11.0"
4
4
  spec.authors = ["Geir Isene"]
5
5
  spec.email = ["g@isene.com"]
6
6
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperlist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.5
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geir Isene
8
- autorequire:
9
8
  bindir: "."
10
9
  cert_chain: []
11
- date: 2026-04-11 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rcurses
@@ -82,7 +81,6 @@ metadata:
82
81
  source_code_uri: https://github.com/isene/HyperList
83
82
  documentation_uri: https://isene.org/hyperlist/
84
83
  changelog_uri: https://github.com/isene/HyperList/blob/main/CHANGELOG.md
85
- post_install_message:
86
84
  rdoc_options: []
87
85
  require_paths:
88
86
  - "."
@@ -97,8 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
95
  - !ruby/object:Gem::Version
98
96
  version: '0'
99
97
  requirements: []
100
- rubygems_version: 3.4.20
101
- signing_key:
98
+ rubygems_version: 3.6.7
102
99
  specification_version: 4
103
100
  summary: A powerful Terminal User Interface for HyperList management
104
101
  test_files: []