Commit 2aa462a8 authored by Yannick Chudy's avatar Yannick Chudy

p3

parent 27041db3
.PHONY: install docker-build docker-push docker-pull
install:
virtualenv -p /usr/bin/python3 venv3
. venv3/bin/activate; pip install -r requirements.txt
mkdir -p ./static/images/
pip install -r requirements.txt
wget https://github.com/Semantic-Org/Semantic-UI-CSS/archive/master.zip -O static/master.zip
cd ./static && unzip master.zip
npm install jade --save
build: jade
jade:
@echo "\n ---------------------------"
@echo " * Building flask templates"
@echo " ---------------------------\n"
#cd ./templates && pypugjs *.jade
cd ./templates && node ../node_modules/jade/bin/jade.js -P *.jade
rundev:
. venv3/bin/activate; export APP_DEBUG=true; export FLASK_APP=botapadapp.py ;export FLASK_DEBUG=1; flask run
docker-build:
......@@ -44,4 +43,4 @@ docker-pull:
@echo "\n --------------------"
@echo " * Pulling images from PDG registry"
@echo " --------------------\n"
docker-compose -f docker-compose.yml pull
\ No newline at end of file
docker-compose -f docker-compose.yml pull
## Installation
$ make install
$ make install build
## Run for testing/developpment
# this will launch a flask application listening on http://localhost:5000
$ make rundev
# botapad
......@@ -220,19 +225,6 @@ Accessible service for botapad
[DEPRECATED] requires ../../screenshot/screenshot.py in `$PYTHONPATH`
## TODO
* [star] starred projected node
* [materials]nodetype materials (shape, color, size) ??
[SCREENSHOT] requires ../../screenshot/screenshot.py in `$PYTHONPATH`
* [import]circular import @[Nodetype]#id
* [import]url expansion with some providers
[+] navigation for humans between pad, git, cloud ...
[-] url might be unaccurate with some providers
ex :
& https://mensuel.framapad.org/p/uspol
! is converted during import to https://mensuel.framapad.org/p/uspol/export/txt
[Unit]
Description=gunicorn daemon
After=network.target
SourcePath= /home/botapad/botapadd
[Service]
PIDFile=/tmp/botapad.pid
User=botapad
Group=botapad
Environment="LANG=en_US.UTF-8"
Environment="ENGINES_HOST=https://botapad.padagraph.io"
Environment='RUN_GUNICORN=1'
#RuntimeDirectory=
WorkingDirectory=/home/botapad/botapadd
ExecStart=/usr/bin/gunicorn -t 200 --pid /tmp/botapad.pid --bind unix:/tmp/botapad.socket botapadapp:app
ExecReload=/bin/kill -s TERM `cat /tmp/botapad.pid`
ExecStop=/bin/kill -s INT `cat /tmp/botapad.pid`
#PrivateTmp=true
Type = simple
#Restart = always
[Install]
WantedBy=multi-user.target
# -*- coding: utf-8 -*-
try :
from botapad import Botapad
except:
from .botapad import Botapad
class BotapadError(Exception):
pass
......@@ -35,3 +29,9 @@ class BotapadURLError(Exception):
self.message = message
self.url = url
try :
from parser import Botapad
except:
from .parser import Botapad
import os
import sys
import json
import argparse
from botapi import Botagraph, BotApiError
from botapad import *
from reliure.types import Text , Numeric
import collections
......@@ -12,6 +14,12 @@ import requests
import re
import csv
from pprint import pprint
import traceback
try:
reload(sys)
sys.setdefaultencoding('utf-8')
except : pass
DIRECTIONS = ('<<','--','>>')
EDGE = 0
......@@ -161,9 +169,8 @@ class Botapad(object):
def debug(self, *args):
if self._debug:
self._log.write( "DEBUG" )
self._log.write( args )
self._log.write( json.dumps(args))
self._log.write( "\n" )
print( "DEBUG:")
pprint( args)
......@@ -181,7 +188,7 @@ class Botapad(object):
self.log( " * Downloading %s %s" % (url, separator))
r = requests.get(url)
content = r.text
self.log( " %s, %s\n" % (r, len(content)))
self.log( " %s, length %s encoding %s %s\n" % (r, len(content), r.encoding, type(r.text)))
# bug BOM ggdoc
if content[0:1] == u'\ufeff':
......@@ -205,11 +212,12 @@ class Botapad(object):
try :
with codecs.open(path, 'r', encoding=encoding ) as fin:
lines = [ line for line in fin]
except :
raise BotapadError("Can't read file %s" % path)
lines = [ line.strip() for line in lines ]
lines = [ line.encode('utf8') for line in lines if len(line)]
lines = [ line.strip()for line in lines ]
lines = [ line for line in lines if len(line)]
if not len(lines):
raise BotapadCsvError(path, separator, "Table is empty %s lines" % (len(lines) ) )
......@@ -226,7 +234,7 @@ class Botapad(object):
try :
reader = csv.reader(lines, delimiter=separator)
rows = [ r for r in reader]
rows = [ [ e.strip().decode('utf8') for e in r ] for r in rows if len(r) and not all([ len(e) == 0 for e in r]) ]
rows = [ [ e.strip() for e in r ] for r in rows if len(r) and not all([ len(e) == 0 for e in r]) ]
except :
raise BotapadCsvError(path, separator, "Error while parsing data %s lines with separator %s" % (len(lines), separator ) )
......@@ -462,10 +470,10 @@ class Botapad(object):
edges.append(payload)
self.log( " [POST] EDGE _ %s %s [%s]" % (len(edges), label , ", ".join(names)))
for e in self.bot.post_edges(self.gid, iter(edges)) :
for e,i in self.bot.post_edges(self.gid, iter(edges) ) :
self.debug(e)
except :
print( row )
except Exception as err:
print( "roooo \n %s" % traceback.format_exc(), row )
raise BotapadPostError("Error while posting edges ", edges, row)
# Vertex
......@@ -696,4 +704,4 @@ def main():
pad.log(" * Visit %s/graph/%s" % ( args.host, args.name, ) )
if __name__ == '__main__':
sys.exit(main())
\ No newline at end of file
sys.exit(main())
......@@ -18,13 +18,16 @@ from reliure.engine import Engine
from cello.graphs import export_graph, IN, OUT, ALL
from cello.graphs.prox import ProxSubgraph, ProxExtract, pure_prox, sortcut
from cello.layout import export_layout
from cello.clustering import export_clustering
from pdgapi.explor import ComplexQuery, AdditiveNodes, NodeExpandQuery, layout_api, clustering_api
from botapad.utils import export_graph
from botapad.utils import export_graph
from botapad import Botapad, BotapadError, BotapadParseError, BotapadURLError, BotapadCsvError, BotapadPostError
from botapi import BotApiError, Botagraph, BotaIgraph, BotLoginError
def db_graph(graphdb, query ):
gid = query['graph']
......@@ -36,18 +39,10 @@ def pad2pdg(gid, url, host, key, delete, debug=False):
bot = Botagraph()
botapad = Botapad(bot, gid, description, delete=delete)
return botapad.parse(url, separator='auto', debug=debug)
@Composable
def pad2igraph(gid, url, format="csv"):
graph = _pad2igraph(gid, url, format, delete=True)
graph['meta']['owner'] = None
graph['meta']['date'] = datetime.datetime.now().strftime("%Y-%m-%d %Hh%M")
return graph
from botapad import Botapad, BotapadError, BotapadParseError, BotapadURLError, BotapadCsvError
from botapi import BotApiError, Botagraph, BotaIgraph, BotLoginError
def _pad2igraph(gid, url, format, delete=False):
def pad2igraph(gid, url, format, delete=False, debug=False, store="/pads/"):
print ("format", gid, url, format )
......@@ -56,11 +51,10 @@ def _pad2igraph(gid, url, format, delete=False):
try :
description = "imported from %s" % url
if url[0:4] != 'http':
url = "%s/%s.%s" % (LOCAL_PADS_STORE, url, format)
url = "%s/%s.%s" % (store, url, format)
bot = BotaIgraph(directed=True)
botapad = Botapad(bot , gid, description, delete=delete, verbose=True, debug=False)
#botapad.parse(url, separator='auto', debug=app.config['DEBUG'])
botapad.parse(url, separator='auto', debug=False)
botapad.parse(url, separator='auto', debug=debug)
graph = bot.get_igraph(weight_prop="weight")
if graph.vcount() == 0 :
......@@ -75,6 +69,7 @@ def _pad2igraph(gid, url, format, delete=False):
except OSError as e :
raise BotapadURLError( "No such File or Directory : %s " % url, url)
elif format in ('pickle', 'graphml', 'graphmlz', 'gml', 'pajek'):
......@@ -164,10 +159,10 @@ def explore_engine(graphdb):
if len(pz):
for u in pz:
s = extract(graph, pzeros=[u], weighted=weighted,mode=mode, cut=cut, length=length)
vs = vs + s.keys()
vs = vs + list(s.keys())
else :
s = extract(graph, pzeros=[], weighted=weighted,mode=mode, cut=cut, length=length)
vs = s.keys()
vs = list(s.keys())
return graph.subgraph(vs)
......@@ -299,4 +294,4 @@ def explore_api(engines, graphdb):
response.headers['Content-Disposition'] = 'inline; filename=%s.%s' % (gid, content_type)
return response
return api
\ No newline at end of file
return api
This diff is collapsed.
#gunicorn
flask
flask-runner
Flask-Markdown
flask_login
flask_cors
......@@ -20,3 +19,5 @@ https://github.com/padagraph/pdglib/archive/master.zip
# used with igraph repo
python-igraph
numpy
scipy
#padagraph-top .row {
}
#padagraph-top .column {
padding: 6px 0px 6px 0px;
z-index: 100;
}
#padagraph-right.column {
padding: 0px;
padding-top: 6px;
}
#padagraph-right .tab {
padding: 0px;
margin: 0px;
height: calc(100% - 68px);
}
#padagraph-right .tab.tab-actions{
height: calc(100% - 51px);
}
#padagraph-right .tab .scrollable {
max-height: 100%;
overflow-y:auto;
word-wrap: break-word;
text-align: left;
padding: 6px;
/*
margin-top : 10px;
*/
}
#padagraph-right .ui.secondary.fitted.menu {
border-top: 0px;
}
#padagraph-right .tab .vertical.menu>.item {
padding-left:8px;
}
#padagraph-right .tab .vertical.menu>.item .menu .item{
/*
padding-left:2px;
*/
}
#padagraph-viz {
height : calc(100% - 52px);
padding:0px;
width:100%;
}
#padagraph-viz .dimmer {
background: hsla(60,100%,30%,0.6);
padding: 12px;
}
.startapp .ui.menu, .ui.pointing.dropdown>.menu {
border-radius: .2rem;
}
i.dore.icons i.comment.icon {
color: #999900;
}
.menu.inverted i.dore.icons i.share.icon {
color: #e2E2E2;
}
i.dore.icons i.share.icon {
color: #666;
}
.padagraph-box, .padagraph-box-messages {
display: block;
position: absolute;
top: 0;
left: 0;
padding: 12px;
z-index:100;
background: rgba(51, 51, 51, 0.6);
}
.padagraph-box {
height: 100%;
width: 100%;
}
.padagraph-box .ui.steps .step {
padding: 0px !important;
}
.padagraph-box>.message {
padding: 0px;
padding-top: 2px;
border: 1px solid #16191D;
border-radius: 0px;
max-height:800px;
max-width: 800px;
text-align: left;
margin: auto;
}
.padagraph-box>.message>.form>.header {
padding: 18px;
text-align: left;
background-color: #333;
color: white;
}
.padagraph-box .message .form .content {
height: auto;
padding: 12px;
overflow: auto;
}
.padagraph-box .padagraph-edit-buttons {
padding-bottom: 42px !important;
margin-top: 10px !important;
}
.padagraph-box .padagraph-edit-buttons .right.floated.button {
margin-right: 12px;
}
.padagraph-box .padagraph-edit-buttons .left.floated.button {
margin-left: 12px;
}
.ui.star.rating .icon:hover {
color:#DDC507;
}
/*
*
*.padagraph-box{
height: 100%;
}
.padagraph-box .message {
padding: 0px;
padding-top: 2px;
border: 1px solid #16191D;
border-radius: 0px;
max-height:800px;
max-width: 800px;
text-align: left;
margin: auto;
}
.padagraph-box .message .form .header {
padding: 18px;
text-align: left;
background-color: #333;
color: white;
}
.padagraph-box .message .form /deep/ .content {
height: auto;
padding: 12px;
}
.padagraph-box .padagraph-edit-buttons {
padding-bottom: 48px !important;
}
.padagraph-box /deep/ .padagraph-edit-buttons button.right.floated.button {
margin-right: 12px;
}
.padagraph-box /deep/ .padagraph-edit-buttons button.left.floated {
margin-left: 12px;
}
*
*
*
*
*
* :host .padagraph-box {
height:100%;
}
.ui.message {
padding-top: 20px;
padding: 0px;
border: 1px solid #2A63AC;
border-radius: 0px;
max-height:800px;
max-width: 800px;
text-align: left;
margin: auto;
}
.form .header {
padding: 18px;
text-align: left;
background-color: #333;
color: white;
}
.form .content {
height: auto;
padding: 12px;
}
.padagraph-edit-buttons {
padding-bottom: 48px;
}
button.ui.icon.right.floated.button {
margin-right: 12px;
}
*/
\ No newline at end of file
body {
/*
background-color:#999900;
*/
background-color:#F7F7F7;
}
#padagraph-row-top {
background-color: #333;
width: 100% !important;
max-width: 100% !important;
margin: 0 !important;
margin-bottom: 20px !important;
padding: 0px;
padding-top: 10px;
height: 70px;
}
#padagraph-row-top .row {
padding: 4px;
}
/* one page app css */
h1.ui.header {
margin-bottom:-20px;
}
.ui.divider { margin:14px; }
#padagraph-viz {
background-color:{{color}};
margin:auto;
}
.compact.mini.buttons {
vertical-align:middle;
}
.compact.mini.buttons .ui.button{
padding:6px !important;
}
.compact.mini.buttons .downvote.icon.button .icon, .compact.mini.buttons .upvote.icon.button .icon{
margin-right:4px;
}
.ui.primary.button{
margin-left:8px;
}
/* iframe css */
#markdown {
position: absolute;
overflow-y: scroll;
display:none;
top: 0px;
left: 0px;
height: 90%;
margin: 20px;
padding: 20px;
background-color:{{color}};
border: 1px solid white;
opacity: 0.87;
}
#markdown h1, #markdown h2 {
border-bottom: 2px solid #0f8e8e;
}
#markdown a {
color: #000e40;
text-decoration: underline;
font-weight: 700;
}
.panel {
position: relative;
top: -32px;
left: -6px;
text-align: center;
margin:auto;
}
.small.button {
margin-top: -4px;
vertical-align: top;
}
This diff is collapsed.
/* mousetrap v1.6.0 craig.is/killing/mice */
(function(r,t,g){function u(a,b,h){a.addEventListener?a.addEventListener(b,h,!1):a.attachEvent("on"+b,h)}function y(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return k[a.which]?k[a.which]:p[a.which]?p[a.which]:String.fromCharCode(a.which).toLowerCase()}function D(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function v(a){return"shift"==a||"ctrl"==a||"alt"==a||
"meta"==a}function z(a,b){var h,c,e,g=[];h=a;"+"===h?h=["+"]:(h=h.replace(/\+{2}/g,"+plus"),h=h.split("+"));for(e=0;e<h.length;++e)c=h[e],A[c]&&(c=A[c]),b&&"keypress"!=b&&B[c]&&(c=B[c],g.push("shift")),v(c)&&g.push(c);h=c;e=b;if(!e){if(!n){n={};for(var l in k)95<l&&112>l||k.hasOwnProperty(l)&&(n[k[l]]=l)}e=n[h]?"keydown":"keypress"}"keypress"==e&&g.length&&(e="keydown");return{key:c,modifiers:g,action:e}}function C(a,b){return null===a||a===t?!1:a===b?!0:C(a.parentNode,b)}function c(a){function b(a){a=
a||{};var b=!1,m;for(m in n)a[m]?b=!0:n[m]=0;b||(w=!1)}function h(a,b,m,f,c,h){var g,e,k=[],l=m.type;if(!d._callbacks[a])return[];"keyup"==l&&v(a)&&(b=[a]);for(g=0;g<d._callbacks[a].length;++g)if(e=d._callbacks[a][g],(f||!e.seq||n[e.seq]==e.level)&&l==e.action){var q;(q="keypress"==l&&!m.metaKey&&!m.ctrlKey)||(q=e.modifiers,q=b.sort().join(",")===q.sort().join(","));q&&(q=f&&e.seq==f&&e.level==h,(!f&&e.combo==c||q)&&d._callbacks[a].splice(g,1),k.push(e))}return k}function g(a,b,m,f){d.stopCallback(b,
b.target||b.srcElement,m,f)||!1!==a(b,m)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0)}function e(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=y(a);b&&("keyup"==a.type&&x===b?x=!1:d.handleKey(b,D(a),a))}function k(a,c,m,f){function e(c){return function(){w=c;++n[a];clearTimeout(r);r=setTimeout(b,1E3)}}function h(c){g(m,c,a);"keyup"!==f&&(x=y(c));setTimeout(b,10)}for(var d=n[a]=0;d<c.length;++d){var p=d+1===c.length?h:e(f||
z(c[d+1]).action);l(c[d],p,f,a,d)}}function l(a,b,c,f,e){d._directMap[a+":"+c]=b;a=a.replace(/\s+/g," ");var g=a.split(" ");1<g.length?k(a,g,b,c):(c=z(a,c),d._callbacks[c.key]=d._callbacks[c.key]||[],h(c.key,c.modifiers,{type:c.action},f,a,e),d._callbacks[c.key][f?"unshift":"push"]({callback:b,modifiers:c.modifiers,action:c.action,seq:f,level:e,combo:a}))}var d=this;a=a||t;if(!(d instanceof c))return new c(a);d.target=a;d._callbacks={};d._directMap={};var n={},r,x=!1,p=!1,w=!1;d._handleKey=function(a,
c,e){var f=h(a,c,e),d;c={};var k=0,l=!1;for(d=0;d<f.length;++d)f[d].seq&&(k=Math.max(k,f[d].level));for(d=0;d<f.length;++d)f[d].seq?f[d].level==k&&(l=!0,c[f[d].seq]=1,g(f[d].callback,e,f[d].combo,f[d].seq)):l||g(f[d].callback,e,f[d].combo);f="keypress"==e.type&&p;e.type!=w||v(a)||f||b(c);p=l&&"keydown"==e.type};d._bindMultiple=function(a,b,c){for(var d=0;d<a.length;++d)l(a[d],b,c)};u(a,"keypress",e);u(a,"keydown",e);u(a,"keyup",e)}if(r){var k={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",
18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},p={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},B={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},A={option:"alt",command:"meta","return":"enter",
escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},n;for(g=1;20>g;++g)k[111+g]="f"+g;for(g=0;9>=g;++g)k[g+96]=g;c.prototype.bind=function(a,b,c){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,c);return this};c.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};c.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};c.prototype.reset=function(){this._callbacks={};this._directMap=
{};return this};c.prototype.stopCallback=function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")||C(b,this.target)?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};c.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};c.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(k[b]=a[b]);n=null};c.init=function(){var a=c(t),b;for(b in a)"_"!==b.charAt(0)&&(c[b]=function(b){return function(){return a[b].apply(a,arguments)}}(b))};
c.init();r.Mousetrap=c;"undefined"!==typeof module&&module.exports&&(module.exports=c);"function"===typeof define&&define.amd&&define(function(){return c})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null);
/* mousetrap v1.6.2 craig.is/killing/mice */
(function(p,t,h){function u(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function y(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return m[a.which]?m[a.which]:q[a.which]?q[a.which]:String.fromCharCode(a.which).toLowerCase()}function E(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function v(a){return"shift"==a||"ctrl"==a||"alt"==a||
"meta"==a}function z(a,b){var d,e=[];var c=a;"+"===c?c=["+"]:(c=c.replace(/\+{2}/g,"+plus"),c=c.split("+"));for(d=0;d<c.length;++d){var k=c[d];A[k]&&(k=A[k]);b&&"keypress"!=b&&B[k]&&(k=B[k],e.push("shift"));v(k)&&e.push(k)}c=k;d=b;if(!d){if(!n){n={};for(var h in m)95<h&&112>h||m.hasOwnProperty(h)&&(n[m[h]]=h)}d=n[c]?"keydown":"keypress"}"keypress"==d&&e.length&&(d="keydown");return{key:k,modifiers:e,action:d}}function C(a,b){return null===a||a===t?!1:a===b?!0:C(a.parentNode,b)}function e(a){function b(a){a=
a||{};var b=!1,l;for(l in n)a[l]?b=!0:n[l]=0;b||(w=!1)}function d(a,b,r,g,F,e){var l,D=[],h=r.type;if(!f._callbacks[a])return[];"keyup"==h&&v(a)&&(b=[a]);for(l=0;l<f._callbacks[a].length;++l){var d=f._callbacks[a][l];if((g||!d.seq||n[d.seq]==d.level)&&h==d.action){var c;(c="keypress"==h&&!r.metaKey&&!r.ctrlKey)||(c=d.modifiers,c=b.sort().join(",")===c.sort().join(","));c&&(c=g&&d.seq==g&&d.level==e,(!g&&d.combo==F||c)&&f._callbacks[a].splice(l,1),D.push(d))}}return D}function h(a,b,d,g){f.stopCallback(b,
b.target||b.srcElement,d,g)||!1!==a(b,d)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0)}function c(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=y(a);b&&("keyup"==a.type&&x===b?x=!1:f.handleKey(b,E(a),a))}function k(a,d,r,g){function l(d){return function(){w=d;++n[a];clearTimeout(p);p=setTimeout(b,1E3)}}function e(d){h(r,d,a);"keyup"!==g&&(x=y(d));setTimeout(b,10)}for(var c=n[a]=0;c<d.length;++c){var f=c+1===d.length?e:l(g||
z(d[c+1]).action);m(d[c],f,g,a,c)}}function m(a,b,c,g,e){f._directMap[a+":"+c]=b;a=a.replace(/\s+/g," ");var h=a.split(" ");1<h.length?k(a,h,b,c):(c=z(a,c),f._callbacks[c.key]=f._callbacks[c.key]||[],d(c.key,c.modifiers,{type:c.action},g,a,e),f._callbacks[c.key][g?"unshift":"push"]({callback:b,modifiers:c.modifiers,action:c.action,seq:g,level:e,combo:a}))}var f=this;a=a||t;if(!(f instanceof e))return new e(a);f.target=a;f._callbacks={};f._directMap={};var n={},p,x=!1,q=!1,w=!1;f._handleKey=function(a,
c,e){var g=d(a,c,e),f;c={};var l=0,k=!1;for(f=0;f<g.length;++f)g[f].seq&&(l=Math.max(l,g[f].level));for(f=0;f<g.length;++f)g[f].seq?g[f].level==l&&(k=!0,c[g[f].seq]=1,h(g[f].callback,e,g[f].combo,g[f].seq)):k||h(g[f].callback,e,g[f].combo);g="keypress"==e.type&&q;e.type!=w||v(a)||g||b(c);q=k&&"keydown"==e.type};f._bindMultiple=function(a,b,c){for(var d=0;d<a.length;++d)m(a[d],b,c)};u(a,"keypress",c);u(a,"keydown",c);u(a,"keyup",c)}if(p){var m={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",
18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},q={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},B={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},A={option:"alt",command:"meta","return":"enter",
escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},n;for(h=1;20>h;++h)m[111+h]="f"+h;for(h=0;9>=h;++h)m[h+96]=h.toString();e.prototype.bind=function(a,b,d){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,d);return this};e.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};e.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};e.prototype.reset=function(){this._callbacks={};
this._directMap={};return this};e.prototype.stopCallback=function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")||C(b,this.target)?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};e.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};e.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(m[b]=a[b]);n=null};e.init=function(){var a=e(t),b;for(b in a)"_"!==b.charAt(0)&&(e[b]=function(b){return function(){return a[b].apply(a,
arguments)}}(b))};e.init();p.Mousetrap=e;"undefined"!==typeof module&&module.exports&&(module.exports=e);"function"===typeof define&&define.amd&&define(function(){return e})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null);
This diff is collapsed.
/** vim: et:ts=4:sw=4:sts=4
* @license RequireJS 2.3.2 Copyright jQuery Foundation and other contributors.
* @license RequireJS 2.3.5 Copyright jQuery Foundation and other contributors.
* Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE
*/
//Not using strict: uneven strict support in browsers, #392, and causes
......@@ -11,7 +11,7 @@ var requirejs, require, define;
(function (global, setTimeout) {
var req, s, head, baseElement, dataMain, src,
interactiveScript, currentlyAddingScript, mainScript, subPath,
version = '2.3.2',
version = '2.3.5',
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/mg,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
jsSuffixRegExp = /\.js$/,
......@@ -440,7 +440,9 @@ var requirejs, require, define;
//Account for relative paths if there is a base name.
if (name) {
if (prefix) {
if (pluginModule && pluginModule.normalize) {
if (isNormalized) {
normalizedName = name;
} else if (pluginModule && pluginModule.normalize) {
//Plugin is loaded, use its normalize method.
normalizedName = pluginModule.normalize(name, function (name) {
return normalize(name, parentName, applyMap);
......@@ -972,7 +974,8 @@ var requirejs, require, define;
//prefix and name should already be normalized, no need
//for applying map config again either.
normalizedMap = makeModuleMap(map.prefix + '!' + name,
this.map.parentMap);
this.map.parentMap,
true);
on(normalizedMap,
'defined', bind(this, function (value) {
this.map.normalizedMap = normalizedMap;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -10,8 +10,6 @@ html
title Botapad
//
<link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.7/semantic.min.css">
<script src="https://cdn.jsdelivr.net/semantic-ui/2.2.7/semantic.min.js"></script>
<link rel="stylesheet" href="static/Semantic-UI-CSS-master/semantic.min.css">
link(rel='stylesheet', href='https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.13/semantic.min.css')
......@@ -93,17 +91,17 @@ html
.statistic
.value {{ stats.fails }}
.label fails
.statistic
.value {{ stats.tries }}
.label tries
h4.ui.hidden.divider
.ui.left.aligned.container
h5.ui.inverted.horizontal.divider
| rows
table.ui.compact.single.line.table
.segment
table.ui.compact.single.line.table
thead
tr
th date
th load
th pad url
th graph
th.center.aligned promote
......@@ -113,12 +111,17 @@ html
tr(class="{% if not item.status %}error{% endif %}")
td {{ item.date }}{{ item.time }}
td
a(href='{{ item.padurl}}', target='_blank') {{ item.padurl }}
a(href='import/igraph.html?s={{ item.botapad_url}}', target='_blank')
i.icon.play
td(style="max-width:400px;overflow-x:hidden")
a(href='{{ item.padurl}}',title='{{ item.padurl}}', target='_blank') {{ item.padurl }}
td
a(href='{{ item.graph_url}}', target='_blank') {{ item.gid }}
td.center.aligned
| {% if item.help %}
i.icon.announcement
| {% else %}
i.icon.minus
| {% endif %}
td.center.aligned
| {% if item.status %}
......@@ -128,12 +131,14 @@ html
{% endfor %}
{% elif complete and not fail %}
//.ui.container
div
include graph.jade
include graph.jade
{% elif error %}
.ui.text.container
h3.ui.inverted.horizontal.divider Import error
.ui.error.icon.message
......@@ -189,16 +194,19 @@ html
li
a(href='{{error.url}}', target='_blank') {{error.url}}
li {{error.message}}
li {{error.stacktrace}}
{%endif%}
.ui.horizontal.divider
i.teal.cloud.icon
{% else %}
.ui.text.container
h4.ui.inverted.horizontal.divider
| Import to {{repo}}
h3.ui.inverted.header Choose a name and fill the pad url
form.ui.form(method='post', action='{{repo}}.html')
form.ui.form(method='post', action='/')
.field
.ui.huge.input
input(type='text', name='gid', placeholder='graph name')
......@@ -251,4 +259,4 @@ html
.ui.inverted.link.list
a.active.item(href='//padagraph.io') padagraph.io @2017
{% endif%}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment