rdtool 0.6.37 → 0.6.39
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 +7 -0
- data/Gemfile +1 -1
- data/HISTORY +11 -0
- data/README.html +64 -10
- data/README.ja.html +68 -11
- data/README.rd +67 -4
- data/README.rd.ja +71 -5
- data/Rakefile +19 -13
- data/bin/rd2 +210 -182
- data/bin/rdswap.rb +144 -88
- data/doc/rd-draft.html +1 -1
- data/doc/rd-draft.ja.html +1 -1
- data/lib/rd/filter.rb +1 -1
- data/lib/rd/output-format-visitor.rb +2 -0
- data/lib/rd/rd2html-ext-opt.rb +1 -1
- data/lib/rd/rd2html-lib.rb +1 -1
- data/lib/rd/rd2html-opt.rb +1 -3
- data/lib/rd/rd2html5-lib.rb +118 -0
- data/lib/rd/rd2man-lib.rb +37 -12
- data/lib/rd/rd2man-opt.rb +16 -0
- data/lib/rd/rdblockparser.ry +0 -1
- data/lib/rd/rdblockparser.tab.rb +111 -110
- data/lib/rd/rdinlineparser.tab.rb +214 -212
- data/lib/rd/rdvisitor.rb +1 -2
- data/lib/rd/version.rb +6 -6
- data/rdtool.gemspec +23 -13
- data/test/test-methodlist-item.rb +0 -1
- data/test/test-rbl-file.rb +4 -7
- data/test/test-rd2-cli.rb +91 -0
- data/test/test-rd2html5-lib.rb +67 -0
- data/test/test-rd2man-lib.rb +54 -0
- data/test/test-rdswap-cli.rb +49 -0
- data/test/test-reference-resolver.rb +1 -1
- data/utils/rd-mode.el +40 -34
- metadata +66 -72
data/lib/rd/rdvisitor.rb
CHANGED
|
@@ -193,7 +193,7 @@ this module provide several functions for MehotList.
|
|
|
193
193
|
indexes = []
|
|
194
194
|
tree.each do |i|
|
|
195
195
|
if i.is_a?(MethodListItem)
|
|
196
|
-
klass, kind, method,
|
|
196
|
+
klass, kind, method, _args = analize_method(i.term.content)
|
|
197
197
|
indexes.push([klass, kind2num(kind), method, kind]) if kind
|
|
198
198
|
end
|
|
199
199
|
end
|
|
@@ -211,4 +211,3 @@ end # RD
|
|
|
211
211
|
$Id: rdvisitor.rb,v 1.46 2003/02/18 16:20:25 tosh Exp $
|
|
212
212
|
|
|
213
213
|
=end
|
|
214
|
-
|
data/lib/rd/version.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module RD
|
|
2
2
|
|
|
3
|
-
VERSION = '0.6.
|
|
3
|
+
VERSION = '0.6.39'
|
|
4
4
|
|
|
5
5
|
class Version
|
|
6
6
|
attr_reader :name
|
|
7
7
|
attr_reader :major, :minor, :patch_level
|
|
8
8
|
|
|
9
|
-
def
|
|
10
|
-
major, minor, patch_level,
|
|
11
|
-
|
|
9
|
+
def self.new_from_version_string(name, version_str)
|
|
10
|
+
major, minor, patch_level, = analyze_version_string(version_str)
|
|
11
|
+
Version.new(name, major, minor, patch_level)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def initialize(name, major, minor, patch_level)
|
|
@@ -18,7 +18,7 @@ module RD
|
|
|
18
18
|
@patch_level = patch_level
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def
|
|
21
|
+
def self.analyze_version_string(version_str)
|
|
22
22
|
version_str = clean_up_version_string(version_str)
|
|
23
23
|
version_str.split(/\./).collect{|i| i.to_i }
|
|
24
24
|
end
|
|
@@ -30,7 +30,7 @@ module RD
|
|
|
30
30
|
result
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def
|
|
33
|
+
def self.clean_up_version_string(version_str)
|
|
34
34
|
if /^\$Version:?\s*(.*)\$/ === version_str
|
|
35
35
|
$1
|
|
36
36
|
else
|
data/rdtool.gemspec
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
# -*- coding: utf-8; mode: ruby -*-
|
|
2
2
|
Gem::Specification.new do |s|
|
|
3
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
4
|
-
s.rubygems_version = "1.3.5"
|
|
5
|
-
|
|
6
3
|
s.name = 'rdtool'
|
|
7
|
-
s.version = '0.6.
|
|
8
|
-
s.date = '
|
|
4
|
+
s.version = '0.6.39'
|
|
5
|
+
s.date = '2026-03-17'
|
|
9
6
|
|
|
10
|
-
s.summary = "
|
|
11
|
-
s.description = "
|
|
7
|
+
s.summary = "Formatter and converter for RD documents."
|
|
8
|
+
s.description = "RDtool parses RD documents and converts them to formats such as HTML and roff. It also includes utilities for working with RD embedded in Ruby source files."
|
|
12
9
|
s.authors = ["Youhei SASAKI"]
|
|
13
10
|
s.email = "uwabami@gfd-dennou.org"
|
|
14
|
-
s.homepage = "
|
|
15
|
-
s.licenses = ["GPL-2
|
|
11
|
+
s.homepage = "https://github.com/uwabami/rdtool"
|
|
12
|
+
s.licenses = ["GPL-2.0-or-later", "Ruby"]
|
|
13
|
+
s.required_ruby_version = ">= 3.2"
|
|
16
14
|
s.require_paths = ["lib"]
|
|
17
|
-
s.executables =
|
|
18
|
-
s.
|
|
15
|
+
s.executables = %w[rd2 rdswap.rb]
|
|
16
|
+
s.metadata = {
|
|
17
|
+
"bug_tracker_uri" => "https://github.com/uwabami/rdtool/issues",
|
|
18
|
+
"changelog_uri" => "https://github.com/uwabami/rdtool/blob/main/HISTORY",
|
|
19
|
+
"source_code_uri" => "https://github.com/uwabami/rdtool",
|
|
20
|
+
}
|
|
19
21
|
|
|
20
|
-
s.
|
|
21
|
-
s.add_development_dependency('
|
|
22
|
+
s.add_dependency('nkf', '>= 0.1', '< 1.0')
|
|
23
|
+
s.add_development_dependency('racc', "~> 1.4")
|
|
24
|
+
s.add_development_dependency('test-unit', "~> 3.0")
|
|
25
|
+
s.add_development_dependency('rake', "~> 13.0")
|
|
22
26
|
|
|
23
27
|
# = MANIFEST =
|
|
24
28
|
s.files = %w[
|
|
@@ -64,7 +68,9 @@ Gem::Specification.new do |s|
|
|
|
64
68
|
lib/rd/rd2html-ext-opt.rb
|
|
65
69
|
lib/rd/rd2html-lib.rb
|
|
66
70
|
lib/rd/rd2html-opt.rb
|
|
71
|
+
lib/rd/rd2html5-lib.rb
|
|
67
72
|
lib/rd/rd2man-lib.rb
|
|
73
|
+
lib/rd/rd2man-opt.rb
|
|
68
74
|
lib/rd/rd2rdo-lib.rb
|
|
69
75
|
lib/rd/rd2rmi-lib.rb
|
|
70
76
|
lib/rd/rdblockparser.ry
|
|
@@ -107,7 +113,11 @@ Gem::Specification.new do |s|
|
|
|
107
113
|
test/test-parser-util.rb
|
|
108
114
|
test/test-rbl-file.rb
|
|
109
115
|
test/test-rbl-suite.rb
|
|
116
|
+
test/test-rd2-cli.rb
|
|
110
117
|
test/test-rd2html-lib.rb
|
|
118
|
+
test/test-rd2html5-lib.rb
|
|
119
|
+
test/test-rd2man-lib.rb
|
|
120
|
+
test/test-rdswap-cli.rb
|
|
111
121
|
test/test-rdtree.rb
|
|
112
122
|
test/test-rdvisitor.rb
|
|
113
123
|
test/test-reference-resolver.rb
|
|
@@ -34,7 +34,6 @@ class TestMethodListItem < Test::Unit::TestCase
|
|
|
34
34
|
def test_inspect
|
|
35
35
|
mi = MethodListItem.new
|
|
36
36
|
mt = MethodListItem::Term.new
|
|
37
|
-
se = StringElement.new "string"
|
|
38
37
|
tb = TextBlock.new
|
|
39
38
|
mi.set_term_under_document_struct(mt, DocumentStructure::RD)
|
|
40
39
|
mi.add_child_under_document_struct(tb, DocumentStructure::RD)
|
data/test/test-rbl-file.rb
CHANGED
|
@@ -16,14 +16,12 @@ class TestRBLFile < Test::Unit::TestCase
|
|
|
16
16
|
tr_head2 = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
17
17
|
de_head2 = DocumentElement.new
|
|
18
18
|
tr_head2.root = de_head2
|
|
19
|
-
hl1_head2, hl2_head2 = nil
|
|
20
|
-
|
|
21
19
|
de_head2.build do
|
|
22
|
-
|
|
20
|
+
new Headline, 1 do
|
|
23
21
|
new StringElement, "label1"
|
|
24
22
|
end
|
|
25
23
|
new TextBlock
|
|
26
|
-
|
|
24
|
+
new Headline, 2 do
|
|
27
25
|
new StringElement, "label2"
|
|
28
26
|
end
|
|
29
27
|
end
|
|
@@ -33,14 +31,13 @@ class TestRBLFile < Test::Unit::TestCase
|
|
|
33
31
|
tr_desc = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
34
32
|
de_desc = DocumentElement.new
|
|
35
33
|
tr_desc.root = de_desc
|
|
36
|
-
hl1_desc, dt1_desc = nil
|
|
37
34
|
de_desc.build do
|
|
38
|
-
|
|
35
|
+
new(Headline, 1) do
|
|
39
36
|
new StringElement, "label1"
|
|
40
37
|
end
|
|
41
38
|
new DescList do
|
|
42
39
|
new DescListItem do
|
|
43
|
-
|
|
40
|
+
make_term do
|
|
44
41
|
new StringElement, "label2"
|
|
45
42
|
end
|
|
46
43
|
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "open3"
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
require "fileutils"
|
|
6
|
+
|
|
7
|
+
class TestRD2CLI < Test::Unit::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
@root = File.expand_path("..", __dir__)
|
|
10
|
+
@rd2 = File.join(@root, "bin", "rd2")
|
|
11
|
+
@libdir = File.join(@root, "lib")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_external_sub_option_parser_registered_via_argv_options_is_shown_in_help
|
|
15
|
+
Dir.mktmpdir("rd2-cli") do |tmpdir|
|
|
16
|
+
write_fake_formatter_files(tmpdir)
|
|
17
|
+
|
|
18
|
+
_stdout, stderr, status = run_rd2(tmpdir, "-r", "fake_rd2_visitor", "--help")
|
|
19
|
+
|
|
20
|
+
assert_predicate(status, :success?, stderr)
|
|
21
|
+
assert_match(/--fake-flag/, stderr)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_external_sub_option_parser_registered_via_argv_options_is_applied
|
|
26
|
+
Dir.mktmpdir("rd2-cli") do |tmpdir|
|
|
27
|
+
write_fake_formatter_files(tmpdir)
|
|
28
|
+
input = File.join(tmpdir, "sample.rd")
|
|
29
|
+
File.write(input, "=begin\n= sample\n=end\n")
|
|
30
|
+
|
|
31
|
+
stdout, stderr, status = run_rd2(tmpdir, "-r", "fake_rd2_visitor", "--fake-flag", input)
|
|
32
|
+
|
|
33
|
+
assert_predicate(status, :success?, stderr)
|
|
34
|
+
assert_equal("flag-on\n", stdout)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_rd2man_supports_custom_man_section
|
|
39
|
+
Dir.mktmpdir("rd2-cli") do |tmpdir|
|
|
40
|
+
input = File.join(tmpdir, "sample.rd")
|
|
41
|
+
File.write(input, "=begin\n= sample\n=end\n")
|
|
42
|
+
|
|
43
|
+
stdout, stderr, status = run_rd2(nil, "-r", "rd/rd2man-lib", "--man-section=3", input)
|
|
44
|
+
|
|
45
|
+
assert_predicate(status, :success?, stderr)
|
|
46
|
+
assert_match(/^\.TH .*SAMPLE 3 "/, stdout)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def run_rd2(extra_libdir, *args)
|
|
53
|
+
ruby = RbConfig.ruby
|
|
54
|
+
rubylib = [@libdir, extra_libdir, ENV["RUBYLIB"]].compact.join(File::PATH_SEPARATOR)
|
|
55
|
+
Open3.capture3({ "RUBYLIB" => rubylib }, ruby, @rd2, *args)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def write_fake_formatter_files(tmpdir)
|
|
59
|
+
File.write(File.join(tmpdir, "fake_rd2_visitor.rb"), <<~RUBY)
|
|
60
|
+
class FakeRD2Visitor
|
|
61
|
+
OUTPUT_SUFFIX = "txt"
|
|
62
|
+
|
|
63
|
+
attr_accessor :input_filename, :filename, :charcode, :lang, :flag
|
|
64
|
+
attr_reader :include_suffix
|
|
65
|
+
|
|
66
|
+
def initialize
|
|
67
|
+
@include_suffix = []
|
|
68
|
+
@flag = false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.version
|
|
72
|
+
"FakeRD2Visitor 1.0"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def visit(_tree)
|
|
76
|
+
@flag ? "flag-on\\n" : "flag-off\\n"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
$Visitor_Class = FakeRD2Visitor
|
|
81
|
+
$RD2_Sub_OptionParser = "fake_rd2_opt"
|
|
82
|
+
RUBY
|
|
83
|
+
|
|
84
|
+
File.write(File.join(tmpdir, "fake_rd2_opt.rb"), <<~RUBY)
|
|
85
|
+
q = ARGV.options
|
|
86
|
+
q.on_tail("--fake-flag", "toggle fake flag") do
|
|
87
|
+
$Visitor.flag = true
|
|
88
|
+
end
|
|
89
|
+
RUBY
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
|
|
3
|
+
require "rd/rd2html5-lib"
|
|
4
|
+
require "rd/tree"
|
|
5
|
+
require "rd/block-element"
|
|
6
|
+
require "rd/desclist"
|
|
7
|
+
require "rd/methodlist"
|
|
8
|
+
require "rd/inline-element"
|
|
9
|
+
require "rd/rd-struct"
|
|
10
|
+
|
|
11
|
+
include RD
|
|
12
|
+
|
|
13
|
+
class TestRD2HTML5Visitor < Test::Unit::TestCase
|
|
14
|
+
def setup
|
|
15
|
+
@vis = RD2HTML5Visitor.new
|
|
16
|
+
@vis.class.module_eval do
|
|
17
|
+
public :xml_decl
|
|
18
|
+
public :doctype_decl
|
|
19
|
+
public :html_open_tag
|
|
20
|
+
public :html_content_type
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_html5_head_pieces
|
|
25
|
+
@vis.lang = "en"
|
|
26
|
+
@vis.charset = "utf-8"
|
|
27
|
+
|
|
28
|
+
assert_equal(nil, @vis.xml_decl)
|
|
29
|
+
assert_equal("<!DOCTYPE html>", @vis.doctype_decl)
|
|
30
|
+
assert_equal('<html lang="en">', @vis.html_open_tag)
|
|
31
|
+
assert_equal('<meta charset="utf-8">', @vis.html_content_type)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_apply_to_headline_uses_id_without_anchor_tag
|
|
35
|
+
tr = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
36
|
+
tr.root = DocumentElement.new
|
|
37
|
+
headline = nil
|
|
38
|
+
tr.root.build do
|
|
39
|
+
headline = new Headline, 1 do
|
|
40
|
+
new StringElement, "headline"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
@vis.prepare_labels(tr, "label:")
|
|
44
|
+
|
|
45
|
+
assert_equal('<h1 id="label:0">headline</h1><!-- RDLabel: "headline" -->',
|
|
46
|
+
@vis.apply_to_Headline(headline, ["headline"]))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_apply_to_desclist_item_uses_id_on_dt
|
|
50
|
+
tr = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
51
|
+
tr.root = DocumentElement.new
|
|
52
|
+
item = nil
|
|
53
|
+
tr.root.build do
|
|
54
|
+
new DescList do
|
|
55
|
+
item = new DescListItem do
|
|
56
|
+
make_term do
|
|
57
|
+
new StringElement, "term"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
@vis.prepare_labels(tr, "label:")
|
|
63
|
+
|
|
64
|
+
assert_equal('<dt id="label:0">term</dt><!-- RDLabel: "term" -->',
|
|
65
|
+
@vis.apply_to_DescListItem(item, ["term"], []))
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "rd/rd2man-lib"
|
|
3
|
+
require "rd/tree"
|
|
4
|
+
require "rd/block-element"
|
|
5
|
+
require "rd/rd-struct"
|
|
6
|
+
|
|
7
|
+
include RD
|
|
8
|
+
|
|
9
|
+
class TestRD2MANLib < Test::Unit::TestCase
|
|
10
|
+
def test_default_man_section_is_1
|
|
11
|
+
visitor = RD2MANVisitor.new
|
|
12
|
+
|
|
13
|
+
assert_equal("1", visitor.output_suffix)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_man_section_changes_output_suffix_and_th_header
|
|
17
|
+
visitor = RD2MANVisitor.new
|
|
18
|
+
visitor.man_section = "3"
|
|
19
|
+
visitor.input_filename = "rdtool.rd"
|
|
20
|
+
|
|
21
|
+
tree = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
22
|
+
tree.root = DocumentElement.new
|
|
23
|
+
|
|
24
|
+
output = visitor.visit(tree)
|
|
25
|
+
|
|
26
|
+
assert_equal("3", visitor.output_suffix)
|
|
27
|
+
assert_match(/^\.TH RDTOOL 3 "/, output)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_th_header_uses_basename_instead_of_full_path
|
|
31
|
+
visitor = RD2MANVisitor.new
|
|
32
|
+
visitor.input_filename = "/tmp/path/to/rd2.rd"
|
|
33
|
+
|
|
34
|
+
tree = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
35
|
+
tree.root = DocumentElement.new
|
|
36
|
+
|
|
37
|
+
output = visitor.visit(tree)
|
|
38
|
+
|
|
39
|
+
assert_match(/^\.TH RD2 1 "/, output)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_th_header_uses_output_basename_for_stdin_input
|
|
43
|
+
visitor = RD2MANVisitor.new
|
|
44
|
+
visitor.input_filename = "-"
|
|
45
|
+
visitor.filename = "/tmp/output/rd2"
|
|
46
|
+
|
|
47
|
+
tree = Tree.new_with_document_struct(DocumentStructure::RD)
|
|
48
|
+
tree.root = DocumentElement.new
|
|
49
|
+
|
|
50
|
+
output = visitor.visit(tree)
|
|
51
|
+
|
|
52
|
+
assert_match(/^\.TH RD2 1 "/, output)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "open3"
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
require "fileutils"
|
|
6
|
+
|
|
7
|
+
class TestRDSwapCLI < Test::Unit::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
@root = File.expand_path("..", __dir__)
|
|
10
|
+
@rdswap = File.join(@root, "bin", "rdswap.rb")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_help_exits_successfully_without_warnings
|
|
14
|
+
_stdout, stderr, status = Open3.capture3(RbConfig.ruby, @rdswap, "-h")
|
|
15
|
+
|
|
16
|
+
assert_predicate(status, :success?, stderr)
|
|
17
|
+
assert_no_match(/warning:/i, stderr)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_generates_translated_script
|
|
21
|
+
Dir.mktmpdir("rdswap") do |tmpdir|
|
|
22
|
+
source = File.join(tmpdir, "sample.rb")
|
|
23
|
+
translation = File.join(tmpdir, "sample.ja")
|
|
24
|
+
|
|
25
|
+
File.write(source, <<~RUBY)
|
|
26
|
+
puts "hello"
|
|
27
|
+
=begin
|
|
28
|
+
original
|
|
29
|
+
=end
|
|
30
|
+
puts "bye"
|
|
31
|
+
RUBY
|
|
32
|
+
|
|
33
|
+
File.write(translation, <<~TEXT)
|
|
34
|
+
=begin
|
|
35
|
+
translated
|
|
36
|
+
=end
|
|
37
|
+
TEXT
|
|
38
|
+
|
|
39
|
+
_stdout, stderr, status = Open3.capture3(RbConfig.ruby, @rdswap, source, translation)
|
|
40
|
+
|
|
41
|
+
assert_predicate(status, :success?, stderr)
|
|
42
|
+
output = File.read("#{source}.ja")
|
|
43
|
+
assert_match(/puts "hello"/, output)
|
|
44
|
+
assert_match(/translated/, output)
|
|
45
|
+
assert_match(/puts "bye"/, output)
|
|
46
|
+
assert_no_match(/original/, output)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
data/utils/rd-mode.el
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
;;; rd-mode.el --- Major mode for RD editing
|
|
1
2
|
;;;
|
|
2
|
-
;;; rd-mode.el
|
|
3
|
-
;;; Major mode for RD editing
|
|
4
|
-
;;;
|
|
5
3
|
;;; NOTE: experimental.
|
|
4
|
+
;;; $Lastupdate: 2018-08-19 23:51:49$
|
|
6
5
|
|
|
7
|
-
;; Copyright (C) 1999 Koji Arai, Toshiro Kuwabara
|
|
6
|
+
;; Copyright (C) 1999-2018 Koji Arai, Toshiro Kuwabara, Youhei SASAKI
|
|
8
7
|
|
|
9
|
-
;; Author: Koji Arai, Toshiro Kuwabara
|
|
8
|
+
;; Author: Koji Arai, Toshiro Kuwabara, Youhei SASAKI
|
|
10
9
|
;; Created: Sat Nov 27 00:08:12 1999
|
|
10
|
+
;; Version: 0.6.38
|
|
11
|
+
;; Keywords: rd
|
|
12
|
+
;; URL: https://github.com/uwabami/rdtool/blob/master/utils/rd-mode.el
|
|
11
13
|
|
|
12
14
|
;; This file is not part of GNU Emacs, but the same permissions apply.
|
|
13
15
|
|
|
@@ -23,8 +25,8 @@
|
|
|
23
25
|
|
|
24
26
|
;; You should have received a copy of the GNU General Public License
|
|
25
27
|
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
26
|
-
;; Free Software Foundation, Inc.,
|
|
27
|
-
;; Boston, MA
|
|
28
|
+
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor
|
|
29
|
+
;; Boston, MA 02110-1301, USA.
|
|
28
30
|
|
|
29
31
|
;; Settings:
|
|
30
32
|
;;
|
|
@@ -45,6 +47,28 @@
|
|
|
45
47
|
(defvar rd-mode-hook nil
|
|
46
48
|
"Hooks run when entering `rd-mode' major mode")
|
|
47
49
|
|
|
50
|
+
(defvar rd-mode-map
|
|
51
|
+
(let ((m (make-sparse-keymap)))
|
|
52
|
+
(define-key m (kbd "TAB") 'rd-indent-line)
|
|
53
|
+
(define-key m (kbd "C-j") 'rd-newline-and-indent)
|
|
54
|
+
(define-key m (kbd "C-c C-v") 'rd-cite-region)
|
|
55
|
+
(define-key m (kbd "C-c C-i e") 'rd-insert-emphasis)
|
|
56
|
+
(define-key m (kbd "C-c C-i c") 'rd-insert-code)
|
|
57
|
+
(define-key m (kbd "C-c C-i v") 'rd-insert-var)
|
|
58
|
+
(define-key m (kbd "C-c C-i k") 'rd-insert-keyboard)
|
|
59
|
+
(define-key m (kbd "C-c C-i i") 'rd-insert-index)
|
|
60
|
+
(define-key m (kbd "C-c C-i r") 'rd-insert-ref)
|
|
61
|
+
(define-key m (kbd "C-c C-i u") 'rd-insert-reftourl)
|
|
62
|
+
(define-key m (kbd "C-c C-i f") 'rd-insert-footnote)
|
|
63
|
+
(define-key m (kbd "C-c C-i b") 'rd-insert-verb)
|
|
64
|
+
(define-key m (kbd "C-c C-y") 'rd-yank-as-url)
|
|
65
|
+
(define-key m (kbd "C-c M-y") 'rd-yank-pop-as-url)
|
|
66
|
+
(define-key m (kbd "C-c C-u") 'rd-insert-url)
|
|
67
|
+
(define-key m (kbd "M-C-m") 'rd-intelligent-newline)
|
|
68
|
+
m)
|
|
69
|
+
"Keymap used in rd-mode.")
|
|
70
|
+
|
|
71
|
+
;;;###autoload
|
|
48
72
|
(define-derived-mode rd-mode text-mode "RD"
|
|
49
73
|
"Major mode for RD editing.
|
|
50
74
|
\\{rd-mode-map}"
|
|
@@ -52,7 +76,7 @@
|
|
|
52
76
|
(setq paragraph-separate "=+\\|\\++\\|[ \t\n\^L]*$")
|
|
53
77
|
(make-local-variable 'paragraph-start)
|
|
54
78
|
(setq paragraph-start "=+\\|\\++\\|[ \t\n\^L]")
|
|
55
|
-
(make-local-variable 'require-final-newline)
|
|
79
|
+
(make-local-variable 'require-final-newline)
|
|
56
80
|
(setq require-final-newline t)
|
|
57
81
|
(make-local-variable 'font-lock-defaults)
|
|
58
82
|
(setq font-lock-defaults '((rd-font-lock-keywords) t nil))
|
|
@@ -64,7 +88,6 @@
|
|
|
64
88
|
(add-hook (make-local-variable 'write-contents-hooks) 'rd-strip-cr-on-top)
|
|
65
89
|
(add-hook (make-local-variable 'after-save-hook) 'rd-rehide-endline)
|
|
66
90
|
(rd-hide-other-block-all)
|
|
67
|
-
(rd-setup-keys)
|
|
68
91
|
(setq indent-tabs-mode nil)
|
|
69
92
|
(setq imenu-create-index-function 'rd-imenu-create-index)
|
|
70
93
|
(run-hooks 'rd-mode-hook)
|
|
@@ -114,25 +137,6 @@
|
|
|
114
137
|
0 rd-description-face)
|
|
115
138
|
))
|
|
116
139
|
|
|
117
|
-
(defun rd-setup-keys ()
|
|
118
|
-
(interactive)
|
|
119
|
-
(define-key rd-mode-map "\t" 'rd-indent-line)
|
|
120
|
-
(define-key rd-mode-map "\C-j" 'rd-newline-and-indent)
|
|
121
|
-
(define-key rd-mode-map "\C-c\C-v" 'rd-cite-region)
|
|
122
|
-
(define-key rd-mode-map "\C-c\C-ie" 'rd-insert-emphasis)
|
|
123
|
-
(define-key rd-mode-map "\C-c\C-ic" 'rd-insert-code)
|
|
124
|
-
(define-key rd-mode-map "\C-c\C-iv" 'rd-insert-var)
|
|
125
|
-
(define-key rd-mode-map "\C-c\C-ik" 'rd-insert-keyboard)
|
|
126
|
-
(define-key rd-mode-map "\C-c\C-ii" 'rd-insert-index)
|
|
127
|
-
(define-key rd-mode-map "\C-c\C-ir" 'rd-insert-ref)
|
|
128
|
-
(define-key rd-mode-map "\C-c\C-iu" 'rd-insert-reftourl)
|
|
129
|
-
(define-key rd-mode-map "\C-c\C-if" 'rd-insert-footnote)
|
|
130
|
-
(define-key rd-mode-map "\C-c\C-ib" 'rd-insert-verb)
|
|
131
|
-
(define-key rd-mode-map "\C-c\C-y" 'rd-yank-as-url)
|
|
132
|
-
(define-key rd-mode-map "\C-c\M-y" 'rd-yank-pop-as-url)
|
|
133
|
-
(define-key rd-mode-map "\C-c\C-u" 'rd-insert-url)
|
|
134
|
-
(define-key rd-mode-map "\M-\C-m" 'rd-intelligent-newline))
|
|
135
|
-
|
|
136
140
|
(defun rd-strip-cr-on-top ()
|
|
137
141
|
(save-excursion
|
|
138
142
|
(widen)
|
|
@@ -188,7 +192,7 @@
|
|
|
188
192
|
(set-buffer-modified-p mod))
|
|
189
193
|
(setq selective-display t
|
|
190
194
|
selective-display-ellipses rd-selective-display-ellipses))
|
|
191
|
-
|
|
195
|
+
|
|
192
196
|
(defun rd-show-other-block ()
|
|
193
197
|
"Shows lines not in RD format before current point."
|
|
194
198
|
(interactive)
|
|
@@ -338,7 +342,7 @@
|
|
|
338
342
|
(beginning-of-line)
|
|
339
343
|
(looking-at "--- +\\| *\\(\\* +\\|([0-9]+) +\\)?")
|
|
340
344
|
(length (buffer-substring (match-beginning 0)(match-end 0)))))
|
|
341
|
-
|
|
345
|
+
|
|
342
346
|
(defun rd-cite-region (beg end)
|
|
343
347
|
"Make region into Verbatim."
|
|
344
348
|
(interactive "r*")
|
|
@@ -359,7 +363,7 @@
|
|
|
359
363
|
(rd-indent-region beg end prev-indent))
|
|
360
364
|
(t
|
|
361
365
|
(goto-char end)))))))
|
|
362
|
-
|
|
366
|
+
|
|
363
367
|
(defun rd-indent-region (beg end &optional indent)
|
|
364
368
|
"Make the indent of region deeper by INDENT."
|
|
365
369
|
(interactive "r*")
|
|
@@ -417,7 +421,7 @@
|
|
|
417
421
|
)
|
|
418
422
|
(end-of-line)
|
|
419
423
|
(newline)
|
|
420
|
-
(if item (insert
|
|
424
|
+
(if item (insert item) )
|
|
421
425
|
)
|
|
422
426
|
)
|
|
423
427
|
|
|
@@ -425,7 +429,7 @@
|
|
|
425
429
|
(let ((root '(nil . nil))
|
|
426
430
|
cur-alist
|
|
427
431
|
(cur-level 0)
|
|
428
|
-
(pattern "^\\(
|
|
432
|
+
(pattern "^\\(=+\\|---\\)[ \t\v\f]*\\(.*?\\)[ \t\v\f]*$")
|
|
429
433
|
(empty-heading "-")
|
|
430
434
|
(self-heading ".")
|
|
431
435
|
pos level heading alist)
|
|
@@ -461,6 +465,8 @@
|
|
|
461
465
|
cur-level level))))))
|
|
462
466
|
(cdr root)))
|
|
463
467
|
|
|
468
|
+
;;;###autoload
|
|
469
|
+
(add-to-list 'auto-mode-alist '("\\.rd\\'" . rd-mode))
|
|
470
|
+
|
|
464
471
|
(provide 'rd-mode)
|
|
465
472
|
;;; rd-mode.el ends here
|
|
466
|
-
|