创建像网站这样的交互式终端

可以创建一个看起来像终端的静态网站或投资组合。但是,如果访问网页的人可以像在真正样式的终端中一样键入一些命令并获得输出,那就更好了。

这些真实终端通常在GNU / Linux系统或Mac OSX上使用,但Windows用户也可以使用PowerShell cmd.exec或Windows 10 WSL(Linux的Windows子系统)使用,Windows 10仅是Windows上的Linux。对于任何系统管理员或更高级的用户,它都是最常用的工具。

如果您拥有一个可以为您提供终端模拟器外观和感觉的库,并且具有漂亮的API来创建命令,那么创建此类终端风格的网站就很容易,因此您无需从头开始创建。我们将使用JavaScript库jQuery Terminal,它提供了一个简单但功能强大的API,可以在任何网站上创建交互式终端。本文将向您展示如何在任何html网页上创建基于Web的简单交互式终端。

首先,您需要创建基本的html页面,其中将包含所有依赖项:

<!DOCTYPE html> 
<html> 
<head> 
<script src =“ https://code.jquery.com/jquery-3.3.1.min.js”> </ script> 
<script src =“ https:// unpkg.com/jquery.terminal/js/jquery.terminal.min.js“> </ script> 
<link rel =” stylesheet“ href =” https://unpkg.com/jquery.terminal/css/jquery.terminal .min.css“ /> 
</ head> 
<body> 
</ body> 
</ html>

然后在body标签中,可以使用第一个命令创建第一个终端:

<script> 
$('body')。terminal({ 
    hello:function(what){ 
        this.echo('Hello,'+ what + 
                  '. Welcome to this terminal。'); 
    } 
},{
    问候:“我的第一个终端' 
}); 
</ script>

如果键入“ hello Medium”,则输出如下所示:

终端画面

终端画面

简单的交互式终端网站

您可以添加到终端主题网站的另一个示例命令是显示图像。以下代码将添加命令“ cat”,该命令将显示小猫的图像。

$( '主体')端子。({
    猫:函数(){ 
        this.echo($( '<IMG SRC = “ https://placekitten.com/408/287 ”>')); 
    } 
});

您还可以在命令中添加参数。您可以添加两个参数来确定图像的特定大小(这将反过来创建不同的图像,这就是placekitten.com的工作方式)。

$('body')。terminal({ 
    cat:function(width,height){ 
        const img = $('<img src =“ https://placekitten.com/'+ 
                      width +'/'+ height +'” >'); 
        this.echo(img); 
    } 
});

如果您键入命令“ cat”并使用特定大小,这将为您提供以下输出:

图片发布

图片发布

终端显示猫的形象

注意:请注意,这里有jQuery $()调用包装器,您不仅回显html文本,而且回显jQuery对象。此限制是出于安全原因。您还可以将带有{raw:true}的选项对象用作回显的第二个参数。

有些命令是异步的,需要一些时间才能计算出来。图像的加载不是即时的,尤其是在慢速网络上。因此,您可以在命令处理异步请求时暂停终端。

$('body')。terminal({ 
    cat:function(width,height){ 
        const img = $('<img src =“ https://placekitten.com/'+ 
                      width +'/'+ height +'” >'); 
        img.on('load',this.resume); 
        this.pause(); 
        this.echo(img); 
    } 
},{
    问候:“我的第一个终端\ n' 
})

另一个选择是从函数返回一个承诺:

函数get_image(url){
    返回新的Promise(function(resolve,reject){ 
        const img = $('<img src =“'+ url +'”'/>'); 
        img.on('load',() => resolve(img)); 
        img.on('错误',拒绝); 
    }); 
}$('body')。terminal({ 
    cat:function(width,height){ 
        return get_image(' https://placekitten.com/'+ width + 
                         '/'+ height); 
    } 
},{
    问候:'我第一航站楼\ n' 
});

而且您不需要回显任何将处理承诺的终端。由于此功能,您可以使用访存并获取AJAX调用的输出:

$('body')。terminal({ 
    title:function(){ 
        return fetch('https://terminal.jcubic.pl')
            .then(r => r.text()).then 
            (html => html .match(/ <title>([^>] +)< \ / title> /)[1]); 
    } 
},{
    问候:“我的第一个终端\ n” 
});

该命令将显示库的首页标题。

注意:如果您希望将漂亮的ASCII Art作为欢迎消息,则可以使用figlet.js库,请参见此CodePen演示

如果要具有与GNU / Linux或MacOSX终端仿真器中相同的命令,可以在其中添加可选的参数和选项,则可以使用将解析选项并返回漂亮对象的函数。以下代码将向您展示如何做到这一点。

$('body')。terminal({ 
    title:function(... args){ 
        const options = $ .terminal.parse_options(args); 
        return fetch(options.url ||'https: //terminal.jcubic.pl ')
            .then(r => r.text()).then(
            html => html.match(/ <title>([^>] +)< \ / title> /)[1]); 
    } 
}, { 
    checkArity:否,
    问候:“我的第一终端” \ n' 
});

checkArity选项很重要。如果没有此选项,则当函数具有大于零的任意数量的参数时,终端将引发错误(这是ES6变量参数的工作方式,树点,终端认为函数接受0个参数)。

该命令的输出如下所示:

图片发布

图片发布

交互式终端会话,使用jQuery Terminal的命令很少。

当然,如果只有一个可选参数,则不需要解析选项,例如在这种情况下,您可以只使用一个参数url:

$('body')。terminal({ 
    title:function(url){ 
        return fetch(url ||'https: 
            //terminal.jcubic.pl ').then(r => r.text()).then 
            ( html => html.match(/ <title>([^>] +)< \ / title> /)[1]); 
    } 
},{ 
    checkArity:false,
    问候语:“ My First Terminal \ n' 
});

但是,如果需要更复杂的命令,则解析选项很有用。您可以像前面的示例一样使用GNU样式的长选项,但也可以使用-u等短选项,它将在options.u变量中访问。您可以在此Wiki页面上阅读有关解析命令和选项的更多信息。

您要添加的另一项功能是制表符完成。如果您这样设置终端(在文档中可以找到其他选项),那么您所需要的只是一个选项:

$('body')。terminal({ 
    title:function(... args){ 
        const options = $ .terminal.parse_options(args); 
        return fetch(options.url ||'https: //terminal.jcubic.pl ')
            .then(r => r.text()).then(
            html => html.match(/ <title>([^>] +)< \ / title> /)[1]); 
    } 
}, { 
    checkArity:false,
    完成:true,
    问候:“我的第一个终端\ n” 
});

现在,当您键入“ t”并按键盘上的Tab键时,它将完成命令“ title”,因此您无需手动键入整个命令。

您可能还需要一些“帮助”命令,其中将列出可用命令。

就是这样。以此为基础,您应该能够编写自己的简单终端。本文未讨论的jQuery Terminal库的功能包括:

您还可以看看的,在使用这个库创意的例子,网站或单个网页的大名单例子页。例如,其中包括动画或404页面,这些页面提供了您可以浏览的命令(例如Wikipedia文章或专业术语:印刷形式时也称为Hacker Dictionary,或者被黑客称为死树版本)。

最后,我想向您展示一个演示,为您提供复古外观的终端,就像计算机开始时的旧CRT显示器一样。

您可以在此CodPen演示中找到代码。您也可以在窗口中创建终端,不需要全屏显示。

使您的网站看起来像Linux终端

您看过我的个人网站JeffWeisbein.com吗?没有?继续,检查一下。我给你一分钟左右的时间。好吧,你现在回来了。因此,现在您可能想知道如何创建与该网站相似的网站。幸运的是,这很容易。您需要做的就是在JeffWeisbein.com上复制源代码,复制文本文件,对源代码和文本文件进行一些小的修改,然后将文档上载到Web服务器。

但是首先,您如何查看源代码?根据您的网络浏览器,它可能会略有不同,但是通常您可以右键单击该页面,然后选择“查看源代码”或类似的功能。它将打开一个包含源代码的新窗口。只需复制所有代码,打开您喜欢的HTML编辑器,然后将代码粘贴到其中即可。从那里,您可以进行所需的任何修改。例如,您可以(并且可能会想要)将文档标题从Jeff Weisbein更改为您自己的名字(例如John Doe)。您还可以通过修改样式/ CSS来更改页面上使用的颜色。

除了这些更改之外,您还需要在源代码中向下滚动到大约第161行,您将在其中更改以下代码行:

Typer.file="jeffweisbein.txt";Typer.file="yourname.txt";

当然,您可以将“您的姓名”替换为您的真实姓名。完成此操作后,将文件另存为.html(HTML)文件。

现在,最后一步。返回您的Web浏览器并访问http://www.jeffweisbein.com/jeffweisbein.txt

<span id="a">jeff@weisbein</span>:<span id="b">~</span><span id="c">$</span> cat jeffweisbein.txt<br/><br/>
Hi, I'm Jeff Weisbein.<!-- laglaglaglaglaglaglaglaglaglaglaglag --><p>I majored in Business Administration with a concentration in Finance. I graduated Summa Cum Laude. I'm currently enrolled in the <a href="https://analytics.hbs.edu">Business Analytics Program at Harvard</a>.</p><!-- qowifjqwoeijfoqweijfqweoifjqweofijqweoqwoijefoqwijefoijfqiwoefjj -->
<p>I'm the founder and CEO of <a href="http://www.besttechie.com">BestTechie</a> and <a href="https://getkya.com">KYA</a>.</p><!- oqwipjefqwioefjwioqfjoiqwjfeioqwjefoi -->
<p>I got started with technology at the age of 13 when I convinced my parents to let me use their credit card to buy the BestTechie domain along with some web hosting. I haven't looked back since.</p><!-- owlsqweoifjqwoefijqwoeifjqwoefijwef -->
If you would like to get in touch with me, whether it be for tech support, a business venture, or to just say hi<!-- slightdelayhere-->, feel free to send me an email or a tweet.<!-- longlongcomment --> My email address is: <a href="mailto:jeff@besttechie.com">jeff@besttechie.com</a> and my Twitter is: <a href="http://twitter.com/jeffweisbein">@jeffweisbein</a>.
<p>And if you haven't already, be sure to check out my tech publication <a href="http://www.besttechie.com">http://www.besttechie.com</a> and analytics startup <a href="https://getkya.com">https://getkya.com</a>.</p>

到那里后,复制文本文件的内容,然后将其粘贴到计算机上自己的文本文件中。同样,您将需要编辑内容以适合您的需求,但是,请确保将所有段落括号以及所有注释保留在文本文件中。它们是站点正常运行所必需的。进行更改后,将文档另存为yourname.txt(再次将“ yourname”替换为您的真实姓名)。我还应注意,您必须将其另存为文本文件 (扩展名为.txt)才能正常工作。

如果您有任何疑问,评论或问题,请随时发表评论,我会尽力提供帮助。

最后,我要感谢我的朋友Sam Phippen,让我与大家分享他出色的网站构想和编码技巧。