]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Wiki/Interpreter/Image.hs
More flexible <img> and <imgsrc> command
[Rakka.git] / Rakka / Wiki / Interpreter / Image.hs
index 12ea6d662de735ee33a5b1203599b8dd6feb2c40..80cd6c318730a794f2f5403f307e78449884ca6c 100644 (file)
@@ -18,6 +18,12 @@ interpreters = [ imageInterp
                ]
 
 
+-- <img src="[PageName]"
+--      alt="[Alternative]"   -- 省略可能
+--      link="[PageName]"     -- 省略可能、省略時は画像そのものへのリンク
+--      link="[Absolute URI]" -- 絶對 URI の場合はその URI へのリンク
+--      link="" />            -- 空文字列の場合はリンク無し
+
 -- <a href="..." class="inlineImage ...">
 --   <img src="..." alt="..." />
 -- </a>
@@ -26,32 +32,38 @@ imageInterp
     = InlineCommandInterpreter {
         iciName      = "img"
       , iciInterpret
-          = \ ctx (InlineCommand _ attrs inside) ->
+          = \ ctx (InlineCommand _ attrs _) ->
             do BaseURI baseURI <- getSysConf (ctxSysConf ctx)
 
-               let pageName    = case lookup "src" attrs of
+               let name        = case lookup "src" attrs of
                                    Just x  -> x
                                    Nothing -> error "\"src\" attribute is missing"
-                   hrefAttr    = ("href", uriToString id (mkPageURI baseURI pageName) "")
+                   link        = case lookup "link" attrs of
+                                   Just "" -> Nothing
+                                   Just x  -> if isURI x then
+                                                  Just x
+                                              else
+                                                  Just (uriToString id (mkPageURI baseURI x) "")
+                                   Nothing -> Just (uriToString id (mkPageURI baseURI name) "")
                    alt         = lookup "alt" attrs
                    classAttr   = case lookup "float" attrs of
-                                   Nothing      -> ("class", "inlineImage")
-                                   Just "left"  -> ("class", "inlineImage leftFloat")
-                                   Just "right" -> ("class", "inlineImage rightFloat")
+                                   Nothing      -> "inlineImage"
+                                   Just "left"  -> "inlineImage leftFloat"
+                                   Just "right" -> "inlineImage rightFloat"
                                    Just others  -> error ("unknown \"float\" attribute: " ++ others)
-                   anchorAttrs = [hrefAttr, classAttr]
-
-               return (Anchor anchorAttrs [Image pageName alt])
+                   result      = case link of
+                                   Nothing -> Span [("class", classAttr)] [Image (Right name) alt]
+                                   Just x  -> Anchor [ ("class", classAttr)
+                                                     , ("href" , x        ) ] [Image (Right name) alt]
+               return result
       }
 
 
 -- <div class="imageFrame ...">
 --   <div class="imageData">
---     <p>
---       <a href="...">
---         <img src="..." />
---       </a>
---     </p>
+--     <a href="...">
+--       <img src="..." />
+--     </a>
 --   </div>
 --   <div class="imageCaption">
 --     ...
@@ -65,22 +77,30 @@ imgFrameInterp
           = \ ctx (BlockCommand _ attrs inside) ->
             do BaseURI baseURI <- getSysConf (ctxSysConf ctx)
 
-               let pageName    = case lookup "src" attrs of
+               let name        = case lookup "src" attrs of
                                    Just x  -> x
                                    Nothing -> error "\"src\" attribute is missing"
-                   hrefAttr    = ("href", uriToString id (mkPageURI baseURI pageName) "")
+                   link        = case lookup "link" attrs of
+                                   Just "" -> Nothing
+                                   Just x  -> if isURI x then
+                                                  Just x
+                                              else
+                                                  Just (uriToString id (mkPageURI baseURI x) "")
+                                   Nothing -> Just (uriToString id (mkPageURI baseURI name) "")
                    classAttr   = case lookup "float" attrs of
                                    Nothing      -> ("class", "imageFrame")
                                    Just "left"  -> ("class", "imageFrame leftFloat")
                                    Just "right" -> ("class", "imageFrame rightFloat")
                                    Just others  -> error ("unknown \"float\" attribute: " ++ others)
+                   image       = case link of
+                                   Nothing -> Image (Right name) Nothing
+                                   Just x  -> Anchor [("href" , x)] [Image (Right name) Nothing]
                
                return (Div [classAttr]
-                       [ Div [("class", "imageData")]
-                         [ Paragraph [ Anchor [hrefAttr]
-                                                  [ Image pageName Nothing ] ]
-                         ]
-                       , Div [("class", "imageCaption")] inside
+                       [ Block (Div [("class", "imageData")]
+                                        [ Inline image ])
+                       , Block (Div [("class", "imageCaption")]
+                                        [ Block x | x <- inside ])
                        ]
                       )
       }