2016-04-02 15 views
2

編集:人は少し混乱しているように見えるので、私は明確にしようとします。JavaScriptで書式設定された段落に文字列を変換する

基本的に、取る文字列は可変長で、任意の数の行にすることができます。

ヒッチは、単語をカットオフしない文字列です。したがって、別の例として、文字列:

「飛び跳ねのキツネ」は2つの別々の行に分かれています。 中間の文字は「u」なので、2行は次のようになります。 行1: 'ジャンプ' 行2: 'Fox' 単語が途切れないようにします。それは2つの制限です。

だから、私はこの質問だ:

は、単一行のテキスト文字列と行の最大値を考えると、入力されたテキストの書式を設定する関数を記述、すなわち:均等に文字に基づいてテキストを分割し、返却を文字列の各セクションの改行。しかし、行を切り落とさないでください。つまり、1000文字と2行の場合は、最初の行のサイズを大きくして、500文字目の途中の最後の単語の終わりを取得できます。

私はJavaScriptで解決しようとしています。任意のヒント?この空白の書式設定を使わないで行を返すだけでも簡単ですが、私は完全に失われています。

function formatString(string, numlines) { 
    var length = string.length; 
    console.log(length); 
    var words = string.split(' '); 
    var paraLength = parseInt(string.length/numlines); 
    console.log(paraLength) 

    var paragraph = []; 
    for(var i=0; i<length;) { 
    // console.log('i is: ', i); 
    console.log('start of string is: ', string.charAt(i)); 
    console.log('end of string is: ', string.charAt(i+paraLength+1)); 
    console.log('if true? ', string.indexOf(i)) 
    if (string.charAt(i+paraLength) == ' ') { 
     var thing = string.substr(i,i+paraLength); 
     console.log('if thing is: ', thing); 
     i+=paraLength; 
     console.log('if i is: ', i); 
     paragraph.push(thing); 
    } else { 
     var thing = string.substr(i,i+paraLength); 
     console.log('else thing is: ', thing); 
     console.log('blah is: ',i+paraLength+1 >= length); 
     while (string.charAt(i+paraLength) != ' ' && i+paraLength < length) { 
     thing.concat(string.charAt(i+paraLength+1)); 
     thing.concat('hi') 
     console.log('else thing is: ', thing); 
     i+=1; 
     console.log('i is: ', i); 
     } 
     paragraph.push(thing); 
     i+= paraLength; 
    } 
    } 

    return paragraph.map(function(d) { 
    console.log('d is: ', d); 
    return d; 
    }).join('') 

} 
console.log(formatString('hello world blah blah blah', 2)); 
+0

あなたは[ 'string.slice()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)のパワーを必要とします。 –

+0

多くの 'n '行がある限り、特定の行の長さにハード制限がありますか? –

+0

ハード制限はありません。それはちょうど文字列に含まれているもののために変更することができます – Tulun

答えて

2

私はあなたが質問している理解していた場合、これが役立つかもしれない:

function formatString(string, numlines) { 
    var length = string.length; 
    var paraLength = Math.round((string.length)/numlines); 
    var paragraphs = []; 
    for (var i=0; i<numlines; i++) { 
     var marker = paraLength; 
     //if the marker is right after a space, move marker back one character 
     if (string.charAt(marker-1) == " ") { 
      marker--; 
     } 
     //move marker to end of a word if it's in the middle 
     while(string.charAt(marker) != " " && string.charAt(marker) != "") { 
      marker++; 
     } 
     var nextPara = string.substring(0, marker) 
     paragraphs.push(nextPara) 
     string = string.substring((nextPara.length+1),string.length) 
    } 
    return paragraphs 
} 

これは、個々の段落を含む配列を返します。

formatString("The jumping fox", 2) // => ["The jumping", "fox"] 
2

提案したアルゴリズムは、「あなたは500番目の文字の途中で最後の単語の終わりをキャプチャするために、最初の行のサイズを大きくすることができますが、」致命的な欠陥を持っている:あなたの最後の単語である場合よりも長いlength(sentence)/num_linesと「次の単語」にスキップすると、その行にあまりにも多くの単語が印刷され、最後の行ではあまりにも少ない単語で終わる可能性があります。

この

はなく、むしろ言葉の シーケンスとして(あなたはそれがスペースであるかどうかを確認するために、各文字を検査する必要がある)文字シーケンスとして文字列を考慮しないことによって解決することができます。その後、アルゴリズムは各行にnum_words/num_linesが現れる必要があります。端数を切り上げるにはMath.ceilを使用してください。したがって、すべての行に少なくとも1つの単語が表示されていることを確認してください。

これで、2の単語のリストを正確に分割する基本的なテストケースを作成できます。分割自体はsplit関数を使用して行うことができますが、すべてのスペースが保持されるように正規表現matchを使用します。 matchは、それぞれが単一の単語とそれに続く空白である一致の配列を返します。それは配列なので、その長さを行数で割り、分数の場合は切り上げて(Math.ceil)、それらの単語を出力することができます。

次?さて、そのステップの後、元の文字列の残っている未処理の残りの部分といくつかの行が残ります。だからと同じ機能を再度呼び出すことができます切り捨てられた文字列と1行の数が少なくなります。行の数が1(残りの文字列全体が表示されます)またはスペースの数が0の場合に実行されます(ここではテストされていません。行がある場合はマイナス1、そうでない場合はエラーを発行します)。

console.log(formatString('hello world blah blah blah', 2)); 

function formatString (string, numLines) 
{ 
    var wordlist, trim_at, result; 
    if (numLines < 2) 
     return string; 

    wordlist = string.match(/\S+\s*/g); 
    trim_at = Math.ceil(wordlist.length/numLines); 

    result = ''; 
    while (trim_at--) 
     result += wordlist.shift(); 
    result += '\n'; 
    result += formatString (wordlist.join(''), numLines-1); 
    return result; 
} 
+0

「superlongword aaaaaa」のような単語で分割すると、「superlongword aaa "superlongword"と "aaaaaa"の代わりに "aaa"と "aaa"を使用します。 – digglemister

+0

あなたは何をしているのでしょうか?本質的に、numlinesが大きくなり、文字列が大きくなると、最後の行が切り捨てられるのはかなり高いです。 私は、秘密がおそらく、あなたが近づいていると思うように、空白ではなく、最も近い空白に向かって前後に行くと思います。 – Tulun

関連する問題