Module:Sandbox/Con-struct (t)/Test1/svg-text

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:Sandbox/Con-struct (t)/Test1/svg-text/doc

Code

local function svgGraphText1 (dGraphStretchWidth, dGraphStretchHeight, sText, sGraphText, dTextX, dTextY, dGeneralFontSizePx, dYAxisFontSize100)
    if dTextX then 
        return 
            '  <text x="' ..
            round (dTextX * dGraphStretchWidth  /  100, 1) .. '" y="' ..
            round (dTextY * dGraphStretchHeight / -100, 1) .. '">' ..
            svgText (FontSize (dGeneralFontSizePx, dYAxisFontSize100), sText or sGraphText) .. 
            '</text>\n'
    else
        return ''
    end
end
 
---- SVGTextDY (), workaround for librsvg ----
--[[
librsvg change slowly the vertical text position every 1.1px
give the additional dy for librsvg
   ]]
local function svgTextDY (dFontSizePx)
    if      dFontSizePx < 1.09 then return 0    - dFontSizePx
    else if dFontSizePx < 2.17 then return 1.09 - dFontSizePx
    else if dFontSizePx < 3.25 then return 2.17 - dFontSizePx
    else if dFontSizePx < 4.41 then return 3.25 - dFontSizePx
    else if dFontSizePx < 5.49 then return 4.41 - dFontSizePx
    else if dFontSizePx < 6.60 then return 5.49 - dFontSizePx
    else if dFontSizePx < 7.73 then return 6.60 - dFontSizePx
    else return 0
    end end end end end end end
end

---- SVGText (), create text ----
--[[
 primary a workaround because librsvg don't generate letter spaces propper on small font sizes
 creates: '<tspan dy=.../>' or nothing
 1: FontSize, px
 2: text
 3: fixed value of displacement, if existing
princip of the workaround:
 - at least one letter (i.e. space) and <tspan> must be located before text
   -> but in this case the word is hanging down
     -> dy is required
       -> <tspan dy=.../> -> works only with librsvg or
       -> <tspan transform="translate(0.28, -0.28)">bla</tspan>
   -> 'middle' and 'end' placement give a bad position
     -> therefore dx required
   -> bigger fontsize means less shift of dx and dy
 - ToDo?: additional safe feature?: requiredFeatures="http://www.w3.org/TR/SVG11/feature#???"
 ToDo: all that parameters and description is not current, it's before 2013-04-03, adapt it
   ]]
function svgText (dFontSizePx, sText, dDefaultDisplacement)
    local sReturn    = ' <tspan dy="'
    local sReturnEnd = 'px"/>'
    
    if dDefaultDisplacement ~= nil then
        sReturn = sReturn .. dDefaultDisplacement
    else if dFontSizePx < 5 then                               -- in case of big font size, workaround not required
        sReturn = sReturn .. svgTextDY (dFontSizePx)           -- dy, tspan
    else
    	sReturn    = ''
    	sReturnEnd = ''
    end end
     
    return sReturn .. sReturnEnd .. sText
end

--[[
function SVGText (dFontSizePx, sText, dDefaultDisplacement)     -- deprecated, todo: to be removed sometime, when only in use svgText
    svgText (dFontSizePx, sText, dDefaultDisplacement)
end
]]


function TextStyles (sLegendType, tsText, dGeneralFontSizePx, dFontSizeTitle100, dXAxisFontSize100, dYAxisFontSize100, dXAxisNumberFontSize100, dLegendFontSize100, dChartTextFontSize100, dLegendTextWA)
   	if iserror () then return '' end
   	local sReturn

    sReturn =
        '  .titletext {\n' ..
        '    font-size:       ' .. FontSize (1.1 * dGeneralFontSizePx, dFontSizeTitle100) .. 'px;\n' ..       -- same of expression in id="title"
        '  }\n' ..
        '  .axistext-x {\n' ..
        '    font-size:       ' .. FontSize (dGeneralFontSizePx, dXAxisFontSize100) .. 'px;\n' ..
        '  }\n' ..
        '  .axistext-x-number {\n' ..
        '    font-size:       ' .. FontSize (dGeneralFontSizePx, dXAxisNumberFontSize100) .. 'px;\n' ..
        '  }\n' ..
        '  .axistext-y {\n' ..
        '    font-size:       ' .. FontSize (dGeneralFontSizePx, dYAxisFontSize100) .. 'px;\n' ..
        '  }\n'
        
    if sLegendType ~= 'none' then sReturn = sReturn ..
        '  .legendtext {\n' ..
        '    font-size:       ' .. FontSize (dGeneralFontSizePx, dLegendFontSize100 * dLegendTextWA) .. 'px;\n' ..
        '    text-anchor:     start;\n' ..
        '  }\n'
    end

    if tsText[1] or tsText[2] then sReturn = sReturn ..
        '  .charttext {\n' ..
        '    font-size:       ' .. FontSize (dGeneralFontSizePx, dChartTextFontSize100) .. 'px;\n' ..
        '    text-anchor:     middle;\n' ..
        '  }\n'
    end
    
    return sReturn
end

----  ----
function svgBackgroundSVG (dGraphStretchWidth, dGraphStretchHeight, sBackgroundSVG)
   	if iserror () then return '' end
    if sBackgroundSVG then
        return '\n' ..
            '&lt;!-- Background SVG -->\n' ..
            '<g transform="scale(' ..
            round (dGraphStretchWidth  /  100, 1) .. ', ' ..
            round (dGraphStretchHeight / -100, 1) .. ')">' ..
            sBackgroundSVG .. '\n' ..
            '</g>\n'
    else
        return ''
    end 
end

----  ----
function svgForeground (sForegroundSVG)
   	if iserror () then return '' end
    if sForegroundSVG then
        return '\n' ..
            '&lt;!-- Foreground SVG -->\n' ..
            sForegroundSVG ..
            '\n'
    else
        return ''
    end 
end
 
----  ----  
function svgChartTitle (dChartWidthStretch, dChartHeightStretch, dGeneralFontSizePx, dFontSizeTitle, sTitle, dTitleX100, dTitleY100, dTitleXlibrsvg, dTitleYlibrsvg)
   	if iserror () then return '' end
    local sReturn = ''
  
    if sTitle then
        sReturn = '\n' ..
            '&lt;!-- additional text -->\n'
    end      	
    	
    if sTitle then
        if not dTitleX100 then dTitleX100 =  50 end
        if not dTitleY100 then dTitleY100 = 107 end
        sReturn = sReturn ..
            '  <text id="title" class="titletext" text-anchor="middle" x="' ..
            round (dChartWidthStretch  * dTitleX100 /  100, 1) .. '" y="' ..      -- x in the centre of the graphic
            round (dChartHeightStretch * dTitleY100 / -100, 1) .. '">' ..         -- -1.xx: y above the graphic
            svgText (FontSize (1.1 * dGeneralFontSizePx, dFontSizeTitle),         -- same of style .titletext
                sTitle, nil, dTitleXlibrsvg, dTitleYlibrsvg) .. 
            '</text>\n'
    end
    return sReturn
end
       
----  ----  
function svgChartFootnote (dChartWidthStretch, sFootnote, dFootnoteX100, dFootnoteY100, dTitleXlibrsvg, dTitleYlibrsvg)
   	if iserror () then return '' end
    local sReturn = ''

    if sFootnote then
        if not dFootnoteX100 then dFootnoteX100 = 100 end
        if not dFootnoteY100 then dFootnoteY100 = -22 end
        
        sReturn = ' \n' ..
        '  <text id="footnote" class="axistext-x" text-anchor="end" x="' ..       -- if required, ToDo: own class
        round (dChartWidthStretch * dFootnoteX100 /  100, 1) .. '" y="' ..
        round (ChartHeightStretch * dFootnoteY100 / -100, 1) .. '">' ..
        sFootnote ..
        '</text>\n'
    end
    return sReturn
end

----  ----
function svgGraphText (dGraphStretchWidth, dGraphStretchHeight, dXMin, dYMin, tsText, tsGraphText, tdTextX, tdTextY, dGeneralFontSizePx, dYAxisFontSize100)
   	if iserror () then return '' end
    local sReturn = ''

    if tdTextX[1] or tdTextX[2] then
        sReturn = '\n' ..
            '&lt;!-- chart text -->\n' ..
            '<g id="charttext" class="charttext" transform="translate(' ..
            round ((0 - dXMin) * dGraphStretchWidth  / 100, 1) .. ', ' ..
            round ((0 - dYMin) * dGraphStretchHeight / 100, 1) .. ')">'
            
        for i = 1, MAXCHARTNUMBER, 1 do
            sReturn = sReturn ..
            svgGraphText1 (dGraphStretchWidth, dGraphStretchHeight, tsText[i], tsGraphText[i], tdTextX[i], tdTextY[i], dGeneralFontSizePx, dYAxisFontSize100)
        end
        
        sReturn = sReturn .. 
            '</g>\n'
    end
    
    return sReturn
end