summaryrefslogtreecommitdiff
path: root/src/modules/gendoc.rb
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/gendoc.rb')
-rw-r--r--src/modules/gendoc.rb174
1 files changed, 0 insertions, 174 deletions
diff --git a/src/modules/gendoc.rb b/src/modules/gendoc.rb
deleted file mode 100644
index f83b1ad9d..000000000
--- a/src/modules/gendoc.rb
+++ /dev/null
@@ -1,174 +0,0 @@
-# coding: utf-8
-# gendoc.rb -- Converts the top-comments inside module.c to modules API
-# reference documentation in markdown format.
-
-# Convert the C comment to markdown
-def markdown(s)
- s = s.gsub(/\*\/$/,"")
- s = s.gsub(/^ ?\* ?/,"")
- s = s.gsub(/^\/\*\*? ?/,"")
- s.chop! while s[-1] == "\n" || s[-1] == " "
- lines = s.split("\n")
- newlines = []
- # Fix some markdown, except in code blocks indented by 4 spaces.
- lines.each{|l|
- if not l.start_with?(' ')
- # Rewrite RM_Xyz() to `RedisModule_Xyz()`. The () suffix is
- # optional. Even RM_Xyz*() with * as wildcard is handled.
- l = l.gsub(/(?<!`)RM_([A-z]+(?:\*?\(\))?)/, '`RedisModule_\1`')
- # Add backquotes around RedisModule functions and type where missing.
- l = l.gsub(/(?<!`)RedisModule[A-z]+(?:\*?\(\))?/){|x| "`#{x}`"}
- # Add backquotes around c functions like malloc() where missing.
- l = l.gsub(/(?<![`A-z])[a-z_]+\(\)/, '`\0`')
- # Add backquotes around macro and var names containing underscores.
- l = l.gsub(/(?<![`A-z\*])[A-Za-z]+_[A-Za-z0-9_]+/){|x| "`#{x}`"}
- # Link URLs preceded by space or newline (not already linked)
- l = l.gsub(/(^| )(https?:\/\/[A-Za-z0-9_\/\.\-]+[A-Za-z0-9\/])/,
- '\1[\2](\2)')
- # Replace double-dash with unicode ndash
- l = l.gsub(/ -- /, ' – ')
- end
- # Link function names to their definition within the page
- l = l.gsub(/`(RedisModule_[A-z0-9]+)[()]*`/) {|x|
- $index[$1] ? "[#{x}](\##{$1})" : x
- }
- newlines << l
- }
- return newlines.join("\n")
-end
-
-# Linebreak a prototype longer than 80 characters on the commas, but only
-# between balanced parentheses so that we don't linebreak args which are
-# function pointers, and then aligning each arg under each other.
-def linebreak_proto(proto, indent)
- if proto.bytesize <= 80
- return proto
- end
- parts = proto.split(/,\s*/);
- if parts.length == 1
- return proto;
- end
- align_pos = proto.index("(") + 1;
- align = " " * align_pos
- result = parts.shift;
- bracket_balance = 0;
- parts.each{|part|
- if bracket_balance == 0
- result += ",\n" + indent + align
- else
- result += ", "
- end
- result += part
- bracket_balance += part.count("(") - part.count(")")
- }
- return result;
-end
-
-# Given the source code array and the index at which an exported symbol was
-# detected, extracts and outputs the documentation.
-def docufy(src,i)
- m = /RM_[A-z0-9]+/.match(src[i])
- name = m[0]
- name = name.sub("RM_","RedisModule_")
- proto = src[i].sub("{","").strip+";\n"
- proto = proto.sub("RM_","RedisModule_")
- proto = linebreak_proto(proto, " ");
- # Add a link target with the function name. (We don't trust the exact id of
- # the generated one, which depends on the Markdown implementation.)
- puts "<span id=\"#{name}\"></span>\n\n"
- puts "### `#{name}`\n\n"
- puts " #{proto}\n"
- comment = ""
- while true
- i = i-1
- comment = src[i]+comment
- break if src[i] =~ /\/\*/
- end
- comment = markdown(comment)
- puts comment+"\n\n"
-end
-
-# Print a comment from line until */ is found, as markdown.
-def section_doc(src, i)
- name = get_section_heading(src, i)
- comment = "<span id=\"#{section_name_to_id(name)}\"></span>\n\n"
- while true
- # append line, except if it's a horizontal divider
- comment = comment + src[i] if src[i] !~ /^[\/ ]?\*{1,2} ?-{50,}/
- break if src[i] =~ /\*\//
- i = i+1
- end
- comment = markdown(comment)
- puts comment+"\n\n"
-end
-
-# generates an id suitable for links within the page
-def section_name_to_id(name)
- return "section-" +
- name.strip.downcase.gsub(/[^a-z0-9]+/, '-').gsub(/^-+|-+$/, '')
-end
-
-# Returns the name of the first section heading in the comment block for which
-# is_section_doc(src, i) is true
-def get_section_heading(src, i)
- if src[i] =~ /^\/\*\*? \#+ *(.*)/
- heading = $1
- elsif src[i+1] =~ /^ ?\* \#+ *(.*)/
- heading = $1
- end
- return heading.gsub(' -- ', ' – ')
-end
-
-# Returns true if the line is the start of a generic documentation section. Such
-# section must start with the # symbol, i.e. a markdown heading, on the first or
-# the second line.
-def is_section_doc(src, i)
- return src[i] =~ /^\/\*\*? \#/ ||
- (src[i] =~ /^\/\*/ && src[i+1] =~ /^ ?\* \#/)
-end
-
-def is_func_line(src, i)
- line = src[i]
- return line =~ /RM_/ &&
- line[0] != ' ' && line[0] != '#' && line[0] != '/' &&
- src[i-1] =~ /\*\//
-end
-
-puts "# Modules API reference\n\n"
-puts "<!-- This file is generated from module.c using gendoc.rb -->\n\n"
-src = File.open(File.dirname(__FILE__) ++ "/../module.c").to_a
-
-# Build function index
-$index = {}
-src.each_with_index do |line,i|
- if is_func_line(src, i)
- line =~ /RM_([A-z0-9]+)/
- name = "RedisModule_#{$1}"
- $index[name] = true
- end
-end
-
-# Print TOC
-puts "## Sections\n\n"
-src.each_with_index do |_line,i|
- if is_section_doc(src, i)
- name = get_section_heading(src, i)
- puts "* [#{name}](\##{section_name_to_id(name)})\n"
- end
-end
-puts "* [Function index](#section-function-index)\n\n"
-
-# Docufy: Print function prototype and markdown docs
-src.each_with_index do |_line,i|
- if is_func_line(src, i)
- docufy(src, i)
- elsif is_section_doc(src, i)
- section_doc(src, i)
- end
-end
-
-# Print function index
-puts "<span id=\"section-function-index\"></span>\n\n"
-puts "## Function index\n\n"
-$index.keys.sort.each{|x| puts "* [`#{x}`](\##{x})\n"}
-puts "\n"