学习用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,完成。
分享到:
相关推荐
在SQL中,`TRUNCATE`、`DELETE`和`DROP`都是用于管理数据库表的重要命令,但它们之间存在显著的区别。本文将深入探讨这三种命令的功能、用法及其应用场景。 #### 相同点 `TRUNCATE`、不带`WHERE`子句的`DELETE`以及...
create or replace procedure proc_truncate_aud as begin execute immediate 'truncate table sys.aud$'; end; ``` 在创建了存储过程后,需要赋予存储过程的执行权限给相应的用户。例如,可以使用以下语句赋予 ...
- **执行存储过程**:最后,用户可以通过调用存储过程`proc_truncate_aud`来执行截断操作。 ```sql CALL SYS.proc_truncate_aud(); ``` ##### 2. 监控与维护 - **审计表记录统计**:可以使用以下SQL语句来查看...
总的来说,`truncate-html` 是前端开发中处理HTML截断问题的一个实用工具,它提供了一种优雅的方式来控制长HTML内容的显示,保持页面的整洁性和可读性。通过合理利用其特性,我们可以优化用户体验,提升网站的性能。
在MATLAB开发中,"truncate_header2:从所有文件中删除标题"是一个脚本,用于处理数据文件,尤其是那些带有头部信息的文件。这个工具的主要目的是为了去除文件开头的不必要的行,这些行通常包含了元数据或者注释,...
以前从网上找到的一个smarty模板的中文截取函数cn_truncate,原来的实现方法有几个bug,我对它基本上重写了一遍。...最重要的是解决了中英文混合时候的截取计算长度的问题。而且解决了html 转义字符的长度计算问题。
"SQL中truncate和delete的区别" SQL中truncate和delete是两种不同的数据删除方式,它们之间存在许多关键的区别。本文将详细阐述truncate和delete的不同之处,以便读者更好地理解和选择这两种删除方式。 -delete的...
在Oracle数据库中,`TRUNCATE TABLE`是一个用于删除表中所有数据的命令,它与`DELETE`语句不同,不记录任何删除操作,并且在大多数情况下执行速度更快。然而,一旦执行`TRUNCATE TABLE`,数据通常无法通过常规的...
此外,还需要赋予用户对目标表(例如`SHOP.Z_TRUNCATE_T`)的`SELECT`, `INSERT`, `DELETE`, `UPDATE`权限: ```sql GRANT SELECT, INSERT, DELETE, UPDATE ON SHOP.Z_TRUNCATE_T TO DWETL; ``` 然而,这种方法...
`truncate_header.m`是完成这一任务的MATLAB脚本。在这个脚本中,可能包含了读取大文件、定位头部结束位置、以及从文件中删除或跳过头部信息的代码。由于大文件可能无法一次性加载到内存,因此通常会使用逐块读取...
需要注意的是,在SQL Server 2008及更高版本中,`TRUNCATE_ONLY`选项在`BACKUP LOG`语句中已被弃用。在这些版本中,你应该先将数据库设置为简单恢复模式,然后使用`DBCC SHRINKFILE`来减小日志文件尺寸。 在日志...
7. **使用方法**:在项目中引入`truncate-html`后,可以调用提供的函数,传入需要截断的HTML字符串和配置参数,即可得到截断后的结果。例如,你可以设置`length`参数来指定截断长度,或者使用`保留标签`选项来保护...
实际线上的场景比较复杂,当时涉及了truncate, delete 两个操作,经确认丢数据差不多7万多行,等停下来时,差不多又有共计1万多行数据写入。 这里为了简单说明,只拿弄一个简单的业务场景举例。 测试环境: Percona-...
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`命令在Oracle数据库中用于快速清空表中的所有数据。与`DELETE`命令不同的是,`TRUNCATE`不触发任何触发器也不记录回滚信息,因此执行速度更快。具体来说,`TRUNCATE`操作的原理在于它**并不会逐个清除用户...
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`是三种常见的SQL语句,它们各自拥有不同的功能与用途,对于初学者来说,区分这三种...
在Oracle数据库中,`TRUNCATE TABLE`命令用于删除表中的所有数据,但它与`DELETE`语句有所不同。`TRUNCATE`操作是DDL(Data Definition Language)的一部分,而`DELETE`是DML(Data Manipulation Language)。由于`...
不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。 其语法结构为: 代码如下:...