在子字符串(行)中断开字符串,而不拆分单词



我正在使用一个小函数,该函数应该在子字符串中断开字符串,以确保不会剪切任何单词。

让我们得到这个用例:

"出了点问题,我搞不清出什么问题"

总字符数: 63;

每行的最大字符长度为 15 个字符,我会得到这个 substr"某事正在走"

如您所见,当我想获得整个单词时,它正在削减单词。

行[1]:某些东西是//在最大字符长度下方的最后一个空格上断开字符串;

[2]:出错...//包括第二行开头第一行中缺少的字符

行[3]: ...//依此类推,直到所有字符都循环播放。

我想出了这个让我发疯的解决方案。

function splitString(obj:Object):Array{
if (obj.hasOwnProperty("d_string"))
{
    var texto:String = obj.d_string;
    var textoStr:Array = texto.split("");
    var textoLen:Number = texto.length;
    trace("textoLen " + textoLen);
    var maxCharPerLine:Number;
    if (obj.hasOwnProperty("d_limit")){
        maxCharPerLine = obj.d_limit;
        trace("maxCharPerLine" + maxCharPerLine);
    }else{
        maxCharPerLine = 20;
    }

    var textLine:Array = [];
    var currentLine:Number = 1;
    var currentIndex:Number = 0;

    var cachedCharsForLine:Array = [];      //all characters between the range
    var lastCachedCharsForLine:Array = [];  //mirror of all characters stoping at the last space found
    var missingChars:Array = [];

    var canCleanData:Boolean = false;

    /*START LOOPING OVER THE STRING*/   
    for (var i:Number = 0; i< textoLen; i++) 
    {   
        //<block1>
        if ( currentIndex == maxCharPerLine || i == textoLen -1 ){ 
            canCleanData = true;
        }
        //<block2> 22
        if ( currentIndex <= maxCharPerLine ){ 
            cachedCharsForLine.push(textoStr[i]);
            //trace(cachedCharsForLine);
        }

            trace(textoStr[i]);
            trace(textoStr[i] == " ");

            /*is the characters a space?*/
            if (textoStr[i] == " ") {
                /*1. even after the condition above returns false*/
                lastCachedCharsForLine = [];
                lastCachedCharsForLine = cachedCharsForLine;
            }

            /*as you can see from the output this value is being updated every iteration after the first space get found
            when it was suppose to be updated only if the a char of type <space> get found"
            */
            trace("-----------------" + lastCachedCharsForLine)

        //<block4>
        if( currentIndex == maxCharPerLine || i == textoLen -1 ){       
            if (textoStr[i]==" " || textoStr[i+1]==" "){        
                trace("n A");
                //trace("@@@      " + lastCachedCharsForLine);
                textLine[currentLine] = lastCachedCharsForLine;
                trace("//" + textLine[currentLine]);
            }
            else{
                trace("n B");
                //trace("@@@      " + lastCachedCharsForLine);
                textLine[currentLine] = lastCachedCharsForLine;
                trace("//" + textLine[currentLine]);
            }
            currentIndex = 0;
            currentLine ++;
        }
        //<block5>
        if (currentLine > 1 && canCleanData){
            trace("DATA CLEANED");
            canCleanData = false;
            cachedCharsForLine = [];
            lastCachedCharsForLine = [];
        }
        currentIndex ++;
    }
    return textLine;
}else{
    return textLine[0] = false;
}
}

var texto:String = "Theres something going wrong and it's driving me crazy.";
var output:Array = []
output = splitString({"d_string":texto,"d_limit":15});
for (var i:Number = 0; i<output.length; i++){
    trace(output[i] + "nn");  
}

lastCachedCharsForLine 的变量正在更新,从此跟踪行中可以看到。

trace("-----------------" + lastCachedCharsForLine)

即使条件为波纹管返回假

 if (textoStr[i] == " ") {
                    /*1. even after the condition above returns false*/
                    lastCachedCharsForLine = [];
                    lastCachedCharsForLine = cachedCharsForLine;
                }

这很有趣。 以下代码输出:

|-------------|
something is
going wrong
and i can't
figure out
what's the
problem.
WORDTHATISWAYTOOLONGFORTHEBUFFER.
A quick brown
fox jumped
over the lazy
dog.
package {
    import flash.display.Sprite;
    final public class Test2 extends Sprite {
        public function Test2() {
            splitIntoLines("something is going wrong and i can't figure out what's the problem.  WORDTHATISWAYTOOLONGFORTHEBUFFER. A quick brown fox jumped over the lazy dog.");
        }
        private function splitIntoLines(text:String, maxLineLength:int = 15):void {
            const words:Array   = text.split(/s+/);
            const output:Array  = [];
            var buffer:String   = '';
            while (words.length) {
                var word:String = words.shift() as String;
                // if buffer has something, add a space
                if (buffer.length) {
                    if (buffer.length + word.length + 1 < maxLineLength) {
                        buffer += ' ' + word;
                    } else {
                        output.push(buffer);
                        buffer = word;
                    }
                // otherwise, it's the first word
                } else {
                    if (buffer.length + word.length < maxLineLength) {
                        buffer += word;
                    } else {
                        output.push(buffer);
                        buffer = word;
                    }
                }
            }
            // something is still in there?
            if (buffer.length) {
                output.push(buffer);
            }
            trace(output.join('n'));
        }
    }
}

如果你使用Grant Skinner的StringUtils库,可能会让你的生活更轻松:

http://gskinner.com/blog/archives/2007/04/free_extension.html

truncate方法是您要查找的:

var line:String = "Something is going wrong and I can't figure out what's the problem."
var truncatedLine:String = StringUtils.truncate(line, 15, "...");

最新更新