Compare commits
No commits in common. "site" and "master" have entirely different histories.
8 changed files with 530 additions and 132 deletions
81
NEWS
Normal file
81
NEWS
Normal file
|
@ -0,0 +1,81 @@
|
|||
# -*- mode: org; -*-
|
||||
|
||||
* Changes since
|
||||
|
||||
- Use the new style of calling DisPass. DisPass has switched from
|
||||
using several executables with many switches to a command-based
|
||||
interface.
|
||||
|
||||
- Make the =dispass-labels-executable= obsolete, since it is nog
|
||||
longer provided by DisPass, all its functionality has been moved
|
||||
into the ~dispass~ executable. Also set it's default value to =nil=.
|
||||
|
||||
* Changes in v1.1.2
|
||||
|
||||
- Change the description to emphasize the idea that ~dispass.el~ is
|
||||
only a wrapper around DisPass.
|
||||
|
||||
- Simplify ~dispass-add-label~ and ~dispass-remove-label~ by deferring
|
||||
their functionality to the ~dispass-label~ executable.
|
||||
|
||||
- Fix some style warnings for various docstrings.
|
||||
|
||||
* Changes in v1.1.1
|
||||
|
||||
- Clean up the output from DisPass when prompting, trim whitespace
|
||||
from the front and end of the prompt.
|
||||
|
||||
- Don't have the filter try and kill the bufer, the sentinel should
|
||||
handle this.
|
||||
|
||||
- Don't call ~dispass-add-label~ in ~dispass-create~, let DisPass
|
||||
handle this.
|
||||
|
||||
- Fix a bug that would cause a new window to be created each time
|
||||
the dispass.el completion was built.
|
||||
|
||||
* Changes in v1.1
|
||||
|
||||
- Use ~dispass-label~ to get a list of labels the user has maed, use
|
||||
this for ~dispass-list-labels~ and adding completion options for
|
||||
~dispass~.
|
||||
|
||||
* Changes in v1
|
||||
|
||||
- Add the ~dispass-list-labels~ command, which shows a list of all
|
||||
the labels in ~dispass-file~. Some management of labels is
|
||||
possible in this list, namely adding and deleting labels.
|
||||
|
||||
- ~dispass-create~ automatically adds "created" labels to
|
||||
~dispass-file~.
|
||||
|
||||
- Store a default length in ~dispass-default-length~. When no length
|
||||
is given or found in the labels file, this length will be passed
|
||||
on to DisPass.
|
||||
|
||||
- Fix the regular expression used in ~dispass-process-filter-for~ to
|
||||
support DisPass v0.1a8.
|
||||
|
||||
* Changes in v0.1a7.3
|
||||
|
||||
- Add the possibility to cut passwords short by using a numeric
|
||||
prefix argument.
|
||||
|
||||
- Add the ~dispass-executable~ option, which holds the location of the
|
||||
DisPass executable script. It can be changed through the Emacs
|
||||
customization interface.
|
||||
|
||||
- Add a customization group named ~dispass~, it is found under the
|
||||
~External~ group.
|
||||
|
||||
* Changes in v0.1a7.2
|
||||
|
||||
- Kill the buffer when we're winished with it.
|
||||
|
||||
* Changes in v0.1a7.1
|
||||
|
||||
- Don's show the password, copy it directly into the clipboard.
|
||||
|
||||
* Notes about v0.1a7
|
||||
|
||||
- Initial release
|
91
README.org
Normal file
91
README.org
Normal file
|
@ -0,0 +1,91 @@
|
|||
#+STARTUP: showall
|
||||
|
||||
* dispass.el
|
||||
|
||||
Generate and disperse/dispell passwords.
|
||||
|
||||
~dispass.el~ is an emacs wrapper around [[http://dispass.babab.nl][DisPass]].
|
||||
|
||||
** Installation
|
||||
|
||||
Place this file somewhere on your filesystem, either in your
|
||||
~load-path~ or somewhere else which you will have to add to your
|
||||
~load-path~, like so:
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(add-to-list 'load-path "/location/of/dispass.el")
|
||||
#+end_src
|
||||
|
||||
And then ~load~, ~require~ or ~autoload~ it in your emacs init file, for
|
||||
example:
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(require 'dispass)
|
||||
#+end_src
|
||||
|
||||
/Or/ if you have ~package.el~ with the Marmalade and/or MELPA
|
||||
repositories set-up you could use ~package-install-file~.
|
||||
|
||||
** Customization
|
||||
|
||||
~dispass.el~ offers a few customizable settings, all of these can be
|
||||
changed using the Emacs customization interface, or of course your
|
||||
Emacs init file:
|
||||
|
||||
- =dispass-default-length= :: The default length of passprases
|
||||
generated by DisPass, when no length has been specified in
|
||||
the labels file for a given label.
|
||||
|
||||
- =dispass-executable= :: The place where the ~dispass~ executable
|
||||
script is located.
|
||||
|
||||
- =dispass-labels-executable= :: The place where the ~dispass-labels~
|
||||
executable script is located.
|
||||
|
||||
** Usage
|
||||
|
||||
Using dispass.el is simple, once installed.
|
||||
|
||||
*** Creating and regenerating passphrases
|
||||
|
||||
To create a new passphrase use the command ~dispass-create~, to
|
||||
regenerate a previously stored one use ~dispass~.[fn:1]
|
||||
|
||||
When a numeric argument is used when calling either =dispass-create=
|
||||
or =dispass=, that argument is sent to the dispass program along
|
||||
with the ~-l~ switch. This cuts the length of the password to that
|
||||
many characters. For example:
|
||||
|
||||
#+begin_example
|
||||
C-5 M-x dispass<RET> test<RET> test<RET>
|
||||
#+end_example
|
||||
|
||||
will generate a passphrase of 5 characters for label "test" and
|
||||
password "test".
|
||||
|
||||
Once a passphrase has been generated it is inserted into the kill
|
||||
ring and the system's clipboard so it can be easily inserted into
|
||||
any password field, unfortunately this also makes the generated
|
||||
passphrase easy to see in plaintext in the =kill-ring= variable,
|
||||
though.
|
||||
|
||||
*** Listing/managing labels
|
||||
|
||||
With the command ~dispass-list-labels~ you can get an overview of
|
||||
the labels you have stored in your labels file, along with their
|
||||
stored meta-data.
|
||||
|
||||
Some label management functions are available in this mode,
|
||||
namely adding and removing labels. See the mode description for
|
||||
a list of keybindings.
|
||||
|
||||
Apart from the keybindings available in the list buffer there are
|
||||
also the commands ~dispass-add-label~ and ~dispass-remove-label~
|
||||
which add and remove a label respectively.
|
||||
|
||||
* Footnotes
|
||||
|
||||
[fn:1] There is no requirement to first call ~dispass-create~ before
|
||||
using ~dispass~, but the former asks for confirmation of the password
|
||||
and newer version of DisPass will automatically store the label and
|
||||
its meta-data (such as length) in your labels file.
|
358
dispass.el
Normal file
358
dispass.el
Normal file
|
@ -0,0 +1,358 @@
|
|||
;;; dispass.el --- Emacs wrapper for DisPass
|
||||
|
||||
;; Copyright (C) 2012 Tom Willemsen <tom@ryuslash.org>
|
||||
|
||||
;; Author: Tom Willemsen <tom@ryuslash.org>
|
||||
;; Created: Jun 8, 2012
|
||||
;; Version: 1.1.2
|
||||
;; Keywords: processes
|
||||
;; URL: http://projects.ryuslash.org/dispass.el/
|
||||
;; Package-Requires: ((dash "1.0.0"))
|
||||
|
||||
;; Permission to use, copy, modify, and distribute this software for any
|
||||
;; purpose with or without fee is hereby granted, provided that the
|
||||
;; above copyright notice and this permission notice appear in all
|
||||
;; copies.
|
||||
|
||||
;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||
;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||
;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
||||
;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
|
||||
;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; dispass.el is an Emacs wrapper around DisPass
|
||||
;; (http://dispass.babab.nl). For more information see the README.org
|
||||
;; and NEWS files.
|
||||
|
||||
;; This version is written for use with DisPass v0.2.0.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'dash)
|
||||
|
||||
(defgroup dispass nil
|
||||
"Customization options for the DisPass wrapper."
|
||||
:group 'external)
|
||||
|
||||
(defcustom dispass-default-length 30
|
||||
"The default length to use when generating passphrases."
|
||||
:package-version '(dispass . "1")
|
||||
:group 'dispass
|
||||
:type '(integer))
|
||||
|
||||
(defcustom dispass-executable "dispass"
|
||||
"The location of the dispass executable."
|
||||
:package-version '(dispass . "0.1a7.3")
|
||||
:group 'dispass
|
||||
:type '(string)
|
||||
:risky t)
|
||||
|
||||
(defcustom dispass-labels-executable nil
|
||||
"The location of the dispass-label executable."
|
||||
:package-version '(dispass . "1.1.3")
|
||||
:group 'dispass
|
||||
:type 'string
|
||||
:risky t)
|
||||
(make-obsolete-variable 'dispass-labels-executable
|
||||
"dispass-label is no longer used by DisPass."
|
||||
"dispass 1.1.3")
|
||||
|
||||
(defcustom dispass-labelfile nil
|
||||
"The location of your preferred labelfile.
|
||||
|
||||
A value of nil means to just let DisPass figure it out."
|
||||
:package-version '(dispass . "1.1.1")
|
||||
:group 'dispass
|
||||
:type 'file
|
||||
:risky t)
|
||||
|
||||
(defvar dispass-labels-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(set-keymap-parent map tabulated-list-mode-map)
|
||||
(define-key map "c" 'dispass-create)
|
||||
(define-key map "a" 'dispass-add-label)
|
||||
(define-key map "d" 'dispass-remove-label)
|
||||
map)
|
||||
"Keymap for `dispass-labels-mode'.
|
||||
|
||||
Uses `tabulated-list-mode-map' as its parent.")
|
||||
|
||||
;; This should be extracted from DisPass at some point.
|
||||
(defconst dispass-algorithms
|
||||
'("dispass1" "dispass2")
|
||||
"The list of algorithms supported by DisPass.")
|
||||
|
||||
(defun dispass-label-at-point ()
|
||||
"When in `dispass-labels-mode', get the label at `point'."
|
||||
(let ((labels-mode-p (eq major-mode 'dispass-labels-mode)))
|
||||
(tabulated-list-get-id)))
|
||||
|
||||
(defun dispass--get-passphrase-matcher (label)
|
||||
"Return a function that will get the passphrase for LABEL."
|
||||
`(lambda (output)
|
||||
(string-match ,(concat "^[ \t]*" label "[ \t]*\\(.+\\)$") output)
|
||||
(substring output (match-beginning 1) (match-end 1))))
|
||||
|
||||
(defun dispass-start-process (cmd label pass create length
|
||||
&optional algo seqno args)
|
||||
"Ask DisPass call CMD for LABEL and PASS.
|
||||
|
||||
When CREATE is non-nil send along the -c switch to make it ask
|
||||
for a password twice. When LENGTH is an integer and greater than
|
||||
0, we request that DisPass make the passphrase LENGTH long. ALGO
|
||||
should be one of `dispass-algorithms' and requests a certain
|
||||
algorithm be used by DisPass to generate the passphrase. SEQNO
|
||||
asks DisPass to use SEQNO as a sequence number.
|
||||
|
||||
If specified add ARGS to the command."
|
||||
(let ((args `(,cmd ,@args "-o" "-p" ,pass))
|
||||
proc)
|
||||
(when create
|
||||
(setq args (append args '("-v"))))
|
||||
|
||||
(when (and (integerp length) (> length 0))
|
||||
(setq args (append args `("-l" ,(number-to-string length)))))
|
||||
|
||||
(when (and algo (not (equal algo ""))
|
||||
(member algo dispass-algorithms))
|
||||
(setq args (append args `("-a" ,algo))))
|
||||
|
||||
(when (and seqno (> seqno 0))
|
||||
(setq args (append args `("-s" ,(number-to-string seqno)))))
|
||||
|
||||
(when dispass-labelfile
|
||||
(setq args (append `("-f" ,dispass-labelfile) args)))
|
||||
|
||||
(shell-command-to-string
|
||||
(apply #'concat
|
||||
(-interpose " " `(,dispass-executable ,@args ,label))))))
|
||||
|
||||
(defun dispass-get-labels ()
|
||||
"Get the list of labels and their information."
|
||||
(let ((result '()))
|
||||
(with-temp-buffer
|
||||
(dispass-read-labels)
|
||||
(while (re-search-forward
|
||||
"^\\(\\(?:\\sw\\|\\s_\\|\\.\\)+\\)"
|
||||
nil t)
|
||||
(add-to-list 'result (match-string 1)))
|
||||
result)))
|
||||
|
||||
(defun dispass-get-labels-for-display ()
|
||||
"Prepare the list of labels for info table."
|
||||
(let ((result '()))
|
||||
(with-temp-buffer
|
||||
(dispass-read-labels)
|
||||
(while (re-search-forward
|
||||
"^\\(\\(?:\\sw\\|\\s_\\|\\.\\)+\\) +\\([0-9]+\\) +\\(\\(?:\\sw\\|\\s_\\)+\\)"
|
||||
nil t)
|
||||
(let ((label (match-string 1))
|
||||
(length (match-string 2))
|
||||
(algo (match-string 3)))
|
||||
(add-to-list 'result
|
||||
(list label
|
||||
`[(,label
|
||||
face link
|
||||
help-echo ,(concat "Generate passphrase for " label)
|
||||
follow-link t
|
||||
dispass-label ,label
|
||||
dispass-length ,length
|
||||
action dispass-from-button)
|
||||
,length
|
||||
,algo])))))
|
||||
result))
|
||||
|
||||
(defun dispass-read-labels ()
|
||||
"Load a list of all labels into a buffer."
|
||||
(insert (shell-command-to-string
|
||||
(concat dispass-executable
|
||||
(when dispass-labelfile
|
||||
(concat " -f " dispass-labelfile))
|
||||
" list --script")))
|
||||
(goto-char (point-min)))
|
||||
|
||||
(defun dispass--verified-password ()
|
||||
"Ask for and verify a password."
|
||||
(let ((passwd (read-passwd "Password: ")))
|
||||
(if (and (equal passwd (read-passwd "Password (again): ")))
|
||||
passwd
|
||||
(error "Passwords don't match"))))
|
||||
|
||||
(defun dispass--generate (label pass create length algo seqno)
|
||||
"Call `dispass-start-process' to generate a passphrase.
|
||||
|
||||
The LABEL, PASS, CREATE, LENGTH, ALGO and SEQNO arguments have
|
||||
the same meanings as when passed to `dispass-start-process'.
|
||||
|
||||
The result is put in the `kill-ring'."
|
||||
(funcall (dispass--get-passphrase-matcher label)
|
||||
(dispass-start-process "generate" label pass create length
|
||||
algo seqno)))
|
||||
|
||||
(defun dispass--copy (str)
|
||||
"Put STR in the `kill-ring'."
|
||||
(kill-new str)
|
||||
(message "Passphrase copied to kill ring"))
|
||||
|
||||
;;;###autoload
|
||||
(defun dispass-create (label pass &optional length algo seqno)
|
||||
"Create a new password for LABEL using PASS.
|
||||
|
||||
Optionally also specify to make the passphrase LENGTH long, use
|
||||
the ALGO algorithm with sequence number SEQNO."
|
||||
(interactive (list
|
||||
(read-from-minibuffer "Label: ")
|
||||
(dispass--verified-password)
|
||||
current-prefix-arg
|
||||
(completing-read "Algorithm: " dispass-algorithms)
|
||||
(read-from-minibuffer
|
||||
"Sequence no. (1): " nil nil t nil "1")))
|
||||
(let ((length (or length dispass-default-length)))
|
||||
(dispass--copy (dispass--generate label pass t length algo seqno))))
|
||||
|
||||
(defun dispass--interactive-spec ()
|
||||
"Return an interactive specification.
|
||||
|
||||
This specification is for use with any functions based on the
|
||||
`dispass--get-phrase' function."
|
||||
(list (completing-read "Label: " (dispass-get-labels))
|
||||
(read-passwd "Password: ")
|
||||
current-prefix-arg))
|
||||
|
||||
(defun dispass--get-phrase
|
||||
(label pass interactivep &optional length algo seqno)
|
||||
"Get a passphrase either by using the label file or asking for info.
|
||||
|
||||
LABEL is a string indicating a label (possibly in the label
|
||||
file). PASS is the password to use to generate the passphrase.
|
||||
INTERACTIVEP is an indication of whether its invoker was called
|
||||
interactively or not. LENGTH is the requested length of the
|
||||
generated passphrase. ALGO is the algrithm to use to generate
|
||||
the passphrase. SEQNO is the sequence number to use when
|
||||
generating the passphrase.
|
||||
|
||||
LENGTH, ALGO and SEQNO are not important if LABEL was found in
|
||||
the labels file."
|
||||
(when (and interactivep
|
||||
(not (member label (dispass-get-labels))))
|
||||
(setq algo (completing-read "Algorithm: " dispass-algorithms))
|
||||
(setq seqno (read-from-minibuffer
|
||||
"Sequence no. (1): " nil nil t nil "1")))
|
||||
(let ((length (or length dispass-default-length)))
|
||||
(dispass--generate label pass nil length algo seqno)))
|
||||
|
||||
;;;###autoload
|
||||
(defun dispass (label pass &optional length algo seqno)
|
||||
"Recreate a passphrase for LABEL using PASS.
|
||||
|
||||
Optionally also specify to make the passphrase LENGTH long, use
|
||||
the ALGO algorithm with sequence number SEQNO. This is useful
|
||||
when you would like to generate a one-shot passphrase, or prefer
|
||||
not to have LABEL added to your labelfile for some other reason."
|
||||
(interactive (dispass--interactive-spec))
|
||||
(dispass--copy
|
||||
(dispass--get-phrase
|
||||
label pass (called-interactively-p 'any) length algo seqno)))
|
||||
|
||||
;;;###autoload
|
||||
(defun dispass-insert (label pass &optional length algo seqno)
|
||||
"Recreate a passphrase for LABEL using PASS.
|
||||
|
||||
This command does the exact same thing as `dispass', except it
|
||||
inserts the results in the current buffer instead of copying them
|
||||
into the `kill-ring' (and clipboard). LABEL, PASS, LENGTH, ALGO
|
||||
and SEQNO are directly passed on to `dispass--get-phrase'."
|
||||
(interactive (dispass--interactive-spec))
|
||||
(insert
|
||||
(dispass--get-phrase
|
||||
label pass (called-interactively-p 'any) length algo seqno)))
|
||||
|
||||
;; Labels management
|
||||
;;;###autoload
|
||||
(defun dispass-add-label (label length algo &optional seqno)
|
||||
"Add LABEL with length LENGTH and algorithm ALGO to DisPass.
|
||||
|
||||
Optionally also specify sequence number SEQNO."
|
||||
(interactive
|
||||
(list (read-from-minibuffer "Label: ")
|
||||
(read-from-minibuffer
|
||||
(format "Length (%d): " dispass-default-length) nil nil t nil
|
||||
(number-to-string dispass-default-length))
|
||||
(completing-read
|
||||
"Algorithm (dispass1): "
|
||||
dispass-algorithms nil nil nil nil "dispass1")
|
||||
(read-from-minibuffer "Sequnce no. (1): " nil nil t nil "1")))
|
||||
(shell-command
|
||||
(format "%s %s add %s:%d:%s:%s"
|
||||
dispass-executable
|
||||
(if dispass-labelfile
|
||||
(concat "-f " dispass-labelfile)
|
||||
"")
|
||||
label length algo seqno)))
|
||||
|
||||
;;;###autoload
|
||||
(defun dispass-remove-label (label)
|
||||
"Remove LABEL from DisPass.
|
||||
|
||||
If LABEL is not given `tabulated-list-get-id' will be used to get
|
||||
the currently pointed-at label. If neither LABEL is not found an
|
||||
error is thrown."
|
||||
(interactive
|
||||
(list (or (dispass-label-at-point)
|
||||
(completing-read
|
||||
"Label: " (dispass-get-labels)))))
|
||||
(shell-command
|
||||
(format "%s %s rm %s" dispass-executable
|
||||
(if dispass-labelfile
|
||||
(concat "-f " dispass-labelfile)
|
||||
"")
|
||||
label)))
|
||||
|
||||
(defun dispass-from-button (button)
|
||||
"Call dispass with information from BUTTON."
|
||||
(dispass (button-get button 'dispass-label)
|
||||
(button-get button 'dispass-length)))
|
||||
|
||||
(defun dispass-labels--refresh ()
|
||||
"Reload labels from dispass."
|
||||
(setq tabulated-list-entries nil)
|
||||
|
||||
(let ((tmp-list '()))
|
||||
(setq tabulated-list-entries (dispass-get-labels-for-display))))
|
||||
|
||||
(define-derived-mode dispass-labels-mode tabulated-list-mode "DisPass"
|
||||
"Major mode for listing dispass labels.
|
||||
|
||||
\\<dispass-labels-mode-map>
|
||||
\\{dispass-labels-mode-map}"
|
||||
(setq tabulated-list-format [("Label" 30 t)
|
||||
("Length" 6 nil)
|
||||
("Algorithm" 0 t)]
|
||||
tabulated-list-sort-key '("Label" . nil))
|
||||
(add-hook 'tabulated-list-revert-hook 'dispass-labels--refresh)
|
||||
(tabulated-list-init-header))
|
||||
|
||||
;;;###autoload
|
||||
(defun dispass-list-labels ()
|
||||
"Display a list of labels for dispass."
|
||||
(interactive)
|
||||
(let ((buffer (get-buffer-create "*DisPass Labels*")))
|
||||
(with-current-buffer buffer
|
||||
(dispass-labels-mode)
|
||||
(dispass-labels--refresh)
|
||||
(tabulated-list-print))
|
||||
(switch-to-buffer-other-window buffer))
|
||||
nil)
|
||||
|
||||
(provide 'dispass)
|
||||
|
||||
;;; dispass.el ends here
|
||||
|
||||
;; Local Variables:
|
||||
;; sentence-end-double-space: t
|
||||
;; End:
|
1
hyde.scm
1
hyde.scm
|
@ -1 +0,0 @@
|
|||
(use hyde)
|
|
@ -1,40 +0,0 @@
|
|||
;; -*- mode: scheme; -*-
|
||||
((menu-items
|
||||
. (("Browse Source" .
|
||||
"http://code.ryuslash.org/cgit.cgi/dispass.el/")
|
||||
("Read News" .
|
||||
"http://blog.ryuslash.org/tags/dispass.el")
|
||||
("View README" .
|
||||
"http://code.ryuslash.org/cgit.cgi/dispass.el/about/")))
|
||||
(print-item
|
||||
. (lambda (mnu)
|
||||
`(li (a (@ (href ,(cdr mnu))) ,(car mnu))))))
|
||||
|
||||
`((doctype-html)
|
||||
(html (@ (lang "en"))
|
||||
(head
|
||||
(title ,($ 'title))
|
||||
(link (@ (rel "stylesheet") (type "text/css")
|
||||
(href "css/bootstrap.min.css")))
|
||||
(link (@ (rel "stylesheet") (type "text/css")
|
||||
(href "css/extra.css"))))
|
||||
(body
|
||||
(div (@ (class "navbar navbar-static-top"))
|
||||
(div (@ (class "navbar-inner"))
|
||||
(div (@ (class "container"))
|
||||
(a (@ (href "") (class "brand"))
|
||||
,($ 'title))
|
||||
(ul (@ (class "nav pull-right"))
|
||||
,@(map (eval ($ 'print-item))
|
||||
($ 'menu-items))))))
|
||||
(div (@ (class "container"))
|
||||
(inject ,contents)
|
||||
(div (@ (class "centered"))
|
||||
(small
|
||||
"This site has been generated by "
|
||||
(a (@ (href "http://wiki.call-cc.org/eggref/4/hyde"))
|
||||
"Hyde") " and is powered by "
|
||||
(a (@ (href "http://twitter.github.com/bootstrap/"))
|
||||
"Bootstrap") " and "
|
||||
(a (@ (href "http://glyphicons.com/"))
|
||||
"Glyphicons") "."))))))
|
9
src/css/bootstrap.min.css
vendored
9
src/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
|
@ -1,4 +0,0 @@
|
|||
((title . "extra"))
|
||||
|
||||
'(css ((= class centered)
|
||||
(text-align center)))
|
|
@ -1,78 +0,0 @@
|
|||
;; -*- mode: scheme; -*-
|
||||
((title . "dispass.el")
|
||||
(dispass . (a (@ (href "http://dispass.babab.nl")) "DisPass"))
|
||||
(emacs . (a (@ (href "http://gnu.org/software/emacs/")) "Emacs"))
|
||||
(tar-gz . "http://code.ryuslash.org/cgit.cgi/dispass.el/snapshot/dispass.el-1.1.2.tar.gz")
|
||||
(zip . "http://code.ryuslash.org/cgit.cgi/dispass.el/snapshot/dispass.el-1.1.2.zip")
|
||||
(dev-tar-gz . "http://code.ryuslash.org/cgit.cgi/dispass.el/snapshot/dispass.el-master.tar.gz")
|
||||
(dev-zip . "http://code.ryuslash.org/cgit.cgi/dispass.el/snapshot/dispass.el-master.zip")
|
||||
(version . "1.1.2"))
|
||||
|
||||
`((div (@ (class "page-header"))
|
||||
(h1 ,($ 'title)
|
||||
(small ", an " ,($ 'emacs) " wrapper for " ,($ 'dispass))))
|
||||
(div (@ (class "hero-unit"))
|
||||
(p ,($ 'dispass) " is a passphrase generator. dispass.el wraps "
|
||||
"it into a nice interface for " ,($ 'emacs) ".")
|
||||
(p "dispass.el tries to give easy access to each feature that "
|
||||
,($ 'dispass) " provides and any others that make sense with "
|
||||
"an interface as awesome as " ,($ 'emacs))
|
||||
(p "dispass.el is written for anyone who likes to use "
|
||||
,($ 'emacs) " over all alternatives. It is released under "
|
||||
"the ISC license as a politeness to " ,($ 'dispass) ", and "
|
||||
"to be completely, 100% compatible with it.")
|
||||
(div (@ (class "row"))
|
||||
(div (@ (class "span5 centered"))
|
||||
(h3 "Version")
|
||||
,($ 'version))
|
||||
(div (@ (class "span5 centered"))
|
||||
(h3 "Licence")
|
||||
"ISC")))
|
||||
(div (@ (class "row"))
|
||||
(div (@ (class "span6"))
|
||||
(h2 "Features")
|
||||
(ul
|
||||
(li "Copies passphrases directly to the clipboard, no "
|
||||
"need for manual selection and copying.")
|
||||
(li "Specify the length of the passphrase by using a "
|
||||
"numeric prefic argument.")
|
||||
(li "Input completion for labels.")
|
||||
(li "Some label management (listing, adding, removing).")))
|
||||
(div (@ (class "span6"))
|
||||
(h2 "Dependencies")
|
||||
(dl
|
||||
(dt ,($ 'emacs))
|
||||
(dd "It has been developed with v24, but if it doesn't "
|
||||
"work in your version of " ,($ 'emacs) ", please let "
|
||||
"me know.")
|
||||
(dt ,($ 'dispass))
|
||||
(dd "Version 0.2.0 is required for this release."))))
|
||||
(h2 "Download")
|
||||
(div (@ (class "row"))
|
||||
(div (@ (class "span6"))
|
||||
(h3 "Latest version")
|
||||
"This version isn't available yet, but as soon as another "
|
||||
"version of " ,($ 'dispass) " is released, there will be "
|
||||
"one.")
|
||||
(div (@ (class "span6"))
|
||||
(h3 "Development version")
|
||||
"This version tries to follow the developments of "
|
||||
,($ 'dispass) " closely."))
|
||||
(div (@ (class "row"))
|
||||
(div (@ (class "span6"))
|
||||
(a (@ (href ,($ 'tar-gz))
|
||||
(class "btn btn-large btn-block"))
|
||||
"Download " ,($ 'version) ".tar.gz")
|
||||
(a (@ (href ,($ 'zip))
|
||||
(class "btn btn-large btn-block"))
|
||||
"Download " ,($ 'version) ".zip"))
|
||||
(div (@ (class "span6"))
|
||||
(a (@ (href ,($ 'dev-tar-gz))
|
||||
(class "btn btn-large btn-block"))
|
||||
"Download master.tar.gz")
|
||||
(a (@ (href ,($ 'dev-zip))
|
||||
(class "btn btn-large btn-block"))
|
||||
"Download master.zip")))
|
||||
(hr)
|
||||
(h2 "More...")
|
||||
(p "For more information please read the README."))
|
Loading…
Reference in a new issue