[luadocumentor] add support of optional tags.
diff --git a/libraries/luadocumentor/docgenerator.lua b/libraries/luadocumentor/docgenerator.lua
index 780ea73..23469e5 100644
--- a/libraries/luadocumentor/docgenerator.lua
+++ b/libraries/luadocumentor/docgenerator.lua
@@ -24,7 +24,7 @@
 local M = {}
 M.defaultsitemainpagename = 'index'
 
-function M.generatedocforfiles(filenames, cssname)
+function M.generatedocforfiles(filenames, cssname,noheuristic)
 	if not filenames then return nil, 'No files provided.' end
 	--
 	-- Generate API model elements for all files
@@ -38,7 +38,7 @@
 		local code = file:read('*all')
 		file:close()
 		-- Get module for current file
-		local apimodule, err = lddextractor.generateapimodule(filename, code)
+		local apimodule, err = lddextractor.generateapimodule(filename, code,noheuristic)
 		
 		-- Handle modules with module name
 		if  apimodule and apimodule.name then
diff --git a/libraries/luadocumentor/extractors.lua b/libraries/luadocumentor/extractors.lua
index f06e07e..0c62ef0 100644
--- a/libraries/luadocumentor/extractors.lua
+++ b/libraries/luadocumentor/extractors.lua
@@ -31,6 +31,16 @@
 -- Enable to retrieve "---" comments from Lua code
 function M.lua( code )
 	if not code then return nil, 'No code provided' end
+	
+	-- manage shebang
+  if code then code = code:gsub("^(#.-\n)", function (s) return string.rep(' ',string.len(s)) end) end
+  
+  -- check for errors
+  local f, err = loadstring(code,'source_to_check')
+	if not f then
+    return nil, 'Syntax error.\n' .. err
+  end
+  
 	-- Get ast from file
 	local status, ast = pcall(mlc.src_to_ast, mlc, code)
 	--
@@ -39,10 +49,6 @@
 	if not status then
 		return nil, 'There might be a syntax error.\n' .. ast
 	end
-	local status, error = pcall(compiler.check_ast, ast)
-	if not status then
-		return nil, 'An error occurred while parsing.\n'..error
-	end
 
 	--
 	-- Extract commented nodes from AST
diff --git a/libraries/luadocumentor/lddextractor.lua b/libraries/luadocumentor/lddextractor.lua
index 4022e60..fbf57b1 100644
--- a/libraries/luadocumentor/lddextractor.lua
+++ b/libraries/luadocumentor/lddextractor.lua
@@ -12,7 +12,6 @@
 require 'metalua.package'
 local compiler = require 'metalua.compiler'
 local mlc = compiler.new()
-local apimodelbuilder = require 'models.apimodelbuilder'
 local M = {}
 
 --
@@ -66,21 +65,45 @@
 	return table.concat(filecontent)..'return nil\n'
 end
 -- Create API Model module from a 'comment only' lua file
-function M.generateapimodule(filename, code)
+function M.generateapimodule(filename, code,noheuristic)
 	if not filename then return nil, 'No file name given.' end
 	if not code then return nil, 'No code provided.' end
-	local commentfile, error = M.generatecommentfile(filename, code)
-	if not commentfile then
-		return nil, 'Unable to create api module for "'..filename..'".\n'..error
-	end
-	local status, ast = pcall(mlc.src_to_ast, mlc, commentfile)
+	if type(filename) ~= "string" then return nil, 'No string for file name provided' end
+	
+	-- for non lua file get comment file 
+  if filename:gmatch('.*%.(.*)')() ~= 'lua' then
+    local err
+    code, err = M.generatecommentfile(filename, code)
+    if not code then
+      return nil, 'Unable to create api module for "'..filename..'".\n'..err
+    end
+  else
+    -- for lua file check syntax error
+    
+    -- manage shebang
+    if code then code = code:gsub("^(#.-\n)", function (s) return string.rep(' ',string.len(s)) end) end
+    
+    -- check for errors
+    local f, err = loadstring(code,'source_to_check')
+    if not f then
+      return nil, 'File'..filename..'contains syntax error.\n' .. err
+    end
+  end
+		
+	local status, ast = pcall(mlc.src_to_ast, mlc, code)
 	if not status then
 		return nil, 'Unable to compute ast for "'..filename..'".\n'..ast
 	end
-	local status, error = pcall(compiler.check_ast, ast)
-	if not status then
-		return nil, '"'..filename..'" contains an error.\n'..error
-	end
-	return apimodelbuilder.createmoduleapi(ast)
+	
+	-- Create api model
+  local apimodelbuilder = require 'models.apimodelbuilder'
+  local _file, comment2apiobj = apimodelbuilder.createmoduleapi(ast)
+
+  -- create internal model
+  if not noheuristic then
+    local internalmodelbuilder = require "models.internalmodelbuilder"
+    local _internalcontent = internalmodelbuilder.createinternalcontent(ast,_file,comment2apiobj)
+  end
+	return _file
 end
 return M
diff --git a/libraries/luadocumentor/luadocumentor.lua b/libraries/luadocumentor/luadocumentor.lua
index d0a06fa..20bdeea 100755
--- a/libraries/luadocumentor/luadocumentor.lua
+++ b/libraries/luadocumentor/luadocumentor.lua
@@ -41,6 +41,7 @@
 		* api: Will produce API file(s) from specified file(s) or directories.
 	-d, --dir (default docs) Define an output directory. If the given directory doesn't exist, it will be created.
 	-h, --help Display the help.
+	-n, --noheuristic Do not use code analysis, use only comments to generate documentation.
 	-s, --style (default !) The path of your own css file, if you don't want to use the default one. (usefull only for the doc format)
 	[directories|files]  Define the paths or the directories of inputs files. Only Lua or C files containing a @module tag will be considered.
 ]]
@@ -139,7 +140,7 @@
 	return
 end
 -- Generate html form files
-local parsedfiles, unparsed = docgenerator.generatedocforfiles(filestoparse, cssfilename)
+local parsedfiles, unparsed = docgenerator.generatedocforfiles(filestoparse, cssfilename,args.noheuristic)
 
 -- Show warnings on unparsed files
 if #unparsed > 0 then