`
chenjihua75
  • 浏览: 42536 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

传说中的truncate_html

阅读更多
学习用rails做blog的时候要用到rails的truncate功能。
<%= h truncate(post.content, 100, "...") %>

问题来了,将html截断后出现不完整的tag,导致后续的文章排版都错乱了。
本来考虑是不是自己写一个,正在思考思路,结果祭起google,好吗,已经有牛人写了
原地址:http://henrik.nyh.se/2008/01/rails-truncate-html-helper
简单记录一下:
将下面代码保存到app/helpers/text_helper.rb。
# By Henrik Nyh <http://henrik.nyh.se> 2008-01-30.
# Free to modify and redistribute with credit.

require "rubygems"
require "hpricot"

module TextHelper

  # Like the Rails _truncate_ helper but doesn't break HTML tags or entities.
  def truncate_html(text, max_length = 30, ellipsis = "...")
    return if text.nil?

    doc = Hpricot(text.to_s)
    ellipsis_length = Hpricot(ellipsis).inner_text.chars.length
    content_length = doc.inner_text.chars.length
    actual_length = max_length - ellipsis_length

    content_length > max_length ? doc.truncate(actual_length).inner_html + ellipsis : text.to_s
  end

end

module HpricotTruncator
  module NodeWithChildren
    def truncate(max_length)
      return self if inner_text.chars.length <= max_length
      truncated_node = self.dup
      truncated_node.children = []
      each_child do |node|
        remaining_length = max_length - truncated_node.inner_text.chars.length
        break if remaining_length == 0
        truncated_node.children << node.truncate(remaining_length)
      end
      truncated_node
    end
  end

  module TextNode
    def truncate(max_length)
      # We're using String#scan because Hpricot doesn't distinguish entities.
      Hpricot::Text.new(content.scan(/&#?[^\W_]+;|./).first(max_length).join)
    end
  end

  module IgnoredTag
    def truncate(max_length)
      self
    end
  end
end

Hpricot::Doc.send(:include,       HpricotTruncator::NodeWithChildren)
Hpricot::Elem.send(:include,      HpricotTruncator::NodeWithChildren)
Hpricot::Text.send(:include,      HpricotTruncator::TextNode)
Hpricot::BogusETag.send(:include, HpricotTruncator::IgnoredTag)
Hpricot::Comment.send(:include,   HpricotTruncator::IgnoredTag)

然后在app/controllers/application.rb中添加
  helper Text

现在可以在view代码中使用
<%= h truncate_html(post.content, 100, "...") %>

ok,完成。
分享到:
评论
2 楼 chenjihua75 2008-10-13  
yangzhihuan 写道

这个不错啊.JE有一个帖子用一个正则表达式解决了这个问题http://www.iteye.com/post/690627

目标不同的啊
1 楼 yangzhihuan 2008-10-09  
这个不错啊.
JE有一个帖子用一个正则表达式解决了这个问题
http://www.iteye.com/post/690627

相关推荐

    sql之truncate_、delete与drop区别.pdf

    在SQL中,`TRUNCATE`、`DELETE`和`DROP`都是用于管理数据库表的重要命令,但它们之间存在显著的区别。本文将深入探讨这三种命令的功能、用法及其应用场景。 #### 相同点 `TRUNCATE`、不带`WHERE`子句的`DELETE`以及...

    Oracle_授权审计表Truncate权限.docx

    create or replace procedure proc_truncate_aud as begin execute immediate 'truncate table sys.aud$'; end; ``` 在创建了存储过程后,需要赋予存储过程的执行权限给相应的用户。例如,可以使用以下语句赋予 ...

    Oracle_审计表_sys.aud$_授权给用户Truncate权限.docx

    - **执行存储过程**:最后,用户可以通过调用存储过程`proc_truncate_aud`来执行截断操作。 ```sql CALL SYS.proc_truncate_aud(); ``` ##### 2. 监控与维护 - **审计表记录统计**:可以使用以下SQL语句来查看...

    前端开源库-truncate-html

    总的来说,`truncate-html` 是前端开发中处理HTML截断问题的一个实用工具,它提供了一种优雅的方式来控制长HTML内容的显示,保持页面的整洁性和可读性。通过合理利用其特性,我们可以优化用户体验,提升网站的性能。

    truncate_header2:从所有文件中删除标题。-matlab开发

    在MATLAB开发中,"truncate_header2:从所有文件中删除标题"是一个脚本,用于处理数据文件,尤其是那些带有头部信息的文件。这个工具的主要目的是为了去除文件开头的不必要的行,这些行通常包含了元数据或者注释,...

    修改过的cn_truncate函数实现

    以前从网上找到的一个smarty模板的中文截取函数cn_truncate,原来的实现方法有几个bug,我对它基本上重写了一遍。...最重要的是解决了中英文混合时候的截取计算长度的问题。而且解决了html 转义字符的长度计算问题。

    sql中 truncate 和 delete 有什么区别

    "SQL中truncate和delete的区别" SQL中truncate和delete是两种不同的数据删除方式,它们之间存在许多关键的区别。本文将详细阐述truncate和delete的不同之处,以便读者更好地理解和选择这两种删除方式。 -delete的...

    oracle中truncate table后的数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`是一个用于删除表中所有数据的命令,它与`DELETE`语句不同,不记录任何删除操作,并且在大多数情况下执行速度更快。然而,一旦执行`TRUNCATE TABLE`,数据通常无法通过常规的...

    Oracle给用户授权truncatetable的实现方案

    此外,还需要赋予用户对目标表(例如`SHOP.Z_TRUNCATE_T`)的`SELECT`, `INSERT`, `DELETE`, `UPDATE`权限: ```sql GRANT SELECT, INSERT, DELETE, UPDATE ON SHOP.Z_TRUNCATE_T TO DWETL; ``` 然而,这种方法...

    matlab开发-truncateheader

    `truncate_header.m`是完成这一任务的MATLAB脚本。在这个脚本中,可能包含了读取大文件、定位头部结束位置、以及从文件中删除或跳过头部信息的代码。由于大文件可能无法一次性加载到内存,因此通常会使用逐块读取...

    SQL Server中减小Log文件尺寸的方法分享

    需要注意的是,在SQL Server 2008及更高版本中,`TRUNCATE_ONLY`选项在`BACKUP LOG`语句中已被弃用。在这些版本中,你应该先将数据库设置为简单恢复模式,然后使用`DBCC SHRINKFILE`来减小日志文件尺寸。 在日志...

    前端开源库-truncate-html.zip

    7. **使用方法**:在项目中引入`truncate-html`后,可以调用提供的函数,传入需要截断的HTML字符串和配置参数,即可得到截断后的结果。例如,你可以设置`length`参数来指定截断长度,或者使用`保留标签`选项来保护...

    MySQL中truncate误操作后的数据恢复案例

    实际线上的场景比较复杂,当时涉及了truncate, delete 两个操作,经确认丢数据差不多7万多行,等停下来时,差不多又有共计1万多行数据写入。 这里为了简单说明,只拿弄一个简单的业务场景举例。 测试环境: Percona-...

    清空ecshop体验数据的简单方法

    TRUNCATE TABLE `ecs_admin_log`; TRUNCATE TABLE `ecs_article`; TRUNCATE TABLE `ecs_brand`; TRUNCATE TABLE `ecs_comment`; TRUNCATE TABLE `ecs_category`; TRUNCATE TABLE `ecs_goods`; TRUNCATE TABLE `ecs_...

    truncate 表恢复

    `TRUNCATE`命令在Oracle数据库中用于快速清空表中的所有数据。与`DELETE`命令不同的是,`TRUNCATE`不触发任何触发器也不记录回滚信息,因此执行速度更快。具体来说,`TRUNCATE`操作的原理在于它**并不会逐个清除用户...

    php截取汉字类

    1. **smarty_modifier_truncate_utf8**: 用于UTF-8编码下的中文字符串截取。 2. **gbk_strlen**: 计算GBK编码下字符串的长度。 3. **gbk_substr**: 在GBK编码下截取字符串。 4. **smarty_modifier_truncate_gbk**: ...

    数据库中truncate,delete,drop语句的比较

    ### 数据库中truncate、delete与drop语句的深入解析 #### 一、基本概念与应用场景 在数据库管理中,`truncate`、`delete`与`drop`是三种常见的SQL语句,它们各自拥有不同的功能与用途,对于初学者来说,区分这三种...

    ORACLE truncate 数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`命令用于删除表中的所有数据,但它与`DELETE`语句有所不同。`TRUNCATE`操作是DDL(Data Definition Language)的一部分,而`DELETE`是DML(Data Manipulation Language)。由于`...

    MySQL删除数据Delete与Truncate语句使用比较

    不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。 其语法结构为: 代码如下:...

Global site tag (gtag.js) - Google Analytics