docjs 0.1.4 → 0.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/README.md +33 -63
- data/bin/docjs +30 -8
- data/bin/docjs.rb +30 -8
- data/docjs.gemspec +2 -2
- data/docs/ARCHITECTURE.md +0 -0
- data/{CONCEPT.md → docs/CONCEPT.md} +0 -0
- data/{DOCUMENTATION.md → docs/DOCUMENTATION.md} +2 -4
- data/docs/PATTERNS.md +101 -0
- data/docs/guides/CUSTOMIZE.md +158 -0
- data/docs/guides/TRY.md +63 -0
- data/docs/guides/USE.md +256 -0
- data/lib/boot.rb +2 -6
- data/lib/code_object/base.rb +5 -0
- data/lib/dom/node.rb +1 -1
- data/lib/{tasks/render_task.rb → generator/generator.rb} +15 -9
- data/lib/helper/helper.rb +2 -2
- data/lib/helper/linker.rb +7 -13
- data/lib/processor.rb +3 -12
- data/lib/renderer.rb +2 -0
- data/lib/token/container.rb +2 -1
- data/lib/token/handler.rb +187 -115
- data/lib/token/token.rb +35 -3
- data/templates/application.rb +7 -5
- data/templates/{tasks/api_index_task.rb → generators/api_index_generator.rb} +2 -2
- data/templates/{tasks/typed_task.rb → generators/api_pages_generator.rb} +2 -2
- data/templates/{tasks/docs_task.rb → generators/docs_generator.rb} +9 -2
- data/templates/{tasks/json_data_task.rb → generators/json_generator.rb} +2 -2
- data/templates/tokens/tokens.rb +2 -2
- data/{lib/code_object → templates/types}/function.rb +5 -3
- data/{lib/code_object → templates/types}/object.rb +0 -2
- data/templates/types/prototype.rb +2 -3
- data/templates/views/tokens/_default.html.erb +0 -2
- data/test/code_object/prototype.rb +1 -1
- data/test/dom/dom.absolute_nodes.rb +2 -3
- data/test/dom/dom.rb +3 -3
- data/test/dom/node.rb +9 -9
- data/test/integration/converter.rb +3 -3
- data/test/token/handler.rb +12 -9
- data/test/token/tokens.rb +1 -1
- metadata +16 -12
- data/RENDERING.md +0 -8
data/README.md
CHANGED
@@ -4,81 +4,51 @@ Bad news first: **You still have to write documentation**
|
|
4
4
|
|
5
5
|
Good news: **It will look awesome!!**
|
6
6
|
|
7
|
+
Doc.js is a JavaScript-Documentation tool which detects `tokens` in your comments and
|
8
|
+
generates documentation out of it. Doc.js could be ported pretty easy to any other
|
9
|
+
language, because the most of it's parts are language agnostic.
|
10
|
+
|
11
|
+
Guides
|
12
|
+
======
|
13
|
+
If you read this, you may belong to one of the following four groups:
|
14
|
+
|
15
|
+
1. You want to {file:TRY.md try out Doc.js} for the first time
|
16
|
+
2. You need some more {file:USE.md information, how to use Doc.js}
|
17
|
+
3. You want to {file:CUSTOMIZE.md customize Doc.js}, to exactly fit your needs
|
18
|
+
4. You are interested in the {file:ARCHITECTURE.md architectural insides} of Doc.js
|
7
19
|
|
8
20
|
Supported Ruby-Version
|
9
21
|
======================
|
10
|
-
Currently **only ruby > 1.9
|
11
|
-
|
22
|
+
Currently **only ruby > 1.9.x is supported**. Support for 1.8.x is not planned,
|
23
|
+
because there are some problems:
|
24
|
+
|
25
|
+
- UTF-8 Support in parser
|
26
|
+
- Intensive use of require_relative
|
27
|
+
- Named captures in RegularExpressions
|
28
|
+
|
29
|
+
For the last two, a rewrite could solve the compatibility issues. Sadly enough
|
30
|
+
currently i don't find the time to fix thoses and the first problem in 1.8.x so
|
31
|
+
only 1.9 is supported. If you have the time to work on 1.8 compatibility you would
|
32
|
+
make me (and possibly some other 1.8 users) very happy.
|
12
33
|
|
13
34
|
|
14
35
|
Installation
|
15
36
|
============
|
16
37
|
gem install docjs
|
17
38
|
|
18
|
-
|
19
|
-
|
20
|
-
=============
|
39
|
+
Dependencies
|
40
|
+
============
|
21
41
|
The following Gems are required to make docjs work and should automatically be
|
22
42
|
installed while installing docjs:
|
23
43
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
Basic Usage
|
29
|
-
===========
|
30
|
-
|
31
|
-
Configuration
|
32
|
-
-------------
|
33
|
-
Before you can use Doc.js you may create your own **Configuration-File**. This
|
34
|
-
can easily be done, using the built-in
|
35
|
-
configuration-generator:
|
36
|
-
|
37
|
-
docjs configure
|
38
|
-
|
39
|
-
You optionally can specify the filename of your configuration file. If no file
|
40
|
-
is specified the configs will be written to `build.yml`.
|
41
|
-
|
42
|
-
docjs configure my_config_file.yml
|
44
|
+
- thor
|
45
|
+
- rdiscount
|
43
46
|
|
44
|
-
The configuration is an interactive one - simply answer the questions you will
|
45
|
-
be asked.
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
---------------------------
|
50
|
-
To make jsdoc recognize your documentation you have to use some special tokens.
|
51
|
-
Let's write a documented function `hello_doc`:
|
52
|
-
|
53
|
-
/**
|
54
|
-
* @function hello_doc
|
55
|
-
*
|
56
|
-
* Innovative function to greet a Person.
|
57
|
-
*
|
58
|
-
* @param [String] name the person you want to greet
|
59
|
-
* @return void
|
60
|
-
*/
|
61
|
-
function hello_doc(name) {
|
62
|
-
console.log("Hello " + name + "!");
|
63
|
-
}
|
64
|
-
|
65
|
-
The symbols `@function`, `@param` and `@return` are called **tokens** in Doc.js.
|
66
|
-
There are many more by default. To see which one you can use simply type:
|
67
|
-
|
68
|
-
docjs tokens
|
69
|
-
|
70
|
-
|
71
|
-
Run the documentation and enjoy!
|
72
|
-
--------------------------------
|
73
|
-
Now it's time to kickoff the documentation-process by typing:
|
74
|
-
|
75
|
-
docjs your_config.yml
|
76
|
-
|
77
|
-
You will find the docs in the output-directory you have specified in your
|
78
|
-
config-file.
|
79
|
-
|
80
|
-
|
81
|
-
Legal Notice
|
82
|
-
============
|
48
|
+
Legal Notice & Contact
|
49
|
+
======================
|
83
50
|
docjs is released under MIT-License. See LICENSE.md for more information.
|
84
|
-
The used icons, are part of the legendary famfamfam-silk-iconset
|
51
|
+
The used icons, are part of the legendary [famfamfam-silk-iconset](http://www.famfamfam.com/lab/icons/silk/).
|
52
|
+
|
53
|
+
For further information about contacting me, please visit my personal [blog](http://b-studios.de).
|
54
|
+
Of course you are also invited to [follow me on twitter](http://twitter.com/#!/__protected).
|
data/bin/docjs
CHANGED
@@ -25,15 +25,37 @@ Configs.set :root => Pathname.new(__FILE__).realpath + '../..'
|
|
25
25
|
#
|
26
26
|
# @note options declared in a docjs.yml will override command-line ones
|
27
27
|
class DocJs < Thor
|
28
|
-
|
28
|
+
|
29
29
|
include Thor::Actions
|
30
|
+
|
31
|
+
def help(task = nil)
|
32
|
+
|
33
|
+
# Introduction
|
34
|
+
unless task
|
35
|
+
say "Welcome to Doc.js", :bold
|
36
|
+
say "If you are using Doc.js for the first time in your project, you may want to create a config file (like docjs.yml)
|
37
|
+
A guided wizard can help you achieving this goal - Simply run the following command:
|
38
|
+
docjs configure
|
39
|
+
\n
|
40
|
+
After creating a config-file (like docjs.yml) the documentation can be generated by running:
|
41
|
+
docjs docjs.yml
|
42
|
+
|
43
|
+
For further information, please visit http://b-studios.github.com/doc.js\n\n"
|
44
|
+
|
45
|
+
self.class.help(shell, false)
|
46
|
+
|
47
|
+
# Help for a specific task
|
48
|
+
else
|
49
|
+
self.class.task_help(shell, task)
|
50
|
+
end
|
51
|
+
end
|
30
52
|
|
31
53
|
desc "CONFIG_FILE", "Starts documentation process"
|
32
54
|
set_options :files =>
|
33
|
-
{ :type => :array, :aliases => '-f', :default => []
|
55
|
+
{ :type => :array, :aliases => '-f', :default => [] },
|
34
56
|
|
35
57
|
:docs =>
|
36
|
-
{ :type => :array, :aliases => '-d', :default => ['README.md']
|
58
|
+
{ :type => :array, :aliases => '-d', :default => ['README.md'] },
|
37
59
|
|
38
60
|
:output =>
|
39
61
|
{ :type => :string, :aliases => '-o', :default => 'out' },
|
@@ -209,16 +231,16 @@ class DocJs < Thor
|
|
209
231
|
|
210
232
|
|
211
233
|
|
212
|
-
desc "
|
213
|
-
def
|
234
|
+
desc "generators TEMPLATE_PATH?", "Lists all registered generators\nNeeds your TEMPLATE_PATH to include your own generators."
|
235
|
+
def generators(template_path = nil)
|
214
236
|
|
215
237
|
load_templates template_path
|
216
238
|
|
217
|
-
say "Registered
|
239
|
+
say "Registered Generators:"
|
218
240
|
|
219
|
-
|
241
|
+
gen_table = Generator::Generator.all.map{|gen| ["#{gen.name}","# #{gen.description}"] }.sort
|
220
242
|
|
221
|
-
print_table
|
243
|
+
print_table gen_table, :ident => 2, :colwidth => 40
|
222
244
|
end
|
223
245
|
end
|
224
246
|
|
data/bin/docjs.rb
CHANGED
@@ -25,15 +25,37 @@ Configs.set :root => Pathname.new(__FILE__).realpath + '../..'
|
|
25
25
|
#
|
26
26
|
# @note options declared in a docjs.yml will override command-line ones
|
27
27
|
class DocJs < Thor
|
28
|
-
|
28
|
+
|
29
29
|
include Thor::Actions
|
30
|
+
|
31
|
+
def help(task = nil)
|
32
|
+
|
33
|
+
# Introduction
|
34
|
+
unless task
|
35
|
+
say "Welcome to Doc.js", :bold
|
36
|
+
say "If you are using Doc.js for the first time in your project, you may want to create a config file (like docjs.yml)
|
37
|
+
A guided wizard can help you achieving this goal - Simply run the following command:
|
38
|
+
docjs configure
|
39
|
+
\n
|
40
|
+
After creating a config-file (like docjs.yml) the documentation can be generated by running:
|
41
|
+
docjs docjs.yml
|
42
|
+
|
43
|
+
For further information, please visit http://b-studios.github.com/doc.js\n\n"
|
44
|
+
|
45
|
+
self.class.help(shell, false)
|
46
|
+
|
47
|
+
# Help for a specific task
|
48
|
+
else
|
49
|
+
self.class.task_help(shell, task)
|
50
|
+
end
|
51
|
+
end
|
30
52
|
|
31
53
|
desc "CONFIG_FILE", "Starts documentation process"
|
32
54
|
set_options :files =>
|
33
|
-
{ :type => :array, :aliases => '-f', :default => []
|
55
|
+
{ :type => :array, :aliases => '-f', :default => [] },
|
34
56
|
|
35
57
|
:docs =>
|
36
|
-
{ :type => :array, :aliases => '-d', :default => ['README.md']
|
58
|
+
{ :type => :array, :aliases => '-d', :default => ['README.md'] },
|
37
59
|
|
38
60
|
:output =>
|
39
61
|
{ :type => :string, :aliases => '-o', :default => 'out' },
|
@@ -209,16 +231,16 @@ class DocJs < Thor
|
|
209
231
|
|
210
232
|
|
211
233
|
|
212
|
-
desc "
|
213
|
-
def
|
234
|
+
desc "generators TEMPLATE_PATH?", "Lists all registered generators\nNeeds your TEMPLATE_PATH to include your own generators."
|
235
|
+
def generators(template_path = nil)
|
214
236
|
|
215
237
|
load_templates template_path
|
216
238
|
|
217
|
-
say "Registered
|
239
|
+
say "Registered Generators:"
|
218
240
|
|
219
|
-
|
241
|
+
gen_table = Generator::Generator.all.map{|gen| ["#{gen.name}","# #{gen.description}"] }.sort
|
220
242
|
|
221
|
-
print_table
|
243
|
+
print_table gen_table, :ident => 2, :colwidth => 40
|
222
244
|
end
|
223
245
|
end
|
224
246
|
|
data/docjs.gemspec
CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
|
|
4
4
|
|
5
5
|
|
6
6
|
s.name = 'docjs'
|
7
|
-
s.version = '0.1.
|
8
|
-
s.date = '2011-06-
|
7
|
+
s.version = '0.1.5'
|
8
|
+
s.date = '2011-06-25'
|
9
9
|
s.summary = "Javascript Documentation Generator"
|
10
10
|
s.description = "Create beautyful Javascript documentations with this ruby-gem. It's pretty easy to customize and add your own tokens/DSL."
|
11
11
|
s.homepage = "https://github.com/b-studios/doc.js"
|
File without changes
|
File without changes
|
@@ -3,9 +3,8 @@ Fullqualifier
|
|
3
3
|
Like an absolute path (/etc/init.d/apache2) we use `FOO.bar` as fullqualifier to
|
4
4
|
an object or function.
|
5
5
|
|
6
|
-
A leading dot suggests filling the empty leading space with the current parsing-context
|
7
|
-
|
8
|
-
`FOO.bar.something_else` in the current context.
|
6
|
+
A leading dot suggests filling the empty leading space with the current parsing-context.
|
7
|
+
As such `.something_else` would be resolved to `FOO.bar.something_else` in the current context.
|
9
8
|
|
10
9
|
Examplecode:
|
11
10
|
|
@@ -38,4 +37,3 @@ Examplecode:
|
|
38
37
|
property_of_the: "returned object"
|
39
38
|
};
|
40
39
|
}
|
41
|
-
|
data/docs/PATTERNS.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
Documentation Patterns
|
2
|
+
======================
|
3
|
+
There are some widely used patterns in JavaScript that need a proper way of documentation.
|
4
|
+
|
5
|
+
Prototypal Inheritance
|
6
|
+
----------------------
|
7
|
+
Because most of the times (this is my personal impression) prototypal inheritence is used like in
|
8
|
+
the following example, Doc.js is specialized for that kind of prototyping.
|
9
|
+
|
10
|
+
/**
|
11
|
+
* @constructor Person
|
12
|
+
* This is the constructor for a Person. Just like you and me.
|
13
|
+
*
|
14
|
+
* @param [String] name The name of the person
|
15
|
+
* @param [Number] age
|
16
|
+
*/
|
17
|
+
function Person(name, age) {
|
18
|
+
this.name = name;
|
19
|
+
this.age = age;
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @prototype Person
|
24
|
+
*/
|
25
|
+
Person.prototype = {
|
26
|
+
|
27
|
+
/**
|
28
|
+
* @object .configs
|
29
|
+
* @prop [Boolean] friendly
|
30
|
+
*/
|
31
|
+
configs: {
|
32
|
+
friendly: true
|
33
|
+
},
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @method .sayHello
|
37
|
+
*/
|
38
|
+
sayHello: function() {
|
39
|
+
if(this.friendly)
|
40
|
+
console.log("Hello " + this.name);
|
41
|
+
|
42
|
+
else console.log("Grmppfbra!");
|
43
|
+
}
|
44
|
+
|
45
|
+
}
|
46
|
+
|
47
|
+
Of course the usage of prototypes can easiliy be modified. For example to use prototype as a
|
48
|
+
property like
|
49
|
+
|
50
|
+
/**
|
51
|
+
* @constructor Collection
|
52
|
+
* @prototype Array.prototype
|
53
|
+
*/
|
54
|
+
function() {
|
55
|
+
...
|
56
|
+
}
|
57
|
+
|
58
|
+
you have to delete the CodeObject::Prototype in `types/prototype.rb` and then register a token like
|
59
|
+
|
60
|
+
register :prototype, :area => :none
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
Revealing Module Pattern
|
65
|
+
------------------------
|
66
|
+
The Revealing Module Pattern is a way of declaring some properties of an object as **private** and
|
67
|
+
reveal only the public ones. This can be documented like the following:
|
68
|
+
|
69
|
+
/**
|
70
|
+
* @constructor Person
|
71
|
+
* @param [String] name
|
72
|
+
*/
|
73
|
+
function Person(name) {
|
74
|
+
|
75
|
+
|
76
|
+
var methods = {
|
77
|
+
|
78
|
+
/**
|
79
|
+
* @method .eatPizza
|
80
|
+
* @private
|
81
|
+
*/
|
82
|
+
eatPizza: function() {
|
83
|
+
...mhh...
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
return {
|
88
|
+
|
89
|
+
/**
|
90
|
+
* @method .sayHello
|
91
|
+
* Outputs a cheerfull greeting, containing the person's name
|
92
|
+
*/
|
93
|
+
sayHello: function() {
|
94
|
+
console.log("Hello, from " + name)
|
95
|
+
}
|
96
|
+
};
|
97
|
+
|
98
|
+
}
|
99
|
+
|
100
|
+
Ommiting the comment of the private function `eatPizza` would exclude it from the documentation. This
|
101
|
+
may be the disired way of documenting for example a API-Documentation.
|
@@ -0,0 +1,158 @@
|
|
1
|
+
Areas
|
2
|
+
=====
|
3
|
+
To visually group the tokens you can specify an area. All tokens for one area (`:sidebar` in this
|
4
|
+
example) will be collected and can be rendered in the view-templates with the
|
5
|
+
{Helper::Helper#render_tokens render_tokens} helper-method.
|
6
|
+
|
7
|
+
render_tokens :of => @code_object, :in => :sidebar
|
8
|
+
|
9
|
+
While {Token::Handler.register registering a new token} you can use any symbol for `area`. But your tokens may not appear in
|
10
|
+
the rendered html-documentation, unless you explicitly call `render_tokens` for each area.
|
11
|
+
|
12
|
+
The default-templates make use of the following areas:
|
13
|
+
|
14
|
+
- :notification
|
15
|
+
- :body
|
16
|
+
- :sidebar
|
17
|
+
- :footnote
|
18
|
+
|
19
|
+
If you don't want your token to be rendered at all, you can use `:none` as value for `area`.
|
20
|
+
|
21
|
+
register :your_token, :area => :none
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
1. Example - Adding a simple token
|
26
|
+
==================================
|
27
|
+
You can extend Doc.js on different levels. The easiest way of customization is to add a simple token.
|
28
|
+
Let's say we want to add a new innovative token `@requires` to specify dependencies to other objects.
|
29
|
+
|
30
|
+
/**
|
31
|
+
* @function say_hello
|
32
|
+
* @requires console.log
|
33
|
+
*/
|
34
|
+
|
35
|
+
If we start Doc.js without making any changes to the templates this documentation will result in an
|
36
|
+
error like **ERROR No Tokenhandler for: @requires**.
|
37
|
+
So let's register our tokenhandler to `tokens/tokens.rb`:
|
38
|
+
|
39
|
+
register :requires
|
40
|
+
|
41
|
+
|
42
|
+
Changing the area
|
43
|
+
-----------------
|
44
|
+
The token will now be processed using the {Token::Handler :text_only} tokenhandler and will appear
|
45
|
+
in the `:body` section of the template. Because `requires` may fit much better in the `:sidebar`
|
46
|
+
section (it contains meta-information about the object) we place it there with
|
47
|
+
|
48
|
+
register :requires, :area => :sidebar
|
49
|
+
|
50
|
+
Now our token should be displayed nicely in the sidebar-area on the right side (if you are using the
|
51
|
+
default template).
|
52
|
+
|
53
|
+
|
54
|
+
Using another tokenhandler
|
55
|
+
--------------------------
|
56
|
+
While using our new token, we may notice, that it would be nice if we can specify some detailed
|
57
|
+
information about the dependency like:
|
58
|
+
|
59
|
+
/**
|
60
|
+
* @function say_hello
|
61
|
+
* @requires console.log for printing the message to the console
|
62
|
+
*/
|
63
|
+
|
64
|
+
So we have to change the tokenhandler to `:named` because our tokenline now consists of a `name`
|
65
|
+
and the description-`content`.
|
66
|
+
|
67
|
+
register :requires, :area => :sidebar, :handler => :named
|
68
|
+
|
69
|
+
The template, which renders the token now can access the `name` and the `content` of the token
|
70
|
+
seperatly and displays them somehow like:
|
71
|
+
|
72
|
+
<h4>console.log</h4>
|
73
|
+
<p>for printing the message to the console</p>
|
74
|
+
|
75
|
+
|
76
|
+
Creating a custom template
|
77
|
+
--------------------------
|
78
|
+
We've come pretty far with just adding one line to our own templates. But now we want to use our own
|
79
|
+
template for this token, because the title isn't automatically linked, if the required object exists
|
80
|
+
in our documentation. Because this would be a cool features, let's implement it.
|
81
|
+
|
82
|
+
First of all we have to create our partial. Like all other templates, the token-partials are located
|
83
|
+
under `views/tokens`. So we create a file called `views/tokens/_requires.html.erb` and fill in some
|
84
|
+
content:
|
85
|
+
|
86
|
+
<section>
|
87
|
+
<h3>Dependencies</h3>
|
88
|
+
<ul>
|
89
|
+
<% tokens.each do |token| %>
|
90
|
+
<li>
|
91
|
+
<h4><%=link_to token.name %></h4>
|
92
|
+
<%=to_html token.content %>
|
93
|
+
</li>
|
94
|
+
<% end %>
|
95
|
+
</ul>
|
96
|
+
</section>
|
97
|
+
|
98
|
+
Because all tokens of one type are rendered as a collection by default, we have to iterate over our
|
99
|
+
local-variable `tokens`. We use the {Helper::Linker#link_to link_to} helper to create a link to the
|
100
|
+
referenced dependency if it exists in our documentation. Additionally we use the
|
101
|
+
{Helper::Helper#to_html to_html} helper to convert the description (which could be written using
|
102
|
+
markdown and contain links we need to generate) to html.
|
103
|
+
|
104
|
+
Last thing we have to do, is to make the renderer use our new template for `@requires` tokens
|
105
|
+
|
106
|
+
register :requires, :area => :sidebar, :handler => :named, :template => :requires
|
107
|
+
|
108
|
+
|
109
|
+
2. Example - Writing your own token-handler
|
110
|
+
===========================================
|
111
|
+
There are a {Token::Handler few handlers}, which can be used to process the tokenlines. But sometimes
|
112
|
+
one of the existing handlers isn't enough to process your token.
|
113
|
+
|
114
|
+
Let's say we need a tokenhandler to parse something like
|
115
|
+
|
116
|
+
/**
|
117
|
+
* @special [String] my_name (default) description
|
118
|
+
*/
|
119
|
+
|
120
|
+
We could get pretty close using the :typed_with_name handler. But this handler doesn't recognizes
|
121
|
+
defaults, so we need to write our own handler.
|
122
|
+
|
123
|
+
First of all we register our token in `tokens/tokens.rb`.
|
124
|
+
|
125
|
+
register :special do |tokenklass, content|
|
126
|
+
# currently the textual content is only stored as `content`
|
127
|
+
self.add_token token_klass.new(:content => stringcontent)
|
128
|
+
end
|
129
|
+
|
130
|
+
Next let's write a Regexp, that recognizes our parts. (Ok, that regular expression may not be the
|
131
|
+
most beautiful one, but it may work)
|
132
|
+
|
133
|
+
register :special do |token_klass, content|
|
134
|
+
|
135
|
+
TYPED_NAMED_WITH_DEFAULTS = /\[([^\]\n]+)\]\s*([\w_.:]+)\s(?:\(([^\)]+)\))?\s*(.*)/
|
136
|
+
|
137
|
+
types, name, default, content = TYPED_NAMED_WITH_DEFAULTS.match(content).captures
|
138
|
+
token = token_klass.new(:name => name, :types => types.split(','), :content => content)
|
139
|
+
token.define_singleton_method(:default) { default }
|
140
|
+
|
141
|
+
self.add_token token
|
142
|
+
end
|
143
|
+
|
144
|
+
Because :default isn't a default property of token, we have to add it manually by defining a
|
145
|
+
method which returns the value (`define_singleton_method`).
|
146
|
+
|
147
|
+
The last thing, we would have to do is to create a custom template and use it. See
|
148
|
+
{file:CUSTOMIZE.md#Creating_a_custom_template above} for tipps how to achieve this.
|
149
|
+
The template could make use of `token.default` to access the default value parsed by our cool
|
150
|
+
token-handler.
|
151
|
+
|
152
|
+
3. Example - Creating the custom type `class`
|
153
|
+
=============================================
|
154
|
+
If you want to create your own Domain specific language (DSL) it's often not enough to add new tokens
|
155
|
+
and manipulate the templates. Sometimes you need to create your own custom types of objects. For
|
156
|
+
example maybe you could need classes, packages or mixins. So in this example we will create a type
|
157
|
+
called `class`.
|
158
|
+
|