From 3231047c1475c9e500a0e5f92ea129fccef8dd28 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Thu, 15 Nov 2018 16:03:12 +0100 Subject: [PATCH] Second commit --- README.md | 71 +++++++ main.py | 53 +++-- static/favicon.png | Bin 0 -> 706 bytes static/logo.png | Bin 0 -> 28922 bytes static/normalize.css | 427 ++++++++++++++++++++++++++++++++++++++++ static/raleway.woff2 | Bin 0 -> 20332 bytes static/skeleton.css | 418 +++++++++++++++++++++++++++++++++++++++ static/style.css | 48 +++-- templates/base.html | 42 ++++ templates/download.html | 37 ++++ templates/index.html | 36 ++-- 11 files changed, 1084 insertions(+), 48 deletions(-) create mode 100644 README.md create mode 100644 static/favicon.png create mode 100644 static/logo.png create mode 100644 static/normalize.css create mode 100644 static/raleway.woff2 create mode 100644 static/skeleton.css create mode 100644 templates/base.html create mode 100644 templates/download.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..79b9069 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +``` + _ ___ _ + | | |__ \ | | + _ __ ___ __ _| |_ ) |_______ _____| |__ Trashing your meta, + | '_ ` _ \ / _` | __| / /______\ \ /\ / / _ \ '_ \ keeping your data, + | | | | | | (_| | |_ / /_ \ V V / __/ |_) | within your browser. + |_| |_| |_|\__,_|\__|____| \_/\_/ \___|_.__/ + ``` + +This is an online version of [mat2](https://0xacab.org/jvoisin/mat2). +Keep in mind that this is a beta version, don't rely on it for anything +serious, yet. + +# How to deploy it? + +Since mat2 isn't available in debian stable yet, you might want to add this to +/etc/apt/preferences.d/ to be able to install `mat2` via apt. + +``` +Package: * +Pin: release o=Debian,a=unstable +Pin-Priority: 10 +``` + +Then: + +``` +# apt install git nginx-light uwsgi uwsgi-plugin-python3 mat2 --no-install-recommends +# cd /var/www/ +# git clone https://0xacab.org/jvoisin/mat2-web.git +# mkdir ./mat2-web/uploads/ +# chown -R www-data:www-data ./mat2-web +# service uwsgi start +# service nginx start +``` + +Since uwsgi isn't fun to configure, feel free to slap this into your +`/etc/uwsgi/apps-enabled/mat2-web.ini`: + +``` +[uwsgi] +module=main +chdir = /var/www/mat2-web/ +callable = app +wsgi-file = main.py +master = true +workers = 1 + +uid = www-data +gid = www-data + +# kill stalled processes +harakiri = 30 +die-on-term = true + +socket = mat2-web.sock +chmod-socket = 774 +plugins = python3 +``` + +and this into your `/etc/nginx/site-enabled/mat2-web`: + +``` + location / { try_files $uri @yourapplication; } + location @yourapplication { + include uwsgi_params; + uwsgi_pass unix:/var/www/mat2-web/mat2-web.sock; + } +``` + +It should now be working. diff --git a/main.py b/main.py index b2f7776..4547a92 100644 --- a/main.py +++ b/main.py @@ -8,14 +8,36 @@ from flask import send_from_directory, after_this_request from werkzeug.utils import secure_filename -UPLOAD_FOLDER = './' -ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app = Flask(__name__) -app.config['SECRET_KEY'] = '1337' -app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER +app.config['SECRET_KEY'] = os.urandom(32) +app.config['UPLOAD_FOLDER'] = './uploads/' app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB +mimetypes = 'image/jpeg, image/png' + + +@app.route('/download/') +def download_file(filename:str): + if filename != secure_filename(filename): + flash('naughty naughty') + return redirect(url_for('upload_file')) + + filepath = secure_filename(filename) + + complete_path = os.path.join(app.config['UPLOAD_FOLDER'], filepath) + if not os.path.exists(complete_path): + return redirect(url_for('upload_file')) + + @after_this_request + def remove_file(response): + os.remove(complete_path) + return response + return send_from_directory(app.config['UPLOAD_FOLDER'], filepath) + +@app.route('/about') +def about(): + return render_template('about.html', mimetypes=mimetypes) @app.route('/', methods=['GET', 'POST']) def upload_file(): @@ -24,7 +46,7 @@ def upload_file(): flash('No file part') return redirect(request.url) uploaded_file = request.files['file'] - if uploaded_file.filename == '': + if not uploaded_file.filename: flash('No selected file') return redirect(request.url) filename = secure_filename(uploaded_file.filename) @@ -35,20 +57,23 @@ def upload_file(): if parser is None: flash('The type %s is not supported' % mime) return redirect(url_for('upload_file')) - elif parser.remove_all() is not True: + + meta = parser.get_meta() + + if parser.remove_all() is not True: flash('Unable to clean ' % mime) return redirect(url_for('upload_file')) - os.remove(filename) + output_filename = os.path.basename(parser.output_filename) - @after_this_request - def remove_file(response): - os.remove(parser.output_filename) - return response + # Get metadata after cleanup + parser, _ = parser_factory.get_parser(parser.output_filename) + meta_after = parser.get_meta() + os.remove(filepath) - return send_from_directory(app.config['UPLOAD_FOLDER'], parser.output_filename) + return render_template('download.html', mimetypes=mimetypes, meta=meta, filename=output_filename, meta_after=meta_after) - mimetypes = 'image/jpeg, image/png' return render_template('index.html', mimetypes=mimetypes) -app.run() +if __name__ == '__main__': + app.run() diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2b98f401934e0e4d3aaf6deb420c49f5513aa220 GIT binary patch literal 706 zcmV;z0zLhSP)m{^?j^sVV0&<0c*DcHj&!!x(IU_giZ!~%pMAqV5xTLFp{+int%19ZY zuxjTisj7#Bfa!^^2H*dss8il)Lu`bhuloG%Q{BZk14Q^jZpD@6dx3x0eV7&OL{~1CE^2>J+4$Lq< z@S4bc7$F3JUI=;>Mcj$!CoVZuec5jK^6*4ZHP#OejlRk>TTBLh>{s92HmYk6tJ@vN zN7B>Neoy=i6$NJ_mGS(Dcn?;W_Z>nEg3_p}OYKssrHZ24kACe@V$l|)%n*W)QgT6+ zvTLgQ;ORtj;77^|1Iz&Lfs=qA2xw81YB~X6%Nvf0m z9_Jq|nI_;EU1NQno&bm}BoQPJM1;Bl+bZ@3?ANW1aMc_GbK+B09_`Dq3L>71yumDwB{Rc?3 oSY6&xtIM0mYKhh5wIpiu5Bm(^b literal 0 HcmV?d00001 diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..712cccf479f50c3318f31bb38891595e23c0bc1b GIT binary patch literal 28922 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 Cxd}`F literal 0 HcmV?d00001 diff --git a/static/normalize.css b/static/normalize.css new file mode 100644 index 0000000..81c6f31 --- /dev/null +++ b/static/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/static/raleway.woff2 b/static/raleway.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7cb70315ff1288d9dc7e0a3f00c34108d8f345b0 GIT binary patch literal 20332 zcmV)1K+V5*Pew8T0RR9108eZH5C8xG0MFn608b160{{R300000000000000000000 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 literal 0 HcmV?d00001 diff --git a/static/skeleton.css b/static/skeleton.css new file mode 100644 index 0000000..f28bf6c --- /dev/null +++ b/static/skeleton.css @@ -0,0 +1,418 @@ +/* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Buttons +- Forms +- Lists +- Code +- Tables +- Spacing +- Utilities +- Clearing +- Media Queries +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 4%; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + + .one.column, + .one.columns { width: 4.66666666667%; } + .two.columns { width: 13.3333333333%; } + .three.columns { width: 22%; } + .four.columns { width: 30.6666666667%; } + .five.columns { width: 39.3333333333%; } + .six.columns { width: 48%; } + .seven.columns { width: 56.6666666667%; } + .eight.columns { width: 65.3333333333%; } + .nine.columns { width: 74.0%; } + .ten.columns { width: 82.6666666667%; } + .eleven.columns { width: 91.3333333333%; } + .twelve.columns { width: 100%; margin-left: 0; } + + .one-third.column { width: 30.6666666667%; } + .two-thirds.column { width: 65.3333333333%; } + + .one-half.column { width: 48%; } + + /* Offsets */ + .offset-by-one.column, + .offset-by-one.columns { margin-left: 8.66666666667%; } + .offset-by-two.column, + .offset-by-two.columns { margin-left: 17.3333333333%; } + .offset-by-three.column, + .offset-by-three.columns { margin-left: 26%; } + .offset-by-four.column, + .offset-by-four.columns { margin-left: 34.6666666667%; } + .offset-by-five.column, + .offset-by-five.columns { margin-left: 43.3333333333%; } + .offset-by-six.column, + .offset-by-six.columns { margin-left: 52%; } + .offset-by-seven.column, + .offset-by-seven.columns { margin-left: 60.6666666667%; } + .offset-by-eight.column, + .offset-by-eight.columns { margin-left: 69.3333333333%; } + .offset-by-nine.column, + .offset-by-nine.columns { margin-left: 78.0%; } + .offset-by-ten.column, + .offset-by-ten.columns { margin-left: 86.6666666667%; } + .offset-by-eleven.column, + .offset-by-eleven.columns { margin-left: 95.3333333333%; } + + .offset-by-one-third.column, + .offset-by-one-third.columns { margin-left: 34.6666666667%; } + .offset-by-two-thirds.column, + .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } + + .offset-by-one-half.column, + .offset-by-one-half.columns { margin-left: 52%; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 62.5%; } +body { + font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } +h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } +h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } +h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } +h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 5.0rem; } + h2 { font-size: 4.2rem; } + h3 { font-size: 3.6rem; } + h4 { font-size: 3.0rem; } + h5 { font-size: 2.4rem; } + h6 { font-size: 1.5rem; } +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #1EAEDB; } +a:hover { + color: #0FA0CE; } + + +/* Buttons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.button, +button, +input[type="submit"], +input[type="reset"], +input[type="button"] { + display: inline-block; + height: 38px; + padding: 0 30px; + color: #555; + text-align: center; + font-size: 11px; + font-weight: 600; + line-height: 38px; + letter-spacing: .1rem; + text-transform: uppercase; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border-radius: 4px; + border: 1px solid #bbb; + cursor: pointer; + box-sizing: border-box; } +.button:hover, +button:hover, +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +.button:focus, +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus, +input[type="button"]:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary, +button.button-primary, +input[type="submit"].button-primary, +input[type="reset"].button-primary, +input[type="button"].button-primary { + color: #FFF; + background-color: #33C3F0; + border-color: #33C3F0; } +.button.button-primary:hover, +button.button-primary:hover, +input[type="submit"].button-primary:hover, +input[type="reset"].button-primary:hover, +input[type="button"].button-primary:hover, +.button.button-primary:focus, +button.button-primary:focus, +input[type="submit"].button-primary:focus, +input[type="reset"].button-primary:focus, +input[type="button"].button-primary:focus { + color: #FFF; + background-color: #1EAEDB; + border-color: #1EAEDB; } + + +/* Forms +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea, +select { + height: 38px; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + background-color: #fff; + border: 1px solid #D1D1D1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; } +/* Removes awkward default styles on some inputs for iOS */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } +textarea { + min-height: 65px; + padding-top: 6px; + padding-bottom: 6px; } +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="text"]:focus, +input[type="tel"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +textarea:focus, +select:focus { + border: 1px solid #33C3F0; + outline: 0; } +label, +legend { + display: block; + margin-bottom: .5rem; + font-weight: 600; } +fieldset { + padding: 0; + border-width: 0; } +input[type="checkbox"], +input[type="radio"] { + display: inline; } +label > .label-body { + display: inline-block; + margin-left: .5rem; + font-weight: normal; } + + +/* Lists +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +ul { + list-style: circle inside; } +ol { + list-style: decimal inside; } +ol, ul { + padding-left: 0; + margin-top: 0; } +ul ul, +ul ol, +ol ol, +ol ul { + margin: 1.5rem 0 1.5rem 3rem; + font-size: 90%; } +li { + margin-bottom: 1rem; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + + +/* Tables +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +th, +td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #E1E1E1; } +th:first-child, +td:first-child { + padding-left: 0; } +th:last-child, +td:last-child { + padding-right: 0; } + + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +table, +p, +ul, +ol, +form { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +/* Clearing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +/* Self Clearing Goodness */ +.container:after, +.row:after, +.u-cf { + content: ""; + display: table; + clear: both; } + + +/* Media Queries +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* +Note: The best way to structure the use of media queries is to create the queries +near the relevant code. For example, if you wanted to change the styles for buttons +on small devices, paste the mobile query code up in the buttons section and style it +there. +*/ + + +/* Larger than mobile */ +@media (min-width: 400px) {} + +/* Larger than phablet (also point when grid becomes active) */ +@media (min-width: 550px) {} + +/* Larger than tablet */ +@media (min-width: 750px) {} + +/* Larger than desktop */ +@media (min-width: 1000px) {} + +/* Larger than Desktop HD */ +@media (min-width: 1200px) {} diff --git a/static/style.css b/static/style.css index ed92664..5f854a4 100644 --- a/static/style.css +++ b/static/style.css @@ -1,21 +1,41 @@ -header { - border-bottom: 1px solid black; - width: 100%; +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 400; + src: local('Raleway'), local('Raleway-Regular'), url(raleway-ext.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } -header h1 { +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 400; + src: local('Raleway'), local('Raleway-Regular'), url(raleway.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + + +.container { + margin-top: 18rem; +} + +.flashes { + text-align: center; + border: 1px solid #1EAEDB; +} + +footer { + width: 100%; + position: absolute; + bottom: 0; + height: 1%; text-align: center; } -header a { - text-align:right; + +a { + text-decoration: none; } -section { - border-radius: 1em; - padding: 1em; - position: absolute; - top: 50%; - left: 50%; - margin-right: -50%; - transform: translate(-50%, -50%); +a:hover { + text-decoration: underline; } diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..3f6e97b --- /dev/null +++ b/templates/base.html @@ -0,0 +1,42 @@ + + + + mat2 - web edition + + + + + + + +
+
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+ {% endif %} + {% endwith %} +
+ +
+
+
+ + mat2 logo + +
+
+ {% block content %}{% endblock %} +
+
+ + + diff --git a/templates/download.html b/templates/download.html new file mode 100644 index 0000000..c2b2a42 --- /dev/null +++ b/templates/download.html @@ -0,0 +1,37 @@ +{% extends "base.html" %} + +{% block content %} +

» Metadata removed

+

+{% if not meta_after %} +mat2 managed to remove all metadata from your file. +{% else %} +mat2 could not remove all the metadata from your file, those are the remaining ones: +

    + {% for key, value in meta_after.items() %} +
  • {{ key }}: {{ value }}
  • + {% endfor %} +
+{%endif %} +

+⇩ Download cleaned file + +
+ +{% if meta %} +

Just for fun, those are the metadata that mat2 detected in your file, before cleanup.

+
+
    + {% for key, value in meta.items() %} +
  • {{ key }}: {{ value }}
  • + {% endfor %} +
+
+{% else %} +meh +{% endif %} + +
+ +{% endblock %} + diff --git a/templates/index.html b/templates/index.html index 0496c2d..1e05c82 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,20 +1,16 @@ - - - - mat2 - online edition - - - -
-

mat2 - online edition

-
-
-

Remove metadata from your images

-

Drag and drop anywhere you want and get your files cleaned

-
-
- - -
-
- +{% extends "base.html" %} +{% block content %} + +

» Remove metadata

+

+Upload your image, get a cleaned one in response.
+
+ Please note that while we do not keep a copy of your image,
+ there is no way that you could be certain about this: act accordingly. +

+
+
+ + +
+{% endblock %}