view release on metacpan or search on metacpan
etc/plugins/routes.conf view on Meta::CPAN
via => [qw(GET PUT DELETE OPTIONS)],
to => {
#Ado::Control::Default
controller => 'Default',
action => 'form'
}
},
# This route will not be considered at all
{'index' => undef},
],
#base_url_path => '/',
};
lib/Ado/Control.pm view on Meta::CPAN
};
} # end sub list_for_json
#validates input parameters given a rules template
sub validate_input {
my ($c, $template) = @_;
my $v = $c->validation;
my $errors = {};
foreach my $param (keys %$template) {
my $checks = $template->{$param};
$checks || next; #false or undefined?!?
#field
my $f =
$checks->{required}
? $v->required($param)
: $v->optional($param);
foreach my $check (keys %$checks) {
next if $check eq 'required';
if (ref $$checks{$check} eq 'HASH') {
$f->$check(%{$checks->{$check}});
lib/Ado/Plugin/Routes.pm view on Meta::CPAN
sub register {
my ($self, $app, $conf) = shift->initialise(@_);
#Add some conditions: Someday
# $app->routes->add_condition(
# require_formats => sub {
# my ($route, $c, $captures, $formats) = @_;
# $c->debug('$route, $c, $captures, $formats:'
# . $c->dumper( $route, ref $c, $captures, $formats));
# #Carp::cluck(caller);
# return ($c->require_formats($formats) ? 1 : undef);
# }
# );
# Rewrite urls in case we are deployed under Apache and using mod_cgi or mod_fcgid.
# This way we have the same urls as if deployed standalone or with hypnotoad.
# See templates/partials/apache2htaccess.ep
$app->hook(
before_dispatch => sub {
state $cgi = $_[0]->req->env->{GATEWAY_INTERFACE} // '' =~ m/^CGI/;
$_[0]->req->url->base->path($conf->{base_url_path}) if $cgi;
lib/Ado/Plugin/Routes.pm view on Meta::CPAN
Ado::Plugin::Routes allows you to define your routes in a separate file
C<$MOJO_HOME/etc/plugins/routes.conf>. In the configuration file you can also
use the B<C<app>> keyword and add complex routes as you would do directly in
the code.
=head1 OPTIONS
=head2 base_url_path
Base URL which will be used to construct URLs when deployed as FCGI or CGI.
Default: C<undef>.
=head2 routes
And ARRAY reference describing the routes.
=head1 METHODS
L<Ado::Plugin::Routes> inherits all methods from
L<Ado::Plugin> and implements the following new ones.
public/js/jquery.cookie.js view on Meta::CPAN
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));
public/vendor/pagedown/Markdown.Converter.js view on Meta::CPAN
)
()()()()() // pad rest of backreferences
/g, writeAnchorTag);
*/
text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
return text;
}
function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
if (m7 == undefined) m7 = "";
var whole_match = m1;
var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs
var link_id = m3.toLowerCase();
var url = m4;
var title = m7;
if (url == "") {
if (link_id == "") {
// lower-case and turn embedded newlines into spaces
link_id = link_text.toLowerCase().replace(/ ?\n/g, " ");
}
url = "#" + link_id;
if (g_urls.get(link_id) != undefined) {
url = g_urls.get(link_id);
if (g_titles.get(link_id) != undefined) {
title = g_titles.get(link_id);
}
}
else {
if (whole_match.search(/\(\s*\)$/m) > -1) {
// Special case for explicit empty url
url = "";
} else {
return whole_match;
}
public/vendor/pagedown/Markdown.Converter.js view on Meta::CPAN
if (!title) title = "";
if (url == "") {
if (link_id == "") {
// lower-case and turn embedded newlines into spaces
link_id = alt_text.toLowerCase().replace(/ ?\n/g, " ");
}
url = "#" + link_id;
if (g_urls.get(link_id) != undefined) {
url = g_urls.get(link_id);
if (g_titles.get(link_id) != undefined) {
title = g_titles.get(link_id);
}
}
else {
return whole_match;
}
}
alt_text = escapeCharacters(attributeEncode(alt_text), "*_[]()");
url = escapeCharacters(url, "*_");
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
beforeReplacer = function (s) { that.before += s; return ""; }
afterReplacer = function (s) { that.after = s + that.after; return ""; }
}
this.selection = this.selection.replace(/^(\s*)/, beforeReplacer).replace(/(\s*)$/, afterReplacer);
};
Chunks.prototype.skipLines = function (nLinesBefore, nLinesAfter, findExtraNewlines) {
if (nLinesBefore === undefined) {
nLinesBefore = 1;
}
if (nLinesAfter === undefined) {
nLinesAfter = 1;
}
nLinesBefore++;
nLinesAfter++;
var regexText;
var replacementText;
// chrome bug ... documented at: http://meta.stackoverflow.com/questions/63307/blockquote-glitch-in-editor-in-chrome-6-and-7/65985#65985
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
// Extends a regular expression. Returns a new RegExp
// using pre + regex + post as the expression.
// Used in a few functions where we have a base
// expression and we want to pre- or append some
// conditions to it (e.g. adding "$" to the end).
// The flags are unchanged.
//
// regex is a RegExp, pre and post are strings.
util.extendRegExp = function (regex, pre, post) {
if (pre === null || pre === undefined) {
pre = "";
}
if (post === null || post === undefined) {
post = "";
}
var pattern = regex.toString();
var flags;
// Replace the flags with empty space and store them.
pattern = pattern.replace(/\/([gim]*)$/, function (wholeMatch, flagsPart) {
flags = flagsPart;
return "";
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
if (!uaSniffed.isIE || mode != "moving") {
timer = setTimeout(refreshState, 1);
}
else {
inputStateObj = null;
}
};
var refreshState = function (isInitialState) {
inputStateObj = new TextareaState(panels, isInitialState);
timer = undefined;
};
this.setCommandMode = function () {
mode = "command";
saveState();
timer = setTimeout(refreshState, 0);
};
this.canUndo = function () {
return stackPtr > 1;
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
return true;
}
return false;
};
// Removes the last state and restores it.
this.undo = function () {
if (undoObj.canUndo()) {
if (lastState) {
// What about setting state -1 to null or checking for undefined?
lastState.restore();
lastState = null;
}
else {
undoStack[stackPtr] = new TextareaState(panels);
undoStack[--stackPtr].restore();
if (callback) {
callback();
}
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
util.addEvent(panels.input, "keypress", function (event) {
// keyCode 89: y
// keyCode 90: z
if ((event.ctrlKey || event.metaKey) && !event.altKey && (event.keyCode == 89 || event.keyCode == 90)) {
event.preventDefault();
}
});
var handlePaste = function () {
if (uaSniffed.isIE || (inputStateObj && inputStateObj.text != panels.input.value)) {
if (timer == undefined) {
mode = "paste";
saveState();
refreshState();
}
}
};
util.addEvent(panels.input, "keydown", handleCtrlYZ);
util.addEvent(panels.input, "keydown", handleModeChange);
util.addEvent(panels.input, "mousedown", function () {
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
}
// Sets the selected text in the input box after we've performed an
// operation.
this.setInputAreaSelection = function () {
if (!util.isVisible(inputArea)) {
return;
}
if (inputArea.selectionStart !== undefined && !uaSniffed.isOpera) {
inputArea.focus();
inputArea.selectionStart = stateObj.start;
inputArea.selectionEnd = stateObj.end;
inputArea.scrollTop = stateObj.scrollTop;
}
else if (doc.selection) {
if (doc.activeElement && doc.activeElement !== inputArea) {
return;
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
panels.ieCachedRange = null;
this.setInputAreaSelection();
}
};
// Restore this state into the input area.
this.restore = function () {
if (stateObj.text != undefined && stateObj.text != inputArea.value) {
inputArea.value = stateObj.text;
}
this.setInputAreaSelection();
inputArea.scrollTop = stateObj.scrollTop;
};
// Gets a collection of HTML chunks from the inptut textarea.
this.getChunks = function () {
var chunk = new Chunks();
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
elapsedTime = currTime - prevTime;
pushPreviewHtml(text);
};
// setTimeout is already used. Used as an event listener.
var applyTimeout = function () {
if (timeout) {
clearTimeout(timeout);
timeout = undefined;
}
if (startType !== "manual") {
var delay = 0;
if (startType === "delayed") {
delay = elapsedTime;
}
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
// It receives a single argument; either the entered text (if OK was chosen) or null (if Cancel
// was chosen).
ui.prompt = function (text, defaultInputText, callback) {
// These variables need to be declared at this level since they are used
// in multiple functions.
var dialog; // The dialog box.
var input; // The text box where you enter the hyperlink.
if (defaultInputText === undefined) {
defaultInputText = "";
}
// Used as a keydown event handler. Esc dismisses the prompt.
// Key code 27 is ESC.
var checkEscape = function (key) {
var code = (key.charCode || key.keyCode);
if (code === 27) {
close(true);
}
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
};
// Why is this in a zero-length timeout?
// Is it working around a browser bug?
setTimeout(function () {
createDialog();
var defTextLen = defaultInputText.length;
if (input.selectionStart !== undefined) {
input.selectionStart = 0;
input.selectionEnd = defTextLen;
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(false);
range.moveStart("character", -defTextLen);
range.moveEnd("character", defTextLen);
range.select();
}
public/vendor/pagedown/Markdown.Editor.js view on Meta::CPAN
else {
prefix = " " + bullet + " ";
}
return prefix;
};
// Fixes the prefixes of the other list items.
var getPrefixedItem = function (itemText) {
// The numbering flag is unset when called by autoindent.
if (isNumberedList === undefined) {
isNumberedList = /^\s*\d/.test(itemText);
}
// Renumber/bullet the list element.
itemText = itemText.replace(/^[ ]{0,3}([*+-]|\d+[.])\s/gm,
function (_) {
return getItemPrefix();
});
return itemText;
t/command/crud.t view on Meta::CPAN
'-t' => 'testatii',
'-H' => $tempdir,
'-T' => catdir($tempdir, 'site_templates')
),
$command
);
is_deeply(
$c->args,
{ controller_namespace => $ado->routes->namespaces->[0],
#dsn => undef,
lib => catdir($tempdir, 'lib'),
model_namespace => 'Ado::Model',
#no_dsc_code => undef,
#password => undef,
overwrite => undef,
templates_root => catdir($tempdir, 'site_templates'),
tables => ['testatii'],
home_dir => $tempdir,
#user => undef,
},
'args are ok'
);
is(ref($c->routes), 'ARRAY', '$c->routes ISA ARRAY');
is_deeply(
$c->routes->[0],
{ route => '/testatii',
via => ['GET'],
to => "testatii#list",
},
t/plugin/auth-02.t view on Meta::CPAN
->content_like(qr'with adobar_links', 'adobar_links ok');
#user is Test 1
$t->get_ok('/')->status_is(200)->text_is('article.ui.main.container h1' => 'Hello Test 1,')
->element_exists('#adobar #authbar a.item .sign.out.icon', 'Sign Out link is present!');
#authorization
$t->get_ok('/test/ingroup')->status_is(200)->json_is('/0/login_name' => 'test1');
$t->get_ok('/test/ingroup', form => {limit => 20, offset => 1})->status_is(200)
->json_is('/0/login_name' => undef);
#logout
$t->get_ok('/logout')->status_is(302)->header_is('Location' => '/');
$t->get_ok('/')->status_is(200)->text_is('article.ui.main.container h1' => 'Hello Guest,');
#authorization
$t->get_ok('/test/ingroup')->status_is(404)->content_type_is('text/html;charset=UTF-8');
done_testing();