amp 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/.hgignore +3 -0
- data/AUTHORS +1 -1
- data/Manifest.txt +99 -38
- data/README.md +3 -3
- data/Rakefile +53 -18
- data/SCHEDULE.markdown +5 -1
- data/TODO.markdown +120 -149
- data/ampfile.rb +3 -1
- data/bin/amp +4 -1
- data/ext/amp/bz2/extconf.rb +1 -1
- data/ext/amp/mercurial_patch/extconf.rb +1 -1
- data/ext/amp/mercurial_patch/mpatch.c +4 -3
- data/ext/amp/priority_queue/extconf.rb +1 -1
- data/ext/amp/support/extconf.rb +1 -1
- data/ext/amp/support/support.c +1 -1
- data/lib/amp.rb +125 -67
- data/lib/amp/commands/command.rb +12 -10
- data/lib/amp/commands/command_support.rb +8 -1
- data/lib/amp/commands/commands/help.rb +2 -20
- data/lib/amp/commands/commands/init.rb +14 -2
- data/lib/amp/commands/commands/templates.rb +6 -4
- data/lib/amp/commands/commands/version.rb +15 -1
- data/lib/amp/commands/commands/workflow.rb +3 -3
- data/lib/amp/commands/commands/workflows/git/add.rb +3 -3
- data/lib/amp/commands/commands/workflows/git/copy.rb +1 -1
- data/lib/amp/commands/commands/workflows/git/rm.rb +4 -2
- data/lib/amp/commands/commands/workflows/hg/add.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/addremove.rb +2 -2
- data/lib/amp/commands/commands/workflows/hg/annotate.rb +8 -2
- data/lib/amp/commands/commands/workflows/hg/bisect.rb +253 -0
- data/lib/amp/commands/commands/workflows/hg/branch.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/branches.rb +3 -3
- data/lib/amp/commands/commands/workflows/hg/bundle.rb +3 -3
- data/lib/amp/commands/commands/workflows/hg/clone.rb +4 -5
- data/lib/amp/commands/commands/workflows/hg/commit.rb +37 -1
- data/lib/amp/commands/commands/workflows/hg/copy.rb +2 -1
- data/lib/amp/commands/commands/workflows/hg/debug/index.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/diff.rb +3 -8
- data/lib/amp/commands/commands/workflows/hg/forget.rb +5 -4
- data/lib/amp/commands/commands/workflows/hg/identify.rb +6 -6
- data/lib/amp/commands/commands/workflows/hg/import.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/incoming.rb +2 -2
- data/lib/amp/commands/commands/workflows/hg/log.rb +5 -4
- data/lib/amp/commands/commands/workflows/hg/merge.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/move.rb +5 -3
- data/lib/amp/commands/commands/workflows/hg/outgoing.rb +1 -1
- data/lib/amp/commands/commands/workflows/hg/push.rb +6 -7
- data/lib/amp/commands/commands/workflows/hg/remove.rb +2 -2
- data/lib/amp/commands/commands/workflows/hg/resolve.rb +6 -23
- data/lib/amp/commands/commands/workflows/hg/root.rb +1 -2
- data/lib/amp/commands/commands/workflows/hg/status.rb +21 -12
- data/lib/amp/commands/commands/workflows/hg/tag.rb +2 -2
- data/lib/amp/commands/commands/workflows/hg/untrack.rb +12 -0
- data/lib/amp/commands/commands/workflows/hg/verify.rb +13 -3
- data/lib/amp/commands/commands/workflows/hg/what_changed.rb +18 -0
- data/lib/amp/commands/dispatch.rb +12 -13
- data/lib/amp/dependencies/amp_support.rb +1 -1
- data/lib/amp/dependencies/amp_support/ruby_amp_support.rb +1 -0
- data/lib/amp/dependencies/maruku.rb +136 -0
- data/lib/amp/dependencies/maruku/attributes.rb +227 -0
- data/lib/amp/dependencies/maruku/defaults.rb +71 -0
- data/lib/amp/dependencies/maruku/errors_management.rb +92 -0
- data/lib/amp/dependencies/maruku/helpers.rb +260 -0
- data/lib/amp/dependencies/maruku/input/charsource.rb +326 -0
- data/lib/amp/dependencies/maruku/input/extensions.rb +69 -0
- data/lib/amp/dependencies/maruku/input/html_helper.rb +189 -0
- data/lib/amp/dependencies/maruku/input/linesource.rb +111 -0
- data/lib/amp/dependencies/maruku/input/parse_block.rb +615 -0
- data/lib/amp/dependencies/maruku/input/parse_doc.rb +234 -0
- data/lib/amp/dependencies/maruku/input/parse_span_better.rb +746 -0
- data/lib/amp/dependencies/maruku/input/rubypants.rb +225 -0
- data/lib/amp/dependencies/maruku/input/type_detection.rb +147 -0
- data/lib/amp/dependencies/maruku/input_textile2/t2_parser.rb +163 -0
- data/lib/amp/dependencies/maruku/maruku.rb +33 -0
- data/lib/amp/dependencies/maruku/output/to_ansi.rb +223 -0
- data/lib/amp/dependencies/maruku/output/to_html.rb +991 -0
- data/lib/amp/dependencies/maruku/output/to_markdown.rb +164 -0
- data/lib/amp/dependencies/maruku/output/to_s.rb +56 -0
- data/lib/amp/dependencies/maruku/string_utils.rb +191 -0
- data/lib/amp/dependencies/maruku/structures.rb +167 -0
- data/lib/amp/dependencies/maruku/structures_inspect.rb +87 -0
- data/lib/amp/dependencies/maruku/structures_iterators.rb +61 -0
- data/lib/amp/dependencies/maruku/textile2.rb +1 -0
- data/lib/amp/dependencies/maruku/toc.rb +199 -0
- data/lib/amp/dependencies/maruku/usage/example1.rb +33 -0
- data/lib/amp/dependencies/maruku/version.rb +40 -0
- data/lib/amp/dependencies/priority_queue.rb +2 -1
- data/lib/amp/dependencies/python_config.rb +2 -1
- data/lib/amp/graphs/ancestor.rb +2 -1
- data/lib/amp/graphs/copies.rb +236 -233
- data/lib/amp/help/entries/__default__.erb +31 -0
- data/lib/amp/help/entries/commands.erb +6 -0
- data/lib/amp/help/entries/mdtest.md +35 -0
- data/lib/amp/help/entries/silly +3 -0
- data/lib/amp/help/help.rb +288 -0
- data/lib/amp/profiling_hacks.rb +5 -3
- data/lib/amp/repository/abstract/abstract_changeset.rb +97 -0
- data/lib/amp/repository/abstract/abstract_local_repo.rb +181 -0
- data/lib/amp/repository/abstract/abstract_staging_area.rb +180 -0
- data/lib/amp/repository/abstract/abstract_versioned_file.rb +100 -0
- data/lib/amp/repository/abstract/common_methods/changeset.rb +75 -0
- data/lib/amp/repository/abstract/common_methods/local_repo.rb +277 -0
- data/lib/amp/repository/abstract/common_methods/staging_area.rb +233 -0
- data/lib/amp/repository/abstract/common_methods/versioned_file.rb +71 -0
- data/lib/amp/repository/generic_repo_picker.rb +78 -0
- data/lib/amp/repository/git/repo_format/changeset.rb +336 -0
- data/lib/amp/repository/git/repo_format/staging_area.rb +192 -0
- data/lib/amp/repository/git/repo_format/versioned_file.rb +119 -0
- data/lib/amp/repository/git/repositories/local_repository.rb +164 -0
- data/lib/amp/repository/git/repository.rb +41 -0
- data/lib/amp/repository/mercurial/encoding/mercurial_diff.rb +382 -0
- data/lib/amp/repository/mercurial/encoding/mercurial_patch.rb +1 -0
- data/lib/amp/repository/mercurial/encoding/patch.rb +294 -0
- data/lib/amp/repository/mercurial/encoding/pure_ruby/ruby_mercurial_patch.rb +124 -0
- data/lib/amp/repository/mercurial/merging/merge_ui.rb +327 -0
- data/lib/amp/repository/mercurial/merging/simple_merge.rb +452 -0
- data/lib/amp/repository/mercurial/repo_format/branch_manager.rb +266 -0
- data/lib/amp/repository/mercurial/repo_format/changeset.rb +768 -0
- data/lib/amp/repository/mercurial/repo_format/dir_state.rb +716 -0
- data/lib/amp/repository/mercurial/repo_format/journal.rb +218 -0
- data/lib/amp/repository/mercurial/repo_format/lock.rb +210 -0
- data/lib/amp/repository/mercurial/repo_format/merge_state.rb +228 -0
- data/lib/amp/repository/mercurial/repo_format/staging_area.rb +367 -0
- data/lib/amp/repository/mercurial/repo_format/store.rb +487 -0
- data/lib/amp/repository/mercurial/repo_format/tag_manager.rb +322 -0
- data/lib/amp/repository/mercurial/repo_format/updatable.rb +543 -0
- data/lib/amp/repository/mercurial/repo_format/updater.rb +848 -0
- data/lib/amp/repository/mercurial/repo_format/verification.rb +433 -0
- data/lib/amp/repository/mercurial/repositories/bundle_repository.rb +216 -0
- data/lib/amp/repository/mercurial/repositories/http_repository.rb +386 -0
- data/lib/amp/repository/mercurial/repositories/local_repository.rb +2034 -0
- data/lib/amp/repository/mercurial/repository.rb +119 -0
- data/lib/amp/repository/mercurial/revlogs/bundle_revlogs.rb +249 -0
- data/lib/amp/repository/mercurial/revlogs/changegroup.rb +217 -0
- data/lib/amp/repository/mercurial/revlogs/changelog.rb +339 -0
- data/lib/amp/repository/mercurial/revlogs/file_log.rb +152 -0
- data/lib/amp/repository/mercurial/revlogs/index.rb +500 -0
- data/lib/amp/repository/mercurial/revlogs/manifest.rb +201 -0
- data/lib/amp/repository/mercurial/revlogs/node.rb +20 -0
- data/lib/amp/repository/mercurial/revlogs/revlog.rb +1026 -0
- data/lib/amp/repository/mercurial/revlogs/revlog_support.rb +129 -0
- data/lib/amp/repository/mercurial/revlogs/versioned_file.rb +597 -0
- data/lib/amp/repository/repository.rb +11 -88
- data/lib/amp/server/extension/amp_extension.rb +3 -3
- data/lib/amp/server/fancy_http_server.rb +1 -1
- data/lib/amp/server/fancy_views/_browser.haml +1 -1
- data/lib/amp/server/fancy_views/_diff_file.haml +1 -8
- data/lib/amp/server/fancy_views/changeset.haml +2 -2
- data/lib/amp/server/fancy_views/file.haml +1 -1
- data/lib/amp/server/fancy_views/file_diff.haml +1 -1
- data/lib/amp/support/amp_ui.rb +13 -29
- data/lib/amp/support/generator.rb +1 -1
- data/lib/amp/support/loaders.rb +1 -2
- data/lib/amp/support/logger.rb +10 -16
- data/lib/amp/support/match.rb +18 -4
- data/lib/amp/support/mercurial/ignore.rb +151 -0
- data/lib/amp/support/openers.rb +8 -3
- data/lib/amp/support/support.rb +91 -46
- data/lib/amp/templates/{blank.commit.erb → mercurial/blank.commit.erb} +0 -0
- data/lib/amp/templates/{blank.log.erb → mercurial/blank.log.erb} +0 -0
- data/lib/amp/templates/{default.commit.erb → mercurial/default.commit.erb} +0 -0
- data/lib/amp/templates/{default.log.erb → mercurial/default.log.erb} +0 -0
- data/lib/amp/templates/template.rb +18 -18
- data/man/amp.1 +51 -0
- data/site/src/about/commands.haml +1 -1
- data/site/src/css/amp.css +1 -1
- data/site/src/index.haml +3 -3
- data/tasks/man.rake +39 -0
- data/tasks/stats.rake +1 -10
- data/tasks/yard.rake +1 -50
- data/test/dirstate_tests/test_dir_state.rb +10 -8
- data/test/functional_tests/annotate.out +31 -0
- data/test/functional_tests/test_functional.rb +155 -63
- data/test/localrepo_tests/ampfile.rb +12 -0
- data/test/localrepo_tests/test_local_repo.rb +56 -57
- data/test/manifest_tests/test_manifest.rb +3 -5
- data/test/merge_tests/test_merge.rb +3 -3
- data/test/revlog_tests/test_revlog.rb +14 -6
- data/test/store_tests/test_fncache_store.rb +19 -19
- data/test/test_19_compatibility.rb +46 -0
- data/test/test_base85.rb +2 -2
- data/test/test_bdiff.rb +2 -2
- data/test/test_changegroup.rb +59 -0
- data/test/test_commands.rb +2 -2
- data/test/test_difflib.rb +2 -2
- data/test/test_generator.rb +34 -0
- data/test/test_ignore.rb +203 -0
- data/test/test_journal.rb +18 -13
- data/test/test_match.rb +2 -2
- data/test/test_mdiff.rb +3 -3
- data/test/test_mpatch.rb +3 -3
- data/test/test_multi_io.rb +40 -0
- data/test/test_support.rb +18 -2
- data/test/test_templates.rb +38 -0
- data/test/test_ui.rb +79 -0
- data/test/testutilities.rb +56 -0
- metadata +168 -49
- data/ext/amp/bz2/mkmf.log +0 -38
- data/lib/amp/encoding/mercurial_diff.rb +0 -378
- data/lib/amp/encoding/mercurial_patch.rb +0 -1
- data/lib/amp/encoding/patch.rb +0 -292
- data/lib/amp/encoding/pure_ruby/ruby_mercurial_patch.rb +0 -123
- data/lib/amp/merges/merge_state.rb +0 -164
- data/lib/amp/merges/merge_ui.rb +0 -322
- data/lib/amp/merges/simple_merge.rb +0 -450
- data/lib/amp/repository/branch_manager.rb +0 -234
- data/lib/amp/repository/dir_state.rb +0 -950
- data/lib/amp/repository/journal.rb +0 -203
- data/lib/amp/repository/lock.rb +0 -207
- data/lib/amp/repository/repositories/bundle_repository.rb +0 -214
- data/lib/amp/repository/repositories/http_repository.rb +0 -377
- data/lib/amp/repository/repositories/local_repository.rb +0 -2661
- data/lib/amp/repository/store.rb +0 -485
- data/lib/amp/repository/tag_manager.rb +0 -319
- data/lib/amp/repository/updatable.rb +0 -532
- data/lib/amp/repository/verification.rb +0 -431
- data/lib/amp/repository/versioned_file.rb +0 -475
- data/lib/amp/revlogs/bundle_revlogs.rb +0 -246
- data/lib/amp/revlogs/changegroup.rb +0 -217
- data/lib/amp/revlogs/changelog.rb +0 -338
- data/lib/amp/revlogs/changeset.rb +0 -521
- data/lib/amp/revlogs/file_log.rb +0 -165
- data/lib/amp/revlogs/index.rb +0 -493
- data/lib/amp/revlogs/manifest.rb +0 -195
- data/lib/amp/revlogs/node.rb +0 -18
- data/lib/amp/revlogs/revlog.rb +0 -1045
- data/lib/amp/revlogs/revlog_support.rb +0 -126
- data/lib/amp/support/ignore.rb +0 -144
- data/site/Rakefile +0 -38
- data/test/test_amp.rb +0 -9
- data/test/test_helper.rb +0 -15
@@ -42,7 +42,7 @@ command :tag do |c|
|
|
42
42
|
raise abort("tag #{name} is not a #{expected_type} tag")
|
43
43
|
end
|
44
44
|
end
|
45
|
-
rev = Amp::RevlogSupport::Node::NULL_ID
|
45
|
+
rev = Amp::Mercurial::RevlogSupport::Node::NULL_ID
|
46
46
|
message ||= "Removed tag #{names.join(", ")}"
|
47
47
|
elsif !opts[:force]
|
48
48
|
names.each do |name|
|
@@ -53,7 +53,7 @@ command :tag do |c|
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
if !rev && repo.dirstate.parents[1] != Amp::RevlogSupport::Node::NULL_ID
|
56
|
+
if !rev && repo.dirstate.parents[1] != Amp::Mercurial::RevlogSupport::Node::NULL_ID
|
57
57
|
raise abort("uncommited merge - please provide" +
|
58
58
|
" a specific revision")
|
59
59
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
command :untrack do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
c.desc "Stop tracking the file"
|
4
|
+
|
5
|
+
c.on_run do |opts, args|
|
6
|
+
opts[:"no-unlink"] = true
|
7
|
+
opts[:quiet] = true
|
8
|
+
|
9
|
+
puts "Forgetting #{args.size} file#{args.size == 1 ? '' : 's'}"
|
10
|
+
Amp::Command['remove'].run opts, args
|
11
|
+
end
|
12
|
+
end
|
@@ -1,9 +1,19 @@
|
|
1
1
|
command :verify do |c|
|
2
|
-
c.desc "Verifies the mercurial repository, checking for integrity errors"
|
3
2
|
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Verifies the mercurial repository, checking for integrity errors"
|
4
5
|
c.on_run do |opts, args|
|
5
6
|
results = opts[:repository].verify
|
6
|
-
|
7
|
-
|
7
|
+
|
8
|
+
Amp::UI.tell "#{results.files} file#{results.files == 1 ? '' : 's' }, "
|
9
|
+
Amp::UI.tell "#{results.changesets} changeset#{results.changesets == 1 ? '' : 's' }, "
|
10
|
+
Amp::UI.tell "#{results.revisions} revision#{results.revisions == 1 ? '' : 's' }"
|
11
|
+
|
12
|
+
if results.errors > 0 || results.warnings > 0
|
13
|
+
Amp::UI.tell ", #{results.errors} integrity error#{results.errors == 1 ? '' : 's' }, "
|
14
|
+
Amp::UI.tell "#{results.warnings} warning#{results.warnings == 1 ? '' : 's' }."
|
15
|
+
end
|
16
|
+
|
17
|
+
Amp::UI.say
|
8
18
|
end
|
9
19
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
command :"what-changed" do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Which commits have touched this file?"
|
5
|
+
c.opt :limit, "Limit how many revisions to show", :short => "-l", :type => :integer, :default => -1
|
6
|
+
c.opt :template, "Which template to use while printing", :short => "-t", :type => :string, :default => "default"
|
7
|
+
|
8
|
+
c.on_run do |opts, args|
|
9
|
+
repo = opts[:repository]
|
10
|
+
file = repo.versioned_file args.shift
|
11
|
+
revs = file.map {|vf| vf.link_rev }
|
12
|
+
revs = revs[-opts[:limit]..-1] unless opts[:limit] <= 0
|
13
|
+
|
14
|
+
revs.reverse.each do |rev|
|
15
|
+
Amp::UI.say repo[rev].to_templated_s(opts)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -21,7 +21,7 @@ module Amp
|
|
21
21
|
global_opts = Trollop::options do
|
22
22
|
banner "Amp - some more crystal, sir?"
|
23
23
|
version "Amp version #{Amp::VERSION} (#{Amp::VERSION_TITLE})"
|
24
|
-
opt :
|
24
|
+
opt :"debug-opts", "Debug the command-line options", :short => "-d"
|
25
25
|
opt :verbose, "Verbose output"
|
26
26
|
opt :profile, "Profile the command being run, running it the given number of times"
|
27
27
|
opt :repository, "The path to the repository to use", :short => "-R", :type => :string, :default => Dir.pwd
|
@@ -41,14 +41,12 @@ module Amp
|
|
41
41
|
$USE_RUBY = true
|
42
42
|
end
|
43
43
|
|
44
|
-
global_config
|
44
|
+
global_config = Amp::AmpConfig.new
|
45
45
|
Amp::UI.config = global_config
|
46
|
-
cmd
|
47
|
-
|
46
|
+
cmd = ARGV.shift || "default" # get the subcommand
|
47
|
+
opts_as_arr = ARGV.dup
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
if global_opts[:debug_opts]
|
49
|
+
if global_opts[:"debug-opts"]
|
52
50
|
global_config["debug", "messages"] = true
|
53
51
|
end
|
54
52
|
|
@@ -94,7 +92,7 @@ module Amp
|
|
94
92
|
|
95
93
|
unless command
|
96
94
|
puts "Invalid command! #{cmd}"
|
97
|
-
|
95
|
+
return false
|
98
96
|
end
|
99
97
|
|
100
98
|
# get the sub-command's options
|
@@ -102,7 +100,7 @@ module Amp
|
|
102
100
|
cmd_opts.merge!(command.collect_options) {|k, v1, v2| v2 || v1 }
|
103
101
|
|
104
102
|
cmd_opts[:global_config] = local_config
|
105
|
-
if global_opts[:
|
103
|
+
if global_opts[:"debug-opts"]
|
106
104
|
require 'yaml'
|
107
105
|
puts "Current directory: #{Dir.pwd}"
|
108
106
|
puts "Global options: \n#{global_opts.inspect.to_yaml}"
|
@@ -115,14 +113,16 @@ module Amp
|
|
115
113
|
puts
|
116
114
|
end
|
117
115
|
|
116
|
+
result = false
|
118
117
|
# Run that fucker!!!
|
119
118
|
begin
|
120
|
-
full_backtrace_please do
|
121
|
-
command.run cmd_opts, ARGV
|
122
|
-
end
|
119
|
+
#full_backtrace_please do
|
120
|
+
result = command.run cmd_opts, ARGV
|
121
|
+
#end
|
123
122
|
rescue AbortError => e
|
124
123
|
puts e.to_s
|
125
124
|
end
|
125
|
+
result
|
126
126
|
end
|
127
127
|
|
128
128
|
##
|
@@ -164,7 +164,6 @@ module Amp
|
|
164
164
|
|
165
165
|
if prefix_list.size > 1
|
166
166
|
puts "Ambiguous command: #{cmd}. Could mean: #{prefix_list.join(", ")}"
|
167
|
-
exit(-1)
|
168
167
|
end
|
169
168
|
nil
|
170
169
|
end
|
@@ -1 +1 @@
|
|
1
|
-
amp_c_extension '
|
1
|
+
amp_c_extension 'amp/support/CSupport', 'amp_support/ruby_amp_support'
|
@@ -0,0 +1,136 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
3
|
+
#
|
4
|
+
# This file is part of Maruku.
|
5
|
+
#
|
6
|
+
# Maruku is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Maruku is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Maruku; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
#++
|
20
|
+
|
21
|
+
require 'rexml/document'
|
22
|
+
|
23
|
+
dir_path = File.expand_path(File.dirname(__FILE__))
|
24
|
+
$:.unshift dir_path
|
25
|
+
|
26
|
+
# :include:MaRuKu.txt
|
27
|
+
module MaRuKu
|
28
|
+
|
29
|
+
module In
|
30
|
+
module Markdown
|
31
|
+
module SpanLevelParser; end
|
32
|
+
module BlockLevelParser; end
|
33
|
+
end
|
34
|
+
# more to come?
|
35
|
+
end
|
36
|
+
|
37
|
+
module Out
|
38
|
+
# Functions for exporting to MarkDown.
|
39
|
+
module Markdown; end
|
40
|
+
# Functions for exporting to HTML.
|
41
|
+
module HTML; end
|
42
|
+
# Functions for exporting to ANSI
|
43
|
+
module Ansi; end
|
44
|
+
end
|
45
|
+
|
46
|
+
# These are strings utilities.
|
47
|
+
module Strings; end
|
48
|
+
|
49
|
+
module Helpers; end
|
50
|
+
|
51
|
+
module Errors; end
|
52
|
+
|
53
|
+
class MDElement
|
54
|
+
include REXML
|
55
|
+
include MaRuKu
|
56
|
+
include Out::Markdown
|
57
|
+
include Out::HTML
|
58
|
+
include Out::Ansi
|
59
|
+
include Strings
|
60
|
+
include Helpers
|
61
|
+
include Errors
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
class MDDocument < MDElement
|
66
|
+
include In::Markdown
|
67
|
+
include In::Markdown::SpanLevelParser
|
68
|
+
include In::Markdown::BlockLevelParser
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# This is the public interface
|
73
|
+
class Maruku < MaRuKu::MDDocument; end
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
require 'rexml/document'
|
78
|
+
|
79
|
+
# Structures definition
|
80
|
+
require 'maruku/structures'
|
81
|
+
require 'maruku/structures_inspect'
|
82
|
+
|
83
|
+
require 'maruku/defaults'
|
84
|
+
# Less typing
|
85
|
+
require 'maruku/helpers'
|
86
|
+
|
87
|
+
# Code for parsing whole Markdown documents
|
88
|
+
require 'maruku/input/parse_doc'
|
89
|
+
|
90
|
+
# Ugly things kept in a closet
|
91
|
+
require 'maruku/string_utils'
|
92
|
+
require 'maruku/input/linesource'
|
93
|
+
require 'maruku/input/type_detection'
|
94
|
+
|
95
|
+
# A class for reading and sanitizing inline HTML
|
96
|
+
require 'maruku/input/html_helper'
|
97
|
+
|
98
|
+
# Code for parsing Markdown block-level elements
|
99
|
+
require 'maruku/input/parse_block'
|
100
|
+
|
101
|
+
# Code for parsing Markdown span-level elements
|
102
|
+
require 'maruku/input/charsource'
|
103
|
+
require 'maruku/input/parse_span_better'
|
104
|
+
require 'maruku/input/rubypants'
|
105
|
+
|
106
|
+
require 'maruku/input/extensions'
|
107
|
+
|
108
|
+
require 'maruku/attributes'
|
109
|
+
|
110
|
+
require 'maruku/structures_iterators'
|
111
|
+
|
112
|
+
require 'maruku/errors_management'
|
113
|
+
|
114
|
+
# Code for creating a table of contents
|
115
|
+
require 'maruku/toc'
|
116
|
+
|
117
|
+
# Version and URL
|
118
|
+
require 'maruku/version'
|
119
|
+
|
120
|
+
|
121
|
+
# Exporting to html
|
122
|
+
require 'maruku/output/to_html'
|
123
|
+
|
124
|
+
# Exporting to ansi terminal output
|
125
|
+
require 'maruku/output/to_ansi'
|
126
|
+
|
127
|
+
# Pretty print
|
128
|
+
require 'maruku/output/to_markdown'
|
129
|
+
|
130
|
+
# Exporting to text: strips all formatting (not complete)
|
131
|
+
require 'maruku/output/to_s'
|
132
|
+
|
133
|
+
# class Maruku is the global interface
|
134
|
+
require 'maruku/maruku'
|
135
|
+
|
136
|
+
$:.delete dir_path
|
@@ -0,0 +1,227 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
3
|
+
#
|
4
|
+
# This file is part of Maruku.
|
5
|
+
#
|
6
|
+
# Maruku is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Maruku is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Maruku; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
#++
|
20
|
+
|
21
|
+
|
22
|
+
class String
|
23
|
+
def quote_if_needed
|
24
|
+
if /[\s\'\"]/.match self
|
25
|
+
inspect
|
26
|
+
else
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module MaRuKu;
|
33
|
+
MagicChar = ':'
|
34
|
+
|
35
|
+
class AttributeList < Array
|
36
|
+
|
37
|
+
# An attribute list becomes
|
38
|
+
# {#id .cl key="val" ref}
|
39
|
+
# [ [:id, 'id'], [:class, 'id'], ['key', 'val'], [ :ref, 'ref' ]]
|
40
|
+
|
41
|
+
private :push
|
42
|
+
|
43
|
+
def push_key_val(key, val);
|
44
|
+
raise "Bad #{key.inspect}=#{val.inspect}" if not key and val
|
45
|
+
push [key, val]
|
46
|
+
end
|
47
|
+
def push_ref(ref_id);
|
48
|
+
|
49
|
+
raise "Bad :ref #{ref_id.inspect}" if not ref_id
|
50
|
+
push [:ref, ref_id+""]
|
51
|
+
|
52
|
+
# p "Now ", self ########################################
|
53
|
+
end
|
54
|
+
def push_class(val);
|
55
|
+
raise "Bad :id #{val.inspect}" if not val
|
56
|
+
push [:class, val]
|
57
|
+
end
|
58
|
+
def push_id(val);
|
59
|
+
raise "Bad :id #{val.inspect}" if not val
|
60
|
+
push [:id, val]
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
map do |k,v|
|
65
|
+
case k
|
66
|
+
when :id; "#" + v.quote_if_needed
|
67
|
+
when :class; "." + v.quote_if_needed
|
68
|
+
when :ref; v.quote_if_needed
|
69
|
+
else k.quote_if_needed + "=" + v.quote_if_needed
|
70
|
+
end
|
71
|
+
end . join(' ')
|
72
|
+
end
|
73
|
+
alias to_md to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
module MaRuKu; module In; module Markdown; module SpanLevelParser
|
79
|
+
|
80
|
+
def unit_tests_for_attribute_lists
|
81
|
+
[
|
82
|
+
[ "", [], "Empty lists are allowed" ],
|
83
|
+
[ "=", :throw, "Bad char to begin a list with." ],
|
84
|
+
[ "a =b", :throw, "No whitespace before `=`." ],
|
85
|
+
[ "a= b", :throw, "No whitespace after `=`." ],
|
86
|
+
|
87
|
+
[ "a b", [[:ref, 'a'],[:ref, 'b']], "More than one ref" ],
|
88
|
+
[ "a b c", [[:ref, 'a'],[:ref, 'b'],[:ref, 'c']], "More than one ref" ],
|
89
|
+
[ "hello notfound", [[:ref, 'hello'],[:ref, 'notfound']]],
|
90
|
+
|
91
|
+
[ "'a'", [[:ref, 'a']], "Quoted value." ],
|
92
|
+
[ '"a"' ],
|
93
|
+
|
94
|
+
[ "a=b", [['a','b']], "Simple key/val" ],
|
95
|
+
[ "'a'=b" ],
|
96
|
+
[ "'a'='b'" ],
|
97
|
+
[ "a='b'" ],
|
98
|
+
|
99
|
+
[ 'a="b\'"', [['a',"b\'"]], "Key/val with quotes" ],
|
100
|
+
[ 'a=b\''],
|
101
|
+
[ 'a="\\\'b\'"', [['a',"\'b\'"]], "Key/val with quotes" ],
|
102
|
+
|
103
|
+
['"', :throw, "Unclosed quotes"],
|
104
|
+
["'"],
|
105
|
+
["'a "],
|
106
|
+
['"a '],
|
107
|
+
|
108
|
+
[ "#a", [[:id, 'a']], "Simple ID" ],
|
109
|
+
[ "#'a'" ],
|
110
|
+
[ '#"a"' ],
|
111
|
+
|
112
|
+
[ "#", :throw, "Unfinished '#'." ],
|
113
|
+
[ ".", :throw, "Unfinished '.'." ],
|
114
|
+
[ "# a", :throw, "No white-space after '#'." ],
|
115
|
+
[ ". a", :throw, "No white-space after '.' ." ],
|
116
|
+
|
117
|
+
[ "a=b c=d", [['a','b'],['c','d']], "Tabbing" ],
|
118
|
+
[ " \ta=b \tc='d' "],
|
119
|
+
[ "\t a=b\t c='d'\t\t"],
|
120
|
+
|
121
|
+
[ ".\"a'", :throw, "Mixing quotes is bad." ],
|
122
|
+
|
123
|
+
].map { |s, expected, comment|
|
124
|
+
@expected = (expected ||= @expected)
|
125
|
+
@comment = (comment ||= (last=@comment) )
|
126
|
+
(comment == last && (comment += (@count+=1).to_s)) || @count = 1
|
127
|
+
expected = [md_ial(expected)] if expected.kind_of? Array
|
128
|
+
["{#{MagicChar}#{s}}", expected, "Attributes: #{comment}"]
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def md_al(s=[]); AttributeList.new(s) end
|
133
|
+
|
134
|
+
# returns nil or an AttributeList
|
135
|
+
def read_attribute_list(src, con, break_on_chars)
|
136
|
+
|
137
|
+
separators = break_on_chars + [?=,?\ ,?\t]
|
138
|
+
escaped = Maruku::EscapedCharInQuotes
|
139
|
+
|
140
|
+
al = AttributeList.new
|
141
|
+
while true
|
142
|
+
src.consume_whitespace
|
143
|
+
break if break_on_chars.include? src.cur_char
|
144
|
+
|
145
|
+
case src.cur_char
|
146
|
+
when nil
|
147
|
+
maruku_error "Attribute list terminated by EOF:\n "+
|
148
|
+
"#{al.inspect}" , src, con
|
149
|
+
tell_user "I try to continue and return partial attribute list:\n"+
|
150
|
+
al.inspect
|
151
|
+
break
|
152
|
+
when ?= # error
|
153
|
+
maruku_error "In attribute lists, cannot start identifier with `=`."
|
154
|
+
tell_user "I try to continue"
|
155
|
+
src.ignore_char
|
156
|
+
when ?# # id definition
|
157
|
+
src.ignore_char
|
158
|
+
if id = read_quoted_or_unquoted(src, con, escaped, separators)
|
159
|
+
al.push_id id
|
160
|
+
else
|
161
|
+
maruku_error 'Could not read `id` attribute.', src, con
|
162
|
+
tell_user 'Trying to ignore bad `id` attribute.'
|
163
|
+
end
|
164
|
+
when ?. # class definition
|
165
|
+
src.ignore_char
|
166
|
+
if klass = read_quoted_or_unquoted(src, con, escaped, separators)
|
167
|
+
al.push_class klass
|
168
|
+
else
|
169
|
+
maruku_error 'Could not read `class` attribute.', src, con
|
170
|
+
tell_user 'Trying to ignore bad `class` attribute.'
|
171
|
+
end
|
172
|
+
else
|
173
|
+
if key = read_quoted_or_unquoted(src, con, escaped, separators)
|
174
|
+
if src.cur_char == ?=
|
175
|
+
src.ignore_char # skip the =
|
176
|
+
if val = read_quoted_or_unquoted(src, con, escaped, separators)
|
177
|
+
al.push_key_val(key, val)
|
178
|
+
else
|
179
|
+
maruku_error "Could not read value for key #{key.inspect}.",
|
180
|
+
src, con
|
181
|
+
tell_user "Ignoring key #{key.inspect}."
|
182
|
+
end
|
183
|
+
else
|
184
|
+
al.push_ref key
|
185
|
+
end
|
186
|
+
else
|
187
|
+
maruku_error 'Could not read key or reference.'
|
188
|
+
end
|
189
|
+
end # case
|
190
|
+
end # while true
|
191
|
+
al
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
# We need a helper
|
196
|
+
def is_ial(e); e.kind_of? MDElement and e.node_type == :ial end
|
197
|
+
|
198
|
+
def merge_ial(elements, src, con)
|
199
|
+
|
200
|
+
# Apply each IAL to the element before
|
201
|
+
elements.each_with_index do |e, i|
|
202
|
+
if is_ial(e) && i>= 1 then
|
203
|
+
before = elements[i-1]
|
204
|
+
after = elements[i+1]
|
205
|
+
if before.kind_of? MDElement
|
206
|
+
before.al = e.ial
|
207
|
+
elsif after.kind_of? MDElement
|
208
|
+
after.al = e.ial
|
209
|
+
else
|
210
|
+
maruku_error "It is not clear to me what element this IAL {:#{e.ial.to_md}} \n"+
|
211
|
+
"is referring to. The element before is a #{before.class.to_s}, \n"+
|
212
|
+
"the element after is a #{after.class.to_s}.\n"+
|
213
|
+
"\n before: #{before.inspect}"+
|
214
|
+
"\n after: #{after.inspect}",
|
215
|
+
src, con
|
216
|
+
# xxx dire se c'è empty vicino
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
if not Globals[:debug_keep_ials]
|
222
|
+
elements.delete_if {|x| is_ial(x) unless x == elements.first}
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
end end end end
|
227
|
+
#module MaRuKu; module In; module Markdown; module SpanLevelParser
|