Skip to content

Instantly share code, notes, and snippets.

@lgedeon
Created September 25, 2012 21:24
Show Gist options
  • Select an option

  • Save lgedeon/3784555 to your computer and use it in GitHub Desktop.

Select an option

Save lgedeon/3784555 to your computer and use it in GitHub Desktop.

Revisions

  1. lgedeon created this gist Sep 25, 2012.
    34 changes: 34 additions & 0 deletions gistfile1.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    function plugin_trim_by_characters_with_html( $text, $length = 400, $append = ' &hellip;', $allowable_tags = '<b><em><a>' ) {
    $length = (int) $length;
    $text = trim( strip_tags( $text, $allowable_tags ) );
    $in_quote = false;
    // if the length without tags is less than our target we are done
    if ( strlen( strip_tags( $text ) ) <= $length )
    return $text;
    // count forward to find the $length character in unstripped $text not counting tags
    for ($i = 0, $j = 0, $l = strlen( $text ), $in_tag = false; $i < $l && ( $in_tag || $j < $length ); $i++) :
    switch ( $text[$i] ) :
    case '<': $in_tag = true; break;
    case '>': $in_tag = false; break;
    case '"': $in_quote = ! $in_quote;
    default :
    if ( ! $in_tag ) $j++;
    endswitch;
    endfor;
    // Step forward one and check for whitespace. If none, go back and find the last place we ended a word or html tag
    if ( isset( $text[$i] ) )
    while ( ' ' != $text[$i] && '>' != $text[$i - 1] ) $i--;

    // don't end with non-final punctuation
    if ( isset( $text[--$i] ) )
    while ( $i > 0 && in_array( $text[$i], array( ',', ':', ';', '(', '$', '&', '-' ), true ) ) $i--;

    // if ending at end of sentance we don't need continuation marking (i.e. &hellip;)
    if ( in_array( $text[$i], array( '.', '!', '?' ) ) )
    return balanceTags( substr( $text, 0, $i+1 ), true );

    // finally if we have a quotation mark, make sure it is final
    if ( '"' == $text[$i] && $in_quote ) $i--;

    return balanceTags( substr( $text, 0, $i+1 ), true ) . $append;
    }