doing 2.1.58 → 2.1.62
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/bin/commands/done.rb +13 -4
- data/bin/commands/update.rb +37 -0
- data/bin/commands/view.rb +1 -1
- data/bin/doing +1 -1
- data/docs/doc/Array.html +1 -1
- data/docs/doc/BooleanTermParser/Clause.html +1 -1
- data/docs/doc/BooleanTermParser/Operator.html +1 -1
- data/docs/doc/BooleanTermParser/Query.html +1 -1
- data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
- data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
- data/docs/doc/BooleanTermParser.html +1 -1
- data/docs/doc/Doing/ArrayCleanup.html +1 -1
- data/docs/doc/Doing/ArrayNestedHash.html +1 -1
- data/docs/doc/Doing/ArrayTags.html +1 -1
- data/docs/doc/Doing/CSVExport.html +1 -1
- data/docs/doc/Doing/CalendarImport.html +1 -1
- data/docs/doc/Doing/Change.html +1 -1
- data/docs/doc/Doing/Changes.html +1 -1
- data/docs/doc/Doing/ChronifyArray.html +1 -1
- data/docs/doc/Doing/ChronifyNumeric.html +1 -1
- data/docs/doc/Doing/ChronifyString.html +1 -1
- data/docs/doc/Doing/Color.html +6 -1
- data/docs/doc/Doing/Completion/BashCompletions.html +1 -1
- data/docs/doc/Doing/Completion/FigCompletions.html +1 -1
- data/docs/doc/Doing/Completion/FishCompletions.html +1 -1
- data/docs/doc/Doing/Completion/StringUtils.html +65 -7
- data/docs/doc/Doing/Completion/ZshCompletions.html +1 -1
- data/docs/doc/Doing/Completion.html +1 -1
- data/docs/doc/Doing/Configuration.html +1 -1
- data/docs/doc/Doing/DayOneRenderer.html +1 -1
- data/docs/doc/Doing/DayoneExport.html +1 -1
- data/docs/doc/Doing/DoingExport.html +1 -1
- data/docs/doc/Doing/DoingImport.html +1 -1
- data/docs/doc/Doing/Entry.html +1 -1
- data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
- data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
- data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
- data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
- data/docs/doc/Doing/Errors/HistoryLimitError.html +1 -1
- data/docs/doc/Doing/Errors/InvalidPlugin.html +1 -1
- data/docs/doc/Doing/Errors/MissingBackupFile.html +1 -1
- data/docs/doc/Doing/Errors/NoResults.html +1 -1
- data/docs/doc/Doing/Errors/PluginException.html +1 -1
- data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
- data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
- data/docs/doc/Doing/Errors.html +1 -1
- data/docs/doc/Doing/HTMLExport.html +1 -1
- data/docs/doc/Doing/Hooks.html +1 -1
- data/docs/doc/Doing/Item.html +2 -2
- data/docs/doc/Doing/ItemDates.html +1 -1
- data/docs/doc/Doing/ItemQuery.html +1 -1
- data/docs/doc/Doing/ItemState.html +1 -1
- data/docs/doc/Doing/ItemTags.html +1 -1
- data/docs/doc/Doing/Items.html +1 -1
- data/docs/doc/Doing/JSONExport.html +1 -1
- data/docs/doc/Doing/JSONImport.html +1 -1
- data/docs/doc/Doing/Logger.html +1 -1
- data/docs/doc/Doing/MarkdownExport.html +1 -1
- data/docs/doc/Doing/Note.html +1 -1
- data/docs/doc/Doing/Pager.html +1 -1
- data/docs/doc/Doing/Plugins.html +1 -1
- data/docs/doc/Doing/Prompt.html +2 -2
- data/docs/doc/Doing/PromptChoose.html +1 -1
- data/docs/doc/Doing/PromptFZF.html +1 -1
- data/docs/doc/Doing/PromptInput.html +1 -1
- data/docs/doc/Doing/PromptSTD.html +1 -1
- data/docs/doc/Doing/PromptYN.html +1 -1
- data/docs/doc/Doing/Section.html +1 -1
- data/docs/doc/Doing/StringHighlight.html +1 -1
- data/docs/doc/Doing/StringNormalize.html +1 -1
- data/docs/doc/Doing/StringQuery.html +61 -5
- data/docs/doc/Doing/StringTags.html +1 -1
- data/docs/doc/Doing/StringTransform.html +1 -1
- data/docs/doc/Doing/StringTruncate.html +1 -1
- data/docs/doc/Doing/StringURL.html +1 -1
- data/docs/doc/Doing/SymbolNormalize.html +1 -1
- data/docs/doc/Doing/TaskPaperExport.html +1 -1
- data/docs/doc/Doing/TemplateExport.html +2 -2
- data/docs/doc/Doing/TemplateString.html +3 -3
- data/docs/doc/Doing/TimingImport.html +1 -1
- data/docs/doc/Doing/Types.html +1 -1
- data/docs/doc/Doing/Util/Backup.html +1 -1
- data/docs/doc/Doing/Util.html +1 -1
- data/docs/doc/Doing/Version.html +1 -1
- data/docs/doc/Doing/WWID.html +2 -2
- data/docs/doc/Doing.html +2 -2
- data/docs/doc/FalseClass.html +1 -1
- data/docs/doc/GLI/Commands/Help.html +1 -1
- data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
- data/docs/doc/GLI/Commands.html +1 -1
- data/docs/doc/GLI.html +1 -1
- data/docs/doc/Hash.html +1 -1
- data/docs/doc/Numeric.html +1 -1
- data/docs/doc/Object.html +1 -1
- data/docs/doc/PhraseParser/Operator.html +1 -1
- data/docs/doc/PhraseParser/PhraseClause.html +1 -1
- data/docs/doc/PhraseParser/Query.html +1 -1
- data/docs/doc/PhraseParser/QueryParser.html +1 -1
- data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
- data/docs/doc/PhraseParser/TermClause.html +1 -1
- data/docs/doc/PhraseParser.html +1 -1
- data/docs/doc/Status.html +1 -1
- data/docs/doc/String.html +65 -2
- data/docs/doc/Symbol.html +1 -1
- data/docs/doc/Time.html +1 -1
- data/docs/doc/TrueClass.html +1 -1
- data/docs/doc/_index.html +1 -1
- data/docs/doc/file.README.html +2 -2
- data/docs/doc/index.html +2 -2
- data/docs/doc/method_list.html +554 -546
- data/docs/doc/top-level-namespace.html +1 -1
- data/doing.rdoc +11 -1
- data/lib/completion/_doing.zsh +4 -0
- data/lib/completion/doing.bash +11 -0
- data/lib/completion/doing.fish +2 -0
- data/lib/completion/doing.ts +14 -0
- data/lib/doing/colors.rb +57 -0
- data/lib/doing/completion/completion_string.rb +11 -0
- data/lib/doing/string/highlight.rb +6 -7
- data/lib/doing/string/query.rb +10 -0
- data/lib/doing/version.rb +1 -1
- data/lib/doing/wwid/modify.rb +0 -1
- data/lib/doing/wwid/timers.rb +1 -156
- data/lib/templates/doing.css +2 -2
- metadata +3 -2
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
</div>
|
|
217
217
|
|
|
218
218
|
<div id="footer">
|
|
219
|
-
Generated on
|
|
219
|
+
Generated on Fri Jul 1 10:30:16 2022 by
|
|
220
220
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
|
221
221
|
0.9.27 (ruby-3.0.1).
|
|
222
222
|
</div>
|
data/doing.rdoc
CHANGED
|
@@ -5,7 +5,7 @@ record of what you've been doing, complete with tag-based time tracking. The
|
|
|
5
5
|
command line tool allows you to add entries, annotate with tags and notes, and
|
|
6
6
|
view your entries with myriad options, with a focus on a "natural" language syntax.
|
|
7
7
|
|
|
8
|
-
v2.1.
|
|
8
|
+
v2.1.62
|
|
9
9
|
|
|
10
10
|
=== Global Options
|
|
11
11
|
=== --config_file arg
|
|
@@ -3009,6 +3009,16 @@ Redo last undo. Note: you cannot undo a redo
|
|
|
3009
3009
|
|
|
3010
3010
|
|
|
3011
3011
|
|
|
3012
|
+
==== Command: <tt>update </tt>
|
|
3013
|
+
Update doing to the latest version
|
|
3014
|
+
|
|
3015
|
+
Checks for the latest available version of doing and updates your local install if needed.
|
|
3016
|
+
===== Options
|
|
3017
|
+
===== -p|--pre|--beta
|
|
3018
|
+
Check for pre-release version
|
|
3019
|
+
|
|
3020
|
+
|
|
3021
|
+
|
|
3012
3022
|
==== Command: <tt>view VIEW_NAME</tt>
|
|
3013
3023
|
Display a user-created view
|
|
3014
3024
|
|
data/lib/completion/_doing.zsh
CHANGED
|
@@ -52,6 +52,7 @@ function _doing() {
|
|
|
52
52
|
'test:Test Stuff'
|
|
53
53
|
'today:List entries from today'
|
|
54
54
|
'undo:Undo the last X changes to the Doing file'
|
|
55
|
+
'update:Update doing to the latest version'
|
|
55
56
|
'view:Display a user-created view'
|
|
56
57
|
'views:List available custom views'
|
|
57
58
|
'wiki:Output a tag wiki'
|
|
@@ -200,6 +201,9 @@ function _doing() {
|
|
|
200
201
|
undo)
|
|
201
202
|
args=( {'(--file)-f','(-f)--file'}"[Specify alternate doing file]:PATH:" {'(--interactive)-i','(-i)--interactive'}"[Select from recent backups]" {'(--prune)-p','(-p)--prune'}"[Remove old backups]:COUNT:" {'(--redo)-r','(-r)--redo'}"[Redo last undo]" )
|
|
202
203
|
;;
|
|
204
|
+
update)
|
|
205
|
+
args=( "--beta[Check for pre-release version]" )
|
|
206
|
+
;;
|
|
203
207
|
view)
|
|
204
208
|
args=( "--after[Show entries newer than date]:DATE_STRING:" "--age[Age]:AGE:" "--before[Show entries older than date]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" {'(--count)-c','(-c)--count'}"[Count to display]:COUNT:" "--case[Case sensitivity for search string matching [(c)ase-sensitive]:TYPE:" "--color[Include colors in output]" "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" "--duration[Show elapsed time on entries without @done tag]" "--from[Date range]:DATE_OR_RANGE:" {'(--hilite)-h','(-h)--hilite'}"[Highlight search matches in output]" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries to perform additional operations]" "--not[Show items that *don't* match search/tag filters]" {'(--output)-o','(-o)--output'}"[Output to export format]:FORMAT:" "--only_timed[Only show items with recorded time intervals]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" "--search[Filter entries using a search query]:QUERY:" {'(--times)-t','(-t)--times'}"[Show time intervals on @done tasks]" "--tag[Filter entries by tag]:TAG:" "--tag_order[Tag sort direction]:DIRECTION:" "--tag_sort[Sort tags by]:KEY:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--totals[Show intervals with totals at the end of output]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
|
|
205
209
|
;;
|
data/lib/completion/doing.bash
CHANGED
|
@@ -368,6 +368,16 @@ _doing_undo() {
|
|
|
368
368
|
fi
|
|
369
369
|
}
|
|
370
370
|
|
|
371
|
+
_doing_update() {
|
|
372
|
+
|
|
373
|
+
if [[ "$token" == --* ]]; then
|
|
374
|
+
COMPREPLY=( $( compgen -W '--beta' -- $token ) )
|
|
375
|
+
elif [[ "$token" == -* ]]; then
|
|
376
|
+
COMPREPLY=( $( compgen -W ' --beta' -- $token ) )
|
|
377
|
+
|
|
378
|
+
fi
|
|
379
|
+
}
|
|
380
|
+
|
|
371
381
|
_doing_view() {
|
|
372
382
|
OLD_IFS="$IFS"
|
|
373
383
|
local token=${COMP_WORDS[$COMP_CWORD]}
|
|
@@ -466,6 +476,7 @@ _doing()
|
|
|
466
476
|
elif [[ $last =~ (template) ]]; then _doing_template
|
|
467
477
|
elif [[ $last =~ (today) ]]; then _doing_today
|
|
468
478
|
elif [[ $last =~ (undo) ]]; then _doing_undo
|
|
479
|
+
elif [[ $last =~ (update) ]]; then _doing_update
|
|
469
480
|
elif [[ $last =~ (view) ]]; then _doing_view
|
|
470
481
|
elif [[ $last =~ (views) ]]; then _doing_views
|
|
471
482
|
elif [[ $last =~ (wiki) ]]; then _doing_wiki
|
data/lib/completion/doing.fish
CHANGED
|
@@ -172,6 +172,7 @@ complete -xc doing -n '__fish_doing_needs_command' -a 'template' -d Output\ HTML
|
|
|
172
172
|
complete -xc doing -n '__fish_doing_needs_command' -a 'test' -d Test\ Stuff
|
|
173
173
|
complete -xc doing -n '__fish_doing_needs_command' -a 'today' -d List\ entries\ from\ today
|
|
174
174
|
complete -xc doing -n '__fish_doing_needs_command' -a 'undo' -d Undo\ the\ last\ X\ changes\ to\ the\ Doing\ file
|
|
175
|
+
complete -xc doing -n '__fish_doing_needs_command' -a 'update' -d Update\ doing\ to\ the\ latest\ version
|
|
175
176
|
complete -xc doing -n '__fish_doing_needs_command' -a 'view' -d Display\ a\ user-created\ view
|
|
176
177
|
complete -xc doing -n '__fish_doing_needs_command' -a 'views' -d List\ available\ custom\ views
|
|
177
178
|
complete -xc doing -n '__fish_doing_needs_command' -a 'wiki' -d Output\ a\ tag\ wiki
|
|
@@ -559,6 +560,7 @@ complete -c doing -l file -s f -f -r -n '__fish_doing_using_command undo' -d Spe
|
|
|
559
560
|
complete -c doing -l interactive -s i -f -n '__fish_doing_using_command undo' -d Select\ from\ recent\ backups
|
|
560
561
|
complete -c doing -l prune -s p -f -r -n '__fish_doing_using_command undo' -d Remove\ old\ backups
|
|
561
562
|
complete -c doing -l redo -s r -f -n '__fish_doing_using_command undo' -d Redo\ last\ undo
|
|
563
|
+
complete -c doing -l beta -f -n '__fish_doing_using_command update' -d Check\ for\ pre-release\ version
|
|
562
564
|
complete -c doing -l after -f -r -n '__fish_doing_using_command view' -d Show\ entries\ newer\ than\ date
|
|
563
565
|
complete -c doing -l age -f -r -n '__fish_doing_using_command view' -d Age
|
|
564
566
|
complete -c doing -l before -f -r -n '__fish_doing_using_command view' -d Show\ entries\ older\ than\ date
|
data/lib/completion/doing.ts
CHANGED
|
@@ -4463,6 +4463,20 @@ const completionSpec: Fig.Spec = {
|
|
|
4463
4463
|
|
|
4464
4464
|
},
|
|
4465
4465
|
|
|
4466
|
+
{
|
|
4467
|
+
name: "update",
|
|
4468
|
+
description: "Update doing to the latest version",
|
|
4469
|
+
options: [
|
|
4470
|
+
{
|
|
4471
|
+
name: ["--beta"],
|
|
4472
|
+
description: "Check for pre-release version",
|
|
4473
|
+
|
|
4474
|
+
},
|
|
4475
|
+
|
|
4476
|
+
],
|
|
4477
|
+
|
|
4478
|
+
},
|
|
4479
|
+
|
|
4466
4480
|
{
|
|
4467
4481
|
name: "view",
|
|
4468
4482
|
description: "Display a user-created view",
|
data/lib/doing/colors.rb
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
module Doing
|
|
5
5
|
# Terminal output color functions.
|
|
6
6
|
module Color
|
|
7
|
+
ESCAPE_REGEX = /(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
|
|
7
8
|
# All available color names. Available as methods and string extensions.
|
|
8
9
|
#
|
|
9
10
|
# @example Use a color as a method. Color reset will be added to end of string.
|
|
@@ -125,6 +126,62 @@ module Doing
|
|
|
125
126
|
def normalize_color
|
|
126
127
|
gsub(/_/, '').sub(/bright/i, 'bold').sub(/bgbold/, 'boldbg')
|
|
127
128
|
end
|
|
129
|
+
|
|
130
|
+
# Get the calculated ANSI color at the end of the
|
|
131
|
+
# string
|
|
132
|
+
#
|
|
133
|
+
# @return ANSI escape sequence to match color
|
|
134
|
+
#
|
|
135
|
+
def last_color_code
|
|
136
|
+
m = scan(ESCAPE_REGEX)
|
|
137
|
+
|
|
138
|
+
em = ['0']
|
|
139
|
+
fg = nil
|
|
140
|
+
bg = nil
|
|
141
|
+
rgbf = nil
|
|
142
|
+
rgbb = nil
|
|
143
|
+
|
|
144
|
+
m.each do |c|
|
|
145
|
+
case c
|
|
146
|
+
when '0'
|
|
147
|
+
em = ['0']
|
|
148
|
+
fg, bg, rgbf, rgbb = nil
|
|
149
|
+
when /^[34]8/
|
|
150
|
+
case c
|
|
151
|
+
when /^3/
|
|
152
|
+
fg = nil
|
|
153
|
+
rgbf = c
|
|
154
|
+
when /^4/
|
|
155
|
+
bg = nil
|
|
156
|
+
rgbb = c
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
c.split(/;/).each do |i|
|
|
160
|
+
x = i.to_i
|
|
161
|
+
if x <= 9
|
|
162
|
+
em << x
|
|
163
|
+
elsif x >= 30 && x <= 39
|
|
164
|
+
rgbf = nil
|
|
165
|
+
fg = x
|
|
166
|
+
elsif x >= 40 && x <= 49
|
|
167
|
+
rgbb = nil
|
|
168
|
+
bg = x
|
|
169
|
+
elsif x >= 90 && x <= 97
|
|
170
|
+
rgbf = nil
|
|
171
|
+
fg = x
|
|
172
|
+
elsif x >= 100 && x <= 107
|
|
173
|
+
rgbb = nil
|
|
174
|
+
bg = x
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
escape = "\e[#{em.join(';')}m"
|
|
181
|
+
escape += "\e[#{rgbb}m" if rgbb
|
|
182
|
+
escape += "\e[#{rgbf}m" if rgbf
|
|
183
|
+
escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
|
|
184
|
+
end
|
|
128
185
|
end
|
|
129
186
|
|
|
130
187
|
class << self
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
module Doing
|
|
2
2
|
module Completion
|
|
3
3
|
module StringUtils
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
## Get short description for command completion
|
|
7
|
+
##
|
|
8
|
+
## @return [String] Short description
|
|
9
|
+
##
|
|
4
10
|
def short_desc
|
|
5
11
|
split(/[,.]/)[0].sub(/ \(.*?\)?$/, '').strip
|
|
6
12
|
end
|
|
7
13
|
|
|
14
|
+
##
|
|
15
|
+
## Truncate string from left
|
|
16
|
+
##
|
|
17
|
+
## @param max The maximum number of characters
|
|
18
|
+
##
|
|
8
19
|
def ltrunc(max)
|
|
9
20
|
if length > max
|
|
10
21
|
sub(/^.*?(.{#{max - 3}})$/, '...\1')
|
|
@@ -17,14 +17,9 @@ module Doing
|
|
|
17
17
|
##
|
|
18
18
|
def highlight_tags(color = 'yellow', last_color: nil)
|
|
19
19
|
unless last_color
|
|
20
|
-
escapes = scan(/(\e\[[\d;]+m)[^\e]+@/)
|
|
21
20
|
color = color.split(' ') unless color.is_a?(Array)
|
|
22
21
|
tag_color = color.each_with_object([]) { |c, arr| arr << Doing::Color.send(c) }.join('')
|
|
23
|
-
last_color =
|
|
24
|
-
(escapes.count > 1 ? escapes[-2..-1] : [escapes[-1]]).map { |v| v[0] }.join('')
|
|
25
|
-
else
|
|
26
|
-
Doing::Color.default
|
|
27
|
-
end
|
|
22
|
+
last_color = last_color_code
|
|
28
23
|
end
|
|
29
24
|
gsub(/(\s|m)(@[^ ("']+)/, "\\1#{tag_color}\\2#{last_color}")
|
|
30
25
|
end
|
|
@@ -54,7 +49,11 @@ module Doing
|
|
|
54
49
|
qs.concat(query[:should]) if query[:should]
|
|
55
50
|
qs.each do |s|
|
|
56
51
|
rx = Regexp.new(s.wildcard_to_rx, ignore_case(s, case_type))
|
|
57
|
-
out.gsub!(rx)
|
|
52
|
+
out.gsub!(rx) do
|
|
53
|
+
m = Regexp.last_match
|
|
54
|
+
last = m.pre_match.last_color_code
|
|
55
|
+
"#{m[0].bgyellow.black}#{last}"
|
|
56
|
+
end
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
out
|
data/lib/doing/string/query.rb
CHANGED
|
@@ -85,6 +85,11 @@ module Doing
|
|
|
85
85
|
Regexp.new(pattern, !case_sensitive)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
##
|
|
89
|
+
## Returns a phrase query (elastic search) representation of the object as a phrase parser.
|
|
90
|
+
##
|
|
91
|
+
## @return Phrase query representation of the object.
|
|
92
|
+
##
|
|
88
93
|
def to_phrase_query
|
|
89
94
|
parser = PhraseParser::QueryParser.new
|
|
90
95
|
transformer = PhraseParser::QueryTransformer.new
|
|
@@ -92,6 +97,11 @@ module Doing
|
|
|
92
97
|
transformer.apply(parse_tree).to_elasticsearch
|
|
93
98
|
end
|
|
94
99
|
|
|
100
|
+
##
|
|
101
|
+
## Returns a query (elastic search) representation of the object as a boolean term parser.
|
|
102
|
+
##
|
|
103
|
+
## @return Query representation of the object.
|
|
104
|
+
##
|
|
95
105
|
def to_query
|
|
96
106
|
parser = BooleanTermParser::QueryParser.new
|
|
97
107
|
transformer = BooleanTermParser::QueryTransformer.new
|
data/lib/doing/version.rb
CHANGED
data/lib/doing/wwid/modify.rb
CHANGED
data/lib/doing/wwid/timers.rb
CHANGED
|
@@ -14,162 +14,7 @@ module Doing
|
|
|
14
14
|
def tag_times(format: :text, sort_by: :time, sort_order: :asc)
|
|
15
15
|
return '' if @timers.empty?
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
total = @timers.delete('All')
|
|
20
|
-
|
|
21
|
-
tags_data = @timers.delete_if { |_k, v| v.zero? }
|
|
22
|
-
sorted_tags_data = if sort_by.normalize_tag_sort == :name
|
|
23
|
-
tags_data.sort_by { |k, _v| k }
|
|
24
|
-
else
|
|
25
|
-
tags_data.sort_by { |_k, v| v }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
sorted_tags_data.reverse! if sort_order.normalize_order == :asc
|
|
29
|
-
case format
|
|
30
|
-
when :html
|
|
31
|
-
|
|
32
|
-
output = <<EOHEAD
|
|
33
|
-
<table>
|
|
34
|
-
<caption id="tagtotals">Tag Totals</caption>
|
|
35
|
-
<colgroup>
|
|
36
|
-
<col style="text-align:left;"/>
|
|
37
|
-
<col style="text-align:left;"/>
|
|
38
|
-
</colgroup>
|
|
39
|
-
<thead>
|
|
40
|
-
<tr>
|
|
41
|
-
<th style="text-align:left;">project</th>
|
|
42
|
-
<th style="text-align:left;">time</th>
|
|
43
|
-
</tr>
|
|
44
|
-
</thead>
|
|
45
|
-
<tbody>
|
|
46
|
-
EOHEAD
|
|
47
|
-
sorted_tags_data.reverse.each do |k, v|
|
|
48
|
-
if v.positive?
|
|
49
|
-
output += "<tr><td style='text-align:left;'>#{k}</td><td style='text-align:left;'>#{v.time_string(format: :clock)}</td></tr>\n"
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
tail = <<EOTAIL
|
|
53
|
-
<tr>
|
|
54
|
-
<td style="text-align:left;" colspan="2"></td>
|
|
55
|
-
</tr>
|
|
56
|
-
</tbody>
|
|
57
|
-
<tfoot>
|
|
58
|
-
<tr>
|
|
59
|
-
<td style="text-align:left;"><strong>Total</strong></td>
|
|
60
|
-
<td style="text-align:left;">#{total.time_string(format: :clock)}</td>
|
|
61
|
-
</tr>
|
|
62
|
-
</tfoot>
|
|
63
|
-
</table>
|
|
64
|
-
EOTAIL
|
|
65
|
-
output + tail
|
|
66
|
-
when :markdown
|
|
67
|
-
pad = sorted_tags_data.map { |k, _| k }.group_by(&:size).max.last[0].length
|
|
68
|
-
pad = 7 if pad < 7
|
|
69
|
-
output = <<~EOHEADER
|
|
70
|
-
| #{' ' * (pad - 7)}project | time |
|
|
71
|
-
| #{'-' * (pad - 1)}: | :------- |
|
|
72
|
-
EOHEADER
|
|
73
|
-
sorted_tags_data.reverse.each do |k, v|
|
|
74
|
-
if v.positive?
|
|
75
|
-
output += "| #{' ' * (pad - k.length)}#{k} | #{v.time_string(format: :clock)} |\n"
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
tail = '[Tag Totals]'
|
|
79
|
-
output + tail
|
|
80
|
-
when :json
|
|
81
|
-
output = []
|
|
82
|
-
sorted_tags_data.reverse.each do |k, v|
|
|
83
|
-
output << {
|
|
84
|
-
'tag' => k,
|
|
85
|
-
'seconds' => v,
|
|
86
|
-
'formatted' => v.time_string(format: :clock)
|
|
87
|
-
}
|
|
88
|
-
end
|
|
89
|
-
output
|
|
90
|
-
when :human
|
|
91
|
-
output = []
|
|
92
|
-
sorted_tags_data.reverse.each do |k, v|
|
|
93
|
-
spacer = ''
|
|
94
|
-
(max - k.length).times do
|
|
95
|
-
spacer += ' '
|
|
96
|
-
end
|
|
97
|
-
output.push("┃ #{spacer}#{k}:#{v.time_string(format: :hm)} ┃")
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
header = '┏━━ Tag Totals '
|
|
101
|
-
(max - 2).times { header += '━' }
|
|
102
|
-
header += '┓'
|
|
103
|
-
footer = '┗'
|
|
104
|
-
(max + 12).times { footer += '━' }
|
|
105
|
-
footer += '┛'
|
|
106
|
-
divider = '┣'
|
|
107
|
-
(max + 12).times { divider += '━' }
|
|
108
|
-
divider += '┫'
|
|
109
|
-
output = output.empty? ? '' : "\n#{header}\n#{output.join("\n")}"
|
|
110
|
-
output += "\n#{divider}"
|
|
111
|
-
spacer = ''
|
|
112
|
-
(max - 6).times do
|
|
113
|
-
spacer += ' '
|
|
114
|
-
end
|
|
115
|
-
total_time = total.time_string(format: :hm)
|
|
116
|
-
total = "┃ #{spacer}total: "
|
|
117
|
-
total += total_time
|
|
118
|
-
total += ' ┃'
|
|
119
|
-
output += "\n#{total}"
|
|
120
|
-
output += "\n#{footer}"
|
|
121
|
-
output
|
|
122
|
-
else
|
|
123
|
-
output = []
|
|
124
|
-
sorted_tags_data.reverse.each do |k, v|
|
|
125
|
-
spacer = ''
|
|
126
|
-
(max - k.length).times do
|
|
127
|
-
spacer += ' '
|
|
128
|
-
end
|
|
129
|
-
output.push("#{k}:#{spacer}#{v.time_string(format: :clock)}")
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
output = output.empty? ? '' : "\n--- Tag Totals ---\n#{output.join("\n")}"
|
|
133
|
-
output += "\n\nTotal tracked: #{total.time_string(format: :clock)}\n"
|
|
134
|
-
output
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
##
|
|
139
|
-
## Gets the interval between entry's start
|
|
140
|
-
## date and @done date
|
|
141
|
-
##
|
|
142
|
-
## @param item [Item] The entry
|
|
143
|
-
## @param formatted [Boolean] Return human readable
|
|
144
|
-
## time (default seconds)
|
|
145
|
-
## @param record [Boolean] Add the interval to the
|
|
146
|
-
## total for each tag
|
|
147
|
-
##
|
|
148
|
-
## @return Interval in seconds, or [d, h, m] array if
|
|
149
|
-
## formatted is true. False if no end date or
|
|
150
|
-
## interval is 0
|
|
151
|
-
##
|
|
152
|
-
def get_interval(item, formatted: true, record: true)
|
|
153
|
-
if item.interval
|
|
154
|
-
seconds = item.interval
|
|
155
|
-
record_tag_times(item, seconds) if record
|
|
156
|
-
return seconds.positive? ? seconds : false unless formatted
|
|
157
|
-
|
|
158
|
-
return seconds.positive? ? seconds.time_string(format: :clock) : false
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
false
|
|
162
|
-
end##
|
|
163
|
-
## Get total elapsed time for all tags in
|
|
164
|
-
## selection
|
|
165
|
-
##
|
|
166
|
-
## @param format [String] return format (html,
|
|
167
|
-
## json, or text)
|
|
168
|
-
## @param sort_by [Symbol] Sort by :name or :time
|
|
169
|
-
## @param sort_order [Symbol] The sort order (:asc or :desc)
|
|
170
|
-
##
|
|
171
|
-
def tag_times(format: :text, sort_by: :time, sort_order: :asc)
|
|
172
|
-
return '' if @timers.empty?
|
|
17
|
+
@timers.delete('meanwhile')
|
|
173
18
|
|
|
174
19
|
max = @timers.keys.sort_by(&:length).reverse[0].length + 1
|
|
175
20
|
|
data/lib/templates/doing.css
CHANGED
|
@@ -50,7 +50,7 @@ article > ul > li:hover {
|
|
|
50
50
|
.date {
|
|
51
51
|
color: #7d9ca2;
|
|
52
52
|
font-size: 17px;
|
|
53
|
-
padding:
|
|
53
|
+
padding: 3px 1ch 0 0;
|
|
54
54
|
text-align: right;
|
|
55
55
|
white-space: nowrap;
|
|
56
56
|
transition: color .2s ease-in-out;
|
|
@@ -59,7 +59,7 @@ article > ul > li:hover {
|
|
|
59
59
|
.entry {
|
|
60
60
|
border-left: solid 1px #ccc;
|
|
61
61
|
line-height: 1.2;
|
|
62
|
-
padding:
|
|
62
|
+
padding: 2px 10px 2px 3ch;
|
|
63
63
|
text-indent: -2ch;
|
|
64
64
|
}
|
|
65
65
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: doing
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.1.
|
|
4
|
+
version: 2.1.62
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brett Terpstra
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-07-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: github-markup
|
|
@@ -470,6 +470,7 @@ files:
|
|
|
470
470
|
- bin/commands/template.rb
|
|
471
471
|
- bin/commands/today.rb
|
|
472
472
|
- bin/commands/undo.rb
|
|
473
|
+
- bin/commands/update.rb
|
|
473
474
|
- bin/commands/view.rb
|
|
474
475
|
- bin/commands/views.rb
|
|
475
476
|
- bin/commands/yesterday.rb
|