Просмотр исходного кода

Merge pull request #3 from KonZee/master

Template tag, basic SVG support
Namdak Tonpa 9 лет назад
Родитель
Сommit
a0d1bef980
3 измененных файлов с 250 добавлено и 0 удалено
  1. 25 0
      include/nitro.hrl
  2. 65 0
      src/elements/element_animate.erl
  3. 160 0
      src/elements/element_svg.erl

+ 25 - 0
include/nitro.hrl

@@ -10,6 +10,24 @@
         hidden, lang, spellcheck, translate, onblur, onerror, onfocus, onmessage, onresize).
 -define(ACTION_BASE(Module), ancestor=action, trigger, target, module=Module, actions, source=[]).
 -define(CTRL_BASE(Module), ?ELEMENT_BASE(Module,undefined,Module)).
+% SVG attribute groups
+-define(SVG_ANIMATION_EVENT, onbegin, onend, onload, onrepeat).
+-define(SVG_ANIMATION_ATTRIBUT_TARGET, attributeType, attributeName).
+-define(SVG_ANIMATION_TIMING, svgbegin, dur, svgend, min, max, restart, repeatCount, repeatDur, fill).
+-define(SVG_ANIMATION_VALUE, calcMode, values, keyTimes, keySplines, from, to, by, autoReverse, accelerate, decelerate).
+-define(SVG_ANIMATION_ADDITION, additive, accumulate).
+-define(SVG_CONDITIONAL_PROCESSING, requiredExtensions, requiredFeatures, systemLanguage).
+-define(SVG_CORE, xmlbase, xmllang, xmlspace).
+-define(SVG_DOCUMENT_EVENT, onabort, onscroll, onunload, onzoom).  %% onerror and onresize, duplicating HTML events, were removed.
+-define(SVG_FILTER_PRIMITIVE, height, result, width, x, y).
+-define(SVG_GRAPHICAL_EVENT, onactivate, onfocusin, onfocusout, onload, onmousedown, onmousemove, onmouseout, onmouseup). %% onclick and onmouseover, duplicating HTML events, were removed.
+-define(SVG_PRESENTATION, alignment_baseline, baseline_shift, clip, clip_path, clip_rule, color, color_interpolation, color_interpolation_filters, color_profile, color_rendering, cursor,
+		direction, display, dominant_baseline, enable_background, fill, fill_opacity, fill_rule, filter, flood_color, flood_opacity, font_family, font_size, font_size_adjust, font_stretch,
+		font_style, font_variant, font_weight, glyph_orientation_horizontal, glyph_orientation_vertical, image_rendering, kerning, letter_spacing, lighting_color, marker_end, marker_mid,
+		marker_start, mask, opacity, overflow, pointer_events, shape_rendering, stop_color, stop_opacity, stroke, stroke_dasharray, stroke_dashoffset, stroke_linecap, stroke_linejoin,
+		stroke_miterlimit, stroke_opacity, stroke_width, text_anchor, text_decoration, text_rendering, unicode_bidi, visibility, word_spacing, writing_mode).
+-define(SVG_TRANSFERT_FUNCTION, type, tableValues, slope, intercept, amplitude, exponent, offset).
+-define(SVG_XLINK, xlinkhref, xlinktype, xlinkrole, xlinkarcrole, xlinktitle, xlinkshow, xlinkactuate).
 
 -record(element, {?ELEMENT_BASE(undefined)}).
 -record(literal, {?ELEMENT_BASE(element_literal), html_encode=true }).
@@ -176,6 +194,13 @@
 -record(u,       		?DEFAULT_BASE).
 -record(var,       		?DEFAULT_BASE).
 
+% HTML5 template
+-record(template,		?DEFAULT_BASE).
+
+% SVG
+-record(svg, {?ELEMENT_BASE(element_svg), version="1.1", baseProfile="full", xmlns="http://www.w3.org/2000/svg", xmlnsxlink="http://www.w3.org/1999/xlink", xmlnsev="http://www.w3.org/2001/xml-events", preserveAspectRatio, contentScriptType, contentStyleType, viewBox, externalResourcesRequired, ?SVG_CONDITIONAL_PROCESSING, ?SVG_CORE, ?SVG_DOCUMENT_EVENT, ?SVG_FILTER_PRIMITIVE, ?SVG_GRAPHICAL_EVENT, ?SVG_PRESENTATION, ?SVG_TRANSFERT_FUNCTION, ?SVG_XLINK}).
+-record(animate, {?ELEMENT_BASE(element_animate), externalResourcesRequired, ?SVG_ANIMATION_EVENT, ?SVG_ANIMATION_ATTRIBUT_TARGET, ?SVG_ANIMATION_TIMING, ?SVG_ANIMATION_VALUE, ?SVG_ANIMATION_ADDITION, ?SVG_CONDITIONAL_PROCESSING, ?SVG_CORE, ?SVG_XLINK}).
+
 % Extras
 -record(upload,         {?CTRL_BASE(element_upload), name, value}).
 

+ 65 - 0
src/elements/element_animate.erl

@@ -0,0 +1,65 @@
+-module(element_animate).
+-author('Konstantin Zakablukovsky').
+-include("nitro.hrl").
+-compile(export_all).
+-import(element_svg, [svg_conditional_processing/1, svg_core/1, svg_xlink/1]).
+
+render_element(Record) ->
+	wf_tags:emit_tag(<<"animate">>, nitro:render(Record#animate.body),
+	list:append([
+		[
+			{<<"id">>, Record#animate.id},
+			{<<"class">>, Record#animate.class},
+			{<<"style">>, Record#animate.style},
+			{<<"externalResourcesRequired">>, Record#animate.externalResourcesRequired}
+		],
+		svg_animation_event(Record),
+		svg_animation_attribut_target(Record),
+		svg_animation_timing(Record),
+		svg_animation_value(Record),
+		svg_animation_addition(Record),
+		svg_conditional_processing(Record),
+		svg_core(Record),
+		svg_xlink(Record),
+		Record#animate.data_fields,
+		Record#animate.aria_states
+	])).
+
+% Common SVG animate attributes
+svg_animation_event(Record) -> [
+	{<<"onbegin">>, Record#animate.onbegin},
+	{<<"onend">>, Record#animate.onend},
+	{<<"onload">>, Record#animate.onload},
+	{<<"onrepeat">>, Record#animate.onrepeat}
+].
+svg_animation_attribut_target(Record) -> [
+	{<<"attributeType">>, Record#animate.attributeType},
+	{<<"attributeName">>, Record#animate.attributeName}
+].
+svg_animation_timing(Record) -> [
+	{<<"begin">>, Record#animate.svgbegin},
+	{<<"dur">>, Record#animate.dur},
+	{<<"end">>, Record#animate.svgend},
+	{<<"min">>, Record#animate.min},
+	{<<"max">>, Record#animate.max},
+	{<<"restart">>, Record#animate.restart},
+	{<<"repeatCount">>, Record#animate.repeatCount},
+	{<<"repeatDur">>, Record#animate.repeatDur},
+	{<<"fill">>, Record#animate.fill}
+].
+svg_animation_value(Record) -> [
+	{<<"calcMode">>, Record#animate.calcMode},
+	{<<"values">>, Record#animate.values},
+	{<<"keyTimes">>, Record#animate.keyTimes},
+	{<<"keySplines">>, Record#animate.keySplines},
+	{<<"from">>, Record#animate.from},
+	{<<"to">>, Record#animate.to},
+	{<<"by">>, Record#animate.by},
+	{<<"autoReverse">>, Record#animate.autoReverse},
+	{<<"accelerate">>, Record#animate.accelerate},
+	{<<"decelerate">>, Record#animate.decelerate}
+].
+svg_animation_addition(Record) -> [
+	{<<"additive">>, Record#animate.additive},
+	{<<"accumulate">>, Record#animate.accumulate}
+].

+ 160 - 0
src/elements/element_svg.erl

@@ -0,0 +1,160 @@
+-module(element_svg).
+-author('Konstantin Zakablukovsky').
+-include("nitro.hrl").
+-compile(export_all).
+
+render_element(Record) ->
+	wf_tags:emit_tag(<<"svg">>, nitro:render(Record#svg.body),
+	list:append([
+		[
+			{<<"id">>, Record#svg.id},
+			{<<"class">>, Record#svg.class},
+			{<<"style">>, Record#svg.style},
+			{<<"version">>, Record#svg.version},
+			{<<"baseProfile">>, Record#svg.baseProfile},
+			{<<"xmlns">>, Record#svg.xmlns},
+			{<<"xmlns:xlink">>, Record#svg.xmlnsxlink},
+			{<<"xmlns:ev">>, Record#svg.xmlnsev},
+			{<<"preserveAspectRatio">>, Record#svg.preserveAspectRatio},
+			{<<"contentScriptType">>, Record#svg.contentScriptType},
+			{<<"contentStyleType">>, Record#svg.contentStyleType},
+			{<<"viewBox">>, Record#svg.viewBox},
+			{<<"externalResourcesRequired">>, Record#svg.externalResourcesRequired}
+		],
+		svg_conditional_processing(Record),
+		svg_core(Record),
+		svg_document_event(Record),
+		svg_filter_primitive(Record),
+		svg_graphical_event(Record),
+		svg_presentation(Record),
+		svg_transfert_function(Record),
+		svg_xlink(Record),
+		Record#svg.data_fields,
+		Record#svg.aria_states
+	])).
+
+
+%% Common SVG attributes
+svg_conditional_processing(Record)-> [
+	{<<"requiredExtensions">>, Record#svg.requiredExtensions},
+	{<<"requiredFeatures">>, Record#svg.requiredFeatures},
+	{<<"systemLanguage">>, Record#svg.systemLanguage}
+].
+
+svg_core(Record)-> [
+	{<<"xml:base">>, Record#svg.xmlbase},
+	{<<"xml:lang">>, Record#svg.xmllang},
+	{<<"xml:space">>, Record#svg.xmlspace}
+].
+
+svg_document_event(Record)-> [
+	{<<"onabort">>, Record#svg.onabort},
+	{<<"onerror">>, Record#svg.onerror},
+	{<<"onresize">>, Record#svg.onresize},
+	{<<"onscroll">>, Record#svg.onscroll},
+	{<<"onunload">>, Record#svg.onunload},
+	{<<"onzoom">>, Record#svg.onzoom}
+].
+
+svg_filter_primitive(Record)-> [
+	{<<"height">>, Record#svg.height},
+	{<<"result">>, Record#svg.result},
+	{<<"width">>, Record#svg.width},
+	{<<"x">>, Record#svg.x},
+	{<<"y">>, Record#svg.y}
+].
+
+svg_graphical_event(Record)-> [
+	{<<"onactivate">>, Record#svg.onactivate},
+	{<<"onclick">>, Record#svg.onclick},
+	{<<"onfocusin">>, Record#svg.onfocusin},
+	{<<"onfocusout">>, Record#svg.onfocusout},
+	{<<"onload">>, Record#svg.onload},
+	{<<"onmousedown">>, Record#svg.onmousedown},
+	{<<"onmousemove">>, Record#svg.onmousemove},
+	{<<"onmouseout">>, Record#svg.onmouseout},
+	{<<"onmouseover">>, Record#svg.onmouseover},
+	{<<"onmouseup">>, Record#svg.onmouseup}
+].
+
+svg_presentation(Record)-> [
+	{<<"alignment-baseline">>, Record#svg.alignment_baseline},
+	{<<"baseline-shift">>, Record#svg.baseline_shift},
+	{<<"clip">>, Record#svg.clip},
+	{<<"clip-path">>, Record#svg.clip_path},
+	{<<"clip-rule">>, Record#svg.clip_rule},
+	{<<"color">>, Record#svg.color},
+	{<<"color-interpolation">>, Record#svg.color_interpolation},
+	{<<"color-interpolation-filters">>, Record#svg.color_interpolation_filters},
+	{<<"color-profile">>, Record#svg.color_profile},
+	{<<"color-rendering">>, Record#svg.color_rendering},
+	{<<"cursor">>, Record#svg.cursor},
+	{<<"direction">>, Record#svg.direction},
+	{<<"display">>, Record#svg.display},
+	{<<"dominant-baseline">>, Record#svg.dominant_baseline},
+	{<<"enable-background">>, Record#svg.enable_background},
+	{<<"fill">>, Record#svg.fill},
+	{<<"fill-opacity">>, Record#svg.fill_opacity},
+	{<<"fill-rule">>, Record#svg.fill_rule},
+	{<<"filter">>, Record#svg.filter},
+	{<<"flood-color">>, Record#svg.flood_color},
+	{<<"flood-opacity">>, Record#svg.flood_opacity},
+	{<<"font-family">>, Record#svg.font_family},
+	{<<"font-size">>, Record#svg.font_size},
+	{<<"font-size-adjust">>, Record#svg.font_size_adjust},
+	{<<"font-stretch">>, Record#svg.font_stretch},
+	{<<"font-style">>, Record#svg.font_style},
+	{<<"font-variant">>, Record#svg.font_variant},
+	{<<"font-weight">>, Record#svg.font_weight},
+	{<<"glyph-orientation-horizontal">>, Record#svg.glyph_orientation_horizontal},
+	{<<"glyph-orientation-vertical">>, Record#svg.glyph_orientation_vertical},
+	{<<"image-rendering">>, Record#svg.image_rendering},
+	{<<"kerning">>, Record#svg.kerning},
+	{<<"letter-spacing">>, Record#svg.letter_spacing},
+	{<<"lighting-color">>, Record#svg.lighting_color},
+	{<<"marker-end">>, Record#svg.marker_end},
+	{<<"marker-mid">>, Record#svg.marker_mid},
+	{<<"marker-start">>, Record#svg.marker_start},
+	{<<"mask">>, Record#svg.mask},
+	{<<"opacity">>, Record#svg.opacity},
+	{<<"overflow">>, Record#svg.overflow},
+	{<<"pointer-events">>, Record#svg.pointer_events},
+	{<<"shape-rendering">>, Record#svg.shape_rendering},
+	{<<"stop-color">>, Record#svg.stop_color},
+	{<<"stop-opacity">>, Record#svg.stop_opacity},
+	{<<"stroke">>, Record#svg.stroke},
+	{<<"stroke-dasharray">>, Record#svg.stroke_dasharray},
+	{<<"stroke-dashoffset">>, Record#svg.stroke_dashoffset},
+	{<<"stroke-linecap">>, Record#svg.stroke_linecap},
+	{<<"stroke-linejoin">>, Record#svg.stroke_linejoin},
+	{<<"stroke-miterlimit">>, Record#svg.stroke_miterlimit},
+	{<<"stroke-opacity">>, Record#svg.stroke_opacity},
+	{<<"stroke-width">>, Record#svg.stroke_width},
+	{<<"text-anchor">>, Record#svg.text_anchor},
+	{<<"text-decoration">>, Record#svg.text_decoration},
+	{<<"text-rendering">>, Record#svg.text_rendering},
+	{<<"unicode-bidi">>, Record#svg.unicode_bidi},
+	{<<"visibility">>, Record#svg.visibility},
+	{<<"word-spacing">>, Record#svg.word_spacing},
+	{<<"writing-mode">>, Record#svg.writing_mode}
+].
+
+svg_transfert_function(Record)-> [
+	{<<"type">>, Record#svg.type},
+	{<<"tableValues">>, Record#svg.tableValues},
+	{<<"slope">>, Record#svg.slope},
+	{<<"intercept">>, Record#svg.intercept},
+	{<<"amplitude">>, Record#svg.amplitude},
+	{<<"exponent">>, Record#svg.exponent},
+	{<<"offset">>, Record#svg.offset}
+].
+
+svg_xlink(Record)-> [
+	{<<"xlink:href">>, Record#svg.xlinkhref},
+	{<<"xlink:type">>, Record#svg.xlinktype},
+	{<<"xlink:role">>, Record#svg.xlinkrole},
+	{<<"xlink:arcrole">>, Record#svg.xlinkarcrole},
+	{<<"xlink:title">>, Record#svg.xlinktitle},
+	{<<"xlink:show">>, Record#svg.xlinkshow},
+	{<<"xlink:actuate">>, Record#svg.xlinkactuate}
+].