2020-06
18

BlogBus 2 WordPress – by xrspook

By xrspook @ 19:50:07 归类于: 扮IT

为什么要学习python?因为我见识过python有多牛逼,简单一个脚本文件,轻量级的东西实现强大的功能。因为要做XML文件的格式转换,所以我觉得我要学好python。Think Python 2看到第14章,我就转向去研究10年多以前网友写的BlogBus转WordPress的python脚本。之所以要研究,因为当时的WordPress格式和现在不一样,用以前的脚本转换出来的东西已经没办法直接导入到现在的WordPress里了。再去找写代码的那些人,有些网站还在,但有些已经消失了。我不能等待别人拯救我,我只能自己拯救自己。

我需要转换格式的是“回到过去——Betty迷的独白”和“Mi Internacional Cielo”,这两个旧BlogBus站点和我的主站“我的天”不一样,虽然里面有不少我原创的东西,但我从四面八方搜集回来的内容也不少。当时的BlogBus默认编辑界面是富文本,我看上去觉得格式没问题大概就可以了,但实际上格式是有问题的。从五湖四海搜集回来的文字里面怎么可能不夹杂各种格式,那些东西在富文本编辑下可能看不出来,但在源代码界面一团糟。如果当年我复制粘贴的时候有先去记事本过渡一下就不会有那么多的问题。所以除了要转换BlogBus和WordPress的标签以外我还要筛选删除那些坏事的源代码。

经过接近一周的努力,我终于整出来了。运行下面的python3脚本,如果能顺利完成,自动生成出新的XML文件,用官方途径导入WordPress 5.4.2是完全没有问题的,但我只测试了我自己的两个blog,是不是兼容其它我不知道。因为转换blog我是有自己的想法的,所以脚本中有一些个性化的东西,比如我把blog的标题变成了分类,把原来的分类变成了标签。脚本中有大量的反转义替换,主要是为了人去看CDATA的时候不太头晕迷糊,因为我那两个旧blog里有大量的西班牙语字符,不同的编码下,BlogBus的导出文件里有些被转义了有些没有。那些转义了的放到WordPress里不知道WordPress会不会转回来,我试过标题被BlogBus转义之后WordPress不会转回来,看得我云里雾里。因为转义很头痛,所以除了少数几个内容,有可能被转义的文字都被我用CDATA包裹了起来。

脚本不是我一个人的功劳,我只是在当年网友脚本的基础上做了调整,使之适配python3和WordPress 5.4.2。

我的脚本:xbus2wp.py (PS:下面脚本330行的《/p》是什么鬼怪!WordPress的脚本插件在搞什么!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
'''
***使用说明***
终端界面输入xbus2wp.py bus.xml xrspook。其中:
xbus2wp.py为脚本名字,bus.xml为BlogBus导出文件,xrspook为博主名字,3个参数以空格分开
若运行无误,输出的文件名为[原文件名_xbus2wp.xml]
脚本基于python3,适配WordPress 5.4.2(2020-06-18)
'''
 
import re, sys, getopt, datetime
from xml.dom import minidom
from time import time
 
def convert(inputFileName, owner, order='asc'):
    """"""
    try:
        xmldoc = minidom.parse(inputFileName)
    except Exception as e:
        print ('Fail.')
        print (e)
        print ('Please repair or delete invalid token like "& < >" there.')
        sys.exit(1)
 
    bus = xmldoc.documentElement
    logs = bus.getElementsByTagName('Log')
 
    dom = minidom.Document()
    rss = dom.createElement('rss') # rss是root,根元素
    dom.appendChild(rss)      
    rss.setAttribute('version', '2.0')
    rss.setAttribute('xmlns:content', 'http://purl.org/rss/1.0/modules/content/')
    rss.setAttribute('xmlns:wfw', 'http://wellformedweb.org/CommentAPI/')
    rss.setAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/')
    rss.setAttribute('xmlns:wp', 'http://wordpress.org/export/1.0/')
    channel = dom.createElement('channel')
    rss.appendChild(channel)
    wxr_version = dom.createElement('wp:wxr_version') # 加入wxr戳,无戳无法进行WordPress导入
    channel.appendChild(wxr_version)
    wxr_version_node = dom.createTextNode('1.1')
    wxr_version.appendChild(wxr_version_node)
 
    busname = bus.getElementsByTagName('BlogName')[0] # 提取原BlogBus名字
    busname_text = getElementData(busname).replace(' ', '_')
 
    # create a list to contain items instead of appending them to
    # channel directly in order to sort them of lately according to order.
    if order == 'desc':
        item_list = []
    else:
        item_list = None
 
    for log in logs:
        title = log.getElementsByTagName('Title')[0]
        title_text = getElementData(title)
        content = log.getElementsByTagName('Content')[0]
        content_text = getElementData(content)
        logdate = log.getElementsByTagName('LogDate')[0]
        pubdate = getElementData(logdate)
        writer = log.getElementsByTagName('Writer')[0]
        creator = owner # BlogBus的writer根本没包含元素!
        category = getElementData(log.getElementsByTagName('Sort')[0])
        tagi = log.getElementsByTagName('Tags')[0]
        tags = getElementData(tagi).split(' ')
        new_tags = unique_tag(category, tags) # 新的wp标签里包含了原BlogBus里的分类与标签
        comments = log.getElementsByTagName('Comment')
 
        #-----
        item = dom.createElement('item')
 
        # handle title
        title_element = createElement(dom, 'title', title_text, 'cdata')
        item.appendChild(title_element)
 
        # handle type
        type_element = createElement(dom, 'wp:post_type', 'post', 'cdata')
        item.appendChild(type_element)
 
        # handle pubdate
        pubdate_element = createElement(dom, 'pubDate', convertPubDate(pubdate))
        item.appendChild(pubdate_element)
 
        # handle creator
        creator_element = createElement(dom, 'dc:creator', creator, 'cdata')
        item.appendChild(creator_element)
 
        # handle categories with domain
        category_element = createElement(dom, 'category', busname_text, 'cdata') # 把BlogBus标题设置为分类,因为我要合并多个旧blog
        category_element.setAttribute('domain','category')
        category_element.setAttribute('nicename', busname_text)
        item.appendChild(category_element)
 
        # handle tags
        for tag in new_tags:
            tag = tag.replace('&ntilde;', 'n')
            tag = tag.replace('summary_of_BLF', 'summary_of_BLF(from_rincondebetty)')
            tag = tag.replace('summary_of_EcoModa', 'summary_of_EcoModa(from_rincondebetty)')
            category_element = createElement(dom, 'category', tag, 'cdata')
            category_element.setAttribute('domain','post_tag')
            category_element.setAttribute('nicename', tag)
            item.appendChild(category_element)
 
        # handle content
        content_element = createElement(dom, "content:encoded", content_text, 'cdata')        
        item.appendChild(content_element)
 
        # handle post_date
        post_date_element = createElement(dom, "wp:post_date", pubdate)
        item.appendChild(post_date_element)
 
        # handle status
        status_element = createElement(dom, "wp:status", 'publish')
        item.appendChild(status_element)
 
        # handle comments
        if comments:
            commentElements = createComments(dom, comments)
            for commentElement in commentElements:
                item.appendChild(commentElement)
 
        if item_list != None:
            item_list.append(item)
        else:
            channel.appendChild(item)
 
    if item_list:
        item_list.reverse()
        for m in item_list:
            channel.appendChild(m)
 
    global filename # 输出设置
    output = filename + '_xbus2wp.xml'
    f = open(output ,'wb+')
    import codecs
    writer = codecs.lookup('utf-8')[3](f)
    dom.writexml(writer, '', ' ' * 4, '\n', encoding='utf-8')
    writer.close()
 
def unique_tag(category,tags): # 只保留唯一的标签
    category = category.replace(' ', '_')
    l = category.split() + tags
    new_l = []
    for item in l:
        if item not in new_l and item != '(from_rincondebetty)':
            new_l.append(item.replace(' ', '_')) # 替换空格为下划线
    return new_l
 
def getElementData(element): # 获取节点数据
    """"""
    data = ''
    for node in element.childNodes:
        if node.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
            data += node.data
    return data
 
def createComments(dom, comments):
    """"""
    l = []
    count = 0
    for comment in comments:
        count += 1 # 每篇文章的评论序号,没有序号,评论只能导入每篇最后一条
        email = comment.getElementsByTagName('Email')[0]
        homepage = comment.getElementsByTagName('HomePage')[0]
        name = comment.getElementsByTagName('NiceName')[0]
        content = comment.getElementsByTagName('CommentText')[0]
        date = comment.getElementsByTagName('CreateTime')[0]
        comment_element = createCommentElement(count, dom, email, homepage, name, content, date)
        l.append(comment_element)
    return l
 
def createCommentElement(count, dom, email, homepage, name, content, date):
    """"""
    comment_author = getElementData(name)
    comment_author_email = getElementData(email)
    comment_author_url = getElementData(homepage)
    comment_date = getElementData(date)
    comment_content = getElementData(content)
 
    comment_id_element = createElement(dom, 'wp:comment_id', str(count))
    comment_author_element = createElement(dom, 'wp:comment_author', comment_author)
    comment_author_email_element = createElement(dom, 'wp:comment_author_email', comment_author_email)
    comment_author_url_element = createElement(dom, 'wp:comment_author_url', comment_author_url)
    comment_date_element = createElement(dom, 'wp:comment_date', comment_date)
    comment_date_gmt_element = createElement(dom, 'wp:comment_date_gmt', comment_date)
    comment_content_element = createElement(dom, 'wp:comment_content', comment_content, 'cdata')
    comment_approved_element = createElement(dom, 'wp:comment_approved', '1')
 
    # make the comment element
    comment_element = dom.createElement('wp:comment')
    comment_element.appendChild(comment_id_element)
    comment_element.appendChild(comment_author_element)
 
    # validate email and url
    validEmail = validateEmail(comment_author_email)
    if (validEmail):
        comment_element.appendChild(comment_author_email_element)
 
    validUrl = validateUrl(comment_author_url)
    if (validUrl):
        comment_element.appendChild(comment_author_url_element)    
 
    comment_element.appendChild(comment_date_element)
    comment_element.appendChild(comment_date_gmt_element)
    comment_element.appendChild(comment_content_element)
    comment_element.appendChild(comment_approved_element)
 
    return comment_element
 
def createElement(dom, elementName, elementValue, type='text'): #建立节点标签和节点
    """"""
    global owner
    tag = dom.createElement(elementName)
    if elementValue.find(']]>') > -1:
        type = 'text'
    if type == 'text':
        text = dom.createTextNode(elementValue)
    elif type == 'cdata':
        elementValue = elementValue.replace('&amp;', '&')
        elementValue = elementValue.replace('&lt;', '<')
        elementValue = elementValue.replace('&gt;', '>')
        elementValue = elementValue.replace('&apos;', '\'')
        elementValue = elementValue.replace('&quot;', '"')
 
        # 大量替换与我的旧blog有各种编码的西班牙语字符有关
        elementValue = elementValue.replace('&copy;', '') # 版权标志
        elementValue = elementValue.replace('&nbsp;', '') # 空格
        elementValue = elementValue.replace('&ldquo;', '“') # 左双引号
        elementValue = elementValue.replace('&rdquo;', '”') # 右双引号
        elementValue = elementValue.replace('&lsquo;', '‘') # 左单引号
        elementValue = elementValue.replace('&rsquo;', '’') # 右单引号
        elementValue = elementValue.replace('&acute;', '´') # 单引号
        elementValue = elementValue.replace('&hellip;', '...') # 省略号
        elementValue = elementValue.replace('&mdash;', '—') # 破折号
        elementValue = elementValue.replace('&middot;', '·') # 分隔号
        elementValue = elementValue.replace('&deg;', '°') # 单位度
        elementValue = elementValue.replace('&iexcl;', '¡') # 西班牙语反叹号
        elementValue = elementValue.replace('&iquest;', '¿') # 西班牙语反问号
        elementValue = elementValue.replace('&ntilde;', 'ñ') # 西班牙语n
        elementValue = elementValue.replace('&Ntilde;', 'Ñ') # 西班牙语N
        elementValue = elementValue.replace('&aacute;', 'á') # 西班牙语a
        elementValue = elementValue.replace('&eacute;', 'é') # 西班牙语e
        elementValue = elementValue.replace('&iacute;', 'í') # 西班牙语i
        elementValue = elementValue.replace('&oacute;', 'ó') # 西班牙语o
        elementValue = elementValue.replace('&uacute;', 'ú') # 西班牙语u
        elementValue = elementValue.replace('&Aacute;', 'Á') # 西班牙语A
        elementValue = elementValue.replace('&Eacute;', 'É') # 西班牙语E
        elementValue = elementValue.replace('&Iacute;', 'Í') # 西班牙语I
        elementValue = elementValue.replace('&Oacute;', 'Ó') # 西班牙语O
        elementValue = elementValue.replace('&Uacute;', 'Ú') # 西班牙语U
        elementValue = elementValue.replace('&Atilde;', 'Ã') # 西班牙语A~
        elementValue = elementValue.replace('&ordf;', 'ª') # 西班牙语上标a
        elementValue = elementValue.replace('&ordm;', 'º') # 西班牙语上标o
 
        elementValue = elementValue.replace('<!--msnavigation-->', '')
        elementValue = elementValue.replace('博主', owner)
        elementValue = elementValue.replace('<i>', '')
        elementValue = elementValue.replace('</i>', '')
        elementValue = elementValue.replace('<br /><br />', '<br />')
 
        elementValue = re.sub(r"(?:<\?xml.*?>)", "", elementValue)
        elementValue = re.sub(r"(?:<[TDSFHI].*?>)", "", elementValue)
        elementValue = re.sub(r"(?:<\/[TDSFHI].*?>)", "", elementValue)
        elementValue = re.sub(r"(?:<P.*?>)", "<p>", elementValue)
        elementValue = re.sub(r"(?:<(table|tbody|tr|td|div|span|img|script|font|hr|object|param).*?>)", "", elementValue)
        elementValue = re.sub(r"(?:<\/(table|tbody|tr|td|div|span|img|script|font|object).*?>)", "", elementValue)
        elementValue = re.sub(r"\n", "", elementValue) # 把替换造成的空行删除
 
        text = dom.createCDATASection(elementValue)
    tag.appendChild(text)
    return tag
 
def convertPubDate(date, timediff='+0000'):
    """
    convert 2003-08-22 16:01:56
    to Thu, 23 Aug 2007 05:47:54 +0000
    """
    year, mon, day = int(date[:4]), int(date[5:7]), int(date[8:10])
    time = date[11:]
    aday = datetime.datetime(year, mon, day)
    d = {'1':'Mon', '2':'Tus', '3':'Wen', '4':'Thur', '5':'Fri', '6':'Sat', '7':'Sun'}
    m = {'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr', '5':'May', '6':'Jun',
         '7':'Jul', '8':'Aug', '9':'Sep', '10':'Oct', '11':'Nov', '12':'Dec'}
    weekday = d[str(aday.isoweekday())]
    month = m[str(mon)]
    pubdate = "%s, %d %s %s %s %s" % (weekday, day, month, year, time, timediff)
    return pubdate
 
def validateEmail(email):
    '''
    '''
    pattern = r'^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$'
    p = re.compile(pattern)
    m = p.match(email)
    if m:
        return True
    else:
        return False
 
def validateUrl(url):
    '''
    '''
    pattern = r'^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$'
    p = re.compile(pattern)
    m = p.match(url)
    if m:
        return True
    else:
        return False
 
def main(argv=None):    
    global filename
    global owner
 
    if argv is None:
        argv = sys.argv
    # parse command line options
 
    args = sys.argv[1:]
    order='asc'
    if (len(args) == 2):
        print ('Converting...'),
        sys.stdout.flush()
        start = time()
        filename = args[0].replace('.xml', '')
        owner = args[1] # BlogBus没把博主名字输出,只能手动
        convert(args[0], args[1], order)
        end = time()
        print ('Done. Elapse %g seconds.' % (end - start))
 
if __name__ == "__main__":
    sys.exit(main())
</p>
2020-03
31

如果可以再选一次编程初恋

By xrspook @ 8:59:02 归类于: 烂日记

编程是什么,我也不知道,但显然对我的很多同学而言,那是一个别人给你的任务,要你去实现它。那就像是一次测验或者一次考试,把那东西拿下,他们就会有成就感,或者那根本谈不上成就感,完全是因为那跟成绩挂钩,那跟学分挂钩。任何东西和那扯上关系,他们都会觉的有满满的肾上腺素。他们不是为自己而变成。情况就像那些沉迷于游戏的人。当然我之所以这么说,大概因为我不玩游戏,我是一个游戏渣,所以我才会有这样的看法。当我的同学花很多时间听歌、看电影、看电视、看综艺的时候,我花了很多时间在我的blog上,有可能是回忆某天我干了些什么,有什么感悟,也有可能我正在改进blog的。有可能是版面装修,也有可能是某篇日志里某个图片的PS。现在回想起来,那真挺神奇的,为什么我每天都可以为自己的日志配张图呢?现在我已经不记得是不是每篇日志都这么干了,但的确很多日志我都用心地配了图。有些简单一点,直接是照了个相,然后处理一下,修改一下大小也就可以了,顶多是加个滤镜什么的,但更多的那些是集合了好些操作的。

相比于PS,我更喜欢写代码。但实际上,当时我接触的代码不过是CSS而已。网站的基本结构很简单,因为高深的东西已经被BlogBus封装起来了,所以我能操作的不过是最基础的HTML代码。以及可以随意让我修改的CSS。当时我可以修改CSS,但我不可以随意增加或者减少CSS的起效位点。有些东西他们没有把控制权放出来,所以某些部位我是没办法通过CSS控制的。当时,甚至可以这么说,我没有接触到真正的编程。因为什么判断循环都是不存在的,又或者格式输出也是不存在的。更加不用说什么变量参数之类的东西。

为什么我大二的时候会对C语言那么着迷呢?我真的不知道。如果还可以选的话,我会主动选择C语言吗?当时的我根本不知道居然有那么多编程语言。直到后来,我终于见识到了各种各样了强大的东西,比如说昨天我上的那节课,说Python居然不需要用大括号把语句框起来,只通过缩进就能判断,那是同一个层级的。这简直把我脑子里的编程语言给颠覆了!如果那是在其它语言,无论是C还是PHP,又或者是其他东西。根本不可能运行成功,但Python通过4个空格的缩进就实现了。于是我不得不问一句,为什么我们当年要学习C而不学Python呢?当我用过VSCode以后,我觉得debug的过程很爽快,写代码也很轻松,因为你写好一半,另外一半就蹦出来了。前面你对某个东西定义了,后面当你打出一点点,余下的东西你可以通下拉把它选出来。当你写出判断之类的东西,回车后自动缩进是自然而然的事。代码写出来以后,不同类型的东西有不同的颜色,一眼就看得出来。正在写或者保存以后,如果某个地方出现了红色波浪线,意味着那里通常出状况了,有可能是静态的语法判断把你冤枉了,但对我来说,通常那都是我的粗心大意。如果当年学习C语言的时候也有这么多帮助,大概我们就不会在语法和格式上面纠结半天。实际上,我们的脑子应该用在天马行空上,而不是死在那些花括号对碰上,不是吗?当年,我可是用txt记事本写C语言的。更多时候,我身边没有电脑,我是拿草稿纸写的。的确,这样白手起家锻炼了我,但我觉得,用VSCode写代码,才会让我真正感受到写码的快乐。

34岁才开始和Python交朋友,我觉得这还不算太迟。

2020-03
22

折腾不同版本的WXR

By xrspook @ 22:09:44 归类于: 烂日记

我只是想把自己从前的东西重新拿出来,原来这也会很难,这是我完全没想到的。要找回那些尘封10年的文档,并不算太难,翻一下电脑也就找到了,虽然有点坎坷,因为当时备份的时候,我没有标注是哪个网站的,xml都放在一起,我以为那都是我主站的,后来,同一个日期不同的文件大小才让我觉得有蹊跷。xml文档找到了,接着要把它转化为WordPress的格式。当年用来转换文档的脚本找不到了,翻遍家里电脑的各个盘都没找到。之所以在家的电脑找不到,是因为当时干这事我是在单位完成的。所以理论上单位的电脑应该有,但是因为换过电脑,我也清理过同步盘,所以会不会也因此清理掉呢?这个我不确定。我觉得,在我转格式的时候,我仍然在用Dropbox,里面的很多东西我的确已经清理了,于是这也很好解释,为什么我家里电脑的Dropbox文件夹里找不到那个脚本。家里的电脑没有,单位的电脑可能有,但还有一种可能性,我把那上传到网盘,于是就把那同步软件里撤掉了。我只会上传到两个地方,一个是百度,一个是115。115打开很麻烦,我也懒得下载打开它的工具。百度上果然就有我要找的东西,但当我想把整个文件夹下载回来的时候,问题严重了,那里居然有4000多个文件。下大文件的时候度娘就很慢,下小文件的时候度量更慢,那是直接10KB以下的速度。我直接去网页版的度娘找到我要的东西,不在客户端里等它慢慢下载了。

东西下载回来以后,我再翻查我的日志,我需要安装一个Python。我默认安装的是现在最新的版本3.7.7,但运行脚本以后却发现才刚刚开始读取脚本,就马上报错。查找原因,原来是版本之间的语法差异。才刚刚开始就错,要运行完整个脚本,我真不知道还得修改我根本不懂的语法。所以,我把最新的Python卸载掉了,重新安装当时我就在那个版本下转换的2.6.5。2.6.5是一个什么概念?这意味着时光倒流10年。

出乎我意料,软件装好以后,我几乎没遇到困难就可以把BlogBus的文档成功转为了WordPress的格式。在下载Python的时候,我顺便下载了XAMPP,同样下载的是最新的版本。前段时间我才刚用过,觉得挺爽。我也下载了最新版的WordPress的5.3.2。同时把导入插件也装。当我试图上传,已经转过格式的xml是,上传报错。原来这才是噩梦的开始!不同版本的WordPress里的xml格式各不相同,几乎可以这么说,越往后越严格越来越严格了。于是我又安装了WordPress 3.9和2.8。3.9的WordPress在PHP 7之下马马虎虎可以运行,2.8是直接连数据库都连不上…… 于是我甚至不能从通过低版本的WordPress N轮导入导出拯救世界……

没办法,我只能研究我手头上的xml,看看和现在的标准版差多少。首先,必备填写一个WXR的版本号。在旧版本里,这条规则是这是不存在的,所以要手动加入。同样需要手动加入的就是,即文件类型,因为现在的WordPress把文章分成了post和page。把这些搞定以后,基本上正文就可以导进去了,但是分类和标签还是不行。因为现在的分类和标签,WordPress使用的是一个叫做nice name的东西,你必须在分类和标签那里,加上这个标注0才能识别的出来。评论那里,当年就试过在2.8的版本里面评论正常,但是在2.9里面,有评论的话会只剩下一条评论。研究发现,那是因为评论有了一个id号。BlogBus转码过来的东西没有id号,所以大概东西就自动覆盖了。除了这些BlogBus和WordPress之间的格式问题以外。我的文章里还有格式的=问题,因为有些东西,不完全是我自己的东西,好些是我从网络上搜集回来的。当时我保存了网页,在BlogBus发布的时候直接复制到可视化编辑器,所以格式也带入了。如果当时我懂得先把东西贴到记事本,然后再剪切粘贴一次,就不会存在这种问题。除了格式以外,从前的blog里还有图片,但经过这么多年,图片都已经失效了,链接摆在那里只会浪费加载时间和访客的期待,所以我要把图片链接也尽可能去掉。有些图片链接是我没办法去掉的,因为用正则筛选的时候会遇到一些很屌丝的句子,到了某个点,就卡住了,但实际上那并不是这个标签的结束。

搞清那些规则,总结出我的对策。一次又一次查找替换,一次又一次导入删除再导入。花了一整个下午加半个晚上的时间,我总算搞定了从前BlogBus上的BLF!文章238篇齐全,评论56条也齐全!!!其中可能会有一些小格式上毛病,但是那并不是共性的问题,后续还得靠运气慢慢修改。

非常有必要记录一下我在Notepad++上做的WordPress不同版本xml转换操作

/*操作开始*/

普通替换《channel》为《channel》《wp:wxr_version》1.1《/wp:wxr_version》 /*WP XML共性问题*/
普通替换《category domain=”category”》为《category domain=”tag”》
普通替换《dc:creator》《/dc:creator》
为《dc:creator》《![CDATA[xrspook]]》《/dc:creator》《wp:post_type》《![CDATA[post]]》《/wp:post_type》《category domain=”category”》《![CDATA[回到过去——Betty迷的独白]]》《/category》 /*《/wp:post_type》前是WP XML共性问题*/
普通替换《BR》《BR》为《BR》
普通替换《!–msnavigation–》为无
普通替换[summary_of_BLF]为[summary_of_BLF(from_rincondebetty)]
普通替换[summary_of_EcoModa]为[summary_of_EcoModa(from_rincondebetty)]
普通替换《category domain=”tag”》《![CDATA[(from_rincondebetty)]]》《/category》为无
普通替换[Yo soy Betty, la Fea]为[Yo_soy_Betty,_la_fea]
普通替换[JEA’s Writting]为[JEA’s_Writting]
普通替换”博主”为”xrspook”
普通替换《i》为无
普通替换《/i》为无

正则替换category\”》《\!\[CDATA\[(.*?)\]为category\” nicename=\”\1\”》《\!\[CDATA\[\1\] /*WP XML共性问题*/
正则替换tag\”》《\!\[CDATA\[(.*?)\]为post_tag\” nicename=\”\1\”》《\!\[CDATA\[\1\] /*WP XML共性问题*/
正则替换《[TDSFHI].*?》为无
正则替换《/[TDSFHI].*?》为无
正则替换《P.*?》为《P》
正则替换《(table|tbody|tr|td|div|span|img|script|font|hr).*?》为无
正则替换《/(table|tbody|tr|td|div|span|img|script|font).*?》为无

《wp:comment》《/wp:comment》中增加《wp:comment_id》1《/wp:comment_id》,id数字递增 /*WP XML共性问题*/

/*操作结束*/

注:请自行替换《》为<>,用尖括号那是全部都挂掉无法显示的节奏啊啊啊

这个是一次死去活来的经历啊啊啊啊啊啊啊啊啊啊啊啊!奇怪的知识又增长了不少……

2020-03
14

回忆曾经的BlogBus

By xrspook @ 13:53:01 归类于: 烂日记

用现在的眼光去审视从前的模板,我觉得连逻辑都出现错误了。还记得当年我选用BlogBus作为我的第1个blog,是因为他们相对于其它BSP来说非常自由,可编辑空间相对大。如果你足够厉害,你甚至可以写出你个人风格的网站,但是这样一来的话,对于新手来说就可能会变成白屏,又或者会满屏的错误代码,为了保证这种事不发生,所以实际上你是没办法弄到白屏的。现在让我回想起,那个时候到底是怎样的,我已经记得不大清楚了,现在也没办法把BlogBus找来研究一番,因为他们已经消失了。BSP消失了,意味着住在上面千千万万的人也被迫消失了。我认识blog,大概首先是从Blogger开始的,然后我知道了有些人会买个域名,然后把Blogger挂在自己的域名上面。昨天我突然有了个想法,要把从前我blog上的其它blog的文章也转为WordPress,分配一个子域名,挂在自己的服务器上。在BSP挂之前,我已经把自己所有日志都倒出来了。放在哪里,一下子我说不出来,但肯定能重新挖出来。前天,我翻出自己在WordPress上面的导出数据,是个XML文件。也就是说,上面只有数据,全部都是文字,又或者说是符号。除了我的东西以外就是一些标记我的东西到底是什么类别的标签。从开始用BlogBus,我就很注意过一段时间就备份一下,所以当我要离开,当我不在那里更新的时候,我当然要把自己的东西完整再备份回来。数据是可以备份的,但图片就不是那么回事了。BlogBus上面的空间很小,又或者你可以说没有空间。在那里写日志的日子,图片我几乎都是用外联的,是相对于BlogBus来说,那些外联图片死的更早。我已经不记得自己用过多少外联图片了,但可以肯定的是,他们挂了一批又一批。有些挂了是无声无息的,有些挂了会告诉你,请你把图片先备份下来。连yahoo.com.cn的邮箱都可以挂,我不觉得这个世界还有什么是不会挂的,但据说yahoo.com的邮箱还能用。

回到BlogBus的话题上。在我开始转用WordPress,我才明白到,实际上BlogBus上可控的东西很少,重要的核心部件,他们封装起来。你顶多只能用css去给那些核心部件化妆一下。当年我最喜欢干的事就是过一段时间就换一下背景图片。当我看到漂亮的壁纸,我就会换一个背景。还记得当年我花了好多时间去研究怎么才可以让文章显示在半透明的板块上,这样就能看到漂亮的背景。的确,用PNG图片就能做。但问题是那个滤镜在某些浏览器之下完全行不通。所以要看到后面漂亮的壁纸,我又要文章展示在磨砂的板块上,我只能在原始的壁纸上自己PS一层半透的图层,大小要刚刚和我的网站尺寸完全一致。浏览器的大小,网站展示的大小是完全不一样的事,就更不用说不同浏览器解释出来的东西经常差非常远。我在网站上放过漂亮的壁纸背景,在版头上放过flash,在主页里放过音乐,也曾经把鼠标图标换成别的……现在回想起来,那些都是些花俏的事,的确很好玩。但实际上,只是停留在好玩的层面上,玩一玩也就厌倦了。

随着自己积累出来的日志越来越多,我越发明白到自己blog的核心价值到底在哪里。如果一个blog只存在了几天,几周或者几个月。那只是玩玩而已,但如果过了几年,仍然活着。我会觉得,这肯定有意思。如果像我这样,居然活了十几年,而且每天都不间断。这简直就是神仙级的存在!人生没有多少个十几年。开始的时候我是个少年,现在,我仍然觉得自己是个少年,不过,经历过很多而已。

2013-08
17

互联网,10年,为了2个人

By xrspook @ 23:49:00 归类于: 烂日记

又是那个熟悉的味道,又是一个夏天,2003年的夏天是互联网把我带到了另外一个世界。那时开始我首次有种high到晚上睡不着觉的感觉。那种躺在床上也恋恋不舍的感觉,那种有无限多个为什么想去探索的欲望。过了好久好久,直到现在,那种探索的欲望对我来说都未曾减退过。

10年了,已经10年了。在这10年里我为2个人疯过。一个可以说是过去了,一个还在持续中。无独有偶,都是到了大概3年的时候出了些状况。具体是什么,就没必要说了,但那只是感觉上的失落,实际上他俩在正经事(工作)上从未让我有任何的不满。都是毋庸置疑的优秀,要不我也不会疯,但说真的,在开始疯的时候我可真没理睬过他们到底优秀得如何,只是凭直觉,我觉得我有兴趣,我觉得那里有我觉得正能量的东西,于是我就扑上去了。随着各种研究的深入,最后我觉得我在发散杂七杂八方面学到的东西比单纯的疯狂要多得多。

还记得从前用Flashget批量方式下载图片,用各种流媒体软件抓取各种流媒体.asf,.rm什么的,哈哈哈,当时.rmvb还没流行呢。当时当我疯狂地把某个网站几万张的照片下载回来后,我是多么的骄傲兴奋!或许也是从那次开始,命中注定我就成为了收集狂。我疯狂地下载各种图片、视频,至于文字类的,我用的是直接转载或翻译。毋庸置疑地,我是一个收集狂,当收集狂遇到小硬盘这很悲惨,所以为了这个两个疯子,我刻录的CD光盘不下300个。如果可以重来,我还会这么神经质么?但如果我不曾如此神经质,我将后悔、错过很多!

我不是生来就是代码狂,我不是一开始就沉迷于网站前端设计,如果我不曾疯狂,或许我只是会在BSP用默认模板。我不会从Blogger用到BlogBus用到WordPress并同时使用diandian。我更加不会自己写正则php用于快速提取我需要的资料。

如果10年前我没有接触互联网,如果10年里我没有为2个人疯狂过,xrspook不会是现在的xrspook,我甚至会像从前那样不知道我自己需要的到底是什么。

他们让我理性思考,他们让我开脑洞,他们让我在不知不觉中孤单地与时俱进。

我想看完这周的SD赶紧写摔角统计报告,因为我想赶紧写信,那种憋在心里,得控制住自己不组织语言发泄出来的感觉很难受。

我不后悔我疯了10年,因为在这10年里,我学会了或许一个female一辈子都学不完,一个male听闻之后要瞠目结舌的东西。我牺牲了,但我觉得我赚了更多。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress