1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00
elua/doc/buildall.lua
Dado Sutter 17487f9ebe - doc folder replaced by some work done on Led Lab for the new doc and site
- This should actually be a merge but we made a mistake on the initial repo creation
  and a merge was not possible.
- Below there is a resumed log of the commit messages for the few steps, just for
  the record.

- The merged commit messages for this work are:

 - Removing Portuguese doc content
 - Ignore folder names fixed on .gitignore
 - Removed doc files which content migrated to the CMS
 - docdata.lua updated accordingly
 - Doc build checked ok
 - Overall doc structure and contents still being refined
 - Removing folder cache from git versioning
 - Removing folder dist from git versioning. The folders above are generated by the buildall.lua script and are not part of the sources
 - Adding .gitignore file with objects info to inform git what to ignore
 - Removed file
 - Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
 - Moving all files and folders to a working doc folder
 - Css updated
 - Index page added and CSS adjusts
 - Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
 - Signed-off-by: Guilherme Sanchez <guilhermesanchezpacheco@gmail.com>
 - Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
 - files deleted
 - Changed function that creates functions submenus.
 - Menu inserted with árvore, CSS adjusts, google search
 - Changed past design to new design
 - CSS updated
 - initial import

- The commit ids were also preserved but they are related to this "other"
  work done on Led Lab. We'll keep the repo just in case.

4dce3f77c47b0c3001a2075a946e80ee52759b49 - Removing Portuguese doc content
78d8847525cacf045fe7e672cff6bd1e058a6a4b Ignore folder names fixed on .gitignore
48dee6b7962168ab1098bf709ead6f3cfe6b7964 - Removed doc files which content migrated to the CMS - docdata.lua updated accordingly - Doc build checked ok - Overall doc structure and contents still being refined
2aa2fe0c554db03dbc7029c34d0f4500fe625b37 - Removing folder cache from git versioning - Removing folder dist from git versioning   The folders above are generated by the buildall.lua script and are not part of the sources - Adding .gitignore file with objects info to inform git what to ignore
af6cc2890edf1855af319dc999a03feee5f9bee0 Removed file
6a180e72eb4f4860620cafc0685000e9f2174cfe Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
eb430112e78ae537459ab315e228ebca84bdf2d4 Moving all files and folders to a working doc folder
d28a7c99489915630bd2625f3756fecf0d08ce37 Css updated
32836ffe382f04ab07c3e6f018c7b449a20d7a8d Index page added and CSS adjusts
1461d9957d9d25a1467cb57ab8717aa213a37e8d Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
ae1934c04f35a29e25bb4495ae8a31cd9c000b5b Signed-off-by: Guilherme Sanchez <guilhermesanchezpacheco@gmail.com>
b5f31d70f1fac8d3fba325c9867a03f976775698 Merge branch 'master' of git@repos.giga.puc-rio.br:elua-doc.git
ec9ad8446b7ea38b252c6a416e70774349835e45 files deleted
bd7a80151b2030720ba8d8a303467d8c25a4b4b2 Changed function that creates functions submenus.
6a7494acaec694fadbb13520bcbccc51a6b95dfe Inserido menu com árvore, ajustes no CSS, busca do google
e979f1c259d425c9a3be83f9cda20eddffe073bb Changed past design to new design.
381459e95286886b052103a0253e60b29e064d7a CSS updated
4f81d2f1195efe733fe5f97517be325d75937bc3 initial import
2011-05-06 06:49:21 -03:00

776 lines
26 KiB
Lua

require "lfs"
require "eluadoc"
require "md5"
-- Uncomment this when generating offline docs
local is_offline = true
-- Languages in the system
-- NOTE: "en" must ALWAYS be the first entry in this array!
-- NOTE: all languages must be given in lowercase only!
-- ## Obs: PT going offline in July 2010 for lack of support.
-- We hope to offer it again and I'll keep maintaining (offline) what I can.
--languages = { "en", "pt" }
languages = { "en" }
-- Reverse lookup (language to idx) dictionary
local langidx = {}
for k, v in ipairs( languages ) do
langidx[ v ] = k
end
local sf = string.format
local cache_invalid = false
-------------------------------------------------------------------------------
-- Indexes into our menu table (defined in docdata.lua)
name_idx, link_idx, submenu_idx , title_idx = 1, 2, 3, 4
-------------------------------------------------------------------------------
-- "getstr" support (return strings in different languages)
-- If defaults to english (but gives a warning) if the string isn't found in the given language
-- This table keeps the strings we already emitted warnings for
-- After all, we don't want to drive the user crazy
local warned = {}
function getstr( str, lang )
-- Get the language index from langidx
local idx = langidx[ lang ]
if not idx then error( string.format( "Invalid language %s", lang ) ) end
-- Look from the string in the "translations" table
local where
for _, v in ipairs( translations ) do
if v[ 1 ] == str then
where = v
break
end
end
if not where then error( string.format( "String %s not found in translations" , str ) ) end
-- Try to return the value in the specified language
-- If not possible, return the value in english, but issue a warning first
local res = where[ idx ]
if not res then
res = where[ 1 ]
if not warned[ str ] then
print( string.format( "*** WARNING: translation for '%s' in language '%s' not found!", str, lang ) )
warned[ str ] = true
end
end
return res
end
-------------------------------------------------------------------------------
-- Generic helper functions
-- Remove anchor from a link of the form a/b.../baselink.html#anchor
local function get_base_link( name )
return ( name:gsub( "#.*", "" ) )
end
-- Get the menu field for a given item and language
-- Returns the english name is the field for the specified language can't be found
local function get_menu_field( menuitem, lang, fieldidx )
if not menuitem[ fieldidx ] then
return nil
else
if type( menuitem[ fieldidx ] ) == "string" then
return menuitem[ fieldidx ]
else
local lidx = langidx[ lang ]
return menuitem[ fieldidx ][ lidx ] or menuitem[ fieldidx ][ 1 ]
end
end
end
-- Get the menu name for a given menu item and a language
-- Returns the english name if the name for the specified language can't be found
local function get_menu_name( menuitem, lang )
return get_menu_field( menuitem, lang, name_idx )
end
-- Get the link for a given menu item and a language
-- Returns the english name if the name for the specified language can't be found
-- If the link field doesn't exists, the name is returned instead
local function get_menu_title( menuitem, lang )
return "" .. ( get_menu_field( menuitem, lang, title_idx ) or get_menu_field( menuitem, lang, name_idx ) )
end
-- Set "print" to print indented (with 2 spaces)
local oldprint
local function indent_print()
oldprint = print
print = function( ... ) io.write( " " ); oldprint( ... ) end
end
-- Restore the "regular" print function
local function regular_print()
print = oldprint
end
-------------------------------------------------------------------------------
-- File/directory operations helpers
-- Copy the given file to the 'dest' directory
-- Doesn't do error checking
local function copy_file( fname, dst )
local destname = fname
if fname:find( "/" ) then
-- Get only the filename from the path
local sidx
for f = #fname, 1, -1 do
if fname:sub( f, f ) == "/" then
sidx = f
break
end
end
destname = fname:sub( sidx + 1 )
end
local fsrc = io.open( fname, "rb" )
local fdst = io.open( string.format( "%s/%s", dst, destname ), "wb" )
local data = fsrc:read( "*a" )
fdst:write( data )
fsrc:close()
fdst:close()
end
-- Copy the 'src' directory to the 'dst' directory, going recursively through
-- its content. Doesn't do error checking.
local function copy_dir_rec( src, dst )
for f in lfs.dir( src ) do
local oldf = string.format( "%s/%s", src, f )
local attrs = lfs.attributes( oldf )
if attrs.mode == 'directory' and f ~= "." and f ~= ".." and f ~= ".svn" and f ~= ".git" then
local newdir = string.format( "%s/%s", dst, f )
lfs.mkdir( newdir )
copy_dir_rec( oldf, newdir )
elseif attrs.mode == 'file' then
copy_file( oldf, dst )
end
end
end
-- Remove a directory recusively
-- USE WITH CARE!! Doesn't do much checks :)
local function rm_dir_rec( dirname )
for f in lfs.dir( dirname ) do
local ename = string.format( "%s/%s", dirname, f )
local attrs = lfs.attributes( ename )
if attrs.mode == 'directory' and f ~= '.' and f ~= '..' then
rm_dir_rec( ename )
elseif attrs.mode == 'file' or attrs.mode == 'named pipe' or attrs.mode == 'link' then
os.remove( ename )
end
end
lfs.rmdir( dirname )
end
-- Copy a directory to another directory
local function copy_dir( src, dst )
local newdir = string.format( "%s/%s", dst, src )
lfs.mkdir( newdir )
copy_dir_rec( src, newdir )
end
-------------------------------------------------------------------------------
-- Cache helpers
local function read_md5( filename )
local fullname = string.format( "cache/%s.cache", filename )
local f = io.open( fullname, "rb" )
if not f then return "" end
local d = f:read( "*a" )
f:close()
return d
end
local function write_md5( filename, d )
local fullname = string.format( "cache/%s.cache", filename )
local f = io.open( fullname, "wb" )
if not f then return false end
f:write( d )
f:close()
return true
end
local function file_md5( filename )
local f = io.open( filename, "rb" )
if not f then return "" end
local d = f:read( "*a" )
f:close()
return md5.sumhexa( d )
end
-------------------------------------------------------------------------------
-- Table utils (from http://lua-users.org/wiki/TableUtils)
function table.val_to_str( v )
if "string" == type( v ) then
v = string.gsub( v, "\n", "\\n" )
if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
return "'" .. v .. "'"
end
return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
else
return "table" == type( v ) and table.tostring( v ) or tostring( v )
end
end
function table.key_to_str ( k )
if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
return k
else
return "[" .. table.val_to_str( k ) .. "]"
end
end
function table.tostring( tbl )
local result, done = {}, {}
for k, v in ipairs( tbl ) do
table.insert( result, table.val_to_str( v ) )
done[ k ] = true
end
for k, v in pairs( tbl ) do
if not done[ k ] then
table.insert( result,
table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
end
end
return "{" .. table.concat( result, "," ) .. "}"
end
-------------------------------------------------------------------------------
-- Build the list of files that must be processed starting from the menu data
-- Traverse a second (or higher) level menu and add relevant information to flist
local function traverse_list( item, parentid, flist )
if not item[ link_idx ] then return end
local base = get_base_link( item[ link_idx ] )
if base ~= "" and not flist[ base ] then
flist[ base ] = { parentid = parentid, item = item }
end
if item[ submenu_idx ] then
for i = 1, #item[ submenu_idx ] do
traverse_list( item[ submenu_idx ][ i ], parentid, flist )
end
end
end
-- Iterate over the menu list, building the list of files that must be
-- processed by the doc generator. Returns a dictionary with list, parent_id
-- pairs where parent_id is the parent menu of link in themenu
local function get_file_list()
local flist = {}
for i = 1, #themenu do
traverse_list( themenu[ i ], i, flist )
end
return flist
end
-- Returns true if the given string begins with the given substring, false otherwise
-- The comparation is case-insensitive
local function beginswith( str, prefix )
return str:sub( 1, #prefix ):lower() == prefix:lower()
end
-------------------------------------------------------------------------------
-- Build the navigation data for a given page
-- Helper function: format a link starting from language and link
-- Links marked as "#" ("null" links) are left alone
-- Links that begin with "http(s)://" are unchanged
local function get_link( lang, link )
if link == "#" then
return "#"
elseif link:find( "https?://" ) == 1 then
return link
else
return string.format( "%s_%s", lang, link )
end
end
-- Helper for gen_html_nav: generate the submenu(s) for a given top level menu item
local function gen_submenus( item, lang, level )
level = level or 1
local data = ''
local lidx = langidx[ lang ]
local arrptr = ''
for i = 1, #item do
local l = item[ i ]
if l[ submenu_idx ] then
local link = l[ link_idx ]
local string_item = (link == "" or not link) and '<li>%s<span class="folder">%s%s</span>\n' or '<li> <a href="%s">%s%s</a>\n'
data = data .. string.rep( " ", level * 2 + 8 ) .. string.format( string_item, get_link( lang, l[ link_idx ] ), arrptr, get_menu_name( l, lang ) )
data = data .. string.rep( " ", level * 2 + 8 ) .. "<ul>\n"
data = data .. gen_submenus( l[ submenu_idx ], lang, level + 1 )
data = data .. string.rep( " ", level * 2 + 8 ) .. "</ul></li>\n"
else
if get_menu_name( l, lang ) then
local link = l[ link_idx ]
local string_item = (link == "" or not link) and '<li>%s<span class="folder">%s</span></li>\n' or '<li> <a href="%s">%s</a></li>\n'
data = data .. string.rep( " ", level * 2 + 8 ) .. string.format( string_item, get_link( lang, l[ link_idx ] ), get_menu_name( l, lang ) )
end
end
end
return data
end
-- Generate the HTML menu structure for the given language and parentid
-- If "is_offline" is true, don't generate links to the counter and the BerliOS logo
local function gen_html_nav( parentid, lang )
local htmlstr = [[
<ul id="menu-nav">
]]
local lidx = langidx[ lang ]
for i = 1, #themenu do
local menudata = ""
local imginsert = ""
local styledef = i == #themenu and ' style="border-bottom-width: 0"' or ""
local link = themenu[ i ][ link_idx ]
local name = get_menu_name( themenu[ i ], lang )
if not link then
htmlstr = htmlstr .. string.format(' <li class="sep"%s>%s</li>\n', styledef, name )
else
local relname = string.gsub( string.gsub( string.format( "s_%d_%s", i, string.lower( get_base_link( link ) ) ), "%s", "_" ), "%.html", "" )
-- If we have a submenu, update the HTML menu content part
if themenu[ i ][ submenu_idx ] then
menudata = string.format( [[
<ul id="%s">
%s
</ul>
]], relname, string.sub( gen_submenus( themenu[ i ][ submenu_idx ], lang ), 1, -2 ) )
imginsert = ''
end
if name then
if i == parentid then
-- If this is the parent, use a special style for it (<a class="current"> or <li class="current">, depending on the item type)
if themenu[ i ][ submenu_idx ] then
local string_item = (link == "" or not link) and ' <li><span class="folder" %s rel="%s"%s>%s%s</span>\n%s </li>\n' or ' <li><a class="current" href="%s" rel="%s"%s>%s%s</a>\n%s </li>\n'
htmlstr = htmlstr .. string.format(string_item, get_link( lang, link ), relname, styledef, imginsert, name, menudata )
else
htmlstr = htmlstr .. string.format(' <li class="current"%s>%s%s\n%s </li>\n', styledef, imginsert, name, menudata )
end
else
local submenustr = themenu[ i ][ submenu_idx ] and string.format( ' rel="%s"', relname ) or ""
local string_item = (link == "" or not link) and ' <li> <span class="folder" %s %s%s>%s%s</span>\n%s </li>\n' or ' <li> <a href="%s"%s%s>%s%s</a>\n%s </li>\n'
htmlstr = htmlstr .. string.format(string_item, get_link( lang, link ), submenustr, styledef, imginsert, name, menudata )
end
end
end
end
offline_data = not is_offline and [[
<p style="margin-left: 35px;"><a href="http://www.pax.com/free-counters.html"><img src="http://counter.pax.com/counter/image?counter=ctr-zsg80nnmqt" alt="Free Hit Counter" style="border: 0;" /></a></p>
<p style="margin-left: 18px;"><a href="http://developer.berlios.de" title="BerliOS Developer"> <img src="http://developer.berlios.de/bslogo.php?group_id=9919" width="124px" height="32px" style="border: 0;" alt="BerliOS Developer Logo" /></a></p>
]] or ""
htmlstr = htmlstr .. string.format( [[
</ul>
%s
]], offline_data )
return htmlstr
end
-- Helper function: replace local links with links prefixed by language
local function language_for_links( lang, orig )
-- Iterate through all the links in the document and change the local ones with
-- the correct language option
orig = orig:gsub( [==[<a href=["'](.-)["']>]==], function( link )
if beginswith( link, "#" ) or beginswith( link, "http://" ) or beginswith( link, "https://" ) or beginswith( link, "ftp://" ) then
return string.format( '<a href="%s">', link )
else
return string.format( '<a href="%s_%s">', lang, link )
end
end )
return orig
end
-------------------------------------------------------------------------------
-- Build the logo for a given language
local function gen_logo( fname, lang )
local numl = #languages
local langdata = ''
for i = 1, numl do
local crtlang = languages[ i ]
local hlang = crtlang:sub( 1, 1 ):upper() .. crtlang:sub( 2, -1 )
if lang:lower() == crtlang:lower() then
langdata = langdata .. string.format(' <td align="center"><h6 class="selected"><img src="images/%s.jpg" alt="%s" style="border: 0;" /></h6></td>\n', hlang, crtlang )
else
langdata = langdata .. string.format(' <td align="center"><h6><a href="%s_%s" class="lang"><img src="images/%s.jpg" alt="%s" style="border: 0;" /></a></h6></td>\n', crtlang:lower(), fname, hlang, crtlang )
end
end
return string.format( [[
]], getstr( "eLua - Embedded Lua", lang ), numl + 1, getstr( "Search", lang ), getstr( "Language", lang ), langdata:sub( 1, -2 ) )
end
-------------------------------------------------------------------------------
-- Generate an actual HTML page starting from a template
-- Replace the $$HEADER$$ and $$FOOTER$$ with proper data
local function gen_html_page( fname, lang )
local entry = flist[ fname ]
local parentid = entry.parentid
local item = entry.item
-- Open and read file
local fullname = string.format( "%s/%s", lang, fname )
local f = io.open( fullname, "rb" )
if not f then
fullname = fullname:gsub( "%.html", "%.txt" )
f = io.open( fullname, "rb" )
if not f then
return nil, string.format( "Error opening %s", fullname )
end
end
local orig = f:read( "*a" )
f:close()
-- Check cache
local cfilename = string.format( "%s_%s", lang, fname )
local oldsum = read_md5( cfilename )
local crtsum = md5.sumhexa( orig )
if oldsum == crtsum then
if not cache_invalid then
return nil, "#cached#"
end
else
write_md5( cfilename, crtsum )
end
local asciimode = fullname:find( "%.txt" )
-- Check the presence of $$HEADER$$ and $$FOOTER$$
if not orig:find( "%$%$HEADER%$%$" ) or not orig:find( "%$%$FOOTER%$%$" ) then
return nil, string.format( "%s not formated properly ($$HEADER$$ or $$FOOTER$$ not found)", fullname )
end
if not asciimode then
print ""
-- Anticipate some common errors and fix them directly
orig = orig:gsub( "<br>", "<br />" )
orig = orig:gsub( '(<a name=["\'][^\'"]-["\']>)([^\n]-)</a>%s-\n', function( anchor, data )
return anchor:gsub( ">", " />" ) .. data .. "\n"
end )
orig = orig:gsub( '<p><pre><code>(.-)</code></pre></p>', "<pre><code>%1</code></pre>" )
orig = orig:gsub( 'target="_blank"', "" )
else
print( "(AsciiDoc mode)" )
-- Call "asciidoc" to generate the actual HTML
local tempname = fullname .. '.temp'
os.execute( sf( "asciidoc -s -a icons -a 'newline=\\n' -b xhtml11 -o %s %s", tempname, fullname ) )
local resfile = io.open( tempname, "rb" )
if not resfile then
return nil, sf( "Unable to find the AsciiDoc generated file %s", tempname )
end
orig = resfile:read( "*a" )
resfile:close()
orig = "$$HEADER$$\n" .. orig .. "$$FOOTER$$\n"
os.remove( tempname )
end
-- Replace local links with language-dependent links
orig = language_for_links( lang, orig )
-- Generate actual data
local header = [=[
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta charset="utf-8">
<meta name="subject" content="eLua - Lua for the embedded world" />
<meta name="Description" content="eLua stands for Embedded Lua and the project aims to offer the full set of features of the Lua Programming Language to the embedded world." />
<meta name="Keywords" content="eLua, lua, embedded, ARM, Cortex-M3, AVR32, ARM7TDMI, microcontroller, mcu, programming, electronics, tools, development" />
<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/jquery.treeview.js" type="text/javascript"></script>
<link href="css/style1.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="css/jquery.treeview.css" />
<title>eLua - ]=]..get_menu_title( item, lang )..[=[</title>
<link REL="SHORTCUT ICON" HREF="images/eLua_16x16.ico">
</head>
<body id="interna_2">
<!--header-->
<div id="header">
<div class="wrapper">
<form method="get" action="http://www.google.com/search" class="searchform" style="margin-top:62px;">
<input type="hidden" name="ie" value="utf-8" />
<input type="hidden" name="oe" value="utf-8" />
<input type="hidden" name="domains" value="http://www.eluaproject.net" />
<input type="hidden" name="sitesearch" value="http://www.eluaproject.net" />
<input class="searchfield" type="text" name="q" maxlength="255" value="Search..." onfocus="if (this.value == 'Search...') {this.value = '';}" onblur="if (this.value == '') {this.value = 'Search...';}" />
<input class="searchbutton" type="submit" value="Go" />
</form>
<h1><a href="index.htm" title="eLua Project"><img src="images/logo_eLua_menor.png" alt="eLua Project"/></a></h1>
<!--navegação-->
<div id="nav_top">
<ul class="sections">
<li><a href="http://www.eluaproject.net" target="_blank">Site</a></li>
<li><a href="/" class="selected">Doc</a></li>
<li><a href="http://wiki.eluaproject.net" target="_blank">Wiki</a></li>
<li><a href="http://builder.eluaproject.net" target="_blank">Builder</a></li>
<li><a href="http://tracker.eluaproject.net" target="_blank">Tracker</a></li>
<li><a href="http://www.github.com/elua" target="_blank">Repository</a></li>
</ul>
</div>
<!--navegação-->
<!--chamada-->
<div class="chamada_elua">
<h2>]=]..get_menu_name( item, lang )..[=[</h2>
</div>
<!--chamada-->
</div>
<!--header-->
</div>
<div id="article">
<div class="wrapper">
<div class="section_menu">
<!--conteudo Esquerda-->
]=] ..gen_logo( fname, lang ) .. "\n"..gen_html_nav( parentid, lang )
..
[=[
<!--conteudo esquerda-->
</div>
<div class="section_conteudo section_size">
<!--conteudo-->
<h1>]=]..get_menu_title( item, lang )..[=[ </h1>
]=]
local footer = [[
<!--conteudo-->
</div>
</div>
<br/>
</div>
<!--footer-->
<div id="footer">
<div class="wrapper">
<br/>
<span class="rodape">© 2011 eLua Project. All rights reserved.</span>
</div>
<br/>
</div>
<!--footer-->
<script type="text/javascript">
$("#menu-nav").treeview({
persist: "location",
collapsed: true,
unique: true
});
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%%3E%%3C/script%%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-11834941-1");
pageTracker._trackPageview();
} catch(err) {}
</body>
</html>
]]
orig = orig:gsub( "%$%$HEADER%$%$", header )
orig = orig:gsub( "%$%$FOOTER%$%$", footer )
return orig
end
-------------------------------------------------------------------------------
-- Documentation generator
-- Helper function: iterate through the menu and replace automatically generated content
local function replace_auto_content( automenus, item )
if type( item[ submenu_idx ] ) == "string" then
local r = automenus[ item[ submenu_idx ] ]
if not r then
return string.format( "Autogenerated menu '%s' not found", item[ submenu_idx ] )
else
print( string.format( "Replaced autogenerated menu '%s'", item[ submenu_idx ] ) )
item[ submenu_idx ] = r
end
elseif type( item[ submenu_idx ] ) == "table" then
for i = 1, #item[ submenu_idx ] do
replace_auto_content( automenus, item[ submenu_idx ][ i ] )
end
end
end
-- Argument check
local args = { ... }
local destdir = "dist"
local destdiridx = 1
if #args > 2 then
print "Usage: buildall.lua [destdir] [-online] [-clean]"
print "Use -online to generate online documentation (includes BerliOS logo and counter)"
print "Use -clean to clear the cache and generate clean documentation"
return
end
local cleancache = false
for i = 1, #args do
if args[ i ] == "-online" then
is_offline = false
elseif args[ i ] == "-clean" then
cleancache = true
else
destdir = args[ i ]
end
end
print( sf( "Using '%s' as the destination directory", destdir ) );
-- Read the documentation data
themenu, translations, fixed = dofile( "docdata.lua" )
if not themenu or not translations or not fixed then
print "docdata.lua doesn't return the proper data, aborting."
return
end
-- Add the content generated from eluadoc to our menu(s)
print "Generating HTML documentation..."
indent_print()
local automenus, genfiles = eluadoc.gen_html_doc()
if not automenus then return end
regular_print()
-- Replace content generated by gen_html_doc in the menu
for i = 1, #themenu do
local replerr = replace_auto_content( automenus, themenu[ i ] )
if replerr then
print( replerr )
return
end
end
print( "done" )
-- If the destination directory doesn't exist, create it
-- If it exists, remove it
local attr = lfs.attributes( destdir )
if not attr then
if not lfs.mkdir( destdir ) then
print( string.format( "Unable to create directory %s", destdir ) )
return
end
else
if attr.mode ~= "directory" then
print( string.format( "%s is not a directory", destdir ) )
return
end
rm_dir_rec( destdir )
lfs.mkdir( destdir )
end
-- If the cache must be cleared, do it now
if cleancache then
local attr = lfs.attributes( 'cache' )
if attr then
if attr.mode ~= "directory" then
print( "'cache' is not a directory" )
return
end
rm_dir_rec( 'cache' )
lfs.mkdir( 'cache' )
end
end
-- Create the cache directory if it doesn't exist
local attr = lfs.attributes( 'cache' )
if not attr then
if not lfs.mkdir( 'cache' ) then
print( "Unable to create cache directory" )
return
end
end
-- Set the global "cache invalid" flag
-- It is set to 'true' if the content of docdata.lua changes
local crtdocsum = md5.sumhexa( table.tostring( themenu ) )
local oldsum = read_md5( "docdata" )
cache_invalid = crtdocsum ~= oldsum
if cache_invalid then
write_md5( "docdata", crtdocsum )
print "Cache invalidated"
end
print "\nProcessing HTML templates..."
indent_print()
flist = get_file_list()
for _, lang in ipairs( languages ) do
for fname, entry in pairs( flist ) do
if fname:find( "https?://" ) ~= 1 then -- not a filename but a direct link
io.write( string.format( "Processing %s %s...", fname, entry.item[ name_idx ] and "" or "(hidden entry)" ) )
local res, err = gen_html_page( fname, lang )
if err == "#cached#" then
-- This file is already in the cache
print( " (cached)" )
elseif not res then
print( "***" .. err )
else
local g = io.open( string.format( "cache/%s_%s", lang, fname ), "wb" )
if not g then
print( string.format( "Unable to open %s for writing", fname ) )
else
g:write( res )
g:close()
end
end
-- Copy file from cache to destination directory
local srcf = io.open( string.format( "cache/%s_%s", lang, fname ), "rb" )
local destf = io.open( string.format( "%s/%s_%s", destdir, lang, fname ), "wb" )
if not srcf or not destf then
print "Unable to copy file from cache to dist"
return
end
local content = srcf:read( "*a" )
destf:write( content )
srcf:close()
destf:close()
end
end
end
regular_print()
print "done"
-- Now copy the fixed content in the documentation directory
print "\nCopying fixed content ..."
indent_print()
for _, v in ipairs( fixed ) do
print( string.format( "Copying %s", v ) )
if v:sub( -1 ) == "/" then
copy_dir( v, destdir )
else
copy_file( v, destdir )
end
end
regular_print()
print "done"
-- And delete the files generated by eluadoc
print "\nCleaning up files generated by eluadoc..."
indent_print()
for _, v in pairs( genfiles ) do
print( string.format( "Deleting %s...", v ) )
os.remove( v )
end
regular_print()
print "done"
print( string.format( "\nEnjoy your documentation in %s :)", destdir ) )