ntxt 1.0.4 → 1.0.5
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.
- data/README.rdoc +8 -5
- data/bin/ntxt +95 -15
- data/lib/ntxt/block.rb +15 -3
- data/lib/ntxt/parser.rb +1 -3
- metadata +25 -41
data/README.rdoc
CHANGED
@@ -7,7 +7,7 @@ to search their text in a slightly more structured way than +grep+ 'ing.
|
|
7
7
|
|
8
8
|
Any tags found in a block are extracted and the block is _tagged_ with them.
|
9
9
|
All parent blocks also receive the tags of their child blocks. Thus, the
|
10
|
-
root block is tagged with all tags
|
10
|
+
root block is tagged with all tags occurring in the document.
|
11
11
|
|
12
12
|
== Format Rules
|
13
13
|
=== Headers
|
@@ -40,13 +40,15 @@ is bundled into a subblock to the 2-space indented block of text.
|
|
40
40
|
|
41
41
|
The only ways to break out of this 2-indent text is to:
|
42
42
|
|
43
|
-
1. Put in an empty line.
|
44
|
-
|
45
|
-
|
43
|
+
1. Put in an empty line. That is, a line with no indenting. A line with only
|
44
|
+
two spaces on it will be seen as a continuation of the 2-indent block.
|
45
|
+
2. Indent more shallowly, such as a 1-space line.
|
46
|
+
3. Put in a header.
|
46
47
|
|
47
48
|
=== Tags
|
48
49
|
|
49
|
-
Lines beginning with [tag1] [tag2] are considered to
|
50
|
+
Lines beginning with [tag1] [tag2] (ignoring whitespace) are considered to
|
51
|
+
have tags
|
50
52
|
+tag1+ and +tag2+. For example:
|
51
53
|
|
52
54
|
Block1
|
@@ -61,3 +63,4 @@ And finally, <code>not a tag</code> is, well, not a tag. It does not start a lin
|
|
61
63
|
Also note that you can't tag header blocks directly because the header line
|
62
64
|
must start with = and tag lines must begin with [. Blocks inherit all their
|
63
65
|
child blocks' tags, though, so finding header blocks by tags is still possible.
|
66
|
+
|
data/bin/ntxt
CHANGED
@@ -6,12 +6,19 @@ require 'ntxt'
|
|
6
6
|
require 'yaml'
|
7
7
|
|
8
8
|
$configs = {
|
9
|
-
:cmd => '
|
9
|
+
:cmd => 'last',
|
10
|
+
:last => 1,
|
10
11
|
:tag_string => '',
|
11
|
-
|
12
|
+
|
13
|
+
# Replace with command of editor. Otherwise NTXT_EDITOR and EDITOR are used.
|
14
|
+
:editor => nil,
|
15
|
+
|
16
|
+
# Tag printing mode describes how tags are printed.
|
17
|
+
:tag_print_mode => 'path',
|
18
|
+
:filename => File.join(ENV['HOME'], "notes.txt")
|
12
19
|
}
|
13
20
|
|
14
|
-
DEFAULT_CONFIG_FILE=
|
21
|
+
DEFAULT_CONFIG_FILE=File.join(ENV['HOME'], ".ntxtrc")
|
15
22
|
|
16
23
|
# Create or load a configuration file.
|
17
24
|
if File.exists?(DEFAULT_CONFIG_FILE)
|
@@ -25,7 +32,7 @@ else
|
|
25
32
|
end
|
26
33
|
|
27
34
|
OptionParser.new do |opt|
|
28
|
-
opt.version="1.0.
|
35
|
+
opt.version="1.0.5"
|
29
36
|
|
30
37
|
opt.on('--trace', 'Trace through the file printing summaries.' ) do |v|
|
31
38
|
$configs[:cmd] = 'trace'
|
@@ -43,13 +50,23 @@ OptionParser.new do |opt|
|
|
43
50
|
$configs[:cmd] = 'print_tags'
|
44
51
|
end
|
45
52
|
|
46
|
-
opt.on('-t', '--tag=String', '
|
53
|
+
opt.on('-t', '--tag=String', 'Print blocks with tags contaning this.') do |v|
|
47
54
|
$configs[:cmd] = 'tag'
|
48
55
|
$configs[:tag_string] = v
|
49
56
|
end
|
50
57
|
|
58
|
+
opt.on('--path', 'Print the path down the tree.') do |v|
|
59
|
+
$configs[:tag_print_mode] = 'path'
|
60
|
+
end
|
61
|
+
opt.on('--parent', 'Print the whole parent block.') do |v|
|
62
|
+
$configs[:tag_print_mode] = 'parent'
|
63
|
+
end
|
64
|
+
opt.on('--leaf', 'Print only the tagged block.') do |v|
|
65
|
+
$configs[:tag_print_mode] = 'leaf'
|
66
|
+
end
|
67
|
+
|
51
68
|
opt.on('-l', '--last=[Integer]',
|
52
|
-
'Show the last n top-level blocks.
|
69
|
+
'Show the last n top-level blocks.') do |v|
|
53
70
|
$configs[:cmd] = 'last'
|
54
71
|
$configs[:last] = (v.nil?)? 1 : v.to_i
|
55
72
|
end
|
@@ -72,6 +89,71 @@ def printNonEmpty(txt)
|
|
72
89
|
end
|
73
90
|
end
|
74
91
|
|
92
|
+
module TagPrintModes
|
93
|
+
|
94
|
+
def self.each_matched_tag(block, tag_string)
|
95
|
+
block.
|
96
|
+
tags.
|
97
|
+
keys.
|
98
|
+
# Filter the tags we want.
|
99
|
+
select { |x| x.index(tag_string) }.
|
100
|
+
|
101
|
+
# Process the tags we've selected.
|
102
|
+
each { |tag| yield tag }
|
103
|
+
end
|
104
|
+
|
105
|
+
# Only print the block if the tag count == 0.
|
106
|
+
def self.leaf(ntxt, tag_string)
|
107
|
+
ntxt.walkText(
|
108
|
+
# Processing a block
|
109
|
+
lambda { |txt, depth, block| },
|
110
|
+
lambda do |depth, block|
|
111
|
+
each_matched_tag(block, tag_string) do |tag|
|
112
|
+
printNonEmpty(block.text) if block.tags[tag] == 0
|
113
|
+
end
|
114
|
+
end,
|
115
|
+
lambda { |depth, block| } )
|
116
|
+
end
|
117
|
+
|
118
|
+
# Print the entire parent block if the tag count == 0
|
119
|
+
# and the parent tag count == 1. Otherwise, print txt.
|
120
|
+
def self.parent(ntxt, tag_string)
|
121
|
+
ntxt.walkText(
|
122
|
+
# Processing a block
|
123
|
+
lambda { |txt, depth, block| },
|
124
|
+
lambda do |depth, block|
|
125
|
+
each_matched_tag(block, tag_string) do |tag|
|
126
|
+
if block.tags[tag] == 0 and
|
127
|
+
block.parent and
|
128
|
+
block.parent.tags[tag] == 1
|
129
|
+
printNonEmpty(block.parent.text)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end,
|
133
|
+
lambda { |depth, block| } )
|
134
|
+
end
|
135
|
+
|
136
|
+
# Print txt always. Effectively this presents a pruned
|
137
|
+
# text path of text that is tagged.
|
138
|
+
#
|
139
|
+
# This is essentially the Ntxt::Ntxt.walkText algorithm.
|
140
|
+
def self.path(ntxt, tag_string)
|
141
|
+
ntxt.walkText(
|
142
|
+
# Processing a block
|
143
|
+
lambda do |txt, depth, block|
|
144
|
+
each_matched_tag(block, tag_string) do |tag|
|
145
|
+
printNonEmpty(txt) if block.tags[tag] > 0
|
146
|
+
end
|
147
|
+
end,
|
148
|
+
lambda do |depth, block|
|
149
|
+
each_matched_tag(block, tag_string) do |tag|
|
150
|
+
printNonEmpty(block.text) if block.tags[tag] == 0
|
151
|
+
end
|
152
|
+
end,
|
153
|
+
lambda { |depth, block| } )
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
75
157
|
$configs[:tag_string] = ARGV.shift if ARGV.length > 0
|
76
158
|
|
77
159
|
begin
|
@@ -86,15 +168,11 @@ when 'print_tags'
|
|
86
168
|
# Notice that we are re-wrapping the tags back into square brackets.
|
87
169
|
puts "[#{ntxt.rootBlock.tags.keys.sort.join('] [')}]"
|
88
170
|
when 'tag'
|
89
|
-
|
90
|
-
lambda { |txt, depth, block|
|
91
|
-
printNonEmpty txt if block.tags.keys.sort.join(', ').index( $configs[:tag_string])},
|
92
|
-
lambda { |depth, block| },
|
93
|
-
lambda { |depth, block| } )
|
171
|
+
TagPrintModes.send($configs[:tag_print_mode], ntxt, $configs[:tag_string])
|
94
172
|
when 'search'
|
95
173
|
ntxt.walkText(
|
96
174
|
lambda { |txt, depth, block|
|
97
|
-
printNonEmpty txt if txt && txt.index(
|
175
|
+
printNonEmpty txt if txt && txt.index($configs[:search_string])},
|
98
176
|
lambda { |depth, block| },
|
99
177
|
lambda { |depth, block| } )
|
100
178
|
when 'print'
|
@@ -103,14 +181,16 @@ when 'print'
|
|
103
181
|
lambda { |depth, block| },
|
104
182
|
lambda { |depth, block| } )
|
105
183
|
when 'last'
|
106
|
-
ntxt.rootBlock.children[-$configs[:last].. -1].each do |blk|
|
184
|
+
ntxt.rootBlock.children[-$configs[:last] .. -1].each do |blk|
|
107
185
|
puts blk.text
|
108
186
|
end
|
109
187
|
when 'edit'
|
110
|
-
editor = ENV['NTXT_EDITOR'] || ENV['EDITOR']
|
188
|
+
editor = $configs[:editor] || ENV['NTXT_EDITOR'] || ENV['EDITOR']
|
111
189
|
|
112
190
|
if editor.nil?
|
113
|
-
puts "
|
191
|
+
puts "No editor defined."
|
192
|
+
puts "No editor entry in .ntxtrc."
|
193
|
+
puts "No editor entry in NTXT_EDITOR or EDITOR environment variables."
|
114
194
|
else
|
115
195
|
system("#{editor} \"#{$configs[:filename]}\"")
|
116
196
|
end
|
data/lib/ntxt/block.rb
CHANGED
@@ -60,9 +60,21 @@ module Ntxt
|
|
60
60
|
end
|
61
61
|
|
62
62
|
# Add a tag to this block and all ancestor blocks.
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
#
|
64
|
+
# A tag added to a block does not increment that block's tag count
|
65
|
+
# for the added tag. A tag added to the parent of a tagged block has
|
66
|
+
# it's tag count incremented by 1.
|
67
|
+
#
|
68
|
+
# Thus, if a tag count = 0, then this block owns the tag.
|
69
|
+
#
|
70
|
+
# If a tag count = 1. there is 1 child block with the given tag.
|
71
|
+
#
|
72
|
+
# [tag] The tag to add.
|
73
|
+
# [inc] The increment value. This should always be 0
|
74
|
+
# for client code.
|
75
|
+
def addTag(tag, inc=0)
|
76
|
+
@tags[tag] += inc
|
77
|
+
@parent.addTag(tag, 1) if @parent
|
66
78
|
end
|
67
79
|
|
68
80
|
# Return the text slice that this block refers to.
|
data/lib/ntxt/parser.rb
CHANGED
metadata
CHANGED
@@ -1,74 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntxt
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 1.0.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Sam Baskinger
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-12-09 00:00:00 Z
|
12
|
+
date: 2013-02-25 00:00:00.000000000 Z
|
19
13
|
dependencies: []
|
14
|
+
description: ! 'A library and command line tool for parsing plain text into blocks
|
15
|
+
by
|
20
16
|
|
21
|
-
description: |
|
22
|
-
A library and command line tool for parsing plain text into blocks by
|
23
17
|
indentation and a simple wiki-esque == header == notation. Tagging of blocks
|
18
|
+
|
24
19
|
and searching them is also supported.
|
25
20
|
|
21
|
+
'
|
26
22
|
email: basking2@yahoo.com
|
27
|
-
executables:
|
23
|
+
executables:
|
28
24
|
- ntxt
|
29
25
|
extensions: []
|
30
|
-
|
31
26
|
extra_rdoc_files: []
|
32
|
-
|
33
|
-
files:
|
27
|
+
files:
|
34
28
|
- README.rdoc
|
29
|
+
- lib/ntxt.rb
|
35
30
|
- lib/ntxt/block.rb
|
36
|
-
- lib/ntxt/parser.rb
|
37
31
|
- lib/ntxt/ntxt.rb
|
38
|
-
- lib/ntxt.rb
|
32
|
+
- lib/ntxt/parser.rb
|
39
33
|
- bin/ntxt
|
40
34
|
homepage: http://coffeesgone.wordpress.com
|
41
35
|
licenses: []
|
42
|
-
|
43
36
|
post_install_message:
|
44
37
|
rdoc_options: []
|
45
|
-
|
46
|
-
require_paths:
|
38
|
+
require_paths:
|
47
39
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
41
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
|
55
|
-
- 0
|
56
|
-
version: "0"
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
47
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
|
63
|
-
segments:
|
64
|
-
- 0
|
65
|
-
version: "0"
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
66
52
|
requirements: []
|
67
|
-
|
68
53
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.
|
54
|
+
rubygems_version: 1.8.25
|
70
55
|
signing_key:
|
71
56
|
specification_version: 3
|
72
57
|
summary: A parser and some tools for the ntxt text block format.
|
73
58
|
test_files: []
|
74
|
-
|