Well, my code below

toPhone(s  = "") {
  s r="",c=96,p=1 f i=3,3,3,3,3,4,3,4{s:$i(p) k="" f j=1:1:i s k=k_p,c($c($i(c)))=k} f i=1:1:$l(s){s n=$g(c($e(s,i)),0) s:$e(n)=$e(r,*) r=r_" " s r=r_n} q r
}

In first I'm generate a plane array with all variants, and then just get all numbers from it, include space between identical numbers, and zero for unknown symbols such as space

Actually, XData content it is a just XML, in it is stored exactly as you wrote it in IDE. But it is possible to compile any XData to any other format as you need, at this portal you can find two articles about how to do it, first and second. In your case it could be much easier, like some method which in compile mode gets all XData content and place it to &html<>, which then compile again as usual, and what you need after it is just call this generated method, to show this html. 

Steve,

I would recommend to distant webservers from ECP Application servers. In your case I would install webserver exactly on the server where ECP Application Server have already installed, so in this case your connect via superport will be secured, and in this case only web port should be opened in the firewall. Outside of this servers after firewall you need to use some load balancer, in this case I would recommend to use HAProxy. Connection between extarnal HAProxy and  internal webservers could be secured with ssl, but I'm not sure that is really needed.

And in this case it is possible to store all static content such as JS, CSS and images on server where load balancer placed, to avoid redundant request to the data servers. It is not a big problem for the production systems.

So finally in simple view it my looks like below.

It's is not good idea, not all time and not everywhere I have an access to google, but I have an access to my installation, and I have to search on my local machine. And such search should be support browser's search engines. And then I could do something like this.

with settings

But Ensemble documentation, should provide their own search engine to install in my browser without any manual operations. As it possible to do with AddSearchProvider

Many times I need to get some link from documentation, to show particular part to someone. And some time it is quite difficult to get such link, and the worst place in Class References, where I can't get good link for a particular part of class.

So, what I need is, an active icon with link, which then I can use, and for Class reference too.

As an example github.

As for me, when I have to investigate some strange behavior in my application, I prefer to read all journal files or limited by time, and then all records, and then I have some some to find exactly what I need, like only kill records or only sets, and only for some concrete global references. So, my usual code looks like this:

     set exit=0
    set docId="14105401"
    set jrnFile=##class(%SYS.Journal.System).GetCurrentFileName()
    do {
        !!,jrnFile,!
        set jrn=##class(%SYS.Journal.File).%OpenId(jrnFile)
        quit:'$isobject(jrn)
        
        #dim rec As %SYS.Journal.Record = jrn.FirstRecord
        set last=jrn.End
        set pr=0,opr=0
        do {
            set pr=$j(rec.Address/last*100,0,2)
            if pr'=opr write $c(13),pr_"%" set opr=pr
            
            if rec.%IsA("%SYS.Journal.SetKillRecord") {
                set glb=rec.GlobalNode
                if $qs(glb, 0),"^My.Global",$qs(glb, 1)=docId {
                    !!,rec.Address,!,glb
                    !
                }
            }
            
            set rec=rec.Next
            read q:0 set exit=q="q"
            quit:exit
        while $isobject(rec)
        quit:exit
        
        set sc=jrn.GetPrev(jrnFile, .jrnFile)
    while $$$ISOK(sc)
    quit

This code looks all journal files, file by file from latest to oldest, and show progress for current journal file, and shows offset if it found something interesting

You could just pass this arguments in Execute method, something like this

    new $namespace
    set $namespace="%sys"

    Set tRS = ##class(%ResultSet).%New("%SYS.Journal.File:Search")
    Set tSC = tRS.Execute("test", "/opt/cache/mgr/journal/20160507.001")
    if $$$ISERR(tSC) {
        do $system.OBJ.DisplayError(tSC)
    }
    
    do tRS.%Display()

this code will return all offset's which contains text - 'test'

You must remember that this query should be executed only in %SYS namespace.

Usually we could use some another modern ways, which allow us to call queries.  

    set statement=##class(%SQL.Statement).%New()
    set tSC=statement.%PrepareClassQuery("%SYS.Journal.File","Search")
    if $$$ISERR(tSC) {
        do $system.OBJ.DisplayError(tSC)
    }
    Set tRS = statement.%Execute("test", "/opt/cache/mgr/journal/20160507.001")

or even much shorter

    set tRS=##class(%SYS.Journal.File).SearchFunc("test", "/opt/cache/mgr/journal/20160507.001")
    
    do tRS.%Display()

But unfortunately such code snippets does not work in case when Query does not contain any parameters in his original declaration.

Well, you can't write conditions in this way, and compile error which you see, it is actually parsing error for such condition
How you can change it, You should define some function which may do all this check or partially, just return some value for check.

To define such function, you should have your child for Ens.Rule.FunctionSet class, something like this

Class Test.Utils Extends Ens.Rule.FunctionSet
{

ClassMethod GetAt(value As %String = "", index As %String) As %String
{
    if $isobject(value) {
        quit value.GetAt(index)
    }
    quit ""
}

}

and then, you can use it in this way, where GetAt your just created function.

<rule name="">
<constraint name="msgClass" value="Test.TestMessage"></constraint>
<when condition="GetAt(Document.myList,1)=&quot;AA&quot;">
<send transform="" target="DummyOperation"></send>
<return></return>
</when>
</rule>

But your function should return final value for checking, and you can't use write so,

GetAt(Document.myList,1).property1=&quot;AA&quot;

First of all you should know that namespace it is not final destination for any data in Caché. Namespace just defines easy access to set of data, but all data stores in databases. And any security settings uses on Databases not for Namespaces. Data

There some reasons why you can't just use any %-classes; 

  • By default all %-classes, appeared in CACHELIB database, which read-only by default after installation.
  • CACHELIB database after any installation process, will be overwritten with all you custom content.

Actually first point is not so truly, because InterSystems gives us one chance to create %-class, without loosing it after next upgrade. You should use %Z* or %z* name for classes and routines (some names have already reserved for InterSystems use), and in this case that classes will be stored at CACHESYS database, which available to write, and any upgrade will not rewrite such classes. 

So, you should read this page in documentation, to know more about names, which names you can't use, and how to name recommend.