Webtags (preserving history): Difference between revisions

From Cumulus Wiki
Jump to navigationJump to search
m
(37 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Category:Terminology]]
[[Category:Terminology]]


=What is a web tag or token?=
=What is a web tag? =


Put simply, what Cumulus 1 calls a web tag, and MX calls a web token, is included in a Cumulus template file to indicate where Cumulus should insert values when it produces an output file. The concept of [[Customised_templates#What_is_meant_by_.27Cumulus_processes_templates.27|processing templates]] is explained in another article.  The output file can be a [[Customised_templates#HTML_5_-_a_very_quick_guide_to_structure|web page]], a [[Feels_Like#HTML_code_to_translate_web_tags_to_JavaScript_variables_.28as_modified_for_additional_parameters.29|JavaScript file]], a PHP script, or a [[Xml_webtags|eXtensible Mark-up Language (XML)]] file.
Put simply, a web tag is included in a Cumulus template file to indicate where Cumulus should insert values when it produces an output file. The concept of [[Customised_templates#What_is_meant_by_.27Cumulus_processes_templates.27|processing templates]] is explained in another article.  The output file can be a [[Customised_templates#HTML_5_-_a_very_quick_guide_to_structure|web page]], a [[Feels_Like#HTML_code_to_translate_web_tags_to_JavaScript_variables_.28as_modified_for_additional_parameters.29|JavaScript file]], a PHP script, or a [[Xml_webtags|eXtensible Mark-up Language (XML)]] file.
 
== Why does MX talk about tokens? ==
 
MX uses a '''token parser''' to read the web tags, so if diagnostic output refers to tokens, it is saying the attempt to actually work out what was required from the web tag with its tag name and parameters has encountered a problem.


{{TOCright}}
{{TOCright}}
Line 23: Line 27:
=What this article covers =
=What this article covers =


At the last count MX produces nine and a half million Web tags/tokens! But the file mentioned in previous section contains just 717 items. How come this discrepancy?
At the last count MX produces nine and a half million '''web tags'''! But the file mentioned in previous section contains just 717 items. How come this discrepancy?


Well each web tag has the general format <tt><#tag_name input_parameter output_parameter></tt> and it is these parameters that allow 717 items to produce milllion values!
Well each web tag has the general format <tt><#tag_name optional_input_parameter optional_output_parameter></tt> and it is adding these optional parameters that allow 717 tag names to define million values!


Because this article describes the parameters available, it covers more than just web tags, it lists the way that you can specify the naming format for the NOAA style reports that Cumulus produces as those names use a sub-set of the output parameters.
Because this article describes the parameters available, it covers more than just web tags, it lists the way that you can specify the naming format for the NOAA style reports that Cumulus produces as those names use a sub-set of the same output parameters as web tags use.


Although web tags apply to all flavours of Cumulus (Cumulus 1, 2, and 3 aka MX), as mentioned above, the range available depends on the exact version/build of Cumulus you are using. Because Cumulus 2 is no longer available, it has been ignored in the tables below. However, in the tables of web tags below, some sections are marked '''Cumulus 1 only''', or '''MX only''', and some individual tags have icon markings indicating aspects that apply only to a particular flavour.  It is important to stress that these "C1" markings are for the final version of Cumulus 1 (and so if you are running an earlier version, some may not be available to you). Similarly the "MX" markings apply to the latest version of MX (and if you are using an earlier build, some may not be available to you). In general, Cumulus 1 will silently ignore any web tags it does not recognise, but MX will raise an error for any web token it does not understand how to process. Both flavours may either ignore, give wrong values, or refuse to accept, incorrect input or incorrect output parameters, this varies by tag/token and has not been indicated in the tables below.
Although web tags apply to all flavours of Cumulus (Cumulus 1, 2, and 3 aka MX), as mentioned above, the range available depends on the exact version/build of Cumulus you are using. Because Cumulus 2 is no longer available, it has been ignored in the tables below. However, in the tables of web tags below, some sections are marked '''Cumulus 1 only''', or '''MX only''', and some individual tags have icon markings indicating aspects that apply only to a particular flavour.  It is important to stress that these "C1" markings are for the final version of Cumulus 1 (and so if you are running an earlier version, some may not be available to you). Similarly the "MX" markings apply to the latest version of MX (and if you are using an earlier build, some may not be available to you). In general, Cumulus 1 will silently ignore any web tags it does not recognise, but MX will raise an error for any web tag it does not understand how to process when the "token parser" runs. Both flavours may either ignore, give wrong values, or refuse to accept, incorrect input or incorrect output parameters, this varies by web tag and has not been indicated in the tables below.


= NOAA style Report Naming =
= NOAA style Report Naming =
Line 120: Line 124:
= Template Files =
= Template Files =


This is the name given by Steve Loft to any files that contain web tags/tokens.
This is the name given by Steve Loft to any files that contain web tags and need to be processed before they actually include values.  


When Cumulus processes these files it generates output files where the tags/tokens have been replaced by values.
When Cumulus processes these files it generates output files where the tags/tokens have been replaced by values. Consequently, a single template will actually generate a different file each time Cumulus processes that template because the part of the content that was web tags is now populated with text (values, times, dates, etc.) and as these values change that make the file different to the previous generated file.


For standard Cumulus, all the output files are web pages which it then uploads to your web site. There is more about processing of files on the [[Customised templates]] page, but think of a template as containing text that Cumulus copies from the template file to the web page it is constructing. The processing process is basically a parse, each time it finds what MX calls a token (a web tag complete with any parameters it needs) it looks up the value that it will use to replace that web tag before moving on through the text.  
For standard Cumulus, all the output files are web pages which it then uploads to your web site. There is more about processing of files on the [[Customised templates]] page, but think of a template as containing text that Cumulus copies from the template file to the web page it is constructing. The processing process is basically a parse, each time it finds what MX calls a token (a web tag complete with any parameters it needs) it looks up the value that it will use to replace that web tag before moving on through the text.  


The example web templates provided by Cumulus insert a "T" at the end of the intended web page name before the extension (.htm or .html), so that the template files and generated web pages cannot be confused.
The example web templates provided by Cumulus insert a "T" at the end of the intended web page name before the extension (.htm or .html), so that the template files and generated web pages cannot be confused. The generated file will often have "tmp" added to the end


When writing your own templates, some people will stick to this "T" notation, others will change the extension to "tmpl" or "cum" to indicate they are Cumulus templates. Cumulus does not care what extension is used for any local file specified in the MX '''Extra Web Files''' settings or Cumulus 1 '''Files''' tab settings.
When writing your own templates, some people will stick to this "T" notation, others will change the extension to "tmpl" or "cum" to indicate they are Cumulus templates. Cumulus does not care what extension is used for any local file specified in the MX '''Extra Web Files''' settings or Cumulus 1 '''Files''' tab settings.
For Cumulus 1 and MX, there are one template held within the program code, this is what produces the default [[Realtime.txt]]. You can define an alternative template with web tags and Cumulus can process that instead of its default template.
For MX only, there are other templates held within the program code (so you cannot edit them), these output in json format. Some are application program interface, and feed information to the admin interface, you can only view these by using the development interface in your browser that lets you see what has been loaded. The rest become the json files that are created in the '''web''' folder from where (like the web pages produced after processing the standard web templates), they can be uploaded to your web site.


= Web tags available in Cumulus =
= Web tags available in Cumulus =
Line 142: Line 150:
The [[BETA webtags|additional webtags]] page was created to hold web tags that were not yet available in any Cumulus 1 formal release, but were available in any Beta version that was under development. When development of Cumulus 1 ceased, that page held all web tokens specific to the MX Beta then under development. So at that time you had 2 articles to read to find which web tokens were available in MX Beta, and it was not clear in this article which web tags were only available in Cumulus 1!
The [[BETA webtags|additional webtags]] page was created to hold web tags that were not yet available in any Cumulus 1 formal release, but were available in any Beta version that was under development. When development of Cumulus 1 ceased, that page held all web tokens specific to the MX Beta then under development. So at that time you had 2 articles to read to find which web tokens were available in MX Beta, and it was not clear in this article which web tags were only available in Cumulus 1!


For a while, some web tokens alterations, for example [[BETA_webtags#Day.2FNight.2FSun.2FMoon|Moon web tags]] had parameters added to control the output from build 3047, continued to be added to the Beta article. You should keep an eye on that Beta article just in case as MX is being developed any more appear there, although at time of writing new MX web tokens are now being added to this article.
For a while, some web tag alterations, for example [[BETA_webtags#Day.2FNight.2FSun.2FMoon|Moon web tags]] had parameters added to control the output from build 3047, continued to be added to the Beta article. You should keep an eye on that Beta article just in case as MX is being developed any more appear there, although at time of writing new MX web tokens are now being added to this article.


When Mark Crossley brought MX out of Beta, all the web tokens that were on that page were moved into this article, and it was made clear which flavours each web tag was available in (excluding Cumulus 2).
When Mark Crossley brought MX out of Beta, all the web tags that were on that page were moved into this article, and it was made clear which flavours each web tag was available in (excluding Cumulus 2).


== Case sensitivity ==
== Case sensitivity ==
Line 158: Line 166:
You will find yourself frequently having to refer to this article, if you decide to make your own Cumulus templates (see section below for more information). This applies whether those templates are for [[Customised templates|web pages]],  to implement [[Xml webtags|Extensible Mark-up Language files]],  or [[Php webtags|PHP Hypertext Pre-processor scripts]]. This because web tags were introduced at different times, and there was no convention as to how they were named, so there is great inconsistency in the naming, making it very easy to spell a tag_name incorrectly.
You will find yourself frequently having to refer to this article, if you decide to make your own Cumulus templates (see section below for more information). This applies whether those templates are for [[Customised templates|web pages]],  to implement [[Xml webtags|Extensible Mark-up Language files]],  or [[Php webtags|PHP Hypertext Pre-processor scripts]]. This because web tags were introduced at different times, and there was no convention as to how they were named, so there is great inconsistency in the naming, making it very easy to spell a tag_name incorrectly.


For example the character "Y" might be included in a web tag to denote '''yesterday''' or it might denote ''this year''. Some web tags for '''today''' include a "T" as a suffix, some do not. "T" is also used as a suffix for the time-stamp tags. Some tags are all lower-case, some are camel-case, and some start with a capital letter. Have a look yourself at just how much inconsistency is present in the names in the tables below.
For example the character "Y" might be included in a web tag to denote '''yesterday''', or it might denote ''this year''; where the Y is indicating '''yesterday''', it is sometimes a ''prefix'', sometimes a ''suffix''!
 
Some web tags for '''today''' include a "T" as a suffix, some do not. "T" is also used as a suffix for the time-stamp tags.  
 
Some tags are all lower-case, some are camel-case, and some start with a capital letter. Have a look yourself at just how much inconsistency is present in the names in the tables below.


In the web tag to PHP variable scripts, I have posted, see [[Php_webtags#Minimised_Upload_size]], I have tried to introduce better consistency in the PHP variable names, so "T" is added as a suffix to all "today" variables for example. Some other script authors try to match the inconsistent web tag names, so their script variable names are also inconsistent.
In the web tag to PHP variable scripts, I have posted, see [[Php_webtags#Minimised_Upload_size]], I have tried to introduce better consistency in the PHP variable names, so "T" is added as a suffix to all "today" variables for example. Some other script authors try to match the inconsistent web tag names, so their script variable names are also inconsistent.
Line 166: Line 178:
=== Input modification Parameters ===
=== Input modification Parameters ===


Most web tags do not require any input parameters. However, those for [[#Recent_History|individual minutes in last week]] and for [[#Monthly_All_Time_Records|the highest and lowest values for a particular month of any year]] do need input parameters specifying how many minutes ago or which month respectively. See the respective sections for full details.
Most web tags do not require any input parameters. There are currently only two types of tags where an input parameter is mandatory:
 
*The recent history tags where a separate one exists for [[#Recent_History|individual minutes in last week]] need input parameter specifying how many minutes ago is required. There are 3 separate input parameters that can be used alone or in combination as explained in relevant section.
*The [[#Monthly_All_Time_Records]] where a separate one exists for each particular month (of any year) need input parameter specifying which month. Again see the respective section for full details of input parameter (which is 1 for January to 12 for December, but 0 is also available with a special meaning).


=== Output modification parameters ===
=== Output modification parameters ===
Line 198: Line 213:


[[File:Badge vMx.png]]
[[File:Badge vMx.png]]
Cumulus MX provides many, but not all web tags available in Cumulus 1. MX adds many more web tokens. The terminology change is just an extra complication! This badge is used when web tokens listed in one of the tables are only available in MX. See [[#GENERAL_TIP|tip]] at top of page for how to check which web tags/tokens are available in your build.  
Cumulus MX provides many, but not all web tags that were available in Cumulus 1. MX adds many more web tags, mostly in support of new weather stations or new sensors. This badge is used against web tags listed in one of the tables that are only available in MX. See [[#GENERAL_TIP|tip]] at top of page for how to check which web tags are available in your build.  


A combination of badges appears where certain aspects apply to Cumulus 1 or to MX. No information is given for Cumulus 2 as it is no longer available.
A combination of badges appears where certain aspects apply to Cumulus 1 or to MX. No information is given for Cumulus 2 as it is no longer available.


When MX is processing web tokens and finds one it cannot understand, a "*** web tag error - see MXdiags file ***" message will appear in the engine console, and the diagnostic file will include something like this:
When MX is processing web tags and finds one it cannot understand, a "*** web tag error - see MXdiags file ***" message will appear in the engine console, and the diagnostic file will include something like this, notice the actual web tag is labelled "token":
<pre>Web tag error
<pre>Web tag error
Exception: i=8998 len=106297
Exception: i=8998 len=106297
inputText.Length=106297
inputText.Length=106297
token=<#daylightlength format=H></pre>
token=<#daylightlength format=H></pre>
This particular error is that when you use a single output format character it does not have same meaning as when there are multiple characters, correct this particular token to:
This particular error is that when you use a single output format character it does not have same meaning as when there are multiple characters, correct this particular web tag to:
<pre><#daylightlength format=%H></pre>
<pre><#daylightlength format=%H></pre>


Line 214: Line 229:
=Output 'format' Parameter=
=Output 'format' Parameter=


=== Output Parameter Differences between Cumulus 1 and Cumulus MX (Cumulus 3) ===
The majority, but not all, of web tags either can use an output format parameter or, in a few cases, really do need an output format parameter.
 
== Output Parameter Differences between Cumulus 1 and Cumulus MX (Cumulus 3) ==
 
There are a number of differences between Cumulus 1 (C1) and Cumulus MX (MX). These nearly all involve times and dates, so the next section deals with this.
 


There are a number of differences between Cumulus 1 (C1) and Cumulus MX (MX). C1 can work with times in 14.24 format using a full stop to separate the figures, MX must have ':' between hour and minute numbers.
=== Output (format modifier) parameters for times and dates ===


The characters used to represent year, month, day, hour, minute, second, microsecond, also differ between C1 and MX.
Time/Date format codes are used in two places:
# As part of report names for NOAA style reports (see [[Cumulus.ini#Section:_NOAA]])
# As part of web-tags that report either times or dates or both a date and a time
From version 1.9.1 most web-tags  that report any form of time or date will accept an optional 'format' parameter, e.g. (Cumulus 1 only): <#YearTempHT format=hh:nn>.


In Cumulus 1 we are able to use "m" or "M" for two different meanings (minutes or month) depending on context. Similarly, in MX the same character sometimes has two different meanings depending on context, but this applies to lots of characters and the context is whether the character is used on its own or with other characters. '''Sounds confusing?''' Well it is complicated.
This allows you to override the default display format for that item, using the format specifiers in the table below.
 
Although, in theory, you can specify date formatting to times, and vice versa, this will not always yield a sensible result. It is best to look at the default format (in most, but not all, cases this reveals whether date and time information are both available):
*The time-stamps for today, and yesterday, only contain time information, so only time-based format instructions should be applied to them. You can use date format parameters on (for example) <#metdate>, and <#metdateyesterday> and that may give you your desired date information to augment the time-stamps.
*Almanac times such as sun-rise, moon-rise, are also only times, and time-based format instructions can generally be applied to them.  However, be aware these are calculated as at midnight GMT and for some of your calendar days, the times may be reported (in default format) as '--' if for example the moon does not rise that day.
 
C1 can work with times in 14.24 format using a full stop ('.') to separate the figures, MX must have colon (':') between hour and minute numbers. But with both flavours you can choose whether 12-hour clock is used with am/pm (in lowercase or capitals) or the 24-hour clock is used. You can choose to include/exclude leading zero for hours. You can only report the hour if you don't care about the minutes, or only report the minutes if you don't need the hour. In most cases you can add seconds to the output, and either milliseconds or microseconds. This does not imply that Cumulus calculates everything every microsecond, in fact many are only calculated once a minute, but the flexibility is there for time outputs.
 
Some web tags contain dates, or both dates and times, and for these there is flexibility (apart from those with fixed format, these might have ISO, or another format indicator, in their tag name) as to how the date is output. Thus you can choose to include or exclude the year; you can represent month in letters or numbers, and you can vary the order in which elements of the date are shown.
 
The characters used to represent year, month, day, hour, minute, second, microsecond, do differ between C1 and MX. In Cumulus 1 we are able to use "m" or "M" for two different meanings (minutes or month) depending on context. Similarly, in MX the same character sometimes has two different meanings depending on context, but this applies to lots of characters and the context is whether the character is used on its own or with other characters. '''Sounds confusing?''' Well it is complicated.


==== Explanation ====
==== Explanation ====


*Cumulus MX (when running on Windows) uses the '''.NET''' software.  
*Cumulus MX (when running on Windows) uses the '''.NET''' software.  
*If Cumulus MX is running on Linux or Mac OS X, or any other device that uses UNIX derived operating system, then it uses '''Mono''' software for same purposes. (MONO is a operating system independent version of .NET, although they are developed independently, they have common origins).
*If Cumulus MX is running on Linux or Mac OS X, or any other device that uses UNIX derived operating system, then it uses '''Mono''' software for same purposes. (MONO is a operating system independent version of .NET, although they are developed independently, they have common origins). Please see the [[Cumulus MX]] article for more details of their differences and what will change in November 2020.
*The date and time format characters in Mono (and .NET) software framework are not exactly the same as the '''Delphi''' software framework ones that Cumulus 1 uses.   
*The date and time format characters in Mono (and .NET) software framework are not exactly the same as the '''Delphi''' software framework ones that Cumulus 1 uses.   
*For Cumulus MX see [http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx this Microsoft site] for format selectors available.  
*For Cumulus MX see [http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx this Microsoft site] for format selectors available.  
*The differences come about because Delphi is case-insensitive, while .NET and MONO are case sensitive, so .NET (and MONO) can use upper and lower case for different items, where Delphi has to use different letters for each item.
*The differences come about because Delphi is case-insensitive, while .NET and MONO are case sensitive.  Consequently, .NET (and MONO) can use upper and lower case for different items, but Delphi has to use different letters, ignoring case, for each item.


==== When it causes problems ====
==== When it causes problems ====
Line 260: Line 293:
* You may need to use both single quotes and back slashes in some format specifiers, depending whether the characters you want to include can be interpreted as control characters (yes, backslash is also used to escape control characters, so backslash will NOT work for some characters such as those in "on" and "at" [\n will produce new line not the letter n, \t will produce a tab not the letter t]), consequently for some characters you must use the literal approach to include them in your format.
* You may need to use both single quotes and back slashes in some format specifiers, depending whether the characters you want to include can be interpreted as control characters (yes, backslash is also used to escape control characters, so backslash will NOT work for some characters such as those in "on" and "at" [\n will produce new line not the letter n, \t will produce a tab not the letter t]), consequently for some characters you must use the literal approach to include them in your format.


==== Using HTML tags within format parameters (available in MX only) ====
=== List of allowed modifiers for output format parameters ===
Note for Cumulus 1 - where lower (or upper, for easier comparison with MX) case shown, because Delphi is case insensitive, upper (or lower) case (in some cases, indicated by use of curved brackets) could be used instead (exceptions: a/p, ampm, am/pm, Am/Pm, AM/PM, A/P, AMPM etc display as input).


'''Example using a class to change the look of part of the output'''
[[File:Badge vMx.png]]Remember that most single character format specifiers have a different meaning to when the same letter appears in a multi-character format.


<pre><#TapptempH format="dd'&nbsp;'MMM'&nbsp;'yyyy'<span class=\'xx\'> at 'HH:mm'</span>'"></pre>
the output from this will look like ''04&nbsp;Dec&nbsp;2018<span class='xx'> at 10:12</span>''


'''Note where the quotes are, and where you need to use '\' escape characters'''.
==== Forum reference ====


'''Example using HTML tags'''
For official full details see [https://cumulus.hosiene.co.uk/viewtopic.php?f=39&t=17888 Cumulus MX forum], the following table is revised for simplicity. (I've given a different selection of combinations and included '%' where necessary to avoid single character versus custom complications).


<pre><#RecentTS d=2 format="h:mm'&nbsp;'tt'<small>on' d/M/yyyy'</small>'"></pre>
==== My Revised Table of Time and Date Output Modifiers ====
This puts the date in a smaller font than the time


=== Output (format modifier) parameters for decimal places ===
In some rows of this table, square brackets [] indicate optional items, they are included just to make it clearer how items can be combined in a single output parameter.
 
{| class="wikitable" border="1"
 
|-
Cumulus 1 allows use of <tt>dp=n</tt> modifier (where n represents desired number of decimal places for latitude and longitude e.g. <#latitude dp=5> gives "59.24250". This is also available in MX.
!style="width:150px" | {{Version badge 1}}Delphi Specifier for Cumulus 1.9.x
MX makes much more usage of these '''dp''' parameters. For example in the moon tags  <#MoonAge> gives "11" but <#MoonAge dp=3> gives "11.234"  
!style="width:150px" | [[File:Badge vMx.png]]Mono/.NET Specifier for Cumulus MX
 
!style="width:600px" | Displays
*<tt>dp=i</tt> is used for both Cumulus 1 and MX. The value '''i''' following the attribute '''dp''' is an integer, how many decimal places you want for the output you see. Only available for a limited range of web tags (latitude and longitude, plus in MX <#MoonPercent> and <#MoonPercentAbs>).
!style="width:600px" | Example
*<tt>tc=y</tt> is a new parameter only in MX, the attribute '''tc''' takes the value 'y' to remove decimal places by truncation instead of using <tt>dp=0</tt> which would round to nearest integer. e.g. <#MoonAge tc=y>. At present not available in any other web tags.
|-
 
|c
=== Output (format modifier) indicating remove commas ===
|G
 
|Displays the date using the format given by the Short Date format, followed by the time using the format given by the Long Time format. The time is not displayed in Cumulus 1 if the date-time value indicates midnight precisely.
"rc=y" is a '''new parameter for MX''', the attribute '''rc''' takes the value 'y' to replace any commas defined by the locale with full stops to separate integer and decimal parts of the output value. It was initially only implemented on a few new web tags (#MoonPercent, #MoonPercentAbs, #MoonAge) for MX versions up to and including 3.5.3. From version 3.6.6 only can all web tags that can output real numbers can now use alternative syntax of <tt><#tag_name rc=y></tt> to replace all commas in the output by a full stop (don't worry, MX does not use a comma for separating off thousands, so it is the decimal comma that becomes a decimal full stop like character when this remove comma specifier is used.
|'22/03/2019 09:47:25' produced by {{Version badge 1}}<#time format=c>[[File:Badge vMx.png]]<#time format=G>
 
|-
 
|d
Why would you want to remove decimal commas?  Well because the JavaScript language cannot understand decimal commas, and MX has several scripts written in this language, equally some third party alternative web pages rely on ajax to update them (and Ajax uses JavaScript).
|%d
 
|Displays the day as a number without a leading zero (1-31). [[File:Badge vMx.png]]Note that Cumulus MX requires a ' ' (space), '%' or other modifier to be included, as 'd' on its own returns full 'short date').
=== Output (format modifier) parameters for times and dates ===
|27 produced by {{Version badge 1}}<#metdate format="d">[[File:Badge vMx.png]]<#metdate format="%d">
 
|-
Time/Date format codes are used in two places:
|dd
# As part of report names for NOAA style reports (see [[Cumulus.ini#Section:_NOAA]])
|dd
# As part of web-tags that report either times or dates or both a date and a time
|Displays the day as a number with a leading zero (01-31).
From version 1.9.1 most web-tags  that report any form of time or date will accept an optional 'format' parameter, e.g. (Cumulus 1 only): <#YearTempHT format=hh:nn>.
|07 produced by <#metdate format="dd">
 
|-
This allows you to override the default display format for that item, using the format specifiers in the table below.
|ddd
 
|ddd
Although, in theory, you can specify date formatting to times, and vice versa, this will not always yield a sensible result. It is best to look at the default format (in most, but not all, cases this reveals whether date and time information are both available):
|Displays the day as an abbreviation (Sun-Sat) using the strings appropriate to the Locale.
*The time-stamps for today, and yesterday, only contain time information, so only time-based format instructions should be applied to them. You can use date format parameters on (for example) <#metdate>, and <#metdateyesterday> and that may give you your desired date information to augment the time-stamps.
|'Wed' produced by <#metdate format="ddd"> (English locale)
*Almanac times such as sun-rise, moon-rise, are also only times, and time-based format instructions can generally be applied to them.  However, be aware these are calculated as at midnight GMT and for some of your calendar days, the times may be reported (in default format) as '--' if for example the moon does not rise that day.
|-
 
|dddd
=== Additional text in output format partameters ===
|dddd
 
|Displays the day as a full name (Sunday-Saturday) using the strings appropriate to the Locale.
You should put anything that is additional, to the defined format modifier specification below, into single quotation marks to prevent it being interpreted as a date or time format modifier:
|'Friday' produced by <#metdate format="dddd"> (English locale)
 
#For example, the word "on" contains the character "n", which for Cumulus versions 1.9.1 to 1.9.4 will be interpreted as a time format modifier unless you put it into single quotation marks. Example of valid Cumulus 1 syntax: <#TtempH format="'at' hh: mm 'on' dd / mm / yyyy">.
#You can include HTML tags (but they cannot have any attributes because both single and double quote characters have defined meanings) and special characters as quoted text within the 'format' parameter.<br>  Example of valid syntax: <#TapptempH format="'at 'h:nn'&nbsp;'am/pm '&lt;small&gt;on' d/m/yyyy'&lt;/small&gt;'">.
 
{{Version badge 1}}'''Note for Cumulus 1 -  if your format has any spaces in it''', you must enclose the whole format parameter value in double quotes, for example (Cumulus 1.9.x): <#YearTempHT format="hh nn">. Consequently, you cannot include double quote characters in any other position (see [[Php_webtags#Web_tag_Complications| here for work-around]]).
 
[[File:Badge vMx.png]]Note for MX - you can use single quotation marks round spaces and text (e.g. ' on '), but you can also use '\' as escape character (e.g. for 'on' use '''\o\n'''). However for 'at' the only alternative is '''\a't''''  because the character t has another meaning and escape followed by a t becomes a tab!
 
=== List of allowed modifiers for output format parameters ===
Note for Cumulus 1 - where lower (or upper, for easier comparison with MX) case shown, because Delphi is case insensitive, upper (or lower) case (in some cases, indicated by use of curved brackets) could be used instead (exceptions: a/p, ampm, am/pm, Am/Pm, AM/PM, A/P, AMPM etc display as input).
 
[[File:Badge vMx.png]]Remember that most single character format specifiers have a different meaning to when the same letter appears in a multi-character format.
 
 
==== Forum reference ====
 
For official full details see [https://cumulus.hosiene.co.uk/viewtopic.php?f=39&t=17888 Cumulus MX forum], the following table is revised for simplicity. (I've given a different selection of combinations and included '%' where necessary to avoid single character versus custom complications).
 
==== My Revised Table of Time and Date Output Modifiers ====
 
In some rows of this table, square brackets [] indicate optional items, they are included just to make it clearer how items can be combined in a single output parameter.
{| class="wikitable" border="1"
|-
|-
!style="width:150px" | {{Version badge 1}}Delphi Specifier for Cumulus 1.9.x
|ddddd
!style="width:150px" | [[File:Badge vMx.png]]Mono/.NET Specifier for Cumulus MX
|d (as single character format)
!style="width:600px" | Displays
!style="width:600px" | Example
|-
|c
|G
|Displays the date using the format given by the Short Date format, followed by the time using the format given by the Long Time format. The time is not displayed in Cumulus 1 if the date-time value indicates midnight precisely.
|'22/03/2019 09:47:25' produced by {{Version badge 1}}<#time format=c>[[File:Badge vMx.png]]<#time format=G>
|-
|d
|%d
|Displays the day as a number without a leading zero (1-31). [[File:Badge vMx.png]]Note that Cumulus MX requires a ' ' (space), '%' or other modifier to be included, as 'd' on its own returns full 'short date').
|27 produced by {{Version badge 1}}<#metdate format="d">[[File:Badge vMx.png]]<#metdate format="%d">
|-
|dd
|dd
|Displays the day as a number with a leading zero (01-31).
|07 produced by <#metdate format="dd">
|-
|ddd
|ddd
|Displays the day as an abbreviation (Sun-Sat) using the strings appropriate to the Locale.
|'Wed' produced by <#metdate format="ddd"> (English locale)
|-
|dddd
|dddd
|Displays the day as a full name (Sunday-Saturday) using the strings appropriate to the Locale.
|'Friday' produced by <#metdate format="dddd"> (English locale)
|-
|ddddd
|d (as single character format)
|Displays the date using the format given by the Short Date format.
|Displays the date using the format given by the Short Date format.
|e.g. '22/03/2019' (British Locale)
|e.g. '22/03/2019' (British Locale)
Line 520: Line 499:
|'xy' or ''\x\y''
|'xy' or ''\x\y''
|Characters enclosed in single quotation marks are displayed as such, and do not affect formatting. In MX each character to be displayed as it was typed can be prefixed by a backslash.
|Characters enclosed in single quotation marks are displayed as such, and do not affect formatting. In MX each character to be displayed as it was typed can be prefixed by a backslash.
|Hypens are added in this PHP language example  '<#LastDataReadT format=yyyy>'.'-'.'<#LastDataReadT format=MM>'.'-'.'<#LastDataReadT format="dd">'
|Hyphens are added in this PHP language example  '<#LastDataReadT format=yyyy>'.'-'.'<#LastDataReadT format=MM>'.'-'.'<#LastDataReadT format="dd">'
|}
|}
==== Using HTML tags within format parameters (available in MX only) ====
'''Example using a class to change the look of part of the output'''
<pre><#TapptempH format="dd'&nbsp;'MMM'&nbsp;'yyyy'<span class=\'xx\'> at 'HH:mm'</span>'"></pre>
the output from this will look like ''04&nbsp;Dec&nbsp;2018<span class='xx'> at 10:12</span>''
'''Note where the quotes are, and where you need to use '\' escape characters'''.
'''Example using HTML tags'''
<pre><#RecentTS d=2 format="h:mm'&nbsp;'tt'<small>on' d/M/yyyy'</small>'"></pre>
This puts the date in a smaller font than the time
=== Output (format modifier) parameters for decimal places ===
Cumulus 1 allows use of <tt>dp=n</tt> modifier (where n represents desired number of decimal places for latitude and longitude e.g. <#latitude dp=5> gives "59.24250". This is also available in MX.
MX makes much more usage of these '''dp''' parameters. For example in the moon tags  <#MoonAge> gives "11" but <#MoonAge dp=3> gives "11.234"
*<tt>dp=i</tt> is used for both Cumulus 1 and MX. The value '''i''' following the attribute '''dp''' is an integer, how many decimal places you want for the output you see. Only available for a limited range of web tags (latitude and longitude, plus in MX <#MoonPercent> and <#MoonPercentAbs>).
*<tt>tc=y</tt> is a new parameter only in MX, the attribute '''tc''' takes the value 'y' to remove decimal places by truncation instead of using <tt>dp=0</tt> which would round to nearest integer. e.g. <#MoonAge tc=y>. At present not available in any other web tags.
=== Output (format modifier) indicating remove commas ===
"rc=y" is a '''new parameter for MX''', the attribute '''rc''' takes the value 'y' to replace any commas defined by the locale with full stops to separate integer and decimal parts of the output value. It was initially only implemented on a few new web tags (#MoonPercent, #MoonPercentAbs, #MoonAge) for MX versions up to and including 3.5.3. From version 3.6.6 only can all web tags that can output real numbers can now use alternative syntax of <tt><#tag_name rc=y></tt> to replace all commas in the output by a full stop (don't worry, MX does not use a comma for separating off thousands, so it is the decimal comma that becomes a decimal full stop like character when this remove comma specifier is used.
Why would you want to remove decimal commas?  Well because the JavaScript language cannot understand decimal commas, and MX has several scripts written in this language, equally some third party alternative web pages rely on ajax to update them (and Ajax uses JavaScript).
== Additional text in output format parameters ==
You should put anything that is additional, to the defined format modifier specification below, into single quotation marks to prevent it being interpreted as a date or time format modifier:
#For example, the word "on" contains the character "n", which for Cumulus versions 1.9.1 to 1.9.4 will be interpreted as a time format modifier unless you put it into single quotation marks. Example of valid Cumulus 1 syntax: <#TtempH format="'at' hh: mm 'on' dd / mm / yyyy">.
#You can include HTML tags (but they cannot have any attributes because both single and double quote characters have defined meanings) and special characters as quoted text within the 'format' parameter.<br>  Example of valid syntax: <#TapptempH format="'at 'h:nn'&nbsp;'am/pm '&lt;small&gt;on' d/m/yyyy'&lt;/small&gt;'">.
{{Version badge 1}}'''Note for Cumulus 1 -  if your format has any spaces in it''', you must enclose the whole format parameter value in double quotes, for example (Cumulus 1.9.x): <#YearTempHT format="hh nn">. Consequently, you cannot include double quote characters in any other position (see [[Php_webtags#Web_tag_Complications| here for work-around]]).
[[File:Badge vMx.png]]Note for MX - you can use single quotation marks round spaces and text (e.g. ' on '), but you can also use '\' as escape character (e.g. for 'on' use '''\o\n''').  However for 'at' the only alternative is '''\a't''''  because the character t has another meaning and escape followed by a "t" i.e. "\t" becomes a tab!


=The Web Tags for Cumulus =
=The Web Tags for Cumulus =
Line 527: Line 549:
These are available in both Cumulus 1 and MX unless indicated by a version 1 or MX badge.
These are available in both Cumulus 1 and MX unless indicated by a version 1 or MX badge.


Here follow tables indicating what web tags/tokens can be used, tables group the tags/tokens by the basic purpose of the tags listed.
Here follow tables indicating what web tags/tokens can be used, tables group the web tags available by the basic purpose of the tags listed.


 
== System ==
===System===


Special tags returning information about the Windows device hosting Cumulus 1. ''If you are running MX, then most tags do not work.
Special tags returning information about the Windows device hosting Cumulus 1. ''If you are running MX, then most tags do not work.
Line 574: Line 595:
|}
|}


==Miscellaneous==
== Miscellaneous ==


All tags are available in all flavours, as far as I know, although their output might vary, and which input/output parameters they permit might vary between Cumulus 1 and MX.
All tags are available in all flavours, as far as I know, although their output might vary, and which input/output parameters they permit might vary between Cumulus 1 and MX.
Line 814: Line 835:
|-
|-
|<#apptemp>
|<#apptemp>
|The [[Apparent_temperature|apparent]] temperature.  The referenced page in weather terminology section of this Wiki explains it.
|The [[Apparent_temperature|apparent]] temperature.  The referenced page in weather terminology section of this Wiki explains it. The formula used is that defined by BOM. Although at temperatures above 20°C (68°F) Feels like reports an "apparent temperature" it uses a different formula.  
|-
|-
|<#wchill>
|<#wchill>
|The current [[wind chill]] temperature.  The referenced page in weather terminology section of this Wiki explains it.
|The current [[wind chill]] temperature.  The referenced page in weather terminology section of this Wiki explains it. For temperatures below 10°C (50°F) Feels like reports the same value.
|-
|-
|<#feelslike>
|<#feelslike>
|The current [[Feels_Like|Feels Like]] temperature. Available only from version 3.5.4. The referenced page in weather terminology section of this Wiki explains it.
|The current [[Feels_Like|Feels Like]] temperature. The referenced page in weather terminology section of this Wiki explains it. Although output from version 3.5.4 build 3075, the correct value is only available from version 3.6.10 (build 3086) onwards as incorrect formula used in builds 3084 and 3085, and a different formula used in builds from 3075 to 3083.
|-
|-
|<#IsFreezing>
|<#IsFreezing>
Line 1,123: Line 1,144:
|<#UserTemp1>  
|<#UserTemp1>  
|User Temperature 1
|User Temperature 1
support for the new Ecowitt WH34 soil and water temperature sensors
support for the Ecowitt WH34 (other model types exist and are reported here as if WH34) soil and water temperature sensors
|-
|-
|colspan="2"|... and so on up to <#UserTemp8> = User temperature 8
|colspan="2"|... and so on up to <#UserTemp8> = User temperature 8
Line 1,281: Line 1,302:


==Today==
==Today==
Many of these web tags are used on the supplied '''todayT.htm''' template, and the supplied '''todayyest.html''' page within the MX admin interface.
For web tags that report values that refer to a particular time of day, there is a corresponding web tag that can give the time of day, shown in same row of table below.  
For web tags that report values that refer to a particular time of day, there is a corresponding web tag that can give the time of day, shown in same row of table below.  


Line 1,287: Line 1,311:
|-
|-
!style="width:150px" | Web tag_name
!style="width:150px" | Web tag_name
!style="width:450px" | Function
!style="width:650px" | Function
!style="width:150px" | Time tag_name
!style="width:150px" | Time tag_name
|-
|-
Line 1,451: Line 1,475:


==Yesterday==
==Yesterday==
Note that the Y indicating yesterday is sometimes a prefix, sometimes a suffix (with H for High, L for Low), web tags are not named consistently!
Note that the Y indicating yesterday is sometimes a prefix, sometimes a suffix (with H for High, L for Low), web tags are not named consistently!


Many of these web tags are used on the supplied yesterdayT.htm template, and the supplied todayyest.html page within the MX user interface.
Many of these web tags are used on the supplied '''yesterdayT.htm''' template, and the supplied '''todayyest.html''' page within the MX admin interface.


For web tags that refer to a particular time of day, there is a corresponding web tag that can give the time of day. Please note none of the time web tags can be modified by output parameters to give a date, but they can be changed from the default time format that is 'h:mm'.
For web tags that refer to a particular time of day, there is a corresponding web tag that can give the time of day. Please note none of the time web tags can be modified by output parameters to give a date, but they can be changed from the default time format that is 'h:mm'.
Line 1,459: Line 1,484:
|-
|-
!style="width:150px" | Web tag_name
!style="width:150px" | Web tag_name
!style="width:450px" | Function
!style="width:550px" | Function
!style="width:150px" | Time
!style="width:150px" | Time
|-
|-
Line 1,606: Line 1,631:


==Monthly==
==Monthly==
This table shows the web tags used on the "thismonthT.htm" web page, the rainfall this month does not appear  on that page, does not appear  on that page, it is shown in [[#Current_Conditions|indexT.htm]] table earlier on this page.


The web tags in the date column output dates in the format "dd MMMM" (same for Cumulus 1 and Cumulus MX), this can be changed using the [[#Time.2FDate_.27format.27_Parameter|format parameters]] described above. For web tags that represent daily values, there are (obviously) no corresponding time web tags, but for high and low spot values the default 'h:mm' format of the time output can be changed using output parameters.
This table shows the web tags used on the '''thismonthT.htm''' web page,and the '''records.html''' page (accessed by penultimate tab) in the admin interface.
 
Because the rainfall this month does not appear on '''thismonthT.htm''' web page, it is shown in [[#Current_Conditions|indexT.htm]] table earlier in this article which is for the web page where it does appear.
 
The web tags in the date column output dates in the format "dd MMMM" (for once this is same for Cumulus 1 and Cumulus MX). Should you require a different output format, this can be changed using the [[#Time.2FDate_.27format.27_Parameter|format parameters]] described above. For web tags that represent daily values, there are (obviously) no corresponding time web tags, but for high and low spot values the default 'h:mm' format of the time output can be changed using output parameters. Do make sure that you get the web tag names right and the output form at parameters right.
 
As another example of inconsistency in how web tags added in different versions are coded, there are two web tags (highest minimum/lowest maximum temperatures) where a standard web tag is not provided by Cumulus (1 or MX) for the associated time-stamp. Consequently, for these 2 (and their corresponding tags in the this year group), there are mandatory output parameters required as shown in the table. Obviously Cumulus 1 lets you use "NN", "nn", "MM", or "mm" for the minutes, but minutes can only be represented in one way in Cumulus MX.


NB This table shows time of extremes for two daily figures (highest minimum/lowest maximum temperatures as of course these are actually associated with a particular time although a standard web tag was not provided for that), by including Cumulus time modifiers, and how minutes in time modifiers can be specified in two ways in Cumulus 1 but only in one way in Cumulus MX.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,760: Line 1,789:


==Yearly==
==Yearly==
This table shows the web tags used on the "thisyearT.htm" web page, the rainfall this season (it need not start on 1 January) does not appear on that page, it is shown on [[#Current_Conditions|indexT.htm]].
This table shows the web tags used on the "thisyearT.htm" web page, and the '''records.html''' page (accessed by final tab) in the admin interface.
 
Because the rainfall this year does not appear on '''thisyearT.htm''' web page, it is shown in [[#Current_Conditions|indexT.htm]] table earlier in this article which is for the web page where it does appear.
 
The web tags in the date column output dates in the format "dd MMMM" (for once this is same for Cumulus 1 and Cumulus MX). Should you require a different output format, this can be changed using the [[#Time.2FDate_.27format.27_Parameter|format parameters]] described above. For web tags that represent daily values, there are (obviously) no corresponding time web tags, but for high and low spot values the default 'h:mm' format of the time output can be changed using output parameters. Do make sure that you get the web tag names right and the output form at parameters right.


The default format for web tags in the date column is (like the monthly web tags) "dd MMMM" (same for Cumulus 1 and Cumulus MX), this can be changed using the [[#Time.2FDate_.27format.27_Parameter|format parameters]] described above. For web tags that represent daily values, there are (obviously) no corresponding time web tags, but for high and low spot values the default 'h:mm' format of the time output can be changed using output parameters.
As another example of inconsistency in how web tags added in different versions are coded, there are two web tags (highest minimum/lowest maximum temperatures) where a standard web tag is not provided by Cumulus (1 or MX) for the associated time-stamp. Consequently, for these 2 (and their corresponding tags in the this month group), there are mandatory output parameters required as shown in the table. Obviously Cumulus 1 lets you use "NN", "nn", "MM", or "mm" for the minutes, but minutes can only be represented in one way in Cumulus MX.


NB Year runs from roll-over time on 1 January for all web tags listed here
Remember that the Year-to-date runs from roll-over time on 1 January for all web tags listed here. Although, some web tags represent seasonal derivatives, i.e. where you define the month from which they start counting, this does not apply to any listed in this group.




Line 1,771: Line 1,804:
!style="width:150px"|Web tag_name
!style="width:150px"|Web tag_name
!style="width:300px"|Function
!style="width:300px"|Function
!style="width:150px"|Time
!style="width:350px"|Time
!style="width:150px"|Date
!style="width:150px"|Date
|-
|-
Line 1,838: Line 1,871:
|<#YearMinTempH>
|<#YearMinTempH>
|This years highest daily minimum temperature
|This years highest daily minimum temperature
|<#YearMinTempHD format=HH:nn> for Cumulus 1, <#YearMinTempHD format=HH:mm> for Cumulus MX
|Flavour specific mandatory output parameters:
* <#YearMinTempHD format=HH:nn> ''for Cumulus 1'',
* <#YearMinTempHD format=HH:mm> ''for Cumulus MX''
|<#YearMinTempHD>
|<#YearMinTempHD>
|-
|-
|<#YearMaxTempL>
|<#YearMaxTempL>
|This years lowest daily maximum temperature
|This years lowest daily maximum temperature
|<#YearMaxTempHD format=HH:nn> for Cumulus 1, <#YearMaxTempHD format=HH:mm> for Cumulus MX
|Flavour specific mandatory output parameters:
* <#YearMaxTempHD format=HH:nn> ''for Cumulus 1'',
* <#YearMaxTempHD format=HH:mm> ''for Cumulus MX''
 
|<#YearMaxTempLD>
|<#YearMaxTempLD>
|-
|-
Line 1,919: Line 1,957:


==All Time==
==All Time==
The web tags in the date/time column have the default format seen on "records.htm". So for an extreme month it just shows the month name in full i.e. format 'MMMM'. For an extreme day it shows the day of the month and the month name in full i.e. format "dd MMMM" (same for Cumulus 1 and Cumulus MX), prefixed with the word 'on'. For the highest/lowest within a day in the year it shows both time and date adding the word "at" before the time, and the word 'on' before the date.


You can change the default output using the [[#Time.2FDate_.27format.27_Parameter|formats features described above, but this can involve complicated use of single and double quotes and there are differences between Cumulus 1 and Cumulus MX.
The web tags in the date/time column have the default format as seen on "records.htm" in the standard web pages.
 
These are also available in the admin interface on "records.html" where they appear in the first tab, although the format used there is different and not able to be edited (any time is shown after the date).
 
*The default format for an extreme month is to show the month name in full i.e. format 'MMMM' followed by the year in full.
*For an extreme day it shows the day of the month and the month name in full i.e. format "dd MMMM" (same for Cumulus 1 and Cumulus MX), prefixed with the word 'on' again ending with the year.
*For the highest/lowest within a day in the year it shows both time and date adding the word "at" before the time, and the word 'on' before the date (i.e. on the standard web page the time comes first, not as seen in admin interface).
 
You can change the default output on either the standard web template, or in your own file,  by using the [[#Time.2FDate_.27format.27_Parameter|formats features described above, but this can involve complicated use of single and double quotes and there are differences between Cumulus 1 and Cumulus MX. Please see examples section above for advice.
 
Note that unlike the this month and this year web tags, the time and the date are both included in the default format of the standard time-stamp web tags for the 'highest minimum' and 'lowest maximum' temperatures, yet another inconsistency!


Note that unlike the monthly web tags, the time is included in the default format of the standard web tags for the 'highest minimum' and 'lowest maximum'.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
!style="width:150px" | Web tag_name
!style="width:150px" | Web tag_name
!style="width:300px" | Function
!style="width:400px" | Function
!style="width:150px" | Date/Time
!style="width:150px" | Date/Time
|-
|-
Line 1,993: Line 2,039:
|-
|-
|<#wchillH>
|<#wchillH>
|All time greatest wind chill (i.e. lowest temperature)  
|All time greatest wind chill (i.e. lowest temperature, but highest wind speed)  
|<#TwchillH>
|<#TwchillH>
|-
|-
Line 2,049: Line 2,095:
==Monthly All Time Records==
==Monthly All Time Records==


There are a set of tags for monthly all-time highs and lows, in other words the highest and lowest values for a particular month of the year. For example, the highest ever temperature in July. Each Value tag has an optional input parameter "mon=N" where N is the index of the month of the year that you want the value for (January=1 and so on). For example, <#ByMonthTempH mon=7> will give you the highest ever temperature in July.  The corresponding date/time web tags are formatted like the all time records directly above this section.
There are a set of tags for monthly all-time highs and lows, in other words the highest and lowest values for a particular month of the year. To supply both optional input, and optional output parameters, separate them with spaces, e.g. <#ByMonthTempHT mon=7 format=hh:nn>. In that example,  the highest ever temperature in July is returned in the value after processing by Cumulus.


If you don't supply a parameter (or supply an invalid value) the current month will be used. You can customise the date and time formats using the 'format' parameter on the web tag. To supply both input and output parameters, separate them with spaces, e.g. <#ByMonthTempHT mon=7 format=hh:nn>
Each Monthly All Time Records web tag has an optional input parameter "mon=N" where N is the index of the month of the year that you want the value for (January=1 and so on).  The corresponding date/time web tags are formatted like the all time records directly above this section. You can customise the date and time formats using the output  'format' parameter on the web tag.
 
If you don't supply an input parameter (or supply an invalid value like zero) the current month will be used. This is useful if you want to write a template that will always supply values for the current month and don't want to use a script to enter the correct input parameter by processing with that script before Cumulus processes the template.




Line 2,057: Line 2,105:
|-
|-
!style="width:150px"|Web tag_name
!style="width:150px"|Web tag_name
!style="width:300px"|Function
!style="width:400px"|Function
!style="width:150px"|Date/Time
!style="width:150px"|Date/Time
|-
|-
Line 2,075: Line 2,123:
|-
|-
|<#ByMonthWChillL>
|<#ByMonthWChillL>
|Greatest wind chill (i.e. lowest temperature)
|Greatest wind chill (i.e. lowest temperature and highest wind speed)
|<#ByMonthWChillLT>
|<#ByMonthWChillLT>
|-
|-
Line 2,182: Line 2,230:
|-
|-
!style="width:150px" | Web tag_name
!style="width:150px" | Web tag_name
!style="width:600px" | Function
!style="width:900px" | Function
|-
|-
|<#sunrise>
|<#sunrise>
5,838

edits

Navigation menu