hyperlist 1.9.5 → 1.10.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 +31 -0
  3. data/hyperlist +51 -36
  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: b8d42e5386dc58dbdc20cd58047ccb03bbcb29d56980770a40a076a540a507cc
4
+ data.tar.gz: 7afd2752e67c25575a5b3e76b7d567eab6d4520dfb322049b5b21f099e24d7ce
5
5
  SHA512:
6
- metadata.gz: e9fc8ad2e75bbbfe84bd8462651905308328291daaf24a339b0ab5b86a3558841bf83c57f60920c51b7d2efae5069882046e469291eb3356e03ebb5670a1f5f6
7
- data.tar.gz: 0eee2499aff88ec3d695a13ae5719803fbc345ce0725eec43bb52d3a31db890290c8a7a2c62903da53161c9aab750260df9590f74773832ff019f90ef34a8376
6
+ metadata.gz: 731e6c85e60c11b12e2d6b57769c49ca64c40a7250280548a43adcd82bab9a4e18d5cf3048c5e5a81955f16b919e287efb9e64b00c99925539326b578576bd60
7
+ data.tar.gz: fd2ed40ca6aacf449f154c821774af8009b02cfbcbf0c387e27d547994274bfc490835973e01082c4ca3029171720fe4cd32d0105aa2b834964df7bf2a6c8051
data/CHANGELOG.md CHANGED
@@ -2,6 +2,37 @@
2
2
 
3
3
  All notable changes to the HyperList Ruby TUI will be documented in this file.
4
4
 
5
+ ## [1.10.0] - 2026-08-11
6
+
7
+ ### Changed
8
+ - HyperList definition v2.8: `+` and `-` are Neutral Starters marking where
9
+ an Item begins, carrying no further meaning. A Starter is required only on
10
+ an Item that spans more than one line, and its following lines are now
11
+ indented two spaces beyond the Item's own indent rather than one. The rule
12
+ forcing every sibling at the same indent to carry a Starter has been
13
+ dropped. Built-in syntax reference and embedded self-definition updated.
14
+
15
+ ## [1.9.7] - 2026-08-10
16
+
17
+ ### Added
18
+ - HyperList definition v2.7: the `[?!]` fallback Qualifier, read as
19
+ "otherwise". Applies when no preceding sibling Qualifier at the same
20
+ indent did, so a fallback binds to the Items above it instead of
21
+ restating the condition negated. Added to the built-in syntax
22
+ reference and the embedded self-definition.
23
+
24
+ ### Fixed
25
+ - Graphviz export treated `[?!]` as an ordinary condition and emitted
26
+ `tooltip="Condition: ?!"`. It now renders as a dashed diamond with no
27
+ tooltip, since a fallback is not a condition.
28
+
29
+ ## [1.9.6] - 2026-05-11
30
+
31
+ ### Fixed
32
+ - Rename rcurses string-styling methods to match rcurses 7.0.0:
33
+ `.b → .bd`, `.i → .it`, `.u → .ul`. Without this, HyperList crashed
34
+ on first render against rcurses 7+. Fixes #1.
35
+
5
36
  ## [1.9.4] - 2025-12-02
6
37
 
7
38
  ### 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.10.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
 
@@ -1596,7 +1596,7 @@ class HyperListApp
1596
1596
  processed_checkbox = true
1597
1597
  elsif result =~ /^(\s*)(\[O\])/
1598
1598
  spaces = $1
1599
- colored = "[O]".fg(colors["green"]).b
1599
+ colored = "[O]".fg(colors["green"]).bd
1600
1600
  result = result.sub(/^(\s*)(\[O\])/, "#{spaces}#{colored}") # Bold bright green for in-progress
1601
1601
  processed_checkbox = true
1602
1602
  elsif result =~ /^(\s*)(\[-\])/
@@ -1734,13 +1734,13 @@ class HyperListApp
1734
1734
  # Handle text formatting (bold, italic, underline)
1735
1735
  # Based on hyperlist.vim patterns with tab/space boundaries
1736
1736
  # Bold: '\(\t\| \)\@<=\*.\{-}\*\($\| \)\@='
1737
- result.gsub!(/(?<=\s|\A)\*([^*]+)\*(?=\s|\z)/) { $1.b }
1737
+ result.gsub!(/(?<=\s|\A)\*([^*]+)\*(?=\s|\z)/) { $1.bd }
1738
1738
 
1739
1739
  # Italic: '\(\t\| \)\@<=/.\{-}/\($\| \)\@='
1740
- result.gsub!(/(?<=\s|\A)\/([^\/]+)\/(?=\s|\z)/) { $1.i }
1740
+ result.gsub!(/(?<=\s|\A)\/([^\/]+)\/(?=\s|\z)/) { $1.it }
1741
1741
 
1742
1742
  # Underline: '\(\t\| \)\@<=_.\{-}_\($\| \)\@='
1743
- result.gsub!(/(?<=\s|\A)_([^_]+)_(?=\s|\z)/) { $1.u }
1743
+ result.gsub!(/(?<=\s|\A)_([^_]+)_(?=\s|\z)/) { $1.ul }
1744
1744
 
1745
1745
  result
1746
1746
  end
@@ -3772,7 +3772,7 @@ class HyperListApp
3772
3772
  help_lines = []
3773
3773
  help_lines << " Press #{"?".fg("10")} for full documentation, #{"UP/DOWN".fg("10")} to scroll, or any other key to return"
3774
3774
  help_lines << " "
3775
- help_lines << "#{"HYPERLIST KEY BINDINGS".b}"
3775
+ help_lines << "#{"HYPERLIST KEY BINDINGS".bd}"
3776
3776
  help_lines << " "
3777
3777
  help_lines << "#{"NAVIGATION".fg("14")}"
3778
3778
  help_lines << help_line("#{"j/↓".fg("10")}", "Move down", "#{"k/↑".fg("10")}", "Move up")
@@ -3848,7 +3848,7 @@ class HyperListApp
3848
3848
  help_lines << help_line("#{"q".fg("10")}", "Quit (asks to save)", "#{"Q".fg("10")}", "Force quit")
3849
3849
  help_lines << ""
3850
3850
  help_lines << "#{"COLOR SCHEME".fg("14")}"
3851
- help_lines << help_line("#{"[X]".fg("10")}", "Completed", "#{"[O]".fg("10").b}", "In progress")
3851
+ help_lines << help_line("#{"[X]".fg("10")}", "Completed", "#{"[O]".fg("10").bd}", "In progress")
3852
3852
  help_lines << help_line("#{"[ ]".fg("22")}", "Unchecked", "#{"[-]".fg("2")}", "Partial")
3853
3853
  help_lines << help_line("#{"[?]".fg("2")}", "Conditionals", "#{"AND:".fg("4")}", "Operators")
3854
3854
  help_lines << help_line("#{"Date:".fg("1")}", "Properties", "#{"<ref>".fg("5")}", "References")
@@ -3920,7 +3920,7 @@ class HyperListApp
3920
3920
  def show_documentation
3921
3921
  doc = <<~DOC
3922
3922
 
3923
- #{"HYPERLIST DOCUMENTATION".b}
3923
+ #{"HYPERLIST DOCUMENTATION".bd}
3924
3924
  #{"Version 2.6 - Complete Specification".fg("245")}
3925
3925
 
3926
3926
  #{"Official HyperList Page:".fg("14")} #{"https://isene.org/hyperlist/".fg("5")}
@@ -3928,7 +3928,7 @@ class HyperListApp
3928
3928
 
3929
3929
  #{"═" * 60}
3930
3930
 
3931
- #{"OVERVIEW".b}
3931
+ #{"OVERVIEW".bd}
3932
3932
 
3933
3933
  HyperList represents a way to describe anything - any state or any
3934
3934
  transition. It represents data in tree-structure lists with a very
@@ -3943,13 +3943,15 @@ class HyperListApp
3943
3943
 
3944
3944
  #{"═" * 60}
3945
3945
 
3946
- #{"HYPERLIST ITEM STRUCTURE".b}
3946
+ #{"HYPERLIST ITEM STRUCTURE".bd}
3947
3947
 
3948
3948
  A HyperList Item consists of these parts in sequence:
3949
3949
 
3950
3950
  1. #{"Starter".fg("5")} (optional)
3951
- Identifier: Numbers (1.1.1) or mixed (1A1A)
3952
- Multi-line indicator: + (plus sign)
3951
+ Neutral Starter: "+ " or "- " — marks where an Item begins
3952
+ Identifier: Numbers (1.1.1) or mixed (1A1A) — also unique
3953
+ Required only when an Item spans more than one line; its following
3954
+ lines are indented two spaces beyond the Item's own indent
3953
3955
 
3954
3956
  2. #{"Type".fg("5")} (optional)
3955
3957
  • State: S: or |
@@ -3965,14 +3967,14 @@ class HyperListApp
3965
3967
 
3966
3968
  #{"═" * 60}
3967
3969
 
3968
- #{"BASIC STRUCTURE".b}
3970
+ #{"BASIC STRUCTURE".bd}
3969
3971
 
3970
3972
  • Items are organized hierarchically using TAB indentation
3971
3973
  • Each level of indentation represents a deeper level
3972
3974
  • Children add information to their parents
3973
3975
  • A separator between items reads as "then" or "and"
3974
3976
 
3975
- #{"CHECKBOXES".b}
3977
+ #{"CHECKBOXES".bd}
3976
3978
 
3977
3979
  [_] Unchecked item (underscore placeholder)
3978
3980
  [ ] Unchecked item (space placeholder)
@@ -3985,12 +3987,13 @@ class HyperListApp
3985
3987
  Use 'V' to toggle with automatic timestamp on completion.
3986
3988
  Format: [x] YYYY-MM-DD HH.MM: (timestamp after checkbox)
3987
3989
 
3988
- #{"QUALIFIERS".b}
3990
+ #{"QUALIFIERS".bd}
3989
3991
 
3990
3992
  Qualifiers in square brackets tell how many times, when, or under
3991
3993
  what conditions an item exists or is executed:
3992
3994
 
3993
3995
  [?] Optional item
3996
+ [?!] Otherwise (no preceding sibling Qualifier applied)
3994
3997
  [3] Do item 3 times
3995
3998
  [1+] Do item 1 or more times
3996
3999
  [2..5] Do item 2 to 5 times
@@ -4004,7 +4007,7 @@ class HyperListApp
4004
4007
  Complex example:
4005
4008
  [2..7, Raining, Temp<5°C] Do item 2-7 times while raining and cold
4006
4009
 
4007
- #{"TIMESTAMPS".b}
4010
+ #{"TIMESTAMPS".bd}
4008
4011
 
4009
4012
  ISO-8601 format: YYYY-MM-DD HH.MM.SS (can be shortened)
4010
4013
 
@@ -4023,7 +4026,7 @@ class HyperListApp
4023
4026
  [YYYY-MM-03] Every 3rd of every month
4024
4027
  [Tue,Fri 12.00] Noon every Tuesday and Friday
4025
4028
 
4026
- #{"PROPERTIES".b}
4029
+ #{"PROPERTIES".bd}
4027
4030
 
4028
4031
  Any text followed by colon is a property (displayed in red):
4029
4032
 
@@ -4032,7 +4035,7 @@ class HyperListApp
4032
4035
  2025-08-11 14.30: Meeting starts
4033
4036
  State: Active
4034
4037
 
4035
- #{"OPERATORS".b}
4038
+ #{"OPERATORS".bd}
4036
4039
 
4037
4040
  ALL CAPS followed by colon (displayed in blue):
4038
4041
 
@@ -4051,7 +4054,7 @@ class HyperListApp
4051
4054
  EXAMPLES: List of examples follows
4052
4055
  CHOOSE: Select from options
4053
4056
 
4054
- #{"REFERENCES".b}
4057
+ #{"REFERENCES".bd}
4055
4058
 
4056
4059
  Enclosed in angle brackets < > (displayed in magenta):
4057
4060
 
@@ -4074,7 +4077,7 @@ class HyperListApp
4074
4077
  <https://url.com> External URL
4075
4078
  <file:/path/to/file> File reference
4076
4079
 
4077
- #{"TEXT FORMATTING".b}
4080
+ #{"TEXT FORMATTING".bd}
4078
4081
 
4079
4082
  *bold text* Bold formatting
4080
4083
  /italic text/ Italic formatting
@@ -4082,7 +4085,7 @@ class HyperListApp
4082
4085
 
4083
4086
  Formatting can be combined and nested.
4084
4087
 
4085
- #{"ADDITIVES".b}
4088
+ #{"ADDITIVES".bd}
4086
4089
 
4087
4090
  #{"Comments".fg("6")} (in parentheses):
4088
4091
  (This is a comment) Not executed in transitions
@@ -4097,7 +4100,7 @@ class HyperListApp
4097
4100
  #TODO #important Markers for categorization
4098
4101
  #ProjectAlpha No spaces allowed in tags
4099
4102
 
4100
- #{"SUBSTITUTIONS".b}
4103
+ #{"SUBSTITUTIONS".bd}
4101
4104
 
4102
4105
  Use curly brackets for variable substitution:
4103
4106
 
@@ -4107,7 +4110,7 @@ class HyperListApp
4107
4110
  Ask user for input; Use {input}
4108
4111
  → Variable from user interaction
4109
4112
 
4110
- #{"MULTI-LINE ITEMS".b}
4113
+ #{"MULTI-LINE ITEMS".bd}
4111
4114
 
4112
4115
  Use + prefix for items spanning multiple lines:
4113
4116
 
@@ -4117,7 +4120,7 @@ class HyperListApp
4117
4120
  If one item at a level is multi-line, all items at that
4118
4121
  level must start with + or an identifier.
4119
4122
 
4120
- #{"SEPARATORS".b}
4123
+ #{"SEPARATORS".bd}
4121
4124
 
4122
4125
  Newline → "then" (for sequence) or "and" (for children)
4123
4126
  Semicolon → Compact multiple items on one line
@@ -4131,7 +4134,7 @@ class HyperListApp
4131
4134
  Task A; Task B; Task C
4132
4135
  → Task A then Task B then Task C
4133
4136
 
4134
- #{"CHANGE MARKUP".b}
4137
+ #{"CHANGE MARKUP".bd}
4135
4138
 
4136
4139
  Special tags for document editing:
4137
4140
 
@@ -4141,7 +4144,7 @@ class HyperListApp
4141
4144
  ##-> Indent item right
4142
4145
  ##Text## Mark item as changed
4143
4146
 
4144
- #{"LITERAL BLOCKS".b}
4147
+ #{"LITERAL BLOCKS".bd}
4145
4148
 
4146
4149
  Escape HyperList interpretation with backslash blocks:
4147
4150
 
@@ -4151,7 +4154,7 @@ class HyperListApp
4151
4154
  Until the closing backslash
4152
4155
  \\
4153
4156
 
4154
- #{"EXAMPLES".b}
4157
+ #{"EXAMPLES".bd}
4155
4158
 
4156
4159
  #{"Simple Todo List:".fg("1")}
4157
4160
  [ ] Buy groceries
@@ -4187,17 +4190,20 @@ class HyperListApp
4187
4190
 
4188
4191
  #{"═" * 60}
4189
4192
 
4190
- #{"COMPLETE HYPERLIST DEFINITION (from specification v2.6)".b}
4193
+ #{"COMPLETE HYPERLIST DEFINITION (from specification v2.6)".bd}
4191
4194
 
4192
4195
  HyperList
4193
4196
  [1+] HyperList Item
4194
4197
  [?] Starter; OR:
4198
+ Neutral Starter = "+ " or "- "
4199
+ Marks where an Item begins and carries no further meaning
4195
4200
  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
4201
+ Unique, so the Item can be referred to; also acts as a Starter
4202
+ + An Item spanning more than one line must have a Starter, and its
4203
+ following lines are indented two spaces beyond the Item's own indent
4204
+ One level of indentation is at least three columns wide, so a
4205
+ continuation line can never be read as a child
4206
+ No requirement falls on the other Items at the same indent
4201
4207
  [?] Type
4202
4208
  OR:
4203
4209
  State = "S:" or "|"
@@ -4251,6 +4257,10 @@ class HyperListApp
4251
4257
  Do Item 1 or more times while "Bob is polite" = "[1+, Bob is polite]"
4252
4258
  Do Item up to 4 times only while "zoo=0" = "[<4, zoo=0]"
4253
4259
  Optional Item = "[?]"
4260
+ Fallback Item = "[?!]"
4261
+ Read as "otherwise"
4262
+ Applies when no preceding sibling Qualifier applied
4263
+ Valid only as the last Item of such a group
4254
4264
  Timestamp Qualifier = "[YYYY-MM-DD hh.mm.ss]"
4255
4265
  Shorten the format to the appropriate granularity
4256
4266
  Time relations
@@ -6190,6 +6200,11 @@ class HyperListApp
6190
6200
  case qualifier
6191
6201
  when "?"
6192
6202
  attributes << "shape=diamond" # Optional items as diamonds
6203
+ when "?!"
6204
+ # Fallback ("otherwise"): the branch taken when no preceding
6205
+ # sibling Qualifier applied. Not a condition, so no tooltip.
6206
+ attributes << "shape=diamond"
6207
+ attributes << "style=dashed"
6193
6208
  when "_"
6194
6209
  label = "☐ #{label}"
6195
6210
  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.10.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.10.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: []