发表时间

测试蒙古文样式蒙古文的页面布局是从上到下,换行从左到右。

例如:

蒙古文 ᠮᠣᠩᠭᠣᠯ
另起一行啊
ᠪᠢᠴᠢᠭ,字里行间显示蒙古文,需要添加蒙古文字库,或者叫做字体。

本站使用的字库为微软开发的蒙古文字库——Monglian Baiti,也就是蒙古文白体。如果您使用的是微软的Windows Vista/7/8/8.1/10,那么您的系统中已经有该字库,如果是Windows XP,那么需要安装字库,更新USP10.dll;如果您使用的时Linux系统,可以下载 Mongolian Baiti字库 ,也可以正常显示,如果是其他系统,没有测试过,您测试了可以告诉我。

作者

发表时间

前面曾经简单介绍过 ISBN ,关于ISBN的校对,有新码和旧码两种校对方法:

  • 新码的校对方法:取前12位数字,将奇数位乘以1,偶数位乘以3,然后将12个积加到一起除以10得到余数,再用10减去余数,得到的数字即为校验数(第12位);
  • 旧码的校对方法:取前9位数字,依次乘以10,9,8,7,6,5,4,3,2,然后将乘积相加除以11得到余数,再用11减去余数,如果得到10,校验位(第10位)应该是X;如果得到11,校验位应该是0,其他的得到几即为几;

这是Ruby写的校验方法(isbn.rb):

def check_isbn(isbn)
  # delete all - from isbn string
  isbn = isbn.gsub(/-/,"")
  sum = 0
  # new isbn
  if isbn.length == 13
    for i in 0..11
      if isbn[i].to_i.odd?
        sum += isbn[i].to_i * 1
      else
        sum += isbn[i].to_i * 3
      end
    end
    if 10 - sum%10 == isbn[12].to_i
      return true
    else
      return false
    end
  # old isbn
  elsif isbn.length == 10
    for i in 0..8
      sum += isbn[i].to_i * (10 - i)
    end
    if 11 - sum%11 == 10 and isbn[9] == "X"
      return true
    elsif 11 - sum%11 == 11 and isbn[9] == "0"
      return true
    elsif 11 - sum%11 == isbn[9].to_i
      return true
    else
      return false
    end
  else
    return false
  end
end

if check_isbn(ARGV[0])
  puts 'yes'
else
  puts 'wrong'
end

运行 ruby isbn.rb 978-7-2343-266-3 即可得到校对结果。

作者

发表时间

翻译自: REXML: Processing XML in Ruby

REXMLRuby 编程 中推荐的XML处理器,该模块是 Ruby 内建模块,已经包含于发行包之中。该模块使用Ruby编写、运行迅速。通常使用两种方式解析:树式(Tree)解析和流式(Stream)解析。本文将展示如何使用REXML解析XML的基本用法。我们也将介绍在 irb 中基于REXML浏览XML文档。

我们将使用一个 DocBook 的目录文件作为示例XML文档。你将看到如何通过树形解析访问元素和树形,并且创建和插入元素。We’ll also look into the peculiarities of text nodes and entity processing。最后,我们将基于流解析如何解析XML文档。这个就是我们的DocBook文件:

例1: bibliography.xml 文件

bibliography.xml

开始树式(Tree)解析

我们使用树解析,其实这就是类似于DOM、但是更直观的的解析方法。这就是我们的第一段代码了:

显示一个XML文件内容(code1.rb)

require 'rexml/document'
include REXML
file = File.new("bibliography.xml")
doc = Document.new(file)
puts doc

require 声明用来加载 REXML 库。然后我们就包含(include)了REXML的命名空间,这样做就是为了不使用类似于 REXML::Document 这样的引用了。我们打开文件名为 bibliography.xml 的文件然后解析XML源码,然后我们就会得到一个 Document 对象。然后我们就把这个文档显示到屏幕上。当你执行命令 ruby code1.rb 的时候,bibliograpy.xml 的内容就会显示。

可能没有看到XML文件内容却得到了这样的信息:

example1.rb:1:in `require': No such file to load 
  -- rexml/document (LoadError)
        from example1.rb:1

如果是这样,你安装的Ruby中可能没有REXML模块,因为有些软件管理系统(如Debian中的APT)是将各种库作为单独的软件安装的。如果是这样,那么就安装 REXML 然后再试。

Document.new 方法生成一个基于文档(Document)或者字符串(String)对象为参数的IO流。参数定义了我们想要读取的XML文档来源。在我们的第一个示例中,我们使用了一个流(IO)对象,是继承自IO类的File对象。另一个IO类的子类是Socket类,也可以使用 Document.new 通过网络来获得一个XML文档。

如果Document构建器获得一个Document作为参数,那么所有的元素节点都会被复制到Document对象之中。如果构建器获得一个String参数,那么该字符串中会包含一个XML文档。例如:

示例3:显示一个XML“嵌入文档”(code2.rb)

require 'rexml/document'
include REXML
string = <<EOF
<?xml version="1.0" encoding="ISO-8859-15"?>
<!DOCTYPE bibliography PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
    "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<bibliography>
    <biblioentry id="FHIW13C-1234">
      <author>
        <firstname>Godfrey</firstname>
        <surname>Vesey</surname>
      </author>
      <title>Personal Identity: A Philosophical Analysis</title>
      <publisher>
        <publishername>Cornell University Press</publishername>
      </publisher>
      <pubdate>1977</pubdate>
   </biblioentry>
</bibliography>
EOF
doc = Document.new(string)
puts doc

我们使用“嵌入文档”字符串(所有位于 <<EOFEOF 中间的字符,包含换行以及字符串等等)。

访问元素和属性

从现在开始,我们将使用 irb (交互式Ruby调试器),就像我们前面使用 REXML 库一样。在 irb 提示符下,我们加载 bibliography.xml 文件到一个文档对象。然后我们就可以以交互方式执行命令访问文档的元素和属性了。

koan$ irb
irb(main):001:0> require 'rexml/document'
=> true
irb(main):002:0> include REXML
=> Object
irb(main):003:0> doc = Document.new(File.new("bibliography.xml"))
=> <UNDEFINED> ... </>

现在你可以很容易地浏览文档了。接下来我们在 irb 中看一看XML文档:

irb(main):004:0> root = doc.root
=> <bibliography id='personal_identity'> ... </>
irb(main):005:0> root.attributes['id']
=> "personal identity"
irb(main):006:0> puts root.elements[1].elements["author"]
<author>
  <firstname>Godfrey</firstname>
  <surname>Vesey</surname>
</author>
irb(main):007:0> puts root.elements["biblioentry[1]/author"]
<author>
  <firstname>Godfrey</firstname>
  <surname>Vesey</surname>
</author>
irb(main):008:0> puts root.elements["biblioentry[@id='FHIW13C-1260']"]
<biblioentry id='FHIW13C-1260'>
      <author>
        <firstname>Sydney</firstname>
        <surname>Shoemaker</surname>
      </author>
      <author>
        <firstname>Richard</firstname>
        <surname>Swinburne</surname>
      </author>
      <title>Personal Identity</title>
      <publisher>
        <publishername>Basil Blackwell</publishername>
      </publisher>
      <pubdate>1984</pubdate>
    </biblioentry>
=> nil
irb(main):009:0> root.each_element('//author') {|author| puts author}
<author>
  <firstname>Godfrey</firstname>
  <surname>Vesey</surname>
</author>
<author>
  <firstname>René</firstname>
  <surname>Marres</surname>
</author>
<author>
  <firstname>James</firstname>
  <surname>Baillie</surname>
</author>
<author>
  <firstname>Brian</firstname>
  <surname>Garrett</surname>
</author>
<author>
  <firstname>John</firstname>
  <surname>Perry</surname>
</author>
<author>
  <firstname>Geoffrey</firstname>
  <surname>Madell</surname>
</author>
<author>
  <firstname>Sydney</firstname>
  <surname>Shoemaker</surname>
</author>
<author>
  <firstname>Richard</firstname>
  <surname>Swinburne</surname>
</author>
<author>
  <firstname>Jonathan</firstname>
  <surname>Glover</surname>
</author>
<author>
  <firstname>Harold</firstname>
  <othername>W.</othername>
  <surname>Noonan</surname>
</author>
=> [<author> ... </>, <author> ... 
  </>, <author> ... </>, <author> ... 
  </>, <author> ... </>, <author> ... 
  </>, <author> ... </>, <author> ... 
  </>, <author> ... </>, <author> ... </>]

首先我们使用 root 访问文档根元素。文档根元素这里是 bibliography 元素。每个元素对象都有一个属性族(Attributes)对象叫做 attributes ,该对象以“键-值”对的形式保存所有属性值。所以使用 root.attributes['id'] 就会得到root元素的以 id 为键的属性值。同样,每个元素对象都有一个元素族对象叫做 elements ,使用 each[ ] 方法可以访问每个子元素。 [ ] 方法获得一个索引或者 XPath 表达式作为参数,返回符合参数的子元素。 XPath 表达式像一个过滤器,来匹配哪一个元素符合条件。注意: root.elements[1] 指第一个元素,因为XPath的索引值是从1而不是0开始的。实际上, root.elements[1] 等同于 root.elements[*[1]] ,而 *[1] 就是匹配第一个子元素的表达式。 Elements 类的 each 方法循环遍历所有的子元素,也可以通过一些XPath表达式来过滤某些元素。在 each 循环中代码块将会执行。另外, Element.each_elementElement.elements.each 的简化形式。

创建和插入元素和属性

现在我们创建一个小的bibliography文档,包含一个 biblioentry 。如下:

irb(main):010:0> doc2 = Document.new
=> <UNDEFINED/>
irb(main):011:0> doc2.add_element("bibliography", 
                    {"id" => "philosophy"})
=> <bibliography id='philosophy'/>
irb(main):012:0> doc2.root.add_element("biblioentry")
=> <biblioentry/>
irb(main):013:0> biblioentry = doc2.root.elements[1]
=> <biblioentry/>
irb(main):014:0> author = Element.new("author")
=> <author/>
irb(main):015:0> author.add_element("firstname")
=> <firstname/>
irb(main):016:0> author.elements["firstname"].text = "Bertrand"
=> "Bertrand"
irb(main):017:0> author.add_element("surname")
=> <surname/>
irb(main):018:0> author.elements["surname"].text = "Russell"
=> "Russell"
irb(main):019:0> biblioentry.elements << author
=> <author> ... </>
irb(main):020:0> title = Element.new("title")
=> <title/>
irb(main):021:0> title.text = "The Problems of Philosophy"
=> "The Problems of Philosophy"
irb(main):022:0> biblioentry.elements << title
=> <title> ... </>
irb(main):023:0> biblioentry.elements << Element.new("pubdate")
=> <pubdate/>
irb(main):024:0> biblioentry.elements["pubdate"].text = "1912"
=> "1912"
irb(main):025:0> biblioentry.add_attribute("id", "ISBN0-19-285423-2")
=> "ISBN0-19-285423-2"
irb(main):026:0> puts doc2
<bibliography id='philosophy'>
  <biblioentry id='ISBN0-19-285423-2'>
    <author>
      <firstname>Bertrand</firstname>
      <surname>Russell</surname>
    </author>
    <title>The Problems of Philosophy</title>
    <pubdate>1912</pubdate>
  </biblioentry>
</bibliography>
=> nil

我们上面创建了一个空的文档,然后添加了一个元素,这是元素就是根元素。 add_element 方法使用元素名字作为参数,可选参数使用“键-值”对来构建属性。所以使用该方法可以添加一个子元素到文档或者设定元素的属性。

也可以构建一个新的元素,就像我们构建的 author 元素,然后添加它到另一个元素:如果 add_element 方法获得一个 Element 元素对象,该对象将被添加到父元素。同 add_element 方法具有相同作用的还有@Element.elments@ 的 << 方法。两个方法都会返回添加的元素。

另外,使用方法 add_attribute 可以给已经存在的元素添加一个属性。第一个参数就是属性名字,第二个参数是属性值。方法返回添加的属性。一个元素的文本值使用 Element.text 或者 add_text 都很容易就可以改变。

如果你想插入一个元素到指定的位置,你可以使用方法 insert_beforeinsert_after

irb(main):027:0> publisher = Element.new("publisher")
=> <publisher/>
irb(main):028:0> publishername = Element.new("publishername")
=> <publishername/>
irb(main):029:0> publishername.add_text("Oxford University Press")
=> <publishername> ... </>
irb(main):030:0> publisher << publishername
=> <publishername> ... </>
irb(main):031:0> doc2.root.insert_before("//pubdate", publisher)
=> <bibliography id='philosophy'> ... </>
irb(main):032:0> puts doc2
<bibliography id='philosophy'>
  <biblioentry id='ISBN0-19-285423-2'>
    <author>
      <firstname>Bertrand</firstname>
      <surname>Russell</surname>
    </author>
    <title>The Problems of Philosophy</title>
    <publisher>
      <publishername>Oxford University Press</publishername>
    </publisher>
    <pubdate>1912</pubdate>
  </biblioentry>
</bibliography>
=> nil

删除元素和属性

add_elmentadd_attribute 方法都有他们的逆方法。示例如下:

irb(main):033:0> doc2.root.delete_attribute('id')
=> <bibliography> ... </>
irb(main):034:0> puts doc2
<bibliography>
  <biblioentry id='ISBN0-19-285423-2'>
    <author>
      <firstname>Bertrand</firstname>
      <surname>Russell</surname>
    </author>
    <title>The Problems of Philosophy</title>
    <publisher>
      <publishername>Oxford University Press</publishername>
    </publisher>
    <pubdate>1912</pubdate>
  </biblioentry>
</bibliography>
=> nil

delete_attribute 方法返回被删除的属性。

delete_element 方法以元素对象、字符串或者索引值作为参数:

irb(main):034:0> doc2.delete_element("//publisher")
=> <publisher> ... </>
irb(main):035:0> puts doc2
<bibliography>
  <biblioentry id='ISBN0-19-285423-2'>
    <author>
      <firstname>Bertrand</firstname>
      <surname>Russell</surname>
    </author>
    <title>The Problems of Philosophy</title>
    <pubdate>1912</pubdate>
  </biblioentry>
</bibliography>
=> nil
irb(main):036:0> doc2.root.delete_element(1)
=> <biblioentry id='ISBN0-19-285423-2'> ... </>
irb(main):037:0> puts doc2
<bibliography/>
=> nil

第一个 delete_element 方法调用一个XPath表达式定位欲删除元素,第二次使用了索引值1,意味着文档根元素内的元素将被删除。 delete_element 方法返回被删除的元素。

文本节点和实体处理

在前面的示例中,我们已经使用过文本节点。这一部分我们将展示更多文本处理示例。尤其是如何使用REXML处理实体?REXML是一种非验证解析器,所以不需要扩展外部实体。所以外部的实体不会被他们的值取代,但是内部实体可以:当REXML解析一个XML文档的时候,它会处理DTD和创建一个内部实体和他们的值的表格。当这些实体中的一个出现在文档中的时候,REXML会用他的值取代它。如下:

irb(main):038:0> doc3 = Document.new('<!DOCTYPE testentity [
irb(main):039:1' <!ENTITY entity "test">]>
irb(main):040:1' <testentity>&entity; the entity</testentity>')
=> <UNDEFINED> ... </>
irb(main):041:0> puts doc3
<!DOCTYPE testentity [
<!ENTITY entity "test">]>
<testentity>&entity; the entity</testentity>
=> nil
irb(main):042:0> doc3.root.text
=> "test the entity"

可以看到,当打印XML文档的时候,已经使用了正确的实体。当你访问文本的时候,实体 &entiry; 已经替换为 “text”。

然而,REXML使用了实体的延迟求值算法。所以,下面问题就来了:

irb(main):043:0> doc3.root.text = "test the &entity;"
=> "test the &entity;"
irb(main):044:0> puts doc3
<!DOCTYPE testentity [
<!ENTITY entity "test">
]>
<testentity>&entity; the &entity;</testentity>
=> nil
irb(main):045:0> doc3.root.text                      
=> "test the test"

如你所见,文本“test the &entity;”变成了“&entity; the &entity;”。如果你改变entity的值,结果会更加超出你所期望:文本中更多的地方将被替换。如果你的程序确认被这个问题折磨,你可以在 Text 或者 Element 上设置 :raw 标志,设置在 Document 上也可以,那么文本中的实体将不会被处理,如果需要做相关处理就需要手动处理了。例如:

irb(main):046:0> doc3 = Document.new('<!DOCTYPE testentity [
irb(main):047:1' <!ENTITY entity "test">]>
irb(main):048:1' <testentity>test the &entity;</testentity>', 
                 {:raw => :all})
=> <UNDEFINED> ... </>
irb(main):049:0> puts doc3
<!DOCTYPE testentity [
<!ENTITY entity "test">
]>
<testentity>test the &entity;</testentity>
=> nil
irb(main):050:0> doc3.root.text
=> "test the test"

实体“ &, <, >, “, ”和“’”会自动处理。如果你在文本节点或者属性中使用这些字符的时候,REXML会自动将他们转化为相应的实体转义表达式,例如 &amp; 会转变为 & 。

流式(Stream)解析

流式解析速度优于树式解析。如果看重速度,那么优先选择流式解析。可是,在流式解析模式下,是不提供XPath的。你不得不构建一个监视器类,REXML要处理每个事件(例如start_tag, end_tag等等),事件发生时监视器发出提醒。示例程序如下:

示例4:流式解析 (code3.rb)

require 'rexml/document'
require 'rexml/streamlistener'
include REXML

class Listener
  include StreamListener
  def tag_start(name, attributes)
    puts "Start #{name}"
  end
  def tag_end(name)
    puts "End #{name}"
  end
end

listener = Listener.new
parser = Parsers::StreamParser.new(File.new("bibliography2.xml"), listener)
parser.parse

文件bibliography2.xml如下:

示例5:bibliography2.xml文件

bibliography2.xml

运行 code2.rb 得到如下结果:

koan$ ruby code3.rb 
Start bibliography
Start biblioentry
Start author
Start firstname
End firstname
Start surname
End surname
End author
Start title
End title
Start publisher
Start publishername
End publishername
End publisher
Start pubdate
End pubdate
End biblioentry
End bibliography

结论

Ruby and XML make a great team(译者按:这句话感觉很莫名奇妙,就不翻译了。另外这个链接也很诡异,网站只剩一个页面了!)。REXML的XML处理器可以很直观的去创建、访问和修改XML文档。如果使用 irb Ruby互动调试器,我们也可很容易的去浏览一个XML文档。

相关链接

作者

发表时间

ISBN是International Standard Book Number(国际标准书号)的缩写形式,是专门为识别图书等文献而设计的国际编号。ISO(国际标准化组织)于1972年颁布了ISBN国际标准,并在西柏林普鲁士图书馆设立了实施该标准的管理机构—-国际ISBN中心。现在,采用ISBN编码系统的出版物有:图书、小册子、缩微出版物、盲文印刷品等。2007年1月1日前,ISBN由10位字组成,分四个部分:组号(国家、地区、语言的代号),出版者号,书序号和检验码。2007年1月1日起,实行新版ISBN,新版ISBN由13位数字组成,分为5段,即在原来的10位数字前加上3位ENA(欧洲商品编号 )图书产品代码“978”。

构成

现行ISBN(2007年1月1日后)一共有13位数字,分为5组:

  1. 前三位数字ENA(欧洲商品编码)的代码,978代表了是图书类商品,这部分是所有国际通用条码都会具备的部分(这也是13位代码比原来的10位代码多出来的部分,有了这部分,才算是真的国际化了);
  2. 第二部分由第四位数字构成,是组号,中国使用7;
  3. 第5到第8位数字是出版社号,例如107代表人民出版社;
  4. 第9到第12位数字是书的序号;
  5. 第13位数字是校验码

校验码算法

从左到右前12位数,奇数位乘1,偶数位乘3,将12个乘积相加,除以10,得到余数,再用10减去这个余数即可

作者

发表时间

原文见 Textpatter Semantics 原文注明“This article has been helpfully translated into Dutch, Chinese, French, Russian and Italian”,可惜中文的链接已经失效,站点还在,满网页都是关于“GPS携帯電話のあれこれ”,看不懂日文,感觉像是卖电话的。出于对Textpattern的喜欢,再对其进行中文翻译。

此文主要介绍Textpattern的架构设计以及各构成元素间的关系。准确的理解Textpattern的概念和意图有助于更好地使用本系统。

主旨思想:分立的两个架构

这显然很帅:一进入 Textpattern 管理界面就看到两个独立的结构:内容(Content)和外观(Presentation)。

!!

下表显示了他们各自所包含内容的层次机构以及内部的相互联系。

!!

请记住这个基本的概念:内容意味着信息,外观负责内容的展示方式。另外请记住,图像和链接是信息的不同存储方式,他们可能被文章、网页或者模块使用。

顺便说一下,如果你还对内容和外观有疑问,可以看一下 mattmoss 制作的一个更加 详细的图表 。如下图。

总之,Textpattern 中主要涉及到了下面这些术语:

分类
依据文章 内容的自然属性(例如“学科”) 进行分类(而 不是 依据其在导航结构中的位置)
分类:文章
通常,会通过全局考虑,将所涉及内容依据相关标准将其分为几大块,每一部分内容都会有其他一些元素,例如标题、作者、发布时间、分类等。
版块
如同报纸的版面。版块可以通过URL访问,例如:“http://www.georgefrankly.com/about”可以访问到georgefrankly.com的关于(About)版块。版块除了包含使用的页面和样式外,还有一些其他信息。首页是一个内置的单独的版块,它不会出现在版块列表中。
版块:样式(Style)
版块样式中CSS信息包含字体,元素的位置等等。 样式通常决定版块的显示方式,而不是页面或者分类
版块:页面
在这里构造 XHTML 格式的版块使用页面。页面利用模块和一些 Textpattern 代码来组织文章和内容。
版块:页面:模块
模块是指无序的、 可重用的 内容块。模块包含了文本信息, HTML 标记和 textpattern 的代码。模块也可以意淫用其他模块。

编码提示

如上所述, Textpattern 各部分都和使用通常叫做标签(Tag)的 Textpattern 代码。代码主要分为两种:我喜欢叫他们为描述型原子型和非原子型,实际上他们叫做 模块标签页面标签

Pedro Palazón 曾经在他的 Textpattern 标签手册(Textpattern Tag Mannul) 中写过一个详细的 Textpattern 代码类型说明

更多关于分类与版块的比较

一般来说,大部分人对于分类和版块的角色定位都很费解,通常都会错误地利用分类执行网站的导航功能。如果您是这么认为的,那么再去理解其实这是版块该负的责任就相当费力了。

版块会将所有文章彼此分割成几部分 。而 分类只不过是在文章上打上几个标签 ,主要是为了在一个版块内部来排序使用。

在一个版块内您可以显示:

  • 版块内的的所有文章,或者
  • 特定分类的文章或者仅仅那个版块内的该分类的文章

(例外:使用新的标签可以显示其他版块的文章,但是,常见的 标签只显示当前版块内部的相关分类的文章。)

这也就解释了为什么 Textpattern 的分页功能不能跨版块。

分类是全局性的分类,而不仅仅局限于版块;假如您有一个叫做“开源软件”,您可以将任何有关开源软件的信息(不仅仅局限于版块内容)都放到该分类下。这是因为,分类和版块是两个不同的分立的系统。

分类和版块都是可选项 。如果您不是用版块功能,那么所有的文章都会默认使用 default 页面。如果您不是用分类功能,那么您的文章显示的时候就不会显示相关的分类信息。

“首页”版块

首页实际上就是一个版块。该版块有一个定制的页面(default)和一个定制的样式表(default)。可是,您不能将一篇文章像分配到其他版块那样分配到首页,首页版块没有属于自己的文章,它只是显示那些勾选了“在首页显示”的版块内的文章。

永久链接

永久链接用于为文章提供一个不变的参考地址。当您点击一个文章的永久链接的时候,您将会看到文章显示 使用不含版块的页面 。这是因为,如果您的站点使用了版块,永久链接的地之中就包含了版块的 URL 。记着,版块是可以通过 URL 来访问的。(译者注:为什么?没搞明白!)

这是一个永久链接地址:http://www.spud.com/tech/12/CantArgue。我们可以看出,该地址指向了一个 “tech” 版块中的一篇文章,通过猜测,该链接应当是指向了一篇叫做“Cant Argue”的文章(Textpattern 会从文章标题中提取永久链接的信息)。如果您在浏览器中使用了该地址, Textpattern 会在 “tech” 版块中寻找该文章。

因为 Textpattern 依赖 URL 来获取文章所用的页面,您可以来“骗骗”她,让她使用其他版块的页面!例如,http://www.spud.com/about/12/CantArgue 将会使文章显示在版块about的页面中,而实际上该文章是在其他的版块中。我不知道这很无聊,这样做也没有什么用处,但是可以说明 Textpattern 是如何利用 URL 来显示内容的。(译者注:该漏洞现在已不存在,测试版本为4.5.7)

结束语

有问题可以 联系我 ,或者最好讨论 相关问题Textpattern 支持论坛 上。

如果您在寻找好的支持 Textpattern 的主机,我推荐去 TextDrive , 我现在在那已经有7个网站了,服务还不错。

——JD

“Saying what we think gives us a wider conversational range than saying what we know.”

— Cullen Hightowe

作者