summaryrefslogtreecommitdiff
path: root/ldoc/lang.lua
diff options
context:
space:
mode:
Diffstat (limited to 'ldoc/lang.lua')
-rw-r--r--ldoc/lang.lua83
1 files changed, 83 insertions, 0 deletions
diff --git a/ldoc/lang.lua b/ldoc/lang.lua
new file mode 100644
index 0000000..ce4e29d
--- /dev/null
+++ b/ldoc/lang.lua
@@ -0,0 +1,83 @@
+-- ldoc/lang.lua
+--
+-- A "better" C/C++ comment parser for LDoc.
+--
+-- Copyright 2013 Daniel Silverstone <dsilvers@digital-scurf.org>
+--
+-- Permission is granted to use this under the same licence terms as
+-- LDoc itself.
+--
+
+-- To use, place this in ldoc/lang.lua in your source-tree relative to where
+-- you invoke LDoc. This file deliberately does not contain documentation
+-- comments and thus should not be picked up by accident.
+
+-- This allows for C/C++ comments of the form:
+--
+-- /** This is a thingy.
+-- *
+-- * Here is thingy's description.
+-- *
+-- * @return Badgers
+-- */
+
+local pp = package.path
+package.path = pp:gsub("%./%?%.lua;", "")
+package.loaded['ldoc.lang'] = nil
+local ll = require 'ldoc.lang'
+package.path = pp
+
+local class = require 'pl.class'
+local stringx = require 'pl.stringx'
+
+local cc_better = class(ll.cc._class)
+
+local function find_pfx(s, common)
+ return s:match("^([ *]*)")
+end
+
+local function max_pfx(s1, s2)
+ if #s1 > #s2 then
+ s1 = s1:sub(1, #s2)
+ else
+ s2 = s2:sub(1, #s1)
+ end
+ while s1 ~= s2 do
+ s1 = s1:sub(1, -2)
+ s2 = s2:sub(1, -2)
+ end
+ return s1
+end
+
+function cc_better:grab_block_comment(v,tok)
+ v = v:gsub(self.block_comment .. " *",'')
+ v = v:sub(1,-3)
+ local lines = stringx.splitlines(v, true)
+
+ if #lines > 1 then
+ local checklines = {}
+ for i = 2, #lines do
+ if lines[i] ~= lines[i]:match("^([ *]*)") then
+ checklines[#checklines+1] = lines[i]
+ end
+ end
+ if #checklines > 0 then
+ local common_pfx = checklines[1]:match("^([ *]*)")
+ for i = 1, #checklines do
+ local this_pfx = checklines[i]:match("^([ *]*)")
+ common_pfx = max_pfx(common_pfx, this_pfx)
+ end
+ for i = 2, #lines do
+ lines[i] = lines[i]:sub(#common_pfx + 1)
+ end
+ end
+ end
+
+ v = table.concat(lines, "\n")
+ return 'comment', v
+end
+
+ll.cc = cc_better()
+
+return ll
+