module Panda.Type.Plugin where
import Panda.Helper.Env hiding (body, name)
import qualified Panda.Model.Album as Album
import qualified Panda.View.Atom.Album as AlbumV
data PluginType = PhotoAlbum | None deriving (Show, Eq)
data Plugin = Plugin
{ plugin_type :: PluginType
, args :: [(String, String)]
}
deriving (Show, Eq)
plugin_expression = "\n\\[\\[((.|\n)*?)\n\\]\\]"
plugin_id = "plugin"
infix_of = flip isInfixOf
optimized_match x
| "[[".infix_of x = x.match plugin_expression
| otherwise = Nothing
parse_plugin x = x.gsub "\n" "".split "," .map (split ":") .inner_map strip .map tuple2.parse_it where
parse_it xs = Plugin { plugin_type = xs.at plugin_id, args = xs.reject (fst > (is plugin_id)) }
at x xs = case (xs.lookup x) >>= parse_plugin_type of
Nothing -> None
Just x -> x
parse_plugin_type x = [PhotoAlbum].label_by (show_data).lookup (x)
match_result x = x.fromJust.snd.first.snd.b2u
apply_plugin x = if r.isNothing then return x else r.sub_it where
r = x.optimized_match
plugin = r.match_result.parse_plugin
sub_it y = case plugin.plugin_type of
None -> return x
PhotoAlbum -> do
album <- plugin.args.Album.from_list ^ render_plugin
x.sub plugin_expression album .apply_plugin
render_plugin = render_data > show