PackagePackagetypeA library you install and call yourself.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

abap_mustache

A Mustache template engine for ABAP, rendering logic-less templates into HTML or any other text from a structure or table of any type, with partials and a separate Steampunk-compatible branch.

Implements the original mustache spec plus some additions, which the maintainer marks as mainly in plans now; the Plans section lists if/else, each/else, inline partials and helpers as things the maintainer might implement with time. The input may be a structure or a table of any type, detected automatically, and for a table the template is repeated for each line, to a depth that is not limited; a template may be a string or a table of strings and the output comes back as either, and partials are supported, so templates can be split into sections and reused. A Steampunk (740+) compatible version lives in a branch of its own, contributed by DerGuteWolf: it is somewhat slower than master because of the whitelisted features Steampunk allows, and the maintainer says it may become the default in the near future. Installation is a clone into the system with abapGit, or creating the zmustache and zmustache_ut includes and filling them with the two program files.

Facts

Last pushLicenceMIT

Where it sits

Lives in
Provides
UI written in ABAPABAPUI written in ABAPcapabilityProducing a web user interface from ABAP code, with the application’s backend language also defining what the user sees and how it behaves.
Flavors

Who is behind it

Alexander TsybulskyAlexander TsybulskyPersonMaintains this
In the atlas: maintains 5, contributes to 11
@sbcgua
maintainerKjetil KilhavnPersonContributes to this
In the atlas: contributes to 6
@kjetil-kilhavn
Lars HvamPersonContributes to this
In the atlas: maintains 13, contributes to 92, wrote 1
@larshp
Theodore TsirpanisPersonContributes to this
In the atlas: contributes to 1
@teo-tsirpanis
3 contributors

Before choosing this

Signals

ActivityQuietNo published releases; repository quiet for 28 months

It publishes no releases, and its repository has been quiet for at least 24 full months. This may be normal for stable software; check whether its current state still fits your use.

What it declares

Every artifact

Type
Package
Origin
Independently maintained

As a package

Where it runs
Inside its host
Distributed through
abapGitCopied into the project

Connections2

README

quoted from sbcgua/abap_mustache under MIT, read
sbcgua/abap_mustache/README.mdOn GitHub

ABAP Mustache

Mustache template engine for ABAP. It implements the original mustache spec plus some additions (mainly in plans now :) Mustache is a logic-less template syntax. It is good for generation of HTML or any other text stuff.

Versions

The library has a Steampunk (740+) compatible version, thanks to @DerGuteWolf. Currently it lives in the steampunk branch. This version, at the time of publication, is somewhat slower compared to the original (master) due to limited whitelisted features of the steampunk (see the PR comments), but it has own advantages and may become the default in near future. If you are using the library in older environments, please notify in the issues to take it into account

Example

Let's assume you have some data like this:

types: 
  begin of ty_shop_item
    name  type string,
    price type s_price, 
  end of ty_shop_item,
  
  ty_shop_item_tt type standard table of ty_shop_item,

  begin of ty_shop,
    shop_name type string,
    items     type ty_shop_item_tt, 
  end of ty_shop.

Create an instance of abap mustache class, feed the desired template to it and then render with your data:

data lo_mustache type ref to lcl_mustache.
data lv_text     type string.

" c_nl is a shortcut for newline char, e.g. from cl_abap_char_utilities
lo_mustache = lcl_mustache=>create(
    'Welcome to {{shop_name}}!' && c_nl && 
    '{{#items}}'                && c_nl &&
    '* {{name}} - ${{price}}'   && c_nl &&
    '{{/items}}' ).

lv_text = lo_mustache->render( ls_my_data ). " ls_my_data type ty_shop 

As the result (lv_text) you'll get some output like this (assuming you filled the ls_my_data appropriately):

Welcome to My Super Store
* Boots - $99.00
* T-Short - $49.00
* Shirts - $59.00

Supported input and technical details

Data structure
  • Input data may be a structure or a table of any type - it is detected automatically. For a table the template is repeated for each line. The depth of the data is not limited for the moment (so can be table in struc in table in struc ...).
  • In addition, there is a special table type lcl_mustache=>ty_struc_tt which processed as a universal structure. Field name corresponds to tag name (case insesitive) and the value may be put either to val field or as a reference to dref. The latter can be then a reference to a structure or a table. So the above example may would look like:
data lt_uni_data type lcl_mustache=>ty_struc_tt.
field-symbols <i> like line of lt_uni_data.

append initial line to lt_uni_data assigning <i>.
<i>-name = 'shop_name'.
<i>-val  = 'My Super Store'.

append initial line to lt_uni_data assigning <i>.
<i>-name = 'items'.
get reference of lt_items to <i>-dref. " lt_items is the ty_shop_item_tt filled elsewhere
...
lv_text = lo_mustache->render( lt_uni_data ).
  • The lcl_mustache=>ty_struc_tt is mainly intended to be the root structure. Supposedly it is convenient to prepare parts of data as regular structures and tables. However, combining them all together at the top level in yet another dedicated structure may be cumbersome. This is where lcl_mustache=>ty_struc_tt may serve well. Although you are free to choose your own way of course.
Templates
  • Template may be a string or a table of strings (type string_table)
lo_mustache = lcl_mustache=>create( lv_template ). " iv_template = lv_template
* OR
lo_mustache = lcl_mustache=>create( it_template = lt_template_tab ). " TABLE of strings
  • Output can be received as a string or a table of string (type string_table)
lv_text = lo_mustache->render( ls_my_data ).
* OR
lt_text_tab = lo_mustache->render_tt( ls_my_data ). " TABLE
  • Template as table is supposed to be separated by newlines. So in case of string rendering newline char will be inserted between template lines. In case of render_tt newline char is not inserted (still if any template line contain line breaks it will be split into several output table lines).
  • Input string template is split by newline chars for internal processing. Both LF and CRLF separators are supported (detected automatically).
Partials

The class supports partials (see example below). So you may prepare your templates in convenient and logical sections. And reuse them if necessary.

lo_mustache = lcl_mustache=>create(
    'Welcome to {{shop_name}}!' && c_nl && 
    '{{>items_template}}' ).  " << Calling partial !

lo_partial  = lcl_mustache=>create(
    '{{#items}}'                && c_nl &&
    '* {{name}} - ${{price}}'   && c_nl &&
    '{{/items}}' ).

lo_mustache->add_partial(     " Register partial
  iv_name = 'items_template' 
  io_obj  = lo_partial ).

lv_text = lo_mustache->render( ls_my_data ). " ls_my_data type ty_shop 
More

Further information can be found in wiki. There are also some notes on performance.

Installation

  • The best option to install is to clone the repository to your SAP system using abapGit tool.
  • Alternatively, create zmustache and zmustache_ut includes and fill with the content of zmustache.prog.abap and zmustache_ut.prog.abap respectively. zmustache_ut is the unit tests include, so you might potentially skip it (just remove the references to ltcl_mustache from the first include).

Plans

Here are some stuff I might be implementing with time:

  • Some stuff inspired by Handlebars, in particular:
    • inline partials (within one template)
    • if/else
    • each/else
    • with and maybe path features (not sure)
    • section parameters
    • maybe some sort of helpers
  • calling object methods for parts of data
  • references to object attributes (maybe, if will be needed)

Still some real usage statistics would be valuable to decide on this or that feature.

Contribution

Contribution is always welcomed :)

License

The code is licensed under MIT License. Please see LICENSE for details.

MIT, read
UI written in ABAP
  1. abap2UI5-localabap2UI5 folded into the local classes of one HTTP handlerfrom ABAP
  2. abap2UI5UI5 apps written as one ABAP class, rendered by a generic shellfrom ABAP
  3. abap-cloud-guiReport-style programming model for abap2UI5 on ABAP Cloudfrom ABAP
  4. custom-controlsThirteen custom UI5 controls for abap2UI5 appsfrom ABAP
  5. http-connectorForwards abap2UI5 roundtrips to another system over HTTPfrom ABAP
  6. layout-managementTable and form layouts with saved variants for abap2UI5from ABAP
  7. abap2UI5 for ExcelOffice add-in running an abap2UI5 app in Excel's task panefrom ABAP
  8. abap2UI5-addons/popupsReady-made dialogs for abap2UI5 appsfrom ABAP
  9. rap-extFloorplans rendered from CDS UI annotations as abap2UI5 appsfrom ABAP
  10. selection-screenSelect-options with saved variants for abap2UI5 appsfrom ABAP
  11. abap2UI5 frontend-webcomponentabap2UI5 frontend rendering with UI5 Web Componentsfrom ABAP
  12. abap2UI5 frontendabap2UI5 frontend as ABAP artefacts installed with abapGitfrom ABAP
  13. abap2UI5 Layout EditorDrag-and-drop UI5 view editor that writes an abap2UI5 app classfrom ABAP
  14. abap2UI5 protocolVersioned specification of the abap2UI5 roundtrip protocolfrom ABAP
  15. ZFPM_TOOLSEdits, copies and transports a whole FPM hierarchy at oncefrom ABAP
  16. ZWD_CALENDAR_VHWeb Dynpro ABAP calendar value help for date fieldsfrom ABAP

Details

Sources3
Added by handdiscovered herechecked
github.com/sbcgua/abap_mustachetree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
discovered viaAdded by hand
first seen in the atlas
ecosystem and domainabap, ui-and-frontend-bridge
abaplint
issues under its own abaplint configuration1,160
lines2,976
statements2,412
objects11
files27
analysed, master
abaplint version2.120.84
Flavors1
ABAP Cloud
“The library has a Steampunk (740+) compatible version, thanks to @DerGuteWolf. Currently it lives in the [steampunk](https://github.com/sbcgua/abap_mustache/tree/steampunk) branch.” — sbcgua/abap_mustache — README, Versionschecked
Contributors3

From the repository’s contributor list, .

History in the atlas1
  1. First seen.
For your agent
Ref
artifact:sbcgua-abap-mustache
JSON
/artifacts/sbcgua-abap-mustache.json
MCP
Connecting an agent