OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

84 lines
2.3 KiB

-- --- SDE-COPYRIGHT-NOTE-BEGIN ---
-- This copyright note is auto-generated by ./scripts/Create-CopyPatch.
--
-- Filename: misc/lua/sde/desc.lua
-- Copyright (C) 2006 The OpenSDE Project
-- Copyright (C) 2005 - 2006 The T2 SDE Project
-- Copyright (C) 2005 - 2006 Juergen "George" Sawinski
--
-- More information can be found in the files COPYING and README.
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License. A copy of the
-- GNU General Public License can be found in the file COPYING.
-- --- SDE-COPYRIGHT-NOTE-END ---
-- TODO:
-- - parser should also accept string as input
-- - implement the desc.validator
-- DESCRIPTION:
-- t = desc.parse(line-iterator)
-- Parse ".desc" file format by passing a line iterator and
-- return a table, where lower-case of last entry in
-- etc/desc_format
-- is the key. Example:
-- Parsing "[I] Title" returns `{ title = "Title" }'
-- package object structure
desc = desc or {}
desc.__format__ = {}
-- FIXME setmetatable(desc, { __call = function })
-- parse .desc text ; expects line iterator function as argument
function desc.parse(iter)
local retval = {}
-- FIXME: Perhaps we'll gain some performance by not reading
-- line by line
for line in io.open(iter):lines() do
local tag,cnt
_,_,tag,cnt = string.find(line, "([[][^]]*[]])[ ]+(.*)")
if tag then
local fmt = desc.__format__[tag]
if fmt then
retval[fmt.name] = retval[fmt.name] or {}
table.insert(retval[fmt.name], cnt)
end
end
end
return retval
end
-- similar to desc.parse, but validate the description
function desc.validate(iter)
local retval = desc.parse(iter)
-- TODO implement validating
return retval
end
-- init: parse etc/desc_format
for line in io.open("etc/desc_format"):lines() do
local required=false
local tag
if string.match(line, "^[[]") ~= nil then
-- check if tag is required
if string.match(line, "([*])") ~= nil then required=true; end
-- use last tag definition as name
for t in string.gfind(line,"[[]([^]]*)[]]") do tag = t; end
tag = string.lower(tag)
-- sort into __format__
for t in string.gfind(line,"([[][^]]*[]])") do
desc.__format__[t] = { name = tag; required = required }
end
end
end