Module:Sandbox/Con-struct (t)/Test1/svg-text
Jump to navigation
Jump to search
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules
Lua
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' ..
'<!-- 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' ..
'<!-- 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' ..
'<!-- 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' ..
'<!-- 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