re-init
This commit is contained in:
commit
cb344b8069
|
@ -0,0 +1,45 @@
|
|||
<!DOCTYPE html>
|
||||
<html manifest='cache.manifest'>
|
||||
<head><title>Git.io</title>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='description' content='git.io browser extension with support for custom URLs and shrt-history'>
|
||||
<meta name='keywords' content='github, git.io'>
|
||||
<meta name='apple-mobile-web-app-capable' content='yes'>
|
||||
<meta name='apple-mobile-web-app-status-bar-style' content='black'>
|
||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no'>
|
||||
<link rel='icon' type='image/png' sizes='512x512' href='icon.png'>
|
||||
<link rel='icon' type='image/png' sizes='128x128' href='favicon.png'>
|
||||
|
||||
<link rel='stylesheet' href='./style.css'>
|
||||
<script type='text/javascript' src='./script.js'></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<section>
|
||||
<label for='full-url'>GitHub</label>
|
||||
<input id='full-url' type='text' placeholder='full url'>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<label for='shortened-url'>Git.io</label>
|
||||
<input id='shortened-url' type='text' placeholder='(custom shortener)'>
|
||||
<button id='action-button'>shrt!</button>
|
||||
</section>
|
||||
|
||||
<ul id='notifications'>
|
||||
<li><span id='message'>Enter the shortener (optional) and click “shrt!”<span></li>
|
||||
</ul>
|
||||
|
||||
<ul id='recent-links'></ul>
|
||||
|
||||
<ul id='show-all-recent-links' title='Show all recent links'>
|
||||
<li></li>
|
||||
</ul>
|
||||
|
||||
<ul id='clear-list' title='Clear the list'>
|
||||
<li>clear list</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,11 @@
|
|||
{ "name": "Git.io Addon"
|
||||
, "description": "git.io browser extension with support for custom URLs and shrt-history"
|
||||
, "launch_path": "./"
|
||||
, "default_locale": "en"
|
||||
, "icons":
|
||||
{ "500": "icon.png" }
|
||||
, "developer":
|
||||
{ "name": "Dym Sohin"
|
||||
, "url": "https://dym.sh"
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
|
@ -0,0 +1,252 @@
|
|||
var GitIO = function ( )
|
||||
{
|
||||
var API_ENDPOINT = 'http://git.io/'
|
||||
|
||||
this.invoke = function ( command, params, response_callback )
|
||||
{
|
||||
if( 'generate' == command )
|
||||
{ requestForShortenUrl
|
||||
( params.url
|
||||
, params.code
|
||||
, function ( data )
|
||||
{ response_callback( data ) }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
var requestForShortenUrl = function ( url, code, callback )
|
||||
{
|
||||
var xhr = new XMLHttpRequest( )
|
||||
var form_data = new FormData( )
|
||||
|
||||
form_data.append( 'url', url )
|
||||
|
||||
if( code )
|
||||
{ form_data.append( 'code', code ) }
|
||||
|
||||
xhr.onload = function ( e )
|
||||
{
|
||||
if( 201 == this.status )
|
||||
{ callback
|
||||
({ 'status': 'OK'
|
||||
, 'shortened_url' : this.getResponseHeader( 'Location' )
|
||||
})
|
||||
}
|
||||
else
|
||||
{ callback
|
||||
({ 'status' : 'Error'
|
||||
, 'error' :
|
||||
{ 'code' : this.status
|
||||
, 'message' : this.responseText
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
xhr.open( 'POST', API_ENDPOINT, true )
|
||||
xhr.send( form_data )
|
||||
}
|
||||
}
|
||||
|
||||
chrome.extension.onRequest.addListener
|
||||
( function ( request, sender, sendResponse )
|
||||
{ GitIO.invoke( request.command, request.params, sendResponse ) }
|
||||
)
|
||||
|
||||
localStorage.getItem( 'notFirstRun', function ( arr )
|
||||
{
|
||||
if( arr['notFirstRun'] ) return
|
||||
|
||||
var shrtList =
|
||||
{ 'http://git.io/help' : 'https://github.com/blog/985-git-io-github-url-shortener'
|
||||
, 'http://git.io/nn' : 'https://github.com/noformnocontent'
|
||||
, 'http://git.io/chrome' : 'https://github.com/noformnocontent/git-io-chrome'
|
||||
}
|
||||
|
||||
localStorage.setItem( 'shrtList', shrtList )
|
||||
localStorage.setItem( 'notFirstRun', true )
|
||||
})
|
||||
|
||||
|
||||
var shrt_field = document.getElementById( 'shortened-url' )
|
||||
, url_field = document.getElementById( 'full-url' )
|
||||
, notifications = document.getElementById( 'notifications' )
|
||||
, message_field = document.getElementById( 'message' )
|
||||
, action_button = document.getElementById( 'action-button' )
|
||||
, show_all_recent_links = document.getElementById( 'show-all-recent-links' )
|
||||
, clear_list = document.getElementById( 'clear-list' )
|
||||
, recent_links = document.getElementById( 'recent-links' )
|
||||
, lis = recent_links.getElementsByTagName( 'li' )
|
||||
|
||||
var shrtLink = function ( )
|
||||
{ getShortenedUrl( ) }
|
||||
|
||||
action_button.addEventListener( 'click', shrtLink )
|
||||
|
||||
localStorage.getItem( function ( arr )
|
||||
{ for( var k in arr )
|
||||
{ createShrtListElement( k, arr[k]) }
|
||||
})
|
||||
|
||||
|
||||
var setMessage = function ( message )
|
||||
{ message_field.innerHTML = message }
|
||||
|
||||
var copyResultToClipboard = function ( field )
|
||||
{
|
||||
field.select( )
|
||||
document.execCommand( 'Copy' )
|
||||
notifications.classList.remove( 'error' )
|
||||
notifications.classList.add( 'done' )
|
||||
setMessage( 'Link is copied to the clipboard.' )
|
||||
}
|
||||
|
||||
var bindBtnToCoopy = function ( )
|
||||
{
|
||||
action_button.removeEventListener( 'click', shrtLink, false )
|
||||
action_button.addEventListener( 'click', function ( )
|
||||
{ copyResultToClipboard( shrt_field ) })
|
||||
|
||||
action_button.innerHTML = 'cpy!'
|
||||
action_button.classList.remove( 'error' )
|
||||
action_button.classList.add( 'done' )
|
||||
notifications.classList.remove( 'error' )
|
||||
notifications.classList.add( 'done' )
|
||||
setMessage( 'You can now copy the link by clicking “cpy!”'
|
||||
+ ' It will also stay in your shrt-list if you ever need it again.'
|
||||
)
|
||||
}
|
||||
|
||||
var createShrtListElement = function ( shrt, fullUrl, flashListsElement )
|
||||
{
|
||||
if( !/^https?:\/\/git\.io\/.+/.test( shrt ) ) return
|
||||
|
||||
var listElement = document.createElement( 'li' )
|
||||
, listInput = document.createElement( 'input' )
|
||||
, listVisit = document.createElement( 'a' )
|
||||
, listCopy = document.createElement( 'a' )
|
||||
|
||||
listInput.value = shrt
|
||||
listInput.type = 'text'
|
||||
listInput.readOnly = true
|
||||
|
||||
listVisit.href = shrt
|
||||
listVisit.target = '_new'
|
||||
listVisit.title = 'Open link in new tab'
|
||||
listVisit.appendChild( document.createTextNode( '' ))
|
||||
|
||||
listCopy.href = '#copy'
|
||||
listCopy.title = 'Copy link to clipboard'
|
||||
listCopy.appendChild( document.createTextNode( '' ))
|
||||
listCopy.addEventListener( 'click', function ( e )
|
||||
{
|
||||
copyResultToClipboard
|
||||
( e.currentTarget.parentNode
|
||||
.getElementsByTagName( 'input' )[0]
|
||||
)
|
||||
e.preventDefault( )
|
||||
})
|
||||
|
||||
listElement.title = fullUrl
|
||||
listElement.appendChild( listInput )
|
||||
listElement.appendChild( listVisit )
|
||||
listElement.appendChild( listCopy )
|
||||
|
||||
if( flashListsElement )
|
||||
{ listElement.classList.add( 'current' ) }
|
||||
|
||||
recent_links.insertBefore
|
||||
( listElement, recent_links.firstChild )
|
||||
|
||||
testShrtListLength( )
|
||||
}
|
||||
|
||||
var getShortenedUrl = function ( )
|
||||
{
|
||||
var request_data =
|
||||
{ 'command': 'generate'
|
||||
, 'params':
|
||||
{ 'url': url_field
|
||||
, 'code': shrt_field.value
|
||||
}
|
||||
}
|
||||
|
||||
chrome.extension.sendRequest( request_data, function ( data )
|
||||
{
|
||||
if( 'OK' == data.status )
|
||||
{
|
||||
// TODO: notice if sent and recived shortened are different
|
||||
shrt_field.value = data.shortened_url
|
||||
bindBtnToCoopy( )
|
||||
localStorage.getItem( data.shortened_url, function ( arr )
|
||||
{
|
||||
if( !arr[data.shortened_url] )
|
||||
{
|
||||
var urlPair = { }
|
||||
urlPair[data.shortened_url] = tab.url
|
||||
localStorage.setItem( urlPair )
|
||||
}
|
||||
else
|
||||
{ // bump to the top and '.current' the one in the list
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
else if( 'Error' == data.status )
|
||||
{
|
||||
action_button.innerHTML = 'rrr!'
|
||||
action_button.classList.remove( 'done' )
|
||||
action_button.classList.add( 'error' )
|
||||
notifications.classList.remove( 'done' )
|
||||
notifications.classList.add( 'error' )
|
||||
setMessage( data.error.code + ': ' + data.error.message )
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
action_button.innerHTML = '??!'
|
||||
action_button.classList.remove( 'done' )
|
||||
action_button.classList.add( 'error' )
|
||||
notifications.classList.remove( 'done' )
|
||||
notifications.classList.add( 'error' )
|
||||
setMessage( data.status )
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var testShrtListLength = function ( )
|
||||
{
|
||||
if( lis.length > 3 )
|
||||
{
|
||||
show_all_recent_links.style.display = 'block'
|
||||
show_all_recent_links.getElementsByTagName( 'li' )[0]
|
||||
.innerHTML = '▾ show ' + ( lis.length-3 ) + ' more ▾'
|
||||
|
||||
show_all_recent_links.addEventListener( 'click', function ( )
|
||||
{
|
||||
for( var i = 3; i < lis.length; i++ )
|
||||
{ lis[i].style.display = 'block' }
|
||||
|
||||
show_all_recent_links.style.display = 'none'
|
||||
clear_list.style.display = 'block'
|
||||
|
||||
clear_list.addEventListener( 'click', function ( )
|
||||
{
|
||||
while( lis[0] )
|
||||
{ lis[0].parentNode.removeChild( lis[0]) }
|
||||
|
||||
localStorage.clear( )
|
||||
localStorage.setItem( 'notFirstRun', true )
|
||||
clear_list.style.display = 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
chrome.storage.onChanged.addListener( function ( changes, namespace )
|
||||
{
|
||||
for( key in changes )
|
||||
{ if( changes[key].newValue )
|
||||
{ createShrtListElement( key, changes[key], true ) }
|
||||
}
|
||||
})
|
|
@ -0,0 +1,233 @@
|
|||
* { margin : 0
|
||||
; padding : 0
|
||||
; text-rendering : optimizeLegibility
|
||||
}
|
||||
|
||||
@font-face
|
||||
{ font-family : 'Octicons Regular'
|
||||
; src : url('octicons.woff') format('woff')
|
||||
; font-weight : normal
|
||||
; font-style : normal
|
||||
}
|
||||
|
||||
body
|
||||
{ font-family : sans-serif
|
||||
; font-size : 0
|
||||
; background : #e7eef1
|
||||
; padding : 15px
|
||||
; word-break : keep-all
|
||||
; white-space : nowrap
|
||||
; margin : 0 auto
|
||||
; width : 255px
|
||||
}
|
||||
|
||||
label
|
||||
{ font-size : 14px
|
||||
; background : linear-gradient(#839ba9, #415b6b)
|
||||
; border-radius : 3px 0 0 3px
|
||||
; border-top : solid 1px #313b3d
|
||||
; border-left : solid 1px #232b2c
|
||||
; border-bottom : solid 1px #232b2c
|
||||
; border-right : solid 1px #232b2c
|
||||
; box-shadow : 0 1px 3px #6a8290 inset
|
||||
; color : #e7eef1
|
||||
; padding : 5px 7px 6px 7px
|
||||
; display : inline-block
|
||||
; letter-spacing : .075pt
|
||||
; line-height : 1rem
|
||||
; width : 37px
|
||||
; text-align : center
|
||||
}
|
||||
|
||||
label[for='full-url']
|
||||
{ font-size : 12px }
|
||||
|
||||
form
|
||||
{ display : inline }
|
||||
|
||||
section
|
||||
{ margin-bottom : 15px }
|
||||
|
||||
::-webkit-input-placeholder
|
||||
{ color : #b3bbbe }
|
||||
|
||||
::input-placeholder
|
||||
{ color : #b3bbbe }
|
||||
|
||||
#shortened-url
|
||||
, #full-url
|
||||
{ background : #f7f9fa
|
||||
; font-size : 14px
|
||||
; color : #3b4448
|
||||
; border-top : solid 1px #49565e
|
||||
; border-right : 0
|
||||
; border-bottom : solid 1px #37434c
|
||||
; border-left : 0
|
||||
; box-shadow : 0 1px 3px #6a8290 inset
|
||||
; vertical-align : top
|
||||
; padding : 3px 5px
|
||||
; height : 21px
|
||||
; width : 144px
|
||||
}
|
||||
|
||||
#full-url
|
||||
{ width : 192px
|
||||
; border-right : solid 1px #37434c
|
||||
; border-radius : 0 3px 3px 0
|
||||
}
|
||||
|
||||
button
|
||||
{ width : 49px
|
||||
; height : 29px
|
||||
; font-size : 14px
|
||||
; line-height : 12px
|
||||
; background : linear-gradient(#425B6B, #24323B)
|
||||
; border-radius : 0 3px 3px 0
|
||||
; border-top : solid 1px #313b3d
|
||||
; border-left : solid 1px #232b2c
|
||||
; border-bottom : solid 1px #232b2c
|
||||
; border-right : solid 1px #232b2c
|
||||
; box-shadow : 0 1px 0 #5f7886 inset
|
||||
; vertical-align : top
|
||||
; color : #fff
|
||||
; padding : 5px 7px
|
||||
}
|
||||
|
||||
button.done
|
||||
{ background : linear-gradient(#52a360, #477651) }
|
||||
|
||||
button.error
|
||||
{ background : linear-gradient(#b24142, #803b3d) }
|
||||
|
||||
ul
|
||||
{ width : 255px
|
||||
; font-size : 14px
|
||||
; list-style : none
|
||||
; margin-top : 15px
|
||||
}
|
||||
|
||||
ul li
|
||||
{ border : solid 1px #839ba9
|
||||
; border-top : 0
|
||||
; background : #e7eef1
|
||||
; text-align : center
|
||||
; padding : 7px 5px
|
||||
}
|
||||
|
||||
ul li:first-child
|
||||
{ border-top : solid 1px #839ba9
|
||||
; border-top-left-radius : 3px
|
||||
; border-top-right-radius : 3px
|
||||
}
|
||||
|
||||
ul li:last-child
|
||||
{ border-bottom-left-radius : 3px
|
||||
; border-bottom-right-radius : 3px
|
||||
}
|
||||
|
||||
#recent-links li
|
||||
{ display : none
|
||||
; padding : 0
|
||||
; text-align : right
|
||||
; font-size : 0
|
||||
}
|
||||
|
||||
#recent-links li:hover
|
||||
{ background : #f7f9fa }
|
||||
|
||||
#recent-links li input
|
||||
{ float : left
|
||||
; font-size : 12px
|
||||
; width : 158px
|
||||
; padding : 2px
|
||||
; background : none
|
||||
; border : 0
|
||||
; text-overflow : ellipsis
|
||||
; color : #839ba9
|
||||
; margin : 5px 5px
|
||||
}
|
||||
|
||||
#recent-links li:hover input
|
||||
{ color : #3b4448 }
|
||||
|
||||
#recent-links li a
|
||||
{ font-family : 'Octicons Regular'
|
||||
; visibility : hidden
|
||||
; text-decoration : none
|
||||
; text-align : center
|
||||
; padding : 3px
|
||||
; display : inline-block
|
||||
; color : #3b4448
|
||||
; font-size : 16px
|
||||
; height : 24px
|
||||
; width : 24px
|
||||
; font-smoothing : antialiased
|
||||
; line-height : 1.5em
|
||||
}
|
||||
|
||||
#recent-links li:hover a
|
||||
{ visibility : visible }
|
||||
|
||||
#recent-links li a:hover
|
||||
, #recent-links li a:active
|
||||
, #recent-links li a:focus
|
||||
{ background-image : linear-gradient(#5899cc, #3173b4)
|
||||
; color : #fff
|
||||
}
|
||||
|
||||
section
|
||||
{ box-shadow : 1px 1px 2px #6a8290
|
||||
; border-radius : 3px
|
||||
; width : 255px
|
||||
}
|
||||
|
||||
#recent-links li:first-child
|
||||
, #recent-links li:nth-child(2)
|
||||
, #recent-links li:nth-child(3)
|
||||
{ display : block }
|
||||
|
||||
#show-all-recent-links, #clear-list
|
||||
{ color : #839ba9
|
||||
; display : none
|
||||
; cursor : pointer
|
||||
; font-size : 12px
|
||||
; line-height : 15px
|
||||
; margin-top : 0
|
||||
}
|
||||
|
||||
#show-all-recent-links li
|
||||
{ color : #839ba9
|
||||
; border-top-left-radius : 0
|
||||
; border-top-right-radius : 0
|
||||
; border-top : 0
|
||||
}
|
||||
|
||||
#show-all-recent-links:hover li
|
||||
{ background : #f7f9fa
|
||||
; color : #3b4448
|
||||
}
|
||||
|
||||
#clear-list
|
||||
{ margin-top : 15px }
|
||||
|
||||
#clear-list:hover li
|
||||
{ background-color : #fee1e5
|
||||
; color : #3b4448
|
||||
}
|
||||
|
||||
#notifications li
|
||||
{ font-size : 11px
|
||||
; text-overflow : ellipsis
|
||||
; word-break : normal
|
||||
; white-space : normal
|
||||
; transition-property : background-color
|
||||
; transition-duration : 0.3s
|
||||
; background-color : #f7f9fa
|
||||
}
|
||||
|
||||
#notifications.done li
|
||||
, #recent-links li.current
|
||||
{ background-color : #e5fae6 }
|
||||
|
||||
#notifications.error li
|
||||
{ background-color : #fee1e5 }
|
Loading…
Reference in New Issue