如何从 RiTa.js 随机词生成器中删除 space?

How to remove space from RiTa.js random word generator?

我正在开发受 Daniel Shiffman 的 RiTa 库演示启发的单词生成器。现在,代码使用以下行在所有单词和标点符号之间添加了一个 space:

output += " ";

我一直想弄清楚如何更改代码,使 space 不会出现在标点符号(如句点)和单词之间。我认为最简单的方法是使用 if/else 语句,不改变标点符号,但在单词中添加 space,但我也很难弄清楚 what functions from the Rita library to use for this作为语法。

有什么想法吗?这是我的代码:

var input;
var button;
var lexicon;

function setup() {
  noCanvas();
  lexicon = new RiLexicon();

  input = createInput('As I say a noun is the name of a thing.');
  button = createButton('submit');
  input.changed(processRita);
  button.mousePressed(processRita);
  input.size(400);
}

function processRita() {
var s = input.value();
var rs = new RiString(s);
var words = rs.words();
var pos = rs.pos();
console.log(words);
console.log(pos);

var output = '';

for (var i = 0; i < words.length; i++) { 
   if (/nn.*/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      if(alliterations.length == 0){
        output+=words[i];
      }else{
         output += alliterations[Math.floor(Math.random() * alliterations.length)];
      }
      //console.log("noun");
      //console.log(alliterations.length);
    } else if (/jj.*/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      output += alliterations[Math.floor(Math.random() * alliterations.length)];
      //console.log("adjective");
    } else if (/vb/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      output += alliterations[Math.floor(Math.random() * alliterations.length)];
      //console.log("verbs");
    } 
    else {
      //console.log(words[i]);
      output += words[i];
  } {
       output += " ";
  }
  }
  createP(output);

}

为什么你需要一个图书馆?你不能只使用常规的 String 函数来测试 String 是否是标点符号吗?

您可以只使用正则表达式来测试 String 是否与标点符号匹配。或者只是对您关心的每个标点符号使用一系列相等性检查。

您也可以查看 the startsWith() function and the endsWith() function

经过多次尝试和错误,我得到了一位编码教授的帮助,他帮助我解决了这个问题,这比我原先预期的要复杂。为了让这段代码工作,我们在 for 循环的开头添加了这一点:

if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){ output += words[i]; }else{ output += " ";

所以整个代码现在看起来像这样:

for (var i = 0; i < words.length; i++) { 



if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){
    output += words[i];
  }else{
    output += " ";
   if (/nn.*/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      if(alliterations.length == 0){
        output+=words[i];
      }else{
         output += alliterations[Math.floor(Math.random() * alliterations.length)];
      }
      //console.log("noun");
      //console.log(alliterations.length);
    } else if (/jj.*/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      output += alliterations[Math.floor(Math.random() * alliterations.length)];
      //console.log("adjective");
    } else if (/vb/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      output += alliterations[Math.floor(Math.random() * alliterations.length)];
      //console.log("verbs");
    } 
    else {
      //console.log(words[i]);
      output += words[i];
  }

}


  }
  createP(output);

}

如果使用 RiTa library 函数, 更简单:

function processRita() {

  var all, output = [],
    words = RiTa.tokenize(input.value()),
    pos = RiTa.getPosTags(words);

  for (var i = 0; i < words.length; i++) {
    if (/[nn|kk|vb|jj].*/.test(pos[i]) && (all = lexicon.alliterations(words[i])).length) {
      output.push(RiTa.randomItem(all));
    } else {
      output.push(words[i]);
    }
  }

  createP(RiTa.untokenize(output));
}