在数字化时代,信息的传播和分享变得异常重要。随着技术的发展,不再局限于传统的纸质媒体,而是转向了更加灵活和便捷的数字平台。在这样的背景下,接手了一个期刊的数字化和印刷发行工作。面临的挑战是,如何将现有的基于WordPress Annotum的系统迁移到一个更现代、用户友好且不易出错的新平台上。经过深思熟虑,选择了Google Docs作为后端存储解决方案。
Google Docs以其直观的操作界面和无限的文档存储空间赢得了用户的青睐。然而,问题随之而来:如何将所有的文章和论文从文档转换为网页内容?为了解决这个问题,决定开发一个名为GoogPress的系统,它类似于WordPress,但后端基于Google。
网站使用GoogPress构建,并且提供了更详细的文档,可以在这里找到:[网站链接],所有的代码都可以在GitHub上找到:[GitHub链接]。
使用Google Apps Script作为获取所有文档的手段。这意味着它们不需要公开共享,可以全部存储在一个名为"Posts"的文件夹中。脚本存储在用户Google Drive的某个位置(具体位置并不重要),并通过客户端的POST请求调用。开发者然后在他们的网站上加入GoogPress.js,并使用gp_Init函数调用它。
// 初始化GoogPress
gp_Init("https://your-script-url-here");
// 加载最新的3篇文章
gp_loadPosts($("#post-container"), "postClass", "<hr/>", 1, 3);
完成这些操作后,生成的HTML看起来可能如下所示:
<div id="post-container">
<div class="postClass">是最新的文章</div>
<hr/>
<div class="postClass">不是最新的文章</div>
<hr/>
<div class="postClass">也不是最新的文章</div>
<hr/>
</div>
也可以通过以下方式加载单个文章:
// 将文章'Hi World'加载到post div中
gp_loadPost("Hi World", $("#post"));
这将返回类似于以下的内容:
<div id="post">
'Hi World'的内容
</div>
或者简单地使用Google的data-googpress属性:
<div data-googpress="postName"></div>
这将在初始化时将文章加载到
深入服务器端,后端完全是Google Apps Script。它基本上是JavaScript,带有一些令人兴奋的Google集成。
// 这是将如何与外界交互
function doPost(e) {
var requestType = e.parameters.type;
var id = e.parameters.id;
var asHtml = e.parameters.asHtml;
var start = e.parameters.start;
var end = e.parameters.end;
if (requestType == undefined) {
return ContentService.createTextOutput("Failed to specify request type");
}
// 其他内容在这里
}
使用openDoc函数搜索文档。
// 在containerFolder中查找docName
function openDoc(docName, containerFolder) {
var file, files = (containerFolder == undefined) ? DriveApp.getFilesByName(docName) : openFolder(containerFolder).getFilesByName(docName);
if (files.hasNext()) {
file = files.next();
} else {
return "Not Found";
}
return DocumentApp.openById(file.getId());
}
然后使用Omar Al Zabir修改过的代码片段将文档转换为HTML。这基本上允许将文档内容转换为网页内容。
Google Apps Script允许通过DocumentApp和DriveApp类轻松地与Google产品进行交互。
构建安装程序是一个相当简单的请求制作界面,它是在放学后的下午实现的。然而,令人惊讶的是,构建安装程序却相当困难。首先考虑在Chrome Web Store上部署,但这似乎太费力了(而且不是特别原型友好)。尝试编写一个脚本来在用户的驱动器中创建一个脚本文件,然后复制代码,但这也没有奏效(确实有充分的理由)。
最终,在一天的思考和几杯啤酒之后,决定采用下面描述的复杂系统。
用户运行一个他们必须授权的脚本。通过这种方式,获得了访问用户驱动器的权限。
然后脚本向这边运行的脚本发送请求。
这边的脚本创建GoogPress脚本的副本,并与用户共享。
用户端的脚本将共享的脚本添加到自己的驱动器中,然后制作它的副本。这确保了用户是文件的所有者(而不是)。
然后进行一些复制和粘贴以及文件的整理,这意味着安装是整洁的,并且保存在一个专门的GoogPress文件夹中。还创建了一个“Hello World”帖子。
一旦这一切都完成,就从驱动器上删除共享文件。
(感兴趣的脚本是Distributor.gs,它在这边运行,以及Installer.gs,它在用户的端运行)。
现在在做什么?(当前挑战)
缓存系统。如果每秒发送太多请求,Google会认为试图DDOS他们(或类似的事情)。虽然这对较小的网站来说不是问题,但对来说是个问题,将尝试解决它。
处理图片。在GoogPress上,图片加载相当慢,因为Google Doc到HTML的转换器在发送它们之前将它们转换为Base64。可能有一种更快的方法,随着时间的推移,会找到它。
<html>
<head>
<title>GoogPress演示</title>
</head>
<body>
<h1>这是GoogPress</h1>
<div data-googpress="TestPost2"></div>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://cdn.googpress.org/0.1/GoogPress.min.js"></script>
<script>
// 替换URL
gp_Init("https://script.google.com/macros/s/AKfycbxunMflwCcd5lPoS1SEDTEIeIOjAuj9QnLon9czPFN5lfV2dtXt/exec");
</script>
</body>
</html>