cocoadex 1.4 → 1.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/bin/cdex_completion +7 -0
- data/bin/cocoadex +5 -3
- data/changelog.md +5 -0
- data/lib/cocoadex/docset_helper.rb +8 -4
- data/lib/cocoadex/extensions.rb +4 -0
- data/lib/cocoadex/keyword.rb +30 -103
- data/lib/cocoadex/model.rb +56 -0
- data/lib/cocoadex/models/callback.rb +12 -0
- data/lib/cocoadex/models/class.rb +2 -2
- data/lib/cocoadex/models/constant.rb +41 -0
- data/lib/cocoadex/models/data_type.rb +47 -0
- data/lib/cocoadex/models/element.rb +14 -1
- data/lib/cocoadex/models/entity.rb +6 -0
- data/lib/cocoadex/models/function.rb +28 -0
- data/lib/cocoadex/models/generic_ref.rb +88 -0
- data/lib/cocoadex/models/method.rb +21 -70
- data/lib/cocoadex/models/nested_node_element.rb +17 -0
- data/lib/cocoadex/models/parameter.rb +20 -0
- data/lib/cocoadex/models/property.rb +3 -18
- data/lib/cocoadex/models/result_code.rb +17 -0
- data/lib/cocoadex/models/seq_node_element.rb +53 -0
- data/lib/cocoadex/parser.rb +22 -18
- data/lib/cocoadex/serializer.rb +18 -8
- data/lib/cocoadex/tokenizer.rb +123 -0
- data/lib/cocoadex/tools/completion_helper.rb +84 -0
- data/lib/cocoadex/version.rb +1 -1
- data/lib/cocoadex.rb +12 -10
- data/lib/ext/nil.rb +3 -0
- data/lib/ext/string.rb +9 -0
- data/lib/ext/template_helpers.rb +20 -0
- data/lib/ext/xml_element.rb +10 -0
- data/readme.md +36 -8
- data/views/class.erb +35 -0
- data/views/constant.erb +10 -0
- data/views/constant_group.erb +28 -0
- data/views/data_type.erb +47 -0
- data/views/generic_ref.erb +28 -0
- data/views/method.erb +34 -0
- data/views/multiple.erb +4 -0
- data/views/property.erb +14 -0
- data/views/result_code.erb +7 -0
- metadata +50 -10
- data/bin/cocoadex_completion.sh +0 -36
- data/lib/cocoadex/templates.rb +0 -114
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
# An element of a section where each item
|
4
|
+
# is divided into its own div element
|
5
|
+
class NestedNodeElement < Element
|
6
|
+
|
7
|
+
def parse_properties node
|
8
|
+
@abstract = node.css(".abstract").first.text
|
9
|
+
@declaration = node.css(".declaration").first.text
|
10
|
+
@declared_in = node.css(".declaredIn code.HeaderFile").first.text
|
11
|
+
@discussion = node.css(".discussion > p").first.text
|
12
|
+
@return_value = node.css(".return_value p").first.text
|
13
|
+
@return_value = nil if @return_value.empty?
|
14
|
+
@availability = node.css(".availability > ul > li").first.text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
class Parameter
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
attr_reader :name, :description
|
7
|
+
|
8
|
+
def initialize name, description
|
9
|
+
@name, @description = name, description
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
"#{name} - #{description}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def <=> other
|
17
|
+
name <=> other.name if other.respond_to? :name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
module Cocoadex
|
3
3
|
# A Cocoa API class property
|
4
|
-
class Property <
|
5
|
-
|
4
|
+
class Property < NestedNodeElement
|
5
|
+
TEMPLATE_NAME=:property
|
6
6
|
|
7
7
|
attr_reader :abstract, :declaration, :discussion,
|
8
8
|
:availability, :parent
|
@@ -10,23 +10,8 @@ module Cocoadex
|
|
10
10
|
def initialize parent_class, node
|
11
11
|
@parent = parent_class
|
12
12
|
@name = node.css("h3.method_property").first.text
|
13
|
-
logger.debug("Adding property: #{@name}")
|
14
13
|
|
15
|
-
|
16
|
-
@abstract = abs.first.text
|
17
|
-
end
|
18
|
-
|
19
|
-
if decl = node.css(".declaration") and decl.length > 0
|
20
|
-
@declaration = decl.first.text
|
21
|
-
end
|
22
|
-
|
23
|
-
if disc = node.css(".discussion > p") and disc.length > 0
|
24
|
-
@discussion = disc.first.text
|
25
|
-
end
|
26
|
-
|
27
|
-
if ava_nodes = node.css(".availability > ul > li") and ava_nodes.size > 0
|
28
|
-
@availability = ava_nodes.first.text
|
29
|
-
end
|
14
|
+
parse_properties(node)
|
30
15
|
end
|
31
16
|
|
32
17
|
def origin
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
class ResultCode < Element
|
4
|
+
TEMPLATE_NAME=:result_code
|
5
|
+
|
6
|
+
attr_reader :value, :description
|
7
|
+
|
8
|
+
def initialize origin, name, value, description
|
9
|
+
@origin = origin
|
10
|
+
@name, @value, @description = name, value, description
|
11
|
+
end
|
12
|
+
|
13
|
+
def origin
|
14
|
+
@origin
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
# An element of a section where each item
|
4
|
+
# is divided by anchor tags
|
5
|
+
class SequentialNodeElement < Element
|
6
|
+
Abstract = ->(node) { node.classes.include? "abstract" }
|
7
|
+
Declaration = ->(node) { node.classes.include? "declaration" }
|
8
|
+
ReturnValue = ->(node) { node.classes.include? "return_value" }
|
9
|
+
Discussion = ->(node) { node.classes.include? "discussion" }
|
10
|
+
Availability = ->(node) { node.classes.include? "availability" }
|
11
|
+
DeclaredIn = ->(node) { node.classes.include? "declaredIn" }
|
12
|
+
Special = ->(node) { node.classes.include? "specialConsiderations" }
|
13
|
+
|
14
|
+
def initialize origin, title_node
|
15
|
+
@origin = origin
|
16
|
+
@name = title_node.text
|
17
|
+
parse(title_node)
|
18
|
+
end
|
19
|
+
|
20
|
+
def origin
|
21
|
+
@origin
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse title_node
|
25
|
+
prev_node = title_node
|
26
|
+
while node = prev_node.next and node.name != "a"
|
27
|
+
case node
|
28
|
+
when Abstract
|
29
|
+
@abstract = node.text
|
30
|
+
when Declaration
|
31
|
+
@declaration = node.text
|
32
|
+
when Availability
|
33
|
+
@availability = node.text.sub("Availability","")
|
34
|
+
when ReturnValue
|
35
|
+
@return_value = node.text.sub("Return Value","")
|
36
|
+
when Discussion
|
37
|
+
@discussion = node.text.sub("Discussion","")
|
38
|
+
when DeclaredIn
|
39
|
+
@declared_in = node.text.sub("Declared In","")
|
40
|
+
when Special
|
41
|
+
@considerations = node.text.sub("Special Considerations","")
|
42
|
+
else
|
43
|
+
handle_node(node)
|
44
|
+
end
|
45
|
+
prev_node = node
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def handle_node node
|
50
|
+
logger.debug("Unhandled #{self.class} property: #{classes} => #{node.text}")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/cocoadex/parser.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
|
2
2
|
module Cocoadex
|
3
|
+
|
4
|
+
# DocSet index and html documentation file parser
|
3
5
|
class Parser
|
6
|
+
GenericReference = ->(title) { title.include?("Reference") }
|
7
|
+
DeprecatedMethods = ->(title) { title =~ /^Deprecated ([A-Za-z]+) Methods$/ }
|
8
|
+
ClassReference = ->(title) {
|
9
|
+
title.include?("Class Reference") or title.include?("Protocol Reference") }
|
4
10
|
|
5
11
|
IGNORED_DIRS = [
|
6
12
|
'codinghowtos', 'qa',
|
@@ -21,27 +27,22 @@ module Cocoadex
|
|
21
27
|
(File.basename(path) == 'index.html' && File.exist?(File.join(File.dirname(path),'Reference')))
|
22
28
|
end
|
23
29
|
|
24
|
-
def self.class_ref? title
|
25
|
-
title.include? "Class Reference" or title.include? "Protocol Reference"
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.deprecated? title
|
29
|
-
title =~ /^Deprecated ([A-Za-z]+) Methods$/
|
30
|
-
end
|
31
|
-
|
32
30
|
def self.parse docset_path
|
33
31
|
plist = File.join(docset_path,"Contents", "Info.plist")
|
34
32
|
if File.exist? plist
|
35
33
|
docset = DocSet.new(plist)
|
36
34
|
logger.info "Parsing docset tokens in #{docset.name}. This may take a moment..."
|
37
35
|
|
38
|
-
files = Dir.glob(docset_path+"/**/*.html")
|
39
|
-
|
36
|
+
files = Dir.glob(docset_path+"/**/*.html").select {|f| not ignored?(f) }
|
37
|
+
|
38
|
+
pbar = ProgressBar.new("#{docset.platform} #{docset.version}",files.size)
|
40
39
|
files.each_with_index do |f,i|
|
41
40
|
index_html(docset,f,i)
|
41
|
+
pbar.inc
|
42
42
|
end
|
43
|
+
pbar.finish
|
43
44
|
|
44
|
-
logger.info " Tokens Indexed: #{
|
45
|
+
logger.info " Tokens Indexed: #{Tokenizer.tokens.size}"
|
45
46
|
docset
|
46
47
|
end
|
47
48
|
end
|
@@ -50,13 +51,16 @@ module Cocoadex
|
|
50
51
|
logger.debug " Parsing path: #{path}"
|
51
52
|
|
52
53
|
doc = Nokogiri::HTML(IO.read(path))
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
54
|
+
if title = doc.css("#IndexTitle").first['content']
|
55
|
+
case title
|
56
|
+
when ClassReference
|
57
|
+
Tokenizer.tokenize_class(docset.name, path, index)
|
58
|
+
when GenericReference
|
59
|
+
Tokenizer.tokenize_ref(docset.name, path, index)
|
60
|
+
when DeprecatedMethods
|
61
|
+
# TODO
|
62
|
+
else
|
63
|
+
# TODO
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
data/lib/cocoadex/serializer.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
|
2
2
|
module Cocoadex
|
3
|
+
|
4
|
+
# Move data to and from disk
|
3
5
|
class Serializer
|
4
6
|
SEPARATOR = "--__--"
|
5
7
|
|
@@ -13,6 +15,7 @@ module Cocoadex
|
|
13
15
|
array
|
14
16
|
end
|
15
17
|
|
18
|
+
# Ensure parent paths exist
|
16
19
|
def self.check_path path
|
17
20
|
unless File.exists? File.dirname(path)
|
18
21
|
FileUtils.mkdir_p File.dirname(path)
|
@@ -20,23 +23,21 @@ module Cocoadex
|
|
20
23
|
end
|
21
24
|
|
22
25
|
# Write text to a file
|
23
|
-
def self.write_text path, text
|
26
|
+
def self.write_text path, text, style=:overwrite
|
24
27
|
check_path path
|
28
|
+
|
29
|
+
mode = style_to_mode(style)
|
30
|
+
|
25
31
|
File.open(path, 'w') do |file|
|
26
32
|
file.print text
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
36
|
# Write a cache Array as a serialized file
|
31
|
-
def self.
|
37
|
+
def self.write_array path, array, style
|
32
38
|
check_path path
|
33
39
|
|
34
|
-
mode =
|
35
|
-
when :append then 'a'
|
36
|
-
when :overwrite then 'w'
|
37
|
-
else
|
38
|
-
raise "Unknown file mode: #{style}"
|
39
|
-
end
|
40
|
+
mode = style_to_mode(style)
|
40
41
|
|
41
42
|
File.open(path, mode) do |file|
|
42
43
|
array.each do |object|
|
@@ -45,5 +46,14 @@ module Cocoadex
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
49
|
+
|
50
|
+
def self.style_to_mode style
|
51
|
+
case style
|
52
|
+
when :append then 'a'
|
53
|
+
when :overwrite then 'w'
|
54
|
+
else
|
55
|
+
raise "Unknown file mode: #{style}"
|
56
|
+
end
|
57
|
+
end
|
48
58
|
end
|
49
59
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
class Tokenizer
|
4
|
+
|
5
|
+
# Cache storage location
|
6
|
+
def self.data_path
|
7
|
+
Cocoadex.config_file("data/store.blob")
|
8
|
+
end
|
9
|
+
|
10
|
+
# All indexed searchable keys
|
11
|
+
def self.tokens
|
12
|
+
@store ||= loaded? ? Serializer.read(data_path) : []
|
13
|
+
end
|
14
|
+
|
15
|
+
# Find all tokens with a term identical to a string
|
16
|
+
def self.match text
|
17
|
+
subset_match(tokens, text)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Find all tokens in a subset with a term identical
|
21
|
+
# to a string
|
22
|
+
def self.subset_match subset, text
|
23
|
+
subset.detect {|t| t.term == text }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Find all tokens with a term at least starting with
|
27
|
+
# a text string. If there is an exact match, return
|
28
|
+
# it instead of the entire list
|
29
|
+
def self.fuzzy_match text
|
30
|
+
subset = tokens.select {|t| t.term.start_with? text }
|
31
|
+
if token = subset_match(subset, text)
|
32
|
+
[token]
|
33
|
+
else
|
34
|
+
subset
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.persist
|
39
|
+
Serializer.write_array(data_path, tokens, :overwrite)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.loaded?
|
43
|
+
File.exists?(data_path)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Find all searchable keywords in a class and
|
47
|
+
# add to cache
|
48
|
+
def self.tokenize_class docset, path, id
|
49
|
+
klass = Cocoadex::Class.new(path)
|
50
|
+
properties = {
|
51
|
+
:method => klass.methods,
|
52
|
+
:property => klass.properties
|
53
|
+
}
|
54
|
+
tokenize(docset, klass, :class, id, properties)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Find all searchable keywords in a reference
|
58
|
+
# and add to cache
|
59
|
+
def self.tokenize_ref docset, path, id
|
60
|
+
ref = Cocoadex::GenericRef.new(path)
|
61
|
+
properties = {
|
62
|
+
:constant => ref.constants,
|
63
|
+
:data_type => ref.data_types,
|
64
|
+
:result_code => ref.result_codes,
|
65
|
+
:const_group => ref.const_groups,
|
66
|
+
:function => ref.functions,
|
67
|
+
:callback => ref.callbacks
|
68
|
+
}
|
69
|
+
tokenize(docset, ref, :ref, id, properties)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Create Cocoadex model objects from
|
73
|
+
# tokenized keywords references
|
74
|
+
def self.untokenize keys
|
75
|
+
keys.map do |key|
|
76
|
+
case key.type
|
77
|
+
when :class
|
78
|
+
Cocoadex::Class.new(key.url)
|
79
|
+
when :ref
|
80
|
+
Cocoadex::GenericRef.new(key.url)
|
81
|
+
when :data_type, :result_code, :function,
|
82
|
+
:const_group, :constant, :callback
|
83
|
+
|
84
|
+
if class_key = tokens.detect {|k| k.id == key.fk}
|
85
|
+
ref = Cocoadex::GenericRef.new(class_key.url)
|
86
|
+
list = case key.type
|
87
|
+
when :result_code then ref.result_codes
|
88
|
+
when :data_type then ref.data_types
|
89
|
+
when :const_group then ref.const_groups
|
90
|
+
when :constant then ref.constants
|
91
|
+
when :function then ref.functions
|
92
|
+
when :callback then ref.callbacks
|
93
|
+
end
|
94
|
+
list.detect {|m| m.name == key.term}
|
95
|
+
end
|
96
|
+
when :method, :property
|
97
|
+
if class_key = tokens.detect {|k| k.id == key.fk}
|
98
|
+
klass = Cocoadex::Class.new(class_key.url)
|
99
|
+
list = key.type == :method ? klass.methods : klass.properties
|
100
|
+
list.detect {|m| m.name == key.term}
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
# Convert all elements into keyword tokens
|
109
|
+
def self.tokenize docset, entity, type, id, properties
|
110
|
+
key = Keyword.new(entity.name, type, docset, entity.path)
|
111
|
+
key.id = id
|
112
|
+
tokens << key
|
113
|
+
|
114
|
+
properties.each do |type, list|
|
115
|
+
list.each do |item|
|
116
|
+
item_key = Keyword.new(item.name, type, docset, entity.path)
|
117
|
+
item_key.fk = id
|
118
|
+
tokens << item_key
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
module Cocoadex
|
3
|
+
class CompletionHelper
|
4
|
+
attr_reader :command
|
5
|
+
|
6
|
+
def initialize(command)
|
7
|
+
@command = command
|
8
|
+
end
|
9
|
+
|
10
|
+
def matches
|
11
|
+
scope = Keyword.get_scope(command)
|
12
|
+
|
13
|
+
CompletionHelper.tags.select do |tag|
|
14
|
+
tag[0, command.length] == command && Keyword.get_scope(tag) == scope
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def scope_matches
|
19
|
+
scope = Keyword.get_scope(command)
|
20
|
+
|
21
|
+
CompletionHelper.tags.select do |tag|
|
22
|
+
Keyword.get_scope(tag) == scope
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Tags file location
|
27
|
+
def self.tags_path
|
28
|
+
Cocoadex.config_file("tags")
|
29
|
+
end
|
30
|
+
|
31
|
+
# Tags loaded from file
|
32
|
+
def self.tags
|
33
|
+
@tags ||= begin
|
34
|
+
if File.exists?(tags_path)
|
35
|
+
IO.read(tags_path, :mode => 'rb').split("\n")
|
36
|
+
else
|
37
|
+
[]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Clear all tags in file
|
43
|
+
def self.clear_tags
|
44
|
+
Serializer.write_text(tags_path, "")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Build a tags file from existing kewords
|
48
|
+
def self.generate_tags!
|
49
|
+
logger.info "Generating tags file..."
|
50
|
+
|
51
|
+
datastore = Tokenizer.tokens.sort_by {|k| k.term }
|
52
|
+
text = datastore.map {|k| k.term }.join("\n") + "\n"
|
53
|
+
|
54
|
+
# Parse class elements and store tags for scope delimiters
|
55
|
+
datastore.select {|k| k.type == :class }.each_slice(50).to_a.each do |batch|
|
56
|
+
Tokenizer.untokenize(batch).each do |klass|
|
57
|
+
logger.debug("Tagging #{klass.name} properties")
|
58
|
+
text << tagify(
|
59
|
+
klass.name,
|
60
|
+
(klass.properties+klass.methods.to_a),
|
61
|
+
Keyword::CLASS_PROP_DELIM)
|
62
|
+
text << tagify(
|
63
|
+
klass.name,
|
64
|
+
klass.class_methods,
|
65
|
+
Keyword::CLASS_METHOD_DELIM)
|
66
|
+
text << tagify(
|
67
|
+
klass.name,
|
68
|
+
klass.instance_methods,
|
69
|
+
Keyword::INST_METHOD_DELIM)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
Serializer.write_text(tags_path, text.strip)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def self.tagify class_name, properties, delimiter
|
79
|
+
properties.map {|p|
|
80
|
+
"#{class_name}#{delimiter}#{p.name}"
|
81
|
+
}.join("\n") + "\n"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/cocoadex/version.rb
CHANGED
data/lib/cocoadex.rb
CHANGED
@@ -1,20 +1,17 @@
|
|
1
1
|
|
2
2
|
require 'erb'
|
3
3
|
require 'bri'
|
4
|
+
require 'nokogiri'
|
4
5
|
require 'cocoadex/docset_helper'
|
6
|
+
require 'cocoadex/tokenizer'
|
5
7
|
require 'cocoadex/serializer'
|
6
8
|
require 'cocoadex/version'
|
7
|
-
require 'cocoadex/
|
8
|
-
require 'cocoadex/models/docset'
|
9
|
-
require 'cocoadex/models/element'
|
10
|
-
require 'cocoadex/models/entity'
|
11
|
-
require 'cocoadex/models/method'
|
12
|
-
require 'cocoadex/models/property'
|
13
|
-
require 'cocoadex/models/class'
|
9
|
+
require 'cocoadex/model'
|
14
10
|
require 'cocoadex/parser'
|
15
11
|
require 'cocoadex/keyword'
|
16
|
-
require '
|
17
|
-
require '
|
12
|
+
require 'cocoadex/tools/completion_helper'
|
13
|
+
require 'extensions'
|
14
|
+
require 'progressbar'
|
18
15
|
require 'term/ansicolor'
|
19
16
|
|
20
17
|
module Cocoadex
|
@@ -31,7 +28,7 @@ module Cocoadex
|
|
31
28
|
elsif objects.size == 1 or load_first
|
32
29
|
puts objects.first.print
|
33
30
|
else
|
34
|
-
template =
|
31
|
+
template = IO.read(view_path('multiple'))
|
35
32
|
puts ERB.new(template, nil, '<>').result(binding)
|
36
33
|
end
|
37
34
|
end
|
@@ -46,6 +43,11 @@ module Cocoadex
|
|
46
43
|
Bri.width = width
|
47
44
|
end
|
48
45
|
|
46
|
+
# retrieve a view template by name
|
47
|
+
def self.view_path name
|
48
|
+
File.join(File.dirname(__FILE__),'..','views',"#{name}.erb")
|
49
|
+
end
|
50
|
+
|
49
51
|
# path to a file in the default configuration directory
|
50
52
|
def self.config_file subpath
|
51
53
|
File.expand_path(File.join(Cocoadex::CONFIG_DIR,subpath))
|
data/lib/ext/nil.rb
CHANGED
data/lib/ext/string.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Bri
|
2
|
+
module Templates
|
3
|
+
module Helpers
|
4
|
+
def wrap text
|
5
|
+
Bri::Renderer.wrap_row(text, Cocoadex.width)
|
6
|
+
end
|
7
|
+
|
8
|
+
def h3 text
|
9
|
+
Term::ANSIColor::blue + text + Term::ANSIColor::reset + "\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
def inline_title title, value, alignment=0
|
13
|
+
length = alignment - title.length
|
14
|
+
buffer = length > 0 ? " "*length : ""
|
15
|
+
Term::ANSIColor::bold + title + ": " + Term::ANSIColor::reset + "#{buffer}#{value}\n"
|
16
|
+
end
|
17
|
+
module_function :h3, :inline_title, :wrap
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/readme.md
CHANGED
@@ -11,6 +11,10 @@ Cocoadex parses Cocoa documentation files and creates a keyword index. Queries c
|
|
11
11
|
|
12
12
|
gem install cocoadex
|
13
13
|
|
14
|
+
## Update
|
15
|
+
|
16
|
+
gem update cocoadex && cocoadex --configure
|
17
|
+
|
14
18
|
## Configuration
|
15
19
|
|
16
20
|
Load any DocSets in known locations:
|
@@ -33,20 +37,44 @@ Load any DocSets in known locations:
|
|
33
37
|
|
34
38
|
cocoadex [query]
|
35
39
|
|
36
|
-
|
40
|
+
#### Class Reference
|
41
|
+
|
42
|
+
Valid search terms are Class, method, and property names. Search scope can also be focused using delimiters, such as `Class-method` to find instance methods, `Class+method` to find class methods, or `Class.method` to find any matching method or property in `Class`.
|
37
43
|
|
44
|
+
#### Functions, Constants, Data Types, Callbacks, Structs...
|
45
|
+
|
46
|
+
Valid search terms are function, constant, data type, callback and struct names, as well as constant groups (e.g. `cocoadex "Social Profile Keys"`).
|
38
47
|
|
39
48
|
## Enabling Tab Completion
|
40
49
|
|
41
|
-
Cocoadex generates a tags file of all indexed search terms during configuration.
|
50
|
+
Cocoadex generates a tags file of all indexed search terms during configuration.
|
51
|
+
|
52
|
+
### Bash
|
53
|
+
|
54
|
+
Enable tab completion for bash by linking/saving `tools/bash_completion.sh` and adding the following to your .bash_profile (or similar):
|
42
55
|
|
43
56
|
complete -C /path/to/cocoadex_completion.sh -o default cocoadex
|
44
57
|
|
58
|
+
### Z Shell
|
59
|
+
|
60
|
+
Add the following to your `.zshrc` to enable tab completion for zsh:
|
61
|
+
|
62
|
+
```sh
|
63
|
+
|
64
|
+
_cocoadex() {
|
65
|
+
local cocoa_prefix
|
66
|
+
read -l cocoa_prefix
|
67
|
+
reply=(`cdex_completion "$cocoa_prefix"`)
|
68
|
+
}
|
69
|
+
|
70
|
+
compctl -K _cocoadex cocoadex
|
71
|
+
```
|
72
|
+
|
45
73
|
## Example Output
|
46
74
|
|
47
75
|
### Property Lookup Example
|
48
76
|
|
49
|
-
|
77
|
+
```sh
|
50
78
|
$ cocoadex tableView
|
51
79
|
|
52
80
|
-------------------------------------------------------------- tableView
|
@@ -57,12 +85,12 @@ $ cocoadex tableView
|
|
57
85
|
Returns the table view managed by the controller object.
|
58
86
|
|
59
87
|
Available in iOS 2.0 and later.
|
60
|
-
|
88
|
+
```
|
61
89
|
|
62
90
|
|
63
91
|
### Method Lookup Example
|
64
92
|
|
65
|
-
|
93
|
+
```sh
|
66
94
|
$ cocoadex tableView:viewForFoo
|
67
95
|
|
68
96
|
-------------------------------------- tableView:viewForFooterInSection:
|
@@ -84,11 +112,11 @@ Parameters:
|
|
84
112
|
An index number identifying a section of tableView .
|
85
113
|
|
86
114
|
Available in iOS 2.0 and later.
|
87
|
-
|
115
|
+
```
|
88
116
|
|
89
117
|
### Class Lookup Example (Clipped for brevity)
|
90
118
|
|
91
|
-
|
119
|
+
```sh
|
92
120
|
$ cocoadex UILabel
|
93
121
|
|
94
122
|
--------------------------------------------------------- Class: UILabel
|
@@ -110,4 +138,4 @@ Properties:
|
|
110
138
|
numberOfLines, shadowColor, shadowOffset, text, textAlignment,
|
111
139
|
textColor, userInteractionEnabled
|
112
140
|
|
113
|
-
|
141
|
+
```
|