Поиск элементов в строке с помощью шаблона с SSJS - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно поддерживать несколько языков в моем приложении XPages.Большинство документов хранят некоторую форму истории, используя образец: Автор - Глагол - Предмет - Дата, например, «Майкл Майерс купил нож 25/10/1978».

Для моей языковой поддержки я хотел бы настроить переводмеханизм и перевод глагола и предмета.Я думаю о сохранении строк в файле свойств.

Поэтому я хочу сохранить историю, как указано в моем поле истории: Майкл Майерс # купил # @a knife @ 25 октября 1978 года.

Это поле является многозначным полем, поэтому выходные данные будут векторными, но я преобразую его в массив с помощью функции xsnippet $ U.toArray (), чтобы использовать его для отображения в целях отображения.

Я хочу отобразить историю с помощью повторного управления.Вот как это выглядит:

<xp:repeat id="rptHistory" rows="1000" var="obj" indexVar="idx">
    <xp:this.value><![CDATA[#{javascript:var $U = {

  /* 
  /* function that always returns an array for the input value
   */
  toArray : function(input) {
    try {

      if (typeof input === "undefined" || input === null) {
        //return empty array
        return [];  
      }

      if (typeof input === "string") {
        //convert string to array (or empty array)
        return ( input.length > 0 ? [input] : [] );
      }

      if (typeof input === "java.util.Vector") {

        //Normally we would use toArray here, but this returns an Object array.
        //If you try to use that in a doc.replaceItemValue call, it fails.
        //sample code:
        //var v = getComponent("input1").getValue();    //returns a Vector if the component contains multiple values
        //v = $U.toArray(v)   //returns an array of Objects
        //doc.replaceItemValue("someOtherField", v);    //fails

        //the solution I used here is to create a JS array and copy the all the Vector's values
        var a = [];
        var it = input.iterator();
        while (it.hasNext() ) {
          a.push( it.next() );
        }
        return a;
      }

      if (typeof input.toArray !== "undefined") {
        return input.toArray();
      }

      if ( input.constructor === Array ) {
        //return input if it's already an array
        return input;
      } 

      //return input as an array
      return [ input ];

    } catch(e) {
      print("$U.toArray: " + e.toString());
    }
  }
}

var coll = compositeData.log;
if(compositeData.sort == "descending"){
    var result = $U.toArray(coll);
    uidArray = result;
    uidArray.reverse();
    uidReversed = uidArray;
    return uidReversed;
}else{
    return coll;
}


}]]></xp:this.value>
    <xp:panel tagName="div">
        <small>
            <xp:text escape="true"
                value="#{javascript:obj}" />
        </small>
    </xp:panel>
</xp:repeat>

В элементе управления вычисляемым текстом мне нужно предоставить перевод.

У кого-нибудь есть догадки, как найти искомые строки?

Я пытался настроить регулярное выражение, но я не уверен, как мне это сделать, например

<xp:text escape="true">
                                <xp:this.value><![CDATA[#{javascript:var str = obj;
var regexp = new RegExp("^#.*#$");
return regexp.replace(str, "---")}]]></xp:this.value>
                            </xp:text>

1 Ответ

0 голосов
/ 23 октября 2018

Сейчас я использую:

var str = obj;
var regexp = /\@(.*?)\@/;

var translations = regexp.exec(str);

if (null != translations){
    for (i = 0; i < translations.length; i++) { 
        if(null != regexp.exec(str)){
            trans = regexp.exec(str)[0];
            //verb first
            if (null != trans){
                str = regexp.replace(str, history[trans]);
            }
        }
    }
}
return str;

Строки перевода хранятся в файлах свойств следующим образом:

@verb_bought@=köpte
@subj_knife@=ett kniv

Итак, сохраненная строка Michael Myers @ verb_bought @ @ subj_knife @25/10/1978 становится Майкл Майерс köpte ett kniv 25/10/1978

...