为Mac OS X(旧称Mac OS X)的富文本(HTML/RTF)而非纯文本提供剪切/复制/粘贴功能
项目描述
为MacOS(旧称Mac OS X)提供的富文本剪切/复制/粘贴。
用法
from richxerox import *
print available() # what kind of data is on the clipboard?
print paste() # get data in the default format ('text')
print paste(format='text') # get text (Unicode)
print paste(format='rtf') # get RTF
print paste(format='html') # get HTML
print "ALL CONTENTS:\n", pasteall()
clear()
print "ALL CONTENTS AFTER CLEAR:\n", pasteall()
r = "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf390\n" \
"{\\fonttbl\\f0\\froman\\fcharset0 Times-Roman;}\n{\\colortbl;" \
"\\red255\\green255\\blue255;}\n\\deftab720\n\\pard\\pardeftab720" \
"\n\n\\f0\\fs24 \\cf0 This is \n\\b good\n\\b0 !}"
h = "this is <strong>good</strong>!"
copy(text="this is good!", html=h, rtf=r)
print "ALL CONTENTS AFTER COPY:\n", pasteall()
API基于xerox的API,有简单的copy()
和paste()
操作。
将paste()
视为将内容粘贴到您的程序中,而将copy()
视为从您的程序中复制内容。
API的主要区别在于,考虑到富文本中使用的不同格式,如果格式不是纯文本,则必须指定提供的或需要的格式。这通过关键字样式参数完成。
替代API
如果您更喜欢面向对象的API
from richxerox import *
print pasteboard.get_contents(format='html') # paste
pasteboard.clear() # clear
pasteboard.set_contents(text="this is good!", # copy
html=h, rtf=r)
print pasteboard.get_all_contents() # pasteall
背景
我费尽心思搜寻,但始终找不到一个简单的Python模块,可以在macOS上轻松直观地实现复制和粘贴操作。虽然xerox功能良好,但它仅支持纯文本。那么,对于导出带有超链接、样式等富文本的浏览器和文字处理器怎么办?如何访问这些数据呢?
经过多次尝试,我终于找到了一些可以修改并使其正常工作的代码示例,而无需理解苹果的整个Foundation和AppKit。这个模块就是成果。
深入RTF
即使在这个到处都是HTML的时代,苹果和macOS应用仍然遗憾的是以RTF为中心。
据我所知,RTF往往在应用程序之间传递时不够稳健。不同的应用程序对相同的RTF有不同的解释或渲染方式,因此字体大小和其他特征会发生变化。
RTF非常冗长。例如,Microsoft Word将“这是好的!”的复制/剪切表示形式输出为29,807个字符。微软以冗长的导出而闻名,RTF本身试图表示整个文档,而不是单个片段。尽管如此,这大约是HTML的1,000倍(也就是三个十进制数量级)的冗长。试着在某个应用程序中复制现有文本,然后运行pasteall(),亲自体验一下这种疯狂。
如果你在剪贴板上放置多种文本格式,当你要求应用程序“粘贴”数据时,你几乎没有控制哪种格式将被使用。如果你只想使用一种格式,最好只把那种格式放在剪贴板上。
虽然Mac应用程序偶尔会将HTML内容放在剪贴板上,但RTF似乎是最常见的通用语言。我尚未找到任何特别好的、稳健的或最新的Python工具来解析和转换RTF。但是,方便的textutil工具可以将RTF文件转换为相当干净的HTML,如下所示
textutil -convert html temp.rtf
生成temp.html。这可以用lxml或你喜欢的HTML/XML库进行解析和处理。
注意
版本1.0.1取消了轮打包的发行。轮子通常很好,但有报告称,它可能会根据本地安装的Mac基础库的状态导致安装中断。取消轮子应该会强制安装更本地化的依赖集。如果您仍然有问题,请在安装richxerox之前手动安装pyobjc。
版本1.0.0更新了测试矩阵。已确认2.7、3.3、3.4、3.5和3.6的最新版本可以正常工作。已从PyPI中删除旧版、预-SemVer版本;它们导致了一些安装问题。由于Python 3.2既古老又不再在我的本地测试环境中得到适当支持,因此已停止对其支持。
截至版本0.6,对Unicode字符的处理更加稳健。更好的自动安装,包括如果需要则安装Foundation pyobjc模块。(pyobjc自动安装仅在Python 2.7及以上版本中可靠地工作,因此已取消对Python 2.6的官方支持。)
如果需要安装底层的pyobjc库,这个过程将需要很长时间。例如,4小时7分钟。不要只是边喝咖啡边安装。吃午餐。一顿漫长的午餐。然后也许可以小睡一会儿。
版本0.5在Unicode处理中有一个错误。尽管它通过了所有测试,但它对来自真实应用程序的Unicode进行了过度引号处理。已修复。
代码灵感来源于并/或基于Genba的使用PyObjC从OS X剪贴板读取URL以及Carl M. Johnson的copy_paste.py
另请参阅NSPasteboard文档、关于UTI的讨论以及John Siracusa对Mac OS类型演变的讨论
作者Jonathan Eunice(邮箱jonathan.eunice@gmail.com)或Twitter上的@jeunice欢迎您的评论和建议。
安装
要安装最新版本
pip install -U richxerox
在某些情况下,有多个Python安装时,pip和Python安装可能会断开连接。如果上述方法不奏效,请尝试通过Python直接安装。您还可以指定要安装的特定Python版本。
python -m pip install -U richxerox
(您可能需要以sudo前缀执行以授权安装。)
项目详情
richxerox-1.0.1.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ea549a8264356a5e48adb9d6d0593a42eca307469424216c7a3cf8aeabf43bbf |
|
MD5 | 29a866141e4b7821cd0595bdb2bbe0ee |
|
BLAKE2b-256 | a84ca85431f1b2de8277a6ba57fc28b10f0ab6f55b306790fc20a14b1d396988 |