├── .gitignore ├── README.md ├── app.js ├── package.json ├── public ├── images │ ├── ReaderResizeLarge@2x.png │ ├── ReaderResizeLargePressed@2x.png │ ├── ReaderResizeSeparator@2x.png │ ├── ReaderResizeSmall@2x.png │ └── ReaderResizeSmallPressed@2x.png ├── javascripts │ └── localizedStrings.js └── stylesheets │ ├── WBSReaderSharedStyleSheet.css │ └── style.css ├── routes ├── fkrenyao.js ├── index.js ├── readability.js └── user.js └── views ├── demo.ejs ├── index.ejs └── readability.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | # demo 2 | lib-cov 3 | *.seed 4 | *.log 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | *.rdb 10 | pids 11 | logs 12 | results 13 | 14 | npm-debug.log 15 | node_modules 16 | .idea 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | readability 2 | =========== 3 | 4 | update : **add mobile screen option initial-scale** 5 | 6 | readability 7 | 8 | #DEMO FOR node-readability 9 | use express 10 | 11 | interface 12 | http://www.youdomain.com/readability?dsturl=[ Article Link ] 13 | 14 | like http://42.121.117.150:15002/readability?dsturl=http://server.chinabyte.com/151/12820151.shtml 15 | 16 | 17 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express'); 7 | var routes = require('./routes'); 8 | var user = require('./routes/user'); 9 | var readability = require('./routes/readability'); 10 | var http = require('http'); 11 | var path = require('path'); 12 | 13 | 14 | var fkrenyao = require('./routes/fkrenyao'); 15 | 16 | var app = express(); 17 | 18 | // all environments 19 | app.set('port', process.env.PORT || 3000); 20 | app.set('views', path.join(__dirname, 'views')); 21 | app.set('view engine', 'ejs'); 22 | app.use(express.favicon()); 23 | app.use(express.logger('dev')); 24 | app.use(express.json()); 25 | app.use(express.urlencoded()); 26 | app.use(express.methodOverride()); 27 | app.use(express.cookieParser('your secret here')); 28 | app.use(express.session()); 29 | app.use(app.router); 30 | app.use(express.static(path.join(__dirname, 'public'))); 31 | 32 | // development only 33 | if ('development' == app.get('env')) { 34 | app.use(express.errorHandler()); 35 | } 36 | 37 | app.get('/', readability.initRouter); 38 | app.get('/users', user.list); 39 | app.get('/fkrenyao',fkrenyao.demo); 40 | 41 | app.get('/readability', readability.index); 42 | 43 | http.createServer(app).listen(app.get('port'), function(){ 44 | console.log('Express server listening on port ' + app.get('port')); 45 | }); 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "application-name", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "3.4.7", 10 | "ejs": "*", 11 | "node-readability": "~0.2.1", 12 | "request": "~2.31.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/images/ReaderResizeLarge@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inmyfree/readability/f28fe62ae343fd60412ea5d6db21ad05b5416d6d/public/images/ReaderResizeLarge@2x.png -------------------------------------------------------------------------------- /public/images/ReaderResizeLargePressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inmyfree/readability/f28fe62ae343fd60412ea5d6db21ad05b5416d6d/public/images/ReaderResizeLargePressed@2x.png -------------------------------------------------------------------------------- /public/images/ReaderResizeSeparator@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inmyfree/readability/f28fe62ae343fd60412ea5d6db21ad05b5416d6d/public/images/ReaderResizeSeparator@2x.png -------------------------------------------------------------------------------- /public/images/ReaderResizeSmall@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inmyfree/readability/f28fe62ae343fd60412ea5d6db21ad05b5416d6d/public/images/ReaderResizeSmall@2x.png -------------------------------------------------------------------------------- /public/images/ReaderResizeSmallPressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inmyfree/readability/f28fe62ae343fd60412ea5d6db21ad05b5416d6d/public/images/ReaderResizeSmallPressed@2x.png -------------------------------------------------------------------------------- /public/javascripts/localizedStrings.js: -------------------------------------------------------------------------------- 1 | var localizedStrings = new Object; 2 | 3 | localizedStrings["%@ cannot be empty."] = "%@ cannot be empty."; 4 | localizedStrings["%@ icon"] = "%@ icon"; 5 | localizedStrings["%@ matches"] = "%@ matches"; 6 | localizedStrings["1 MB"] = "1 MB"; 7 | localizedStrings["1 match"] = "1 match"; 8 | localizedStrings["10 MB"] = "10 MB"; 9 | localizedStrings["100 MB"] = "100 MB"; 10 | localizedStrings["5 MB"] = "5 MB"; 11 | localizedStrings["50 MB"] = "50 MB"; 12 | localizedStrings["A selection is required."] = "A selection is required."; 13 | localizedStrings["Access Level"] = "Access Level"; 14 | localizedStrings["Add Extension…"] = "Add Extension…"; 15 | localizedStrings["All"] = "All"; 16 | localizedStrings["Allowed Domains"] = "Allowed Domains"; 17 | localizedStrings["Author"] = "Author"; 18 | localizedStrings["AutoFill"] = "AutoFill"; 19 | localizedStrings["Automatic install will begin in %@ seconds…"] = "Automatic install will begin in %@ seconds…"; 20 | localizedStrings["Bar %@"] = "Bar %@"; 21 | localizedStrings["Bars"] = "Bars"; 22 | localizedStrings["Blacklist"] = "Blacklist"; 23 | localizedStrings["Build Package…"] = "Build Package…"; 24 | localizedStrings["Bundle Identifier"] = "Bundle Identifier"; 25 | localizedStrings["Bundle Version"] = "Bundle Version"; 26 | localizedStrings["Cancel"] = "Cancel"; 27 | localizedStrings["Cannot be empty."] = "Cannot be empty."; 28 | localizedStrings["Checkbox"] = "Checkbox"; 29 | localizedStrings["Checked"] = "Checked"; 30 | localizedStrings["Close Page"] = "Close Page"; 31 | localizedStrings["Command"] = "Command"; 32 | localizedStrings["Contextual Menu Item %@"] = "Contextual Menu Item %@"; 33 | localizedStrings["Contextual Menu Items"] = "Contextual Menu Items"; 34 | localizedStrings["Database Quota"] = "Database Quota"; 35 | localizedStrings["Default Value"] = "Default Value"; 36 | localizedStrings["Description"] = "Description"; 37 | localizedStrings["Disabled"] = "Disabled"; 38 | localizedStrings["Display Name"] = "Display Name"; 39 | localizedStrings["Display Version"] = "Display Version"; 40 | localizedStrings["Display as a password"] = "Display as a password"; 41 | localizedStrings["Empty"] = "Empty"; 42 | localizedStrings["Enable %@"] = "Enable %@"; 43 | localizedStrings["Enable Extensions"] = "Enable Extensions"; 44 | localizedStrings["End Scripts"] = "End Scripts"; 45 | localizedStrings["Extension Chrome"] = "Extension Chrome"; 46 | localizedStrings["Extension Details"] = "Extension Details"; 47 | localizedStrings["Extension Global Page"] = "Extension Global Page"; 48 | localizedStrings["Extension Info"] = "Extension Info"; 49 | localizedStrings["Extension Main Menu"] = "Extension Main Menu"; 50 | localizedStrings["Extension Settings"] = "Extension Settings"; 51 | localizedStrings["Extension Storage"] = "Extension Storage"; 52 | localizedStrings["Extension Updates"] = "Extension Updates"; 53 | localizedStrings["Extension Versions"] = "Extension Versions"; 54 | localizedStrings["Extension Website Access"] = "Extension Website Access"; 55 | localizedStrings["Extensions"] = "Extensions"; 56 | localizedStrings["Extensions are created by third-party developers to customize and enhance your web experience."] = "Extensions are created by third-party developers to customize and enhance your web experience."; 57 | localizedStrings["Extensions will be automatically updated"] = "Extensions will be automatically updated"; 58 | localizedStrings["False Value"] = "False Value"; 59 | localizedStrings["File"] = "File"; 60 | localizedStrings["For detailed information about problems found on this site, or a portion of this site, visit the Google Safe Browsing diagnostic page for %@."] = "For detailed information about problems found on this site, or a portion of this site, visit the Google Safe Browsing diagnostic page for %@."; 61 | localizedStrings["Get Extensions"] = "Get Extensions"; 62 | localizedStrings["Global Page File"] = "Global Page File"; 63 | localizedStrings["Go Back"] = "Go Back"; 64 | localizedStrings["Group"] = "Group"; 65 | localizedStrings["Height"] = "Height"; 66 | localizedStrings["Help"] = "Help"; 67 | localizedStrings["Hidden"] = "Hidden"; 68 | localizedStrings["Identifier"] = "Identifier"; 69 | localizedStrings["Ignore Warning"] = "Ignore Warning"; 70 | localizedStrings["Image"] = "Image"; 71 | localizedStrings["Include By Default"] = "Include By Default"; 72 | localizedStrings["Include Secure Pages"] = "Include Secure Pages"; 73 | localizedStrings["Injected Extension Content"] = "Injected Extension Content"; 74 | localizedStrings["Inspect Global Page"] = "Inspect Global Page"; 75 | localizedStrings["Install"] = "Install"; 76 | localizedStrings["Install All Updates"] = "Install All Updates"; 77 | localizedStrings["Install Updates Automatically"] = "Install Updates Automatically"; 78 | localizedStrings["Invalid URL pattern."] = "Invalid URL pattern."; 79 | localizedStrings["Invalid URL. A HTTP or HTTPS URL is required."] = "Invalid URL. A HTTP or HTTPS URL is required."; 80 | localizedStrings["Invalid bundle identifier."] = "Invalid bundle identifier."; 81 | localizedStrings["Invalid domain pattern."] = "Invalid domain pattern."; 82 | localizedStrings["Key"] = "Key"; 83 | localizedStrings["Keyboard Shortcut"] = "Keyboard Shortcut"; 84 | localizedStrings["Label"] = "Label"; 85 | localizedStrings["Learn more about phishing scams"] = "Learn more about phishing scams"; 86 | localizedStrings["List Box"] = "List Box"; 87 | localizedStrings["Loading Next Page…"] = "Loading Next Page…"; 88 | localizedStrings["Maximum Value"] = "Maximum Value"; 89 | localizedStrings["Menu"] = "Menu"; 90 | localizedStrings["Menu %@"] = "Menu %@"; 91 | localizedStrings["Menu Item %@"] = "Menu Item %@"; 92 | localizedStrings["Menu Items"] = "Menu Items"; 93 | localizedStrings["Menus"] = "Menus"; 94 | localizedStrings["Minimum Value"] = "Minimum Value"; 95 | localizedStrings["Mixed"] = "Mixed"; 96 | localizedStrings["New"] = "New"; 97 | localizedStrings["New Bar"] = "New Bar"; 98 | localizedStrings["New Contextual Menu Item"] = "New Contextual Menu Item"; 99 | localizedStrings["New Domain Pattern"] = "New Domain Pattern"; 100 | localizedStrings["New Extension…"] = "New Extension…"; 101 | localizedStrings["New Menu"] = "New Menu"; 102 | localizedStrings["New Menu Item"] = "New Menu Item"; 103 | localizedStrings["New Popover"] = "New Popover"; 104 | localizedStrings["New Script"] = "New Script"; 105 | localizedStrings["New Setting Item"] = "New Setting Item"; 106 | localizedStrings["New Style Sheet"] = "New Style Sheet"; 107 | localizedStrings["New Title"] = "New Title"; 108 | localizedStrings["New Toolbar Item"] = "New Toolbar Item"; 109 | localizedStrings["New URL Pattern"] = "New URL Pattern"; 110 | localizedStrings["New Value"] = "New Value"; 111 | localizedStrings["No Safari Developer Certificate"] = "No Safari Developer Certificate"; 112 | localizedStrings["No matches"] = "No matches"; 113 | localizedStrings["No settings"] = "No settings"; 114 | localizedStrings["No updates available"] = "No updates available"; 115 | localizedStrings["None"] = "None"; 116 | localizedStrings["Normal"] = "Normal"; 117 | localizedStrings["OFF"] = "OFF"; 118 | localizedStrings["ON"] = "ON"; 119 | localizedStrings["Page %@"] = "Page %@"; 120 | localizedStrings["Page %@ of %@"] = "Page %@ of %@"; 121 | localizedStrings["Palette Label"] = "Palette Label"; 122 | localizedStrings["Pop-Up Button"] = "Pop-Up Button"; 123 | localizedStrings["Popover"] = "Popover"; 124 | localizedStrings["Popover %@"] = "Popover %@"; 125 | localizedStrings["Popovers"] = "Popovers"; 126 | localizedStrings["Possible Phishing Site"] = "Possible Phishing Site"; 127 | localizedStrings["Radio Buttons"] = "Radio Buttons"; 128 | localizedStrings["Reload"] = "Reload"; 129 | localizedStrings["Report an error"] = "Report an error"; 130 | localizedStrings["Safari will automatically install updates for your extensions. If you prefer to install updates manually, deselect Install Updates Automatically."] = "Safari will automatically install updates for your extensions. If you prefer to install updates manually, deselect Install Updates Automatically."; 131 | localizedStrings["Search:"] = "Search:"; 132 | localizedStrings["Separator"] = "Separator"; 133 | localizedStrings["Setting Item %@"] = "Setting Item %@"; 134 | localizedStrings["Setting Items"] = "Setting Items"; 135 | localizedStrings["Slider"] = "Slider"; 136 | localizedStrings["Some"] = "Some"; 137 | localizedStrings["Start Scripts"] = "Start Scripts"; 138 | localizedStrings["State"] = "State"; 139 | localizedStrings["Step Value"] = "Step Value"; 140 | localizedStrings["Store in secure settings"] = "Store in secure settings"; 141 | localizedStrings["Style Sheets"] = "Style Sheets"; 142 | localizedStrings["Submenu"] = "Submenu"; 143 | localizedStrings["Suspected Malware Site"] = "Suspected Malware Site"; 144 | localizedStrings["Suspected Phishing Site"] = "Suspected Phishing Site"; 145 | localizedStrings["Text Field"] = "Text Field"; 146 | localizedStrings["The address for the website you’re visiting contains a username or password. This may be a “phishing” website. Phishing websites are designed to trick you into disclosing personal or financial information, usually by creating a copy of a legitimate website, such as a bank’s."] = "The address for the website you’re visiting contains a username or password. This may be a “phishing” website. Phishing websites are designed to trick you into disclosing personal or financial information, usually by creating a copy of a legitimate website, such as a bank’s."; 147 | localizedStrings["The description might be too long, causing it to be truncated."] = "The description might be too long, causing it to be truncated."; 148 | localizedStrings["The website you are visiting appears to contain malware. Malware is malicious software that may harm your computer or otherwise operate without your consent. Your computer can be infected just by browsing to a site with malware, without any further action on your part."] = "The website you are visiting appears to contain malware. Malware is malicious software that may harm your computer or otherwise operate without your consent. Your computer can be infected just by browsing to a site with malware, without any further action on your part."; 149 | localizedStrings["The website you are visiting has been reported as a “phishing” website. These websites are designed to trick you into disclosing personal or financial information, usually by creating a copy of a legitimate website, such as a bank."] = "The website you are visiting has been reported as a “phishing” website. These websites are designed to trick you into disclosing personal or financial information, usually by creating a copy of a legitimate website, such as a bank."; 150 | localizedStrings["Title"] = "Title"; 151 | localizedStrings["Titles"] = "Titles"; 152 | localizedStrings["To have Safari automatically install updates for your extensions, select Install Updates Automatically."] = "To have Safari automatically install updates for your extensions, select Install Updates Automatically."; 153 | localizedStrings["Toolbar Item %@"] = "Toolbar Item %@"; 154 | localizedStrings["Toolbar Items"] = "Toolbar Items"; 155 | localizedStrings["Tooltip"] = "Tooltip"; 156 | localizedStrings["True Value"] = "True Value"; 157 | localizedStrings["Type"] = "Type"; 158 | localizedStrings["Unchecked"] = "Unchecked"; 159 | localizedStrings["Uninstall"] = "Uninstall"; 160 | localizedStrings["Untitled"] = "Untitled"; 161 | localizedStrings["Update Manifest"] = "Update Manifest"; 162 | localizedStrings["Updates"] = "Updates"; 163 | localizedStrings["Updates are available for one or more of your extensions. To install an update click its Install button, or click Install All Updates."] = "Updates are available for one or more of your extensions. To install an update click its Install button, or click Install All Updates."; 164 | localizedStrings["Values"] = "Values"; 165 | localizedStrings["Version: %@"] = "Version: %@"; 166 | localizedStrings["Warning: Possible phishing site"] = "Warning: Possible phishing site"; 167 | localizedStrings["Warning: Suspected phishing site"] = "Warning: Suspected phishing site"; 168 | localizedStrings["Warning: Visiting this site may harm your computer"] = "Warning: Visiting this site may harm your computer"; 169 | localizedStrings["Website"] = "Website"; 170 | localizedStrings["Whitelist"] = "Whitelist"; 171 | localizedStrings["Width"] = "Width"; 172 | localizedStrings["by %@"] = "by %@"; 173 | 174 | -------------------------------------------------------------------------------- /public/stylesheets/WBSReaderSharedStyleSheet.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | font-size: 1.25em; 3 | } 4 | 5 | h2 { 6 | font-size: 1.125em; 7 | } 8 | 9 | h3 { 10 | font-size: 1.05em; 11 | } 12 | 13 | h4, h5, h6 { 14 | font-size: 1em; 15 | margin: 1em 0; 16 | } 17 | 18 | figure { 19 | margin: 0; 20 | } 21 | 22 | .page.rtl { 23 | direction: rtl; 24 | } 25 | 26 | #article { 27 | text-rendering: optimizeLegibility; 28 | } 29 | 30 | #article pre { 31 | white-space: pre-wrap; 32 | } 33 | 34 | #article * { 35 | /* Scale down anything larger than our view. Max-width maintains aspect ratios on images. */ 36 | max-width: 100%; 37 | } 38 | 39 | #article img { 40 | /* By default, images are centered on their own line. */ 41 | margin: 0.5em auto; 42 | display: block; 43 | height: auto; 44 | } 45 | 46 | #article img.reader-image-tiny { 47 | display: inline; 48 | margin: 0; 49 | } 50 | 51 | #article .leading-image, figure, .auxiliary { 52 | margin-bottom: .25em; 53 | } 54 | 55 | #article .leading-image img { 56 | margin: auto; 57 | display: block; 58 | clear: both; 59 | } 60 | 61 | #article .leading-image img.full-width { 62 | width: 100%; 63 | } 64 | 65 | #article .leading-image .credit { 66 | margin: 0; 67 | text-align: right; 68 | } 69 | 70 | #article .leading-image .caption, 71 | #article .leading-image .credit, 72 | #article figcaption, 73 | #article .auxiliary figcaption { 74 | font-size: 0.75em; 75 | line-height: 1.5em; 76 | margin-top: 1em; 77 | width: 100%; 78 | } 79 | 80 | #article .leading-image .credit + .caption { 81 | margin-top: 0.1em; 82 | } 83 | 84 | #article .auxiliary { 85 | display: block; 86 | clear: both; 87 | font-size: 0.75em; 88 | line-height: 1.4em; 89 | text-align: start; 90 | } 91 | 92 | #article .auxiliary img, #article .auxiliary > *:first-child { 93 | margin: 0; 94 | } 95 | 96 | /* If the element immediately after an image is inline, it might bump up against the image. */ 97 | #article .auxiliary img + * { 98 | display: block; 99 | } 100 | 101 | #article .auxiliary figcaption { 102 | font-size: 100%; 103 | } 104 | 105 | #article .auxiliary * { 106 | margin-top: 0.5em; 107 | margin-bottom: 0.5em; 108 | } 109 | 110 | #article .float.left { 111 | float: left; 112 | margin-right: 20px; 113 | } 114 | 115 | #article .float.right { 116 | float: right; 117 | margin-left: 20px; 118 | } 119 | 120 | #article .clear { 121 | clear: both; 122 | } 123 | 124 | /* Collapse excess whitespace. */ 125 | .page p > p:empty, 126 | .page div > p:empty, 127 | .page p > div:empty, 128 | .page div > div:empty, 129 | .page p + br, 130 | .page p > br:only-child, 131 | .page div > br:only-child, 132 | .page img + br 133 | { 134 | display: none; 135 | } 136 | 137 | .title { 138 | display: none; 139 | } 140 | 141 | .page:first-of-type .title { 142 | display: block; 143 | } 144 | 145 | .page table { 146 | font-size: 0.9em; 147 | text-align: start; 148 | word-wrap: break-word; 149 | } 150 | 151 | .page a { 152 | text-decoration: none; 153 | } 154 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /routes/fkrenyao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by inmyfree on 1/2/14. 3 | */ 4 | 5 | /* 6 | * GET home page. 7 | */ 8 | 9 | exports.index = function(req, res){ 10 | console.log(req); 11 | res.render('index', { title: 'Fk renyao' }); 12 | }; 13 | 14 | exports.demo = function(req, res){ 15 | console.log(req); 16 | res.render('demo', { title: 'Fk renyao',content:"content contentcontentcontentcontent" }); 17 | }; 18 | 19 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | 6 | exports.index = function(req, res){ 7 | res.render('index', { title: 'Express' }); 8 | }; -------------------------------------------------------------------------------- /routes/readability.js: -------------------------------------------------------------------------------- 1 | var read = require('node-readability'); 2 | 3 | exports.index = function(req, res){ 4 | console.log(req.query.dsturl); 5 | if(req.query.dsturl){ 6 | read(req.query.dsturl, function(err, article) { 7 | if(err == null){ 8 | res.render('readability', { title: article.title , content: article.content }); 9 | }else{ 10 | res.render('readability', { title: err[0].type , content: err[0].message }); 11 | } 12 | }); 13 | }else{ 14 | res.render('readability', { title: "处理错误" , content: "处理错误" }); 15 | } 16 | }; 17 | 18 | exports.initRouter = function(req, res){ 19 | req.query.dsturl = "http://server.chinabyte.com/151/12820151.shtml"; 20 | console.log(req.query.dsturl); 21 | if(req.query.dsturl){ 22 | read(req.query.dsturl, function(err, article) { 23 | if(err == null){ 24 | res.render('readability', { title: article.title , content: article.content }); 25 | }else{ 26 | res.render('readability', { title: err[0].type , content: err[0].message }); 27 | } 28 | }); 29 | }else{ 30 | res.render('readability', { title: "处理错误" , content: "处理错误" }); 31 | } 32 | }; 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /routes/user.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET users listing. 4 | */ 5 | 6 | exports.list = function(req, res){ 7 | res.send("respond with a resource"); 8 | }; -------------------------------------------------------------------------------- /views/demo.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |Welcome to <%= title %>
10 |<%= content %>
11 | 12 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |Welcome to <%= title %>
10 | 11 | -------------------------------------------------------------------------------- /views/readability.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |