Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产成人在线网站,中文字幕免费播放,国产三级在线播放

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML 實例

          TML 基礎

          非常簡單的HTML文檔

          HTML 標題

          HTML 段落

          HTML 鏈接

          HTML 圖片

          實例解析

          HTML 標題

          HTML 標題

          在html源碼中插入注釋

          插入水平線

          實例解析

          HTML 段落

          HTML 段落

          更多段落

          本例演示在 HTML 文檔中折行的使用。

          HTML 格式化的某些問題。

          實例解析

          HTML 文本格式化

          文本格式化

          此例演示如何使用 pre 標簽對空行和空格進行控制。

          此例演示不同的"計算機輸出"標簽的顯示效果。

          此例演示如何在 HTML 文件中寫地址。

          此例演示如何實現縮寫或首字母縮寫。

          此例演示如何改變文字的方向。

          此例演示如何實現長短不一的引用語。

          文本下劃線與刪除線

          實例解析

          HTML 樣式

          HTML Style 元素

          背景色樣式

          字體樣式,顏色,大小

          文本對齊樣式

          設置文本字體

          設置文本字體大小

          設置文本字體顏色

          設置文本字體,字體大小,字體顏色

          HTML使用不同樣式

          沒有下劃線的鏈接

          鏈接到一個外部樣式表

          實例解析

          HTML 鏈接

          創建超級鏈接

          將圖像作為鏈接

          在新的瀏覽器窗口打開鏈接

          鏈接到同一個頁面的不同位置

          跳出框架

          創建電子郵件鏈接

          創建電子郵件鏈接 2

          實例解析

          HTML 圖像

          插入圖像

          從不同的位置插入圖片

          排列圖片

          本例演示如何使圖片浮動至段落的左邊或右邊。

          制作圖像鏈接

          創建圖像映射

          實例解析

          HTML 表格

          簡單的表格

          沒有邊框的表格

          表格中的表頭

          帶有標題的表格

          跨行或跨列的表格單元格

          表格內的標簽

          單元格邊距(Cell padding)

          單元格間距(Cell spacing)

          實例解析

          HTML 列表

          無序列表

          有序列表

          不同類型的有序列表

          不同類型的無序列表

          嵌套列表

          嵌套列表 2

          定義列表

          實例解析

          HTML Forms 和 Input

          創建文本域(Text fields)

          創建密碼域

          復選框

          單選按鈕

          簡單的下拉列表

          預選下拉列表

          本例演示如何創建一個文本域(多行文本輸入控件)。

          創建一個按鈕

          本例演示如何在數據周圍繪制一個帶標題的框。

          帶有文本域與輸入域的表單

          帶有復選框與提交按鈕的form表單

          帶有單選框與提交按鈕的表單

          發送郵件表單

          實例解析

          HTML iframe

          內聯框架 (HTML頁面中插入框架)

          實例解析

          HTML 頭部元素

          描述了文檔標題

          HTML頁面中默認的URL鏈接

          提供文檔元數據

          實例解析

          HTML 腳本

          插入一個腳本

          使用 <noscript> 標簽

          實例解析

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          章作者分享了一種基于設備模板的移動端原型設計方法,相信能夠對你的原型設計工作帶來幫助,值得馬克。

          在使用Axure設計移動端原型的應用方面,我總結出了兩種常用的方法。第一種是更適合在移動端進行演示的設計方法,大家可以參考我之前已經分享過的一篇教程:使用Axure打造最佳的移動端交互原型教程,使用這種方法輸出的原型在手機設備上進行演示時可以達到跟真實APP幾乎一致的展示效果及交互體驗。在今天我將分享另外一種基于設備模板的移動端原型設計方法。

          什么是基于設備模板的移動端原型設計方法?簡而言之就是在Axure的編輯界面中放置對應的機型模板,使輸出的原型達到更規范和真實的演示效果。其實這是一種很常見的移動端原型的設計方法,很多同行在設計原型的時候也都用過。這篇分享教程將對個設計方法進行了總結和梳理,并基于這個方法制作了一套可快速復用的模板。這套模板具有幾個方面的特點:

          ● 結構化,根據APP界面結構進行搭建;

          ● 標準化,非常方便進行編輯和維護;

          ● 高保真,可高度還原移動端交互效果;

          在本篇分享的結尾我會提供模板的Axure源文件下載,其中包含了最新的IPhoneX和IPhone8等多套IOS設備機型,以及一些常見的界面元素和交互效果。在開始正式的介紹之前,大家可以查看使用這套模板還原IOS中兩款官方應用的設計演示。

          IOS11 AppStroe For iPhoneX 原型演示

          IOS11 Contacts For iPhone8 原型演示

          1.界面元素和結構介紹

          由于這套模板是基于IOS系統進行設計的,所以相關界面元素和交互方式均以IOS為標準。目前主流的移動端系統除了IOS還有Android,這兩種系統設計標準和交互方式其實是存在一些差異的,不過目前市面上大部分APP在設計時并沒有爭對兩種系統做單獨的處理。

          所以如果沒有特珠需求的話,我們一般也只需要輸出一套原型方案就可以了,不過設計過程中需要盡量兼顧這兩個主流的系統。當然,如果你的產品明確需要按照Android的系統規范來設計,你也可以參照本教程設計一套Android的原型模板,相關交互方式可以參照Android版的交互指南規范。

          在開始介紹模板的搭建和使用方法之前,需要先對APP的界面結構做一個簡單的介紹,熟悉了界面結構可以方便我們后續的設計。常見APP的界面主要由以下元素或組件組成:

          StatusBar / 狀態欄

          狀態欄顯示設備的關鍵信息,包含設備模型或網絡提供商、網絡信號強度、電池使用量、時間等。在特殊界面中可以對狀態欄做隱藏處理,或根據需要自定義狀態欄背景。

          NavBar / 導航欄

          導航欄位于app內容區的上方,系統狀態欄的下方,并且提供在一系列頁面中的導航能力。可在導航欄中顯示當前視圖的標題,如果標題非常冗長且無法精簡,可以空缺,避免用過多的元素填滿導航欄。導航欄中可以添加文字和圖標控件,相關控件的可點擊區域需要大于控件的可視大小。

          Body / 內容區

          內容區域根據需要進行自定義設計,常見的設計形式有菜單列表、圖標列表、卡片列表、圖文組合等。

          TabBar / 標簽欄

          標簽欄位于APP底部,方便用戶在不同功能模塊之間進行快速切換。標簽欄一般用作APP的一級分類,數量控制在3-5個之間。建議使用Badge進行提示,讓用戶知道有內容更新。

          Toolbar / 工具欄

          工具欄一般會出現在視圖的的底部,提供給用戶相關可操作的功能按紐。如,郵件應用程序里的收件箱欄中有刪除、分享、答復等等。

          Modal / 彈出層

          移動端的彈出層根據彈出方式不同,共分為模態窗口、動作面板、彈出面板等幾種不同的類型。在實際使用中,可根據界面的交互方式選擇對應的類型。

          Toast / 輕提示

          一種輕量級反饋提示,可以用來顯示不會打斷用戶操作的內容,適合用于頁面轉場、數據交互的等場景中。一次只顯示一個輕提示,有圖標的提示字數為4-6個,沒有圖標的輕提示字數不宜超過14個。

          TableView / 列表視圖

          列表視圖是移動端APP中一種通用的界面元素。很多應用程序在一定程度上,都有使用表視圖來顯示數據列表。常見的例如IOS的聯系人應用中聯系人信息列表,另外還有Mail中使用列表視圖顯示郵箱和郵件。列表視圖不僅可以用來顯示文本數據,也可以用來呈現圖像數據。

          以上是豆瓣APP的一個界面截圖示例,界面的結構用顏色進行了區分,從上至下分別為:狀態欄、導航欄、內容區、標簽欄。

          2.結構化的模板搭建

          在介紹完APP的界面結構之后,接下來說明一下模板的搭建方法。在本篇教程的結尾會提供了已經制作好的模板的文件,大家可以下載并參考本部分介紹進行使用,也可以參照介紹制作自己的原型模板。

          在制作模板時需要用到對應的機型設備的圖片素材,可以通過Dribbble等設計分享平臺找到對應的素材文件,然后對素材做一些簡單的處理。處理的過程首先是去掉多余的元素,只保留機型設備的框架圖片。另外還需要對圖片的尺寸進行調整,例如在制作手機等移動端模板時我們將內容區域定為375px,需要根據所定的內容區域對圖片的尺寸進行相應的調整。

          為什么模板的內容區域是375px?這個問題我在上篇教程中進行過介紹,所以不再進行展開說明。但是需要記住的這個尺寸是一個重要的標準,后續在設計過程中相關元件的寬度尺寸都需要參照這個標準。機型設備的圖片素材準備好之后,我們在Axure中創建一個對應的母版,然后將機型設備圖片拖入到母版中。母版的名稱可以按該機型設備的名稱命名,后面在使用時在新建的頁面中拖入該母版即可。

          下一步需要創建前面介紹過的APP界面中常見元素或組件,首先大家可以看一下這張圖片中已經創建好的模板,其中包含了機型母版、輕提示、彈層、導航欄、標簽欄、內容框架等元素。

          在這個模板頁面的概要視圖中可以看到相關的對象,所有對象我都創建了一個對應的動態面板。這樣的處理主要出于兩個方面的考慮,一是方便對相關元素進行編輯維護,二是相關對象的顯示是有順序的,這樣可以方便在概要視圖中進行排序處理。

          3.模板使用細節說明;

          在內容框架中編輯界面內容;

          界面的主要內容在內容框架動態面板中進行編輯和維護,由于該動態面板設置了自動顯示滾動條,如果你的界面內容超出了一屏,在演示時可以通過在內容框架區域滾動鼠標滾輪查看更多內容。

          關于模板界面元素的尺寸說明:

          模板中的界面元素的尺寸并沒有非常嚴格的標準,以下尺寸是我根據比例進行設置的,僅供參考。IphoneX狀態欄:44px、IphoneX標簽欄:80px、Iphone8狀態欄:28px、IphoneX標簽欄:60px、導航欄:40px。另外,內容區域的高度因為機型設備的素材圖片不統一可能略有差異,基本上可以忽略。

          每個界面對應一個頁面;

          在設計原型時建議每一個界面創建一個對應的頁面,通過添加頁面鏈接進行界面跳轉,這樣方便對原型進行編輯和維護。不建議將多個界面用動態面板堆砌在一起頁面內,這樣會使輸出的原型在演示時出現卡頓現象。

          關于元素的層級順序;

          在概要視圖中可以看到相關元素對應動態面板的層級順序,在使用該模板的時候請盡量參照此順序,否則可能在演示時出現顯示錯誤的情況。

          關于底部標簽欄的設置;

          為了方便維護可以將標簽欄創建為母版,然后添加到需要顯示標簽欄的頁面中。另外,在對應的頁面中需要顯示對應的標簽選中效果,只需要在該頁面中的標簽欄動態面板中添加一個選中效果的標簽元件。

          熱區占位符的使用;

          如果頁面中添加了標簽欄或工具欄,由于標簽頁的動態面板在內容框架的動態面板之上,在演示時會出現內容有一部分被擋住的情況。可以創建一個高度為100px的熱區元件為母版,將母版拖入對應的頁面底部,用來解決內容區域被擋住的問題。

          4.常用設計元素及規范

          經常有朋友向我咨詢如何設計出更漂亮美觀的原型,雖然原則上原型能完整的體現出需求細節即可,好看并不是我們在原型輸出時應該關注的重點,但是如果能滿足說明需求的同時能把原型做得更漂亮一些更好,這也算是體現專業程度和工作態度的一個方面,而且很多人對自己的輸出物也是有強烈的美感追求的。

          其實原型設計不需要了解太復雜的設計方法,只要掌握一點簡單的技巧就能達到美觀的效果,同時能讓整體更統一和標準。在分享的這套模板中包含了一些基本的設計元素,我下面對其中的一些規范細節進行說明,供大家進行參考。

          配色方案

          • ◆ 一般采用黑白灰的配色方案就能夠滿足基本設計要求了,但是如果能稍微得加上一些亮色的配色效果,可以使原型更好的體現出視覺層級,這對UI是有一定的參考價值的。不要感覺得配色效果能夠影響UI的設計,如果UI會被原型中的配色影響,只能說明UI的設計能力有待提升;
          • 整套原型中亮色主色調不要超過兩個,對于主要按紐和重點提示可以加上主色調色值,次要元素統一使用#000000、#333333、#999999等灰色輔助色;
          • ◆ 模板中的這套模板方案中的主色調是從IOS11的UI設計規范中提取的,你可以根據自己的需要整理一套自己的配色方案,建議盡量使用扁平化設計色值;

          配色板使用

          Axure中的配色板提供了一些常用的顏色色值,可用作一些常用元素的顏色配色。例如截圖中標注1中的縱向的灰色色值可用于相關字體元素的顏色,標注2中橫向的灰色色值可用于相關元素的背景和線條的顏色。另外,點擊標注3中的更多按紐,可以將其它的常用色值加入到自定義顏色中,方便快速的使用。

          字體元素

          • ◆ 原型設計時的字體字號建議統一使用偶數,常用的標題字號為16px、18px、20px,常用的正文字號為12px、14px;
          • 針對不同字體大小的多行文本單獨設置對應的行間距,例如12px的多行文本行間距建議設置為20,14px的多行文本行間距建議設置為28;
          • 推薦中文字體統一使用微軟雅黑,由于Axure的默認字體為Arial,可以通過生成HTML設置中的字體映射,將Arial映射為微軟雅黑,這樣就不需要在設計時去單獨設置每個元件的字體了。

          其它元素

          • ◆ 原型設計時元件的寬度建議統一保持為5和10的倍數,元件的間距建議為10px或20px;
          • ◆ 使用鍵盤方向鍵移動選中的元件時每次移動距離為1px ,使用ctrl+鍵盤方向鍵每次移動距離為10px;
          • ◆ 按住Ctrl+鼠標拖動可以快速的復制元件,按住Shift+鼠標拖動可以垂直或水平的移動元件;

          對齊及分布工具使用

          • 有對齊強迫癥的朋友可以使用頂部工具欄中的對齊及分布工具對元件進行處理,右擊頂部的工具欄區◆ 域可以自定義顯示或隱藏相關的工具圖標;
          • 選中多個元件時可以使用對齊工具快速的對多個元件進行各種對齊處理,還可以使用分布工具快速的對多個元件進行垂直或水平分布處理;

          5.使用輔助線進行排版;

          在以前的教程中已經介紹過輔助線的使用方法,合理的使用輔助線可以幫助我們提升設計效率,同時能讓輸出的原型效果更標準,所以強烈建議大家在設計過程中使用。以下是模板中內容框架編輯區域的截圖,是我常用使用輔助線用來排版的方式。截圖中的輔助線均為橫向x軸輔助線,可以看到其中共有4條,分別介紹一下它們的作用和位置:

          • 第1條輔助線是用來劃分左邊的內容留白區域,例如我一般習慣將左邊留白為20px,這條輔助線位于x軸的20px位置。
          • 第2條輔助線是內容居中輔助線,之前已經介紹過模板的設計寬度標準為375px,這條輔助線位于x軸的188px位置;(375px/2=187.5px)
          • 第3條輔助線用來劃分右邊的內容留白區域,例如右邊跟左邊留白一樣為20px,這條輔助線位于x軸的355px位置;(375px-20px=355px)
          • 第4條輔助線是用來劃分內容設計區域,例如模板的設計寬度標準為375px,這條輔助線位于位于x軸的375px位置;

          這些輔助線的用法只是作為參考,可以根據自己的需要新建對應的輔助線。鼠標光標移動到編輯區域的左側和頂部的標尺區域,按住鼠標左鍵并往編輯區域拖動時,就可以生成橫向x軸或縱向y軸的輔助線,然后將輔助線拖動到對應的位置即可。輔助線還有一個特性就是當拖動元件靠近它時,元件會自動吸附到輔助線的邊緣達到快速對齊的效果。

          幾點輔助線的使用小技巧:

          • 右擊輔助線可以將其鎖定,以防止拖動元件時會將輔助線會跟著一起移動;
          • 可以通過按住Ctrl拖動創建全局輔助線,全局輔助線就是在所有頁面中產生一條相同的輔助線;
          • 在“布局—柵格和輔助線—鎖定輔助線”中選中可以將所有的輔助線保持鎖定狀態且無法刪除;
          • 在“布局—柵格和輔助線—刪除輔助線”中可以清除所有頁面中的輔助線;
          • 在“布局—柵格和輔助線—輔助線設置”中可以修改輔助線的顏色或進行更多設置;

          6.Toast提示交互設置;

          移動端原型中最常用的交互效果就是彈出層和輕提示兩種,模板中已經包含了這種兩交互效果的相關元件和事件,這里再單獨簡單的介紹一下。

          Toast提示顯示效果

          在模板頁面的概要視圖中可以看到名為“提示”的動態面板,需要顯示的提示信息在這個動態面板中編輯就可以了。當前的動態面板中有一個“操作成功”的提示狀態,如果在一個頁面中顯示多個提示,可以新增對應的狀態然后修改相關的提示內容。

          選中提示的動態面板的狀態右擊選擇復制狀態可以快速創建新的提示。建議對每個對應的提示狀態進行命名,這樣方便后續進行管理。關于輕提示的基本使用規范請參照前面的介紹內容。

          Toast提示的顯示方式設置很簡單,只需要在對應的元件事件上加入以上的交互動作。首先設置提示動態面板中對應的狀態,然后設置顯示動態面板,顯示時有一個逐漸的動畫效果。

          Toast提示顯示以后會在3秒后自動逐漸隱藏,模板中的這個交互動作已經加在提示動態面板的顯示時事件中了,不需要再單獨的進行設置。

          7.常用彈層交互設置

          模態窗口交互效果

          移動端的彈層共分為模態窗口、動作面板、彈出面板等幾種不同的類型。在模板頁面的概要視圖中可以看到名為“彈層”的動態面板,可以根據需要創建更多其它的彈層狀態,還能在對應的面板狀態屬性中設置透明背景的遮罩效果。

          上面截圖中的為比較常見的模態窗口彈層效果,設置方式是在對應的元件事件上加入以上的交互動作。另外,根據模態窗口、動作面板、彈出面板這幾種彈層類型的彈出方式不同,需要設置顯示時為向上滑動和逐步等動畫效果。

          8.導航欄切換交互設置

          最后介紹一下如何實現內容區域滾動時,導航欄自動切換的交互效果。首先需要在導航欄的動態面板中創建對應的狀態,然后選中內容框架動態面板,在它的滾動時事件中按照上面的格式加入對應的條件判斷即可。

          在這個設置用到了條件判斷和函數,條件的詳細設置見上方的截圖。它的原理是當內容框架垂直滾動高度大于70時設置導航欄動態面板的顯示狀態為2,當內容框架垂直滾動高度大小于70設置導航欄動態面板的顯示狀態為1。其中用到的This.scrollY函數是獲取當前元件的直滾動高度,70的值可以根據需要自己設置。

          好了,到此這篇基于設備模板的移動端原型設計方法的分享基本介紹完了。最后提供的是iPhoneX And iPhone8 Mockup 原型模板的源文件下載,大家可以結合本文中的相關介紹進行使用。

          最后再給大家分享一套本人整理設計的移動端元件庫,這套元件庫中的相關元件是可以在這個模板中復用的,后續也會不斷的進行優化和完善,有需要的朋友可以關注一下。

          在學習和工作中,我們經常需要使用日志來記錄程序的運行狀態和調試信息。而為了更好地區分不同的日志等級,我們可以使用不同的顏色來呈現,使其更加醒目和易于閱讀。

          在下圖運行結果中,我們使用了 colorlog 庫來實現彩色日志輸出。通過定義不同日志等級對應的顏色,我們可以在控制臺中以彩色的方式顯示日志信息。例如,DEBUG 級別的日志使用白色,INFO 級別的日志使用綠色,WARNING 級別的日志使用黃色,ERROR 級別的日志使用紅色,CRITICAL 級別的日志使用藍色。

          但是在查看日志文件時,我們會發現日志信息是系統默認的字體顏色,并且前后多了一些特殊符號,例如 [32m 等。這是因為在控制臺中使用的是 ANSI 轉義序列來實現彩色文本效果,而這些特殊符號是 ANSI 轉義序列的一部分。如下圖所示:

          現在有一個需求,在前端頁面直接查看日志內容并還原彩色文本效果,因此,我們將進行以下內容講解:

          1. 什么是 ANSI 轉義序列?
          2. 如何在前端頁面直接查看日志內容?
          3. 如何在前端頁面還原彩色文本效果?

          本文代碼點擊此處跳轉,往期系列文章請訪問博主的 項目實戰專欄,博文中的所有代碼全部收集在博主的 GitHub 倉庫中;

          ANSI 轉義序列

          ANSI 轉義序列是美國國家標準化組織(American National Standards Institute,ANSI)制定的標準,是一種用于控制文本終端顯示的特殊字符序列。它們以 3[ 開頭,以字母和數字組合的形式表示不同的控制功能。

          ANSI 轉義序列可以用于控制文本的顏色、背景色、文本樣式(如粗體、斜體等)、光標位置、清屏等操作。通過在輸出文本中插入適當的 ANSI 轉義序列,可以實現豐富的終端顯示效果。

          以下是一些常用的 ANSI 轉義序列示例:

          • 3[0m:重置所有屬性,恢復默認設置;
          • 3[31m:設置文本顏色為紅色;
          • 3[42m:設置背景顏色為綠色;
          • 3[1m:設置文本為粗體;
          • 3[4m:設置文本為下劃線;
          • 3[2J:清屏;

          需要注意的是,ANSI 轉義序列在不同的終端和操作系統上的支持程度可能會有所不同。在某些終端中,可能無法正確解釋和顯示 ANSI 轉義序列。

          我們以 3[31m 和 3[42m 為例,輸出一個綠底紅字的句子 Hello World! --sidiot.,代碼如下所示:

          log.debug("3[42m3[31mHello World! --sidiot.3[0m3[0m")

          運行結果:

          前端頁面直接查看日志內容

          這里的話,我們使用 Python 的 http.server 模塊來啟動一個簡單的 HTTP 服務器。

          比較快捷的方式就是在日志文件夾中打開終端,輸入 python -m http.server 8888 即可,運行結果如下所示:

          不過這種方式相對來說還是不太安全的,因此我們可以通過設置白名單的方式,來規避一些潛在的安全隱患,代碼如下所示:

          import http.server
          import socketserver
          
          class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
              def check_client_address(self):
                  # 設置白名單,只允許特定的IP地址或主機訪問
                  whitelist = ['127.0.0.1', 'localhost']
          
                  client_address = self.client_address[0]
                  if client_address not in whitelist:
                      self.send_response(403)
                      self.end_headers()
                      self.wfile.write(b'Forbidden. Please contact sidiot.')
                      return False
          
                  return True
          
              def do_GET(self):
                  if not self.check_client_address():
                      return
                  
                  super().do_GET()
          
          with socketserver.TCPServer(('0.0.0.0', 8888), HTTPRequestHandler) as httpd:
              httpd.serve_forever()

          目前本機的 IP 為 192.168.124.23,當我們以 127.0.0.1 來訪問 8888 服務端口時,訪問是成功的,但是當我們用 192.168.124.23 來訪問服務端口時,訪問是失敗的。

          運行結果:

          現在我們點擊文件,它會直接通過瀏覽器直接下載,但是我們需要的是在網頁上能夠直接閱覽文件中的內容,因此我們可以從 do_GET() 下手。

          我們可以設計一個根據傳入的文件名參數,讀取本地文件并作為響應結果進行返回的方法,然后根據一定的規則進行觸發,代碼如下所示:

          def read_file(self):
              try:
                  self.send_response(200)
                  self.send_header("Content-Type", "text/plain; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(open(self.path[6:], 'rb').read())
          
              except FileNotFoundError:
                  self.send_response(404)
                  self.end_headers()
                  self.wfile.write(b'File not found!')
          
          def do_GET(self):
              if self.check_client_address():
                  if self.path.startswith("/?log="):
                      self.read_file()
                  else:
                      super().do_GET()

          上述代碼通過檢查請求的資源路徑來處理 GET 請求。如果請求的資源路徑前綴是 /?log=,且是當前目錄下存在的日志文件,它會讀取文件并將其內容作為響應發送。否則,它會使用基類的默認行為處理普通的 GET 請求。

          運行結果:

          至此,我們已經實現了前端頁面直接查看日志內容的功能。

          前端頁面還原彩色文本效果

          原理分析

          當我們想要在前端頁面展示 ANSI 字體的彩色效果時,我們只需要簡單地將 ANSI 轉義序列轉換成相應的 HTML 代碼就可以實現了。這個轉換過程實際上可以通過編寫一個 Python 函數來實現,該函數可以接受包含 ANSI 控制碼的字符串作為輸入,并將其轉換為帶有相應樣式的 HTML 代碼輸出,代碼如下所示:

          def convert_ansi_to_html(ansi_text):
              ansi_to_html = {
                  '\x1b[31m': '<span style="color: red;">',
                  '\x1b[42m': '<span style="background-color: green;">',
                  ...,
              }
              html_text = re.sub(r'\x1b[[0-9;]*m', lambda match: ansi_to_html.get(match.group(0), ''), ansi_text)
          
              return html_text
          
          
          if __name__ == '__main__':
              ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
              print(ansi)
              html = convert_ansi_to_html(ansi)
              print(f"convert content: {html}")

          需要注意的是,在 ANSI 轉義序列中,\x1b 和 3 都代 表ASCII 碼中的 Escape 字符,用于開始一個轉義序列。

          運行結果:

          使用 ansiconv 轉換

          接下來,我們借助已有的庫函數 ansiconv 進行 ANSI 的轉換。

          通過 pip 進行安裝:

          pip install ansiconv

          根據 ansiconv 的官方文檔使用其中的三個方法 to_plain(),to_html() 和 base_css() 來實現在前端頁面展示 ANSI 字體的彩色效果,代碼如下所示:

          import ansiconv
          
          ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
          print(f"Ansi: {ansi}")
          plain = ansiconv.to_plain(ansi)
          html = ansiconv.to_html(ansi)
          print(f"Convert Plain: {plain}")
          print(f"Convert HTML: {html}")

          在 base_css() 中會有相關的 CSS 映射表,如下所示:

          css_rule('.ansi31', color="#FF0000"),
          css_rule('.ansi42', background_color="#00FF00"),

          運行結果:

          研究 ansiconv 源碼

          我們將通過研究 ansiconv 的源碼,以便深入了解它是如何將 ANSI 轉換成純文本或 HTML 代碼的工作原理。

          to_plain() 的源碼如下所示:

          上述代碼使用正則表達式匹配字符串中的 ANSI 轉義序列,并將其替換為空字符串,從而得到不包含轉義序列的純文本。

          正則表達式的含義如下:

          • \x1B:匹配 ESCAPE 字符;
          • \[:匹配左方括號;
          • [0-9;]*:匹配零個或多個數字或分號;
          • [ABCDEFGHJKSTfmnsulh]:匹配 ANSI 轉義序列中的控制字符;

          我們通過 re.findall() 方法來獲取所有匹配的結果,這樣夠清晰地捕獲所有符合條件的匹配項,從而更好地理解 ansiconv 是如何進行 ANSI 到純文本的轉換,代碼如下所示:

          ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
          print(re.findall(r'\x1B[[0-9;]*[ABCDEFGHJKSTfmnsulh]', ansi))

          運行結果:


          to_html() 的源碼如下所示:

          上述代碼將 ANSI 字符串分割成塊,并對每個塊調用 _block_to_html() 函數進行解析和轉換,同時還處理了 ANSI 命令 "A",模擬向上移動光標的行為。如果 replace_newline 為 True,則 HTML 字符串中的換行符 \n 將替換為 <br />\n 以保留 HTML 輸出中的換行符。

          其中 _block_to_html() 的源碼如下所示:

          上述代碼使用正則表達式匹配 ANSI 代碼,并根據匹配結果生成對應的 HTML 代碼。

          正則表達式的含義:

          • ^:表示匹配字符串的開頭。
          • \[:匹配左方括號 [。
          • (?P<code>\d+(?:;\d+)*)?:這是一個命名捕獲組,用于匹配 ANSI 代碼中的數字部分。它由以下組成: \d+:匹配一個或多個數字。 (?:;\d+)*:這是一個非捕獲組,用于匹配分號 ; 和一個或多個數字的重復出現。(?: ... ) 表示非捕獲組,* 表示重復零次或多次。
          • (?P<command>[Am]):這是另一個命名捕獲組,用于匹配 ANSI 代碼中的命令部分。它由以下組成: [Am]:匹配字符 A 或 m。

          我們可以通過運行源碼里的部分代碼來幫助理解,代碼如下所示:

          text = ("\x1B[0;32;45msidiot\n"
                  "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m")
          print(text)
          blocks = text.split('\x1B')
          print(blocks)
          for block in blocks:
              match = re.match(r'^[(?P<code>\d+(?:;\d+)*)?(?P<command>[Am])', block)
              if match is not None:
                  print("\nmatch:", match, ", code:", match.group('code'), ", command:", match.group('command'))

          運行結果:

          實際應用

          通過深入理解 ANSI 轉換思路和 ansiconv 源碼,我們可以為之前的 http.server 服務帶來全新的優化。

          首先,將原先的 read_file() 方法進行優化,代碼如下所示:

          def read_file(self, content_type, file_io):
              try:
                  self.send_response(200)
                  self.send_header("Content-Type", f"{content_type}; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(file_io)
          
              except FileNotFoundError:
                  self.send_response(404)
                  self.send_header("Content-Type", "text/plain; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(b'File not found!')

          上述代碼通過接收 content_type 和 file_io 兩個參數,實現將自定義內容作為響應返回給客戶端。

          然后修改請求路徑,使其能夠返回純文本HTML 兩種不同類型的內容,代碼如下所示:

          def do_GET(self):
              if self.check_client_address():
                  if self.path.startswith("/?plain="):
                      file = open(self.path[8:], 'rb').read()
                      plain = ansiconv.to_plain(file.decode('UTF-8'))
                      self.read_file("text/plain", plain.encode())
                  elif self.path.startswith("/?html="):
                      file = open(self.path[7:], 'rb').read()
                      conv = ansiconv.to_html(file.decode('UTF-8'))
                      css = ansiconv.base_css()
                      html = """
                      <html>
                        <head><style>{0}</style></head>
                        <body>
                          <pre class="ansi_fore ansi_back">{1}</pre>
                        </body>
                      </html>
                      """.format(css, conv)
                      print(html)
                      self.read_file("text/html", html.encode())
                  else:
                      super().do_GET()

          這里要注意的是,需要設置 CSS 樣式,不然 class 類是無法進行渲染的。

          純文本運行結果:

          HTML 運行結果:

          后記

          在本文中,我們探討了如何實現將 ANSI 字體在前端頁面進行彩色展示的方法。在前端頁面中直接顯示 ANSI 轉義序列是不起作用的,因為瀏覽器不會解析和處理這些轉義序列。

          為了在前端頁面實現彩色展示,我們介紹了一種方法,即將 ANSI 轉義序列轉換為對應的 HTML 代碼。通過解析 ANSI 轉義序列并將其轉換為適當的 HTML 標簽和樣式,我們可以在前端頁面上還原彩色文本的效果。

          在本文中,我們使用了 Python 中的 ansiconv 庫來實現 ANSI 轉換。該庫提供了 to_plain 和 to_html 兩個方法,分別用于將 ANSI 轉義序列轉換為純文本和 HTML 代碼。我們還展示了如何使用這些方法來轉換 ANSI 字符串,并在前端頁面上顯示轉換后的結果。

          通過本文的介紹,讀者可以了解到如何在前端頁面實現彩色文本的展示,從而提升用戶體驗和可讀性。無論是在日志查看器、終端模擬器還是其他需要展示彩色文本的應用中,這種技術都能發揮重要作用。

          以上就是 從終端到瀏覽器:實現 ANSI 字體在前端頁面的彩色展示 的所有內容了,希望本篇博文對大家有所幫助!歡迎大家持續關注我的博客,一起分享學習和成長的樂趣!?

          作者:sidiot
          鏈接:https://juejin.cn/post/7381820436274184202


          主站蜘蛛池模板: 风间由美在线亚洲一区| 日本一区二区三区日本免费| 国产午夜福利精品一区二区三区| 少妇人妻精品一区二区| 视频一区二区在线观看| 少妇无码AV无码一区| 性无码免费一区二区三区在线| 亚洲码一区二区三区| 天天视频一区二区三区| 亚洲国产综合精品一区在线播放| 亚洲啪啪综合AV一区| 精品欧洲av无码一区二区14| 日本精品一区二区三区视频| 在线观看国产区亚洲一区成人| 精品人伦一区二区三区潘金莲| 无码中文字幕乱码一区| 精品国产日韩亚洲一区| 亚洲一区综合在线播放| 日韩美女在线观看一区| 亚洲国产综合无码一区| 精品无人区一区二区三区在线| 白丝爆浆18禁一区二区三区| 亚洲V无码一区二区三区四区观看 亚洲爆乳精品无码一区二区三区 亚洲爆乳无码一区二区三区 | 99国产精品一区二区| 国产香蕉一区二区精品视频| 国产精品小黄鸭一区二区三区| 无码人妻精品一区二区三区夜夜嗨 | 亚洲午夜精品一区二区麻豆| 无码人妻精品一区二区三区99不卡 | 丰满人妻一区二区三区视频53 | 国产在线步兵一区二区三区| 国产凹凸在线一区二区| 尤物精品视频一区二区三区| 亚洲av福利无码无一区二区| 视频一区二区三区免费观看| 亚洲精品精华液一区二区| 久久精品一区二区免费看| 一区二区高清在线| 精品无码国产一区二区三区麻豆| 久久精品国产亚洲一区二区| 冲田杏梨高清无一区二区|