Compare commits

...

2845 Commits

Author SHA1 Message Date
mdipierro
63224e8ce6 2.7.3 2013-10-11 18:10:57 -05:00
mdipierro
ff7f9568db fixed validation of nagtive integers, thanks Stefan 2013-10-11 18:06:57 -05:00
mdipierro
3635dd8faf fixed problem with Virtual Fields and grid 2013-10-11 17:59:30 -05:00
mdipierro
d5fda056ff simplified logic for number validators 2013-10-11 17:07:17 -05:00
mdipierro
d8e8d1d597 fixed problem with IS_INT_IN_RANGE for large numbers 2013-10-11 16:59:05 -05:00
mdipierro
59290534bc fixed issue 1708:gae memcache_contrib does not set the time_expire, thanks Nicholas 2013-10-09 11:58:15 -05:00
mdipierro
8fb0b71be6 fixed compilerapp sorting issue, better 2013-10-09 11:31:33 -05:00
mdipierro
ddc0fc9949 fixed compilerapp sorting issue, possibly 2013-10-09 11:15:07 -05:00
mdipierro
5428fdbd04 reverted error commit 2013-10-09 09:07:00 -05:00
Massimo
98f2bfbfb6 Merge branch 'master' of github.com:web2py/web2py 2013-10-08 11:39:30 -05:00
Massimo
d780d26cc9 merge heads 2013-10-08 11:38:28 -05:00
mdipierro
a5711bd933 Merge pull request #244 from timrichardson/issue/1692
fix for Issue 1692 virtual fields in SQLFORM.grid
2013-10-08 09:35:51 -07:00
mdipierro
b96cde2f77 Merge pull request #243 from cccaballero/master
more spanish translations
2013-10-08 09:34:16 -07:00
Tim Richardson
a3f3ed1298 fix for Issue 1692 virtual fields in forms 2013-10-08 13:31:36 +11:00
mdipierro
5f34193ac7 fixed demo mode 2013-10-07 09:17:51 -05:00
cccaballero
6fe6852a0c more spanish translations
more spanish translations
2013-10-07 09:49:48 -04:00
mdipierro
961d143f7d 2.7.2 2013-10-07 08:40:39 -05:00
mdipierro
0e98544a79 Merge pull request #242 from rhr/master
fix for using the shell with IPython >= 1.0
2013-10-06 19:37:56 -07:00
mdipierro
86d8b8dece Merge pull request #241 from spametki/master
IMAP fixed patch for google code issue 1707
2013-10-06 19:37:11 -07:00
Rick Ree
46e2a663e9 fix for using the shell with IPython >= 1.0 2013-10-06 17:18:04 -05:00
spametki
e7fbd0095f IMAP google code issue 1707: fixed patch 2013-10-06 14:39:23 -03:00
mdipierro
add6fa526e fixed regex status in http.py 2013-10-06 11:52:23 -05:00
mdipierro
47e77e9a9c Merge pull request #239 from abastardi/patch-1
Fixed problem with Rows.render
2013-10-06 08:15:09 -07:00
mdipierro
81036ac997 Merge pull request #237 from alfonsodg/master
Added gitignore restrictions and changes for admin.py
2013-10-06 08:13:58 -07:00
mdipierro
77df883566 Merge pull request #236 from niphlod/enhancement/anyserver_options
fixed gevent workers
2013-10-06 08:11:03 -07:00
mdipierro
bfc7e3b4e9 Merge pull request #238 from houdinihound/patch-1
Support for HTTP Status Code: 429 - Too Many Requests
2013-10-06 08:09:52 -07:00
spametki
e05fe15470 IMAP .insert support for custom date (Google Code issue 1707) 2013-10-06 12:09:44 -03:00
mdipierro
2a062a2ff5 fixed setup scripts for apache to use processes, not threads, thanks Thomas 2013-10-06 10:08:40 -05:00
abastardi
44e7b70dbc Fixed problem with Rows.render 2013-10-06 09:04:47 -04:00
Jose C
88abefb896 Support for HTTP Status Code: 429 - Too Many Requests
Currently raising HTTP 429 results in HTTP 500 being sent.  This patch resolves that issue.
2013-10-05 15:42:48 +01:00
mdipierro
06ca5e6857 grid refcator patch for ajax, thanks Niphlod 2013-10-05 08:52:45 -05:00
Alfonso de la Guarda Reyes
c1f8d34892 Minor fixes for pep and styles widget.py 2013-10-05 08:08:37 -05:00
Alfonso de la Guarda Reyes
5679661914 Minor fixes for pep and style 2013-10-05 08:03:50 -05:00
Alfonso de la Guarda Reyes
cd957cf52b Fixes for some pep and code syntax 2013-10-05 07:59:04 -05:00
Alfonso de la Guarda Reyes
fff798c1cc Added restriction for .idea inside gitignore 2013-10-05 07:51:12 -05:00
niphlod
b464d3185e fixed gevent workers 2013-10-05 13:43:03 +02:00
mdipierro
cfb68ff90f fixed ldap_auth.py 2013-10-04 21:31:39 -05:00
mdipierro
8418fca2f6 R-2.7.1 2013-10-04 15:14:53 -05:00
mdipierro
68c0baeb22 R-2.7.1 2013-10-04 15:04:25 -05:00
mdipierro
700fd846a8 fixed a problem with grid 2013-10-04 14:56:16 -05:00
mdipierro
72a7643cde fixed issue 1704, groups in ldap, thanks Peter Gastinger 2013-10-04 14:41:19 -05:00
mdipierro
6b0177979f fixed issue 1705, sorting of model, thanks Anthony 2013-10-04 14:39:32 -05:00
mdipierro
7eb67fe6fa fields with readable=False should not be exportable from grid 2013-10-04 00:16:30 -05:00
mdipierro
5be65e8bd4 fixed issue 1697:gae memcached is not storing anything, thanks Yair 2013-10-03 08:40:19 -05:00
mdipierro
46903a3732 fixed issue 1698:Application Name Containing a Period . Not Supported, thanks Anton 2013-10-03 08:37:42 -05:00
mdipierro
c5b9b4d723 fixed issue 1700:DAL contains is not working on MSSQL 2013-10-03 08:33:57 -05:00
mdipierro
302a985aa7 fixed self.settings.table_<> 2013-10-03 08:19:34 -05:00
mdipierro
21a11ec47a removing garbage from admin it.py 2013-10-02 18:44:42 -05:00
mdipierro
814f4f4b4c fixed issue 1701:Restore menu/page after end of impersonation, thanks kmouts 2013-10-02 18:36:32 -05:00
mdipierro
87eeaaf028 fixed bug in stripe.py 2013-10-02 13:29:14 -05:00
mdipierro
b44aefc384 fixed some problems with StripeForm 2013-10-02 11:42:02 -05:00
mdipierro
e2c940532d new gluon.contrib.strip.StripeForm for PCI compliant payments 2013-10-02 11:06:30 -05:00
Massimo
66d6b3b511 fixed issue 1696:webclient not built to handle lists, thanks Yair 2013-10-01 15:25:34 -05:00
mdipierro
f0010f320e Merge pull request #233 from niphlod/issue/taskbar
fixed import for taskbar
2013-10-01 13:18:01 -07:00
niphlod
f092530a8c fixed import for taskbar 2013-10-01 20:46:00 +02:00
mdipierro
11a9fa345d Merge pull request #232 from timrichardson/issue/1695
Updated jquery-ui css resource to fix 404 error
2013-10-01 08:04:16 -07:00
Tim Richardson
a1c2019960 Updated jquery-ui css resource to fix 404 error 2013-09-29 06:47:19 +10:00
mdipierro
96e17ff1db SQLFORM.grid(...,ignore_common_filters=True) 2013-09-27 13:08:02 -05:00
mdipierro
4292cf38d9 more translations, thanks Vladyslav 2013-09-26 21:26:55 -05:00
mdipierro
fcba1650a0 Merge pull request #231 from ilvalle/cm-3.18
codemirror 3.18 with enabled the fullscreen addon
2013-09-26 14:37:47 -07:00
Paolo
ddf1998d49 codemirror 3.18 with enabled the fullscreen addon 2013-09-26 21:52:53 +02:00
Massimo
633acffd28 made form session logic backward compatible 2013-09-26 13:35:39 -05:00
Massimo
09ba525f2e possible fix to issue 1688, support for multiple forms with same formname in different browser pages 2013-09-26 11:26:08 -05:00
mdipierro
a8cbb1590d Translation of An 2013-09-26 07:56:49 -05:00
mdipierro
89971d1cb5 revised markmin.html, thanks Vladyslav 2013-09-25 19:54:42 -05:00
mdipierro
35180d61fa simplification in auth multilogin 2013-09-25 09:44:37 -05:00
mdipierro
8954d90ada minor change in languages/it.py 2013-09-25 09:08:40 -05:00
mdipierro
c0d399680e Merge pull request #227 from letolabs/fix_min_web2py
Update location of handlers so that make_min_web2py.py works again
2013-09-24 15:24:39 -07:00
mdipierro
528dd912d8 Merge pull request #228 from niphlod/enhancement/trapped_links
pass the correct element when trapping links
2013-09-24 15:23:07 -07:00
niphlod
cb6ae0516c pass the correct element when trapping links 2013-09-25 00:09:19 +02:00
Jonathan "Duke" Leto
4e1ad9bfa8 Update location of handlers to that make_min_web2py.py works again
The location of the handlers changed in 07f74c6362 and since then
this error blocked the creation of a minizimed web2py instance:

IOError: [Errno 2] No such file or directory: 'fcgihandler.py'
2013-09-24 13:44:38 -07:00
Massimo
6bea258722 update pbkdf2_ctypes.py to upstream, thanks Michele 2013-09-24 13:52:52 -05:00
mdipierro
554a52d548 Merge pull request #226 from michele-comitini/master
update pbkdf2_ctypes.py to upstream
2013-09-24 11:51:34 -07:00
Massimo
1a17655ef1 fixed line not found issues in set breakpoint, thanks Mariano 2013-09-24 13:51:08 -05:00
Massimo
5af2db1ff8 Merge branch 'master' of github.com:web2py/web2py 2013-09-24 13:48:49 -05:00
Massimo
a8567ae9ed syncing 2013-09-24 13:45:14 -05:00
mdipierro
40925165e6 Merge pull request #225 from reingart/master
fixed line not found issues in set breakpoint (linecache patch, used by the debugger)
2013-09-24 11:44:22 -07:00
mdipierro
eb4942a38d Merge pull request #224 from niphlod/enhancement/sessions2trash.py
session2trash.py: easier to use within a module, e.g. in the scheduler
2013-09-24 11:41:29 -07:00
Massimo
5f9d8a9cc2 no more if len(dpost) 2013-09-24 13:37:25 -05:00
Massimo
b67141b1ef fixed problem with ENABLED/DISABLED, issue 1689 2013-09-24 13:29:54 -05:00
Michele Comitini
9f69b9aa42 still support for python2.5 2013-09-24 20:01:51 +02:00
Michele Comitini
18cdade705 added support for python2.5 2013-09-24 18:37:10 +02:00
Michele Comitini
7eb8a604bd update pbkdf2_ctypes.py to upstream 2013-09-24 18:03:49 +02:00
Mariano Reingart
d55470f753 fixed line not found issues in set breakpoint (linecache patch, used by the debugger) 2013-09-24 02:52:01 -03:00
mdipierro
c4042dc475 improved es.py, thanks mcamel and Vladyslav 2013-09-23 16:33:06 -05:00
niphlod
0688c86dee easier to use within a module, e.g. in the scheduler 2013-09-23 22:41:37 +02:00
mdipierro
d111f331ca fixed issue 1196:add language subfolders, thanks jamarcer 2013-09-23 14:54:29 -05:00
mdipierro
f622f2936a Merge pull request #223 from robertop23/master
Fixes and improvements in admin editor
2013-09-23 08:35:05 -07:00
mdipierro
4e017d3ffa Merge pull request #222 from charleslaw/master
Various Minor Auth Additions
2013-09-23 08:34:28 -07:00
Roberto Perdomo
2ebf0d12ed Fix lost flash message in case of error when save editor (crtl-s). Change Esc to Ctrl-Esc to exit from Fullscreen mode, because this cause collision with the Vim mode (Esc key). Add a select into the config button to select 'default', 'vim' or 'emacs' editor 2013-09-22 18:36:28 -04:30
mdipierro
d547a9d6ea added nl, es plural rules, thanks Vladyslav 2013-09-22 10:10:28 -05:00
mdipierro
afdb028070 R-2.6.4 2013-09-21 20:42:19 -05:00
mdipierro
80d4615f32 R-2.6.4 2013-09-21 20:24:31 -05:00
Charles Law
cb7753af2a add a hook for a pre registration message 2013-09-21 19:48:21 -04:00
mdipierro
5a12a7fb31 manually committed pull 221, update vars only if FieldStorage holds actually something, thanks Niphlod 2013-09-21 18:15:27 -05:00
Charles Law
d4bceef5b4 Send username/email in verification email 2013-09-21 18:47:41 -04:00
Charles Law
931082f426 add password class to 2nd password registration field 2013-09-21 18:35:34 -04:00
Charles Law
333fb4ebd8 allow for a multi_login option that accepts both emails and usernames 2013-09-21 18:21:34 -04:00
Charles Law
27b6319f2e have more descriptive messages for username issues 2013-09-21 15:42:10 -04:00
Charles Law
70d8b2d755 show message when an email is already taken 2013-09-21 15:16:06 -04:00
mdipierro
17c10b8a45 things got out of sync 2013-09-20 21:28:26 -05:00
mdipierro
f8e2c8e319 new validator IS_LIST_OF_EMAILS 2013-09-20 21:17:05 -05:00
mdipierro
9ea82fdaaf fixed issue 1686:admin editor files menu hidden when codemirror is in fullscreen mode, thanks Paolo Caruccio 2013-09-20 20:57:29 -05:00
mdipierro
3d01a83c85 Merge pull request #220 from bunnyhugdev/master
Edited cookie handling code when using a db to store sessions
2013-09-20 12:51:49 -07:00
Joel Rathgaber
13f8b1a10c Edited cookie handling code when using a db to store sessions
- Session id cookie is always sent back to client in response
- When no cookie is sent in as a request, a new session id is created
2013-09-20 13:29:50 -06:00
Massimo
f78e172eda fixed issue 1673, propagation for format in archive tables 2013-09-20 12:47:15 -05:00
mdipierro
bd452f90b2 session._fixup_before_save 2013-09-20 08:36:52 -05:00
mdipierro
2b1f150f02 relaxed REST conditions 2013-09-19 22:18:45 -05:00
mdipierro
e7a9457249 fixed problem with widget and list:string 2013-09-19 22:03:37 -05:00
mdipierro
d3ab2e73d5 support for driver mysql.connector, thank you Josiel Santos 2013-09-19 21:44:12 -05:00
mdipierro
860f40ca63 added support for 3letter language files, issue 1680, thanks Fran 2013-09-19 21:33:31 -05:00
mdipierro
59a7db56a4 fixed major problem with persistance of session.flash 2013-09-19 20:51:11 -05:00
mdipierro
01e5107a96 possible fix to issues 1682, REST and DELETE 2013-09-19 18:33:27 -05:00
mdipierro
8765dbbe0f an attempt to fix 1685 2013-09-19 18:26:35 -05:00
mdipierro
d125b0b95b expires can be str or datetime 2013-09-19 18:03:35 -05:00
mdipierro
1d2fc4b8f5 simpler logic in parse POST but not functional difference 2013-09-19 17:47:29 -05:00
mdipierro
146ea115bf Merge pull request #219 from niphlod/enhancement/ajax_page_notarget
fixed issue when target is none. removed useless file in admin/static/js
2013-09-19 14:44:03 -07:00
niphlod
4f44188997 fixed issue when target is not none. removed useless file in admin/static/js 2013-09-19 21:52:45 +02:00
mdipierro
ac5fb303eb Merge pull request #218 from mpranjic/masterfix
startswith, endswith and contains for upload fields
2013-09-19 12:10:07 -07:00
mdipierro
31a14997f8 Merge pull request #216 from ilvalle/ajax_title
Set document title when an ajax fragment has got a <title> element
2013-09-19 12:09:01 -07:00
mpranjic
4cd4ff2c5e startswith, endswith and contains for upload fields 2013-09-19 10:58:23 +02:00
Massimo
26ef508966 added some missing files, is admin/static/js/jquery-1.10.0.min.map correct? 2013-09-18 14:37:28 -05:00
Paolo
28b4badb9a concatenation of filter and find for a better <title> discovery 2013-09-18 17:33:54 +02:00
mdipierro
8e2e2420b0 fixed style of edit in admin 2013-09-18 10:18:31 -05:00
mdipierro
67349627f4 Merge pull request #214 from niphlod/fix/admin_emmet
fixes keyboard shortcuts in admin when modifying js or css files
2013-09-18 08:05:49 -07:00
mdipierro
cfe825f94a Merge pull request #213 from spametki/master
Fix imap insert multipart detection
2013-09-18 08:05:05 -07:00
mdipierro
53e79915fa skip virtual fields on AttributeError 2013-09-18 08:29:31 -05:00
ilvalle
9fb5f688ed Set document title if an ajax fragment has a <title> element 2013-09-18 09:15:06 +02:00
mdipierro
c2cdae0615 new setup_exe.py, thanks Niphlod 2013-09-17 08:31:01 -05:00
mdipierro
2516bb59a1 fixed issue 1679:auth.navbar() duplicates first link if mode is 'default', thanks wkl 2013-09-16 08:55:43 -05:00
mdipierro
13c78fae58 R-2.6.3 2013-09-15 12:00:13 -05:00
mdipierro
91c0a31800 R-2.6.3 2013-09-15 11:51:01 -05:00
mdipierro
277137c8e6 R-2.6.3 2013-09-15 11:48:32 -05:00
mdipierro
4556a355a2 fixed a problem with CRYPT password length 2013-09-15 11:46:46 -05:00
mdipierro
7dafb07438 added a extra level of protection for long passwords, even if IS_LENGTH validator is missing 2013-09-15 09:40:15 -05:00
niphlod
3c8e7a1364 fixes keyboard shortcuts in admin when modifying js or css files 2013-09-15 11:23:58 +02:00
spametki
921cd46c10 Fix imap insert multipart detection 2013-09-14 16:03:41 -03:00
mdipierro
b0f6dc4e16 R-2.6.2 2013-09-13 17:44:01 -05:00
mdipierro
1499b19575 R-2.6.2 2013-09-13 17:41:13 -05:00
mdipierro
877b867cef Merge pull request #212 from niphlod/fix/js_punctuation
never got to understand ASI. Let's behave and have a semicolon.
2013-09-13 15:27:46 -07:00
niphlod
837808bd77 never got to understand ASI. Let's behave and have a semicolon. 2013-09-14 00:22:53 +02:00
mdipierro
10a69f4338 removed circular import for validators 2013-09-13 17:14:47 -05:00
mdipierro
7bc603f380 fixed Pointless to set session.flash before session.renew, thanks nursix 2013-09-13 15:41:58 -05:00
mdipierro
6c1cc6fc96 tabs -> spaces 2013-09-13 15:39:39 -05:00
mdipierro
ed9def985e R-2.6.1 2013-09-12 17:08:52 -05:00
mdipierro
be57c3ab5b conditional renew sessions on login/logout 2013-09-12 16:31:41 -05:00
mdipierro
809a004a60 no more scripts/cleanup.py 2013-09-11 22:38:52 -05:00
mdipierro
6129805194 removed dbsession2trash.py since functionality duplicated in session2trash.py 2013-09-11 14:59:47 -05:00
mdipierro
06475f2050 adding scripts/cleanup.py to remove all sessions and errors 2013-09-11 12:15:03 -05:00
mdipierro
b6f8f9be75 Merge branch 'master' of github.com:web2py/web2py 2013-09-11 11:22:21 -05:00
mdipierro
cc524592c4 Merge pull request #209 from michele-comitini/custom_jsonrpcexception
Allow raising a custom Service.JsonRpcException inside a jsonrpc2 action
2013-09-11 09:22:04 -07:00
Michele Comitini
53bca4e178 Allow raising a custom Service.JsonRpcException inside a jsonrpc2 action. 2013-09-11 18:01:37 +02:00
mdipierro
e060b2936f new CHANGELOG, thanks Niphlod 2013-09-10 15:30:02 -05:00
Massimo
deb0e89240 merged pull 27, thanks Niphlod 2013-09-09 17:08:16 -05:00
niphlod
5951ce2aef fixed redis_session.py, thanks @Giovanni for pointing 2013-09-09 21:32:26 +02:00
mdipierro
16b95b8132 fixed wrong validation of record_id in globals 2013-09-09 14:28:58 -05:00
mdipierro
69d5fb1d64 fixed link in toolbar, issue 1670 2013-09-09 14:17:25 -05:00
mdipierro
dfaf3a6667 Merge pull request #206 from nursix/master
Add 'set' to serializable types in Query.as_dict
2013-09-09 10:53:26 -07:00
mdipierro
0a3b594446 Merge pull request #205 from ilvalle/web2py.js
More control over the destination container of a web2py_ajax call
2013-09-09 10:52:39 -07:00
mdipierro
fa08fd6703 Merge pull request #204 from niphlod/issue/1640
grid search widget always use ISO format for date(time) fields
2013-09-09 10:51:44 -07:00
Dominic König
01c0d14396 Add 'set' to serializable types in Query.as_dict 2013-09-09 14:59:29 +02:00
ilvalle
5176890ff3 updated web2py.js for all apps (examples and admin) 2013-09-09 08:43:07 +02:00
ilvalle
029915f2f9 Container target is now part of the event fired by ajax_page 2013-09-09 08:35:24 +02:00
mdipierro
2a0f481b42 updated changelog for 2.6.1 2013-09-08 21:36:42 -05:00
niphlod
4089001d99 grid search widget always use ISO format for date(time) fields 2013-09-08 18:27:37 +02:00
mdipierro
30f01a2e79 removed unwanted print statement, thanks Luca 2013-09-07 22:05:01 -05:00
mdipierro
aacbb5cef8 reverted previous patch 2013-09-07 21:01:30 -05:00
mdipierro
bf89d42c00 Merge pull request #203 from lucadealfaro/master
Update validators.py
2013-09-07 18:47:32 -07:00
Luca de Alfaro
fae29bf0e1 Update validators.py
Updated the IS_DATETIME validator; otherwise it would fail when creating a new record with SQLFORM, for dates that have an empty default.
2013-09-07 16:57:17 -07:00
mdipierro
b0f6f29de5 Merge pull request #202 from niphlod/enhancement/working_status
streamlined the "working..." status handling and added an example
2013-09-07 07:22:14 -07:00
niphlod
a6baead531 streamlined the "working..." status handling and added an example 2013-09-07 15:34:03 +02:00
mdipierro
31a5e28f9a some cleanup 2013-09-06 16:29:20 -05:00
mdipierro
173d669206 fixed makefile for new folder structure 2013-09-06 16:19:20 -05:00
mdipierro
d129539e62 fixed routes.pattern.example.py 2013-09-06 15:38:01 -05:00
mdipierro
58e02c6f24 fixed prefix in markmin ...:cite 2013-09-06 15:35:27 -05:00
mdipierro
6203fcb852 moved settings.cfg to admin 2013-09-06 15:18:17 -05:00
mdipierro
62b59a023d fixed merge 2013-09-06 14:45:52 -05:00
mdipierro
faeecbfc94 renamed routes.patterns.example.py and routes.parametric.example.py files 2013-09-06 14:33:24 -05:00
mdipierro
7f11ec177a reverting last patch 2013-09-06 14:21:23 -05:00
mdipierro
ceae454386 Merge pull request #199 from pyner/master
download static file via http
2013-09-06 12:00:35 -07:00
mdipierro
cd7dd52002 Merge pull request #201 from michele-comitini/table_init_speedups
little speedup for table init
2013-09-06 11:58:58 -07:00
mdipierro
82950a621c Lazy tables recursion fix 3, thanks Michele and Anthony 2013-09-06 13:55:34 -05:00
mdipierro
b885f7e2b6 Merge pull request #200 from michele-comitini/lazy_tables_recursion_fix_3
Lazy tables recursion fix 3
2013-09-06 11:52:37 -07:00
Michele Comitini
af073a2af1 little speedup for table init 2013-09-06 15:15:34 +02:00
Michele Comitini
59c758368a try to reduce recursion in Row.__getitem__ 2013-09-06 14:48:09 +02:00
Michele Comitini
69ef29bc2d trying to fix some speed issues 2013-09-06 05:56:17 +02:00
Michele Comitini
2baa1af264 fix for recursive selects on lazy tables 2013-09-06 05:09:34 +02:00
Michele Comitini
f96f89b14d Merge ssh://github.com/web2py/web2py 2013-09-06 05:01:33 +02:00
mdipierro
fceb9a57ce auth.crsf_prevention = False 2013-09-05 17:26:40 -05:00
mdipierro
3bb31b1f09 auth.crsf_on = False 2013-09-05 17:23:53 -05:00
mdipierro
def5ba3d4f Merge pull request #198 from niphlod/enhancement/double_submission
help preventing double submissions for normal forms too.
2013-09-05 12:24:53 -07:00
mdipierro
dbf2202630 Merge pull request #197 from spametki/master
DAL dict parameters (issue 1639). Fixed tests (again)
2013-09-05 12:24:01 -07:00
mdipierro
11d0c28f91 toolbar and ajax fix patch 2013-09-05 09:48:40 -05:00
Michele Comitini
59c3c981d3 Merge ssh://github.com/web2py/web2py 2013-09-05 11:17:43 +02:00
Samuel
1b91e746ca download file via http 2013-09-04 16:57:04 -05:00
mdipierro
f171777da5 fixed problem with handlers in zip 2013-09-04 16:33:37 -05:00
mdipierro
5b32e3e2a9 fixed problem with missing .py in zip 2013-09-04 16:30:14 -05:00
mdipierro
832a603939 fixed problem with missing .py in zip 2013-09-04 16:27:42 -05:00
niphlod
79bd1d2e24 help preventing double submissions for normal forms too. Helps with issue #1644 2013-09-04 23:22:41 +02:00
spametki
44aa9483a4 Cast keys recursively including iterables (issue 1639 syntax error) 2013-09-04 16:19:59 -03:00
mdipierro
cbcc9bc8ff Merge branch 'master' of github.com:web2py/web2py 2013-09-03 20:37:28 -05:00
mdipierro
a9d20cf3b4 Merge pull request #195 from niphlod/enhancement/datetime_js_widgets
attach datetime/date/time validators only on events
2013-09-03 18:37:11 -07:00
spametki
af202868bc Merge branch 'dictionary-db-defs'
Tries to fix issue 1639
2013-09-03 19:41:48 -03:00
niphlod
cd30382c0e attach datetime/date/time validators only on events 2013-09-03 20:52:25 +02:00
Massimo
e724e13564 fixed cron deadlock on windows, thanks Helko Besemann 2013-09-03 11:53:18 -05:00
Massimo
fd000fe35b preventing un-necessary fetch, thans Anthony and Villas 2013-09-03 09:53:42 -05:00
mdipierro
099e02fe64 fixed issue 1507, menu links problems with mobile user agent, thanks Paolo Valleri 2013-09-02 20:43:10 -05:00
mdipierro
6a1d83b2f4 Merge pull request #194 from alfonsodg/master
Fixing some typos inside tests and unneeded modules
2013-09-02 18:37:49 -07:00
mdipierro
74cb6c3de6 backported safe_eval to python 2.5 2013-09-02 20:33:19 -05:00
mdipierro
31904d58bd backported safe_eval to python 2.5 2013-09-02 20:30:30 -05:00
Alfonso de la Guarda Reyes
a51d087797 Fixing some typos inside tests and unneeded modules 2013-09-02 19:32:26 -05:00
spametki
b5039a5a6e Switched table definition order at test_dal.py 2013-09-01 19:16:45 -03:00
spametki
a634ff7954 Applied patch for issue 1639 2013-09-01 18:13:51 -03:00
mdipierro
0b501612ad fixed issue 813:archive table current_record field label is translated by default 2013-09-01 14:14:20 -05:00
mdipierro
9729005fff better import errors (issue 1368) 2013-09-01 13:35:17 -05:00
mdipierro
ca85afeb2f fixed issue 1342:MySQL, self-reference, and null values 2013-09-01 13:12:30 -05:00
mdipierro
b7f46c969f multiple renderers for wiki (issue 1298), thanks Alan and sorry this took forever 2013-09-01 12:44:02 -05:00
mdipierro
866d6c6db4 admin design page should not show more than 1000 files 2013-09-01 12:41:24 -05:00
mdipierro
a68ac572ab Wiki(..., force_render=True) 2013-09-01 12:38:11 -05:00
mdipierro
085b4a0d15 fixed issue 1616:possible problem with hideerror for list:string 2013-09-01 11:17:16 -05:00
mdipierro
c87482bdee fixed issue 1590 2013-09-01 10:24:00 -05:00
mdipierro
6097a00bf1 possibly fixed issue 1637:when trying to use IS_IN_DB with a composite reference key, there is a no _id error reported 2013-09-01 09:35:30 -05:00
mdipierro
ac3e1fc84d fixed issue 1657 2013-09-01 08:07:29 -05:00
mdipierro
8cff939fb6 fixed issue 1658, unicode in admin/languages/de.py 2013-09-01 07:55:17 -05:00
mdipierro
dd7609a22a partially fixed issue 1502 2013-09-01 07:44:11 -05:00
mdipierro
fecac08fc7 Merge pull request #193 from niphlod/fix/pip_use_mirrors
seems that --use-mirrors is ATM borked.
2013-08-31 16:54:33 -07:00
niphlod
735357da1d seems that --use-mirrors is ATM borked.
Anyway, --use-mirrors is going to de deprecated in future releases of pip.
Pypi infrastructure is more reliable than a year ago, let's hope we don't incur in any
downtimes.
2013-09-01 01:02:48 +02:00
mdipierro
72ca29694a Merge pull request #192 from niphlod/fix/setup_scripts
fix scripts fetching handlers from /handlers
2013-08-31 07:45:05 -07:00
niphlod
d61bbc6a5f fix scripts fetching handlers from /handlers 2013-08-31 14:23:35 +02:00
mdipierro
1f9071d5df moved options_std.py to examples, thanks Niphlod 2013-08-30 18:29:27 -05:00
mdipierro
27229ea979 Merge pull request #191 from niphlod/fix/anyserver
fix anyserver with logging and/or profiler
2013-08-30 16:25:46 -07:00
mdipierro
ab29b42fbb Merge pull request #190 from niphlod/fix/examples
fix examples app
2013-08-30 16:25:06 -07:00
mdipierro
e1d906256d Merge pull request #189 from niphlod/issue/1584
fixed issue 1584 (grid export with left join)
2013-08-30 16:24:29 -07:00
mdipierro
9526edc49d Merge pull request #188 from jmistx/master
Popen objects leak fixed
2013-08-30 16:23:47 -07:00
niphlod
761d7fd824 fix anyserver with logging and/or profiler 2013-08-30 22:46:36 +02:00
niphlod
5036e36083 fix examples app 2013-08-30 22:05:57 +02:00
niphlod
a7d4c5297e fixed issue 1584 (grid export with left join) 2013-08-30 21:13:49 +02:00
Michele Comitini
013d9090f4 Merge ssh://github.com/web2py/web2py 2013-08-30 18:00:59 +02:00
mdipierro
b13c2cf6e3 possibly solved issue 1617? thanks fredcy 2013-08-30 17:38:51 +02:00
mdipierro
a122215b41 new attempt at fixing session but commented test which fails 2013-08-30 17:38:51 +02:00
mdipierro
5ebf93e453 fixed memdb(Client()) problem 2013-08-30 17:38:51 +02:00
mdipierro
4d46477bee support for content-type .xslm, thanks Niphlod 2013-08-30 17:38:51 +02:00
Johan Englund
49ff414c5c Rewrite navbar & added sublime to gitignore 2013-08-30 17:38:50 +02:00
mdipierro
44f5c0c824 exists to isdir, thanks Niphlod 2013-08-30 17:38:50 +02:00
mdipierro
9aee01df62 updated Makefile 2013-08-30 17:38:50 +02:00
mdipierro
13c782eaa6 handlers check for 'applications' folder 2013-08-30 17:38:50 +02:00
mdipierro
72b3092ef6 moved handlers 2013-08-30 17:38:50 +02:00
mdipierro
03942ba38f allow conditional templates, although no compilation, thanks Anthony 2013-08-30 17:38:50 +02:00
mdipierro
c997192277 another possible solution to issue 1524, without monkey patching 2013-08-30 17:38:50 +02:00
mdipierro
aebb331fe7 monkey_patched_pickle 2013-08-30 17:38:50 +02:00
mdipierro
dafbc17826 fixed get_app problem on windows 2013-08-30 17:38:50 +02:00
mdipierro
cc3da8a50e fixed get_app problem on windows 2013-08-30 17:38:50 +02:00
mdipierro
137b4ed75a fixed if False in widget.py, thanks Niphlod 2013-08-30 17:38:49 +02:00
mdipierro
a6a678bf4a fixed windows paths, thanks Niphlod 2013-08-30 17:38:49 +02:00
mdipierro
1d83daa068 more details in README 2013-08-30 17:38:49 +02:00
mdipierro
0bf787ae5e no echo in Makefile 2013-08-30 17:38:49 +02:00
mdipierro
d70a13e412 commented scripts in setup.py, broke build 2013-08-30 17:38:49 +02:00
mdipierro
8dc8c49dec added a README file 2013-08-30 17:38:49 +02:00
mdipierro
cd704f74bb moved lots of files 2013-08-30 17:38:49 +02:00
mdipierro
f18b264ca1 no more plugins in wizard 2013-08-30 17:38:49 +02:00
niphlod
5bdfbc98dd added boilerplate to be able to run tests from anywhere. Added test for validate_and_insert too. 2013-08-30 17:38:49 +02:00
mdipierro
52c8629f4b fixed typo in globals, thanks Niphlod 2013-08-30 17:38:49 +02:00
Ricardo Pedroso
92fc9a6dce support new session logic 2013-08-30 17:38:48 +02:00
niphlod
02d616aaa3 fix issue with scheduler namespace. Thanks @limedrop for spotting this. 2013-08-30 17:38:48 +02:00
gi0baro
5cef463dcf Support querying for null values in mongoDB 2013-08-30 17:38:48 +02:00
Dominic König
e7ce778121 Ability to send emails with empty message body. 2013-08-30 17:38:48 +02:00
mdipierro
667009318e fixed problem with get_app when app does not exist 2013-08-30 17:38:48 +02:00
mdipierro
838a1ffc82 fixed missing error in design when app does not exist 2013-08-30 17:38:48 +02:00
mdipierro
4ce6d03d89 removed customize it 2013-08-30 17:38:48 +02:00
mdipierro
24c9f999e1 fixing more bugs in new session handling 2013-08-30 17:38:48 +02:00
jmistx
17ee260e3c Popen objects leak fixed 2013-08-30 05:40:01 -07:00
mdipierro
db2469f109 fixed issue 1448, headers in wiki media files, sorry Nico this fell under the radar and tool way longer than should have 2013-08-29 21:32:36 -05:00
mdipierro
7c47619e2f fixed issue 1654, auth.enable_record_versioning(db), thanks hitkatojp 2013-08-29 21:16:16 -05:00
mdipierro
ca0bbac685 chaged pickling rules for lazyT 2013-08-29 18:57:52 -05:00
mdipierro
b82f46352d Merge pull request #187 from niphlod/issue/response_js_order
fixed the order of response.js execution. Thanks @Anthony
2013-08-29 16:43:11 -07:00
mdipierro
b9fc2a66c7 Merge pull request #186 from carpaIdea/master
auth navbar - added bare mode and PEP8 tweaks
2013-08-29 11:58:12 -07:00
niphlod
24bed97a51 fixed the order of response.js execution. Thanks @Anthony 2013-08-29 20:55:03 +02:00
Paolo Caruccio
2f43c11c94 auth navbar - added bare mode and PEP8 tweaks 2013-08-29 20:30:36 +02:00
mdipierro
70a1fbfd41 bypass all session logic when application does not exist, and close files 2013-08-29 08:22:35 -05:00
mdipierro
1ffd110d05 bypass all session logic when application does not exist 2013-08-29 08:09:56 -05:00
mdipierro
cbf550afbe Merge pull request #185 from niphlod/issue/cookies
send session cookie always.
2013-08-28 20:10:52 -07:00
niphlod
bf6cf86987 send session cookie always. Please test it carefully with session data stored in cookies. 2013-08-29 00:43:34 +02:00
mdipierro
eacb4638a1 possibly solved issue 1617? thanks fredcy 2013-08-28 09:57:21 -05:00
mdipierro
b9d681295f new attempt at fixing session but commented test which fails 2013-08-27 22:26:04 -05:00
mdipierro
a767799b36 fixed memdb(Client()) problem 2013-08-27 18:20:25 -05:00
mdipierro
05a41b12ce support for content-type .xslm, thanks Niphlod 2013-08-27 18:02:51 -05:00
mdipierro
19a0a905a5 Merge pull request #184 from tazaar/master
Rewrite navbar & added sublime to gitignore
2013-08-27 15:27:07 -07:00
mdipierro
a626c213a7 exists to isdir, thanks Niphlod 2013-08-27 17:18:27 -05:00
mdipierro
cc0014f42a updated Makefile 2013-08-27 17:01:05 -05:00
mdipierro
458779467d handlers check for 'applications' folder 2013-08-27 16:57:54 -05:00
mdipierro
07f74c6362 moved handlers 2013-08-27 16:50:30 -05:00
mdipierro
202cad5424 allow conditional templates, although no compilation, thanks Anthony 2013-08-27 16:18:29 -05:00
mdipierro
31c1e9468c another possible solution to issue 1524, without monkey patching 2013-08-27 16:12:23 -05:00
mdipierro
a08cd3e8ff monkey_patched_pickle 2013-08-27 15:55:01 -05:00
Johan Englund
c06c207b68 Rewrite navbar & added sublime to gitignore 2013-08-27 14:57:10 +02:00
mdipierro
371a4780e8 fixed get_app problem on windows 2013-08-27 06:34:36 -05:00
mdipierro
300e735a38 fixed get_app problem on windows 2013-08-27 06:30:58 -05:00
mdipierro
97abd5f3b0 fixed if False in widget.py, thanks Niphlod 2013-08-26 16:57:08 -05:00
mdipierro
6b5c8aab83 fixed windows paths, thanks Niphlod 2013-08-26 06:05:25 -05:00
mdipierro
c5fa97cb2b more details in README 2013-08-25 21:23:11 -05:00
mdipierro
cb80f91a4a no echo in Makefile 2013-08-25 21:19:35 -05:00
mdipierro
6acc116341 commented scripts in setup.py, broke build 2013-08-25 20:39:32 -05:00
mdipierro
fa47b873c8 added a README file 2013-08-25 20:37:04 -05:00
mdipierro
1303b657c7 moved lots of files 2013-08-25 20:29:54 -05:00
mdipierro
63adb9a6c4 no more plugins in wizard 2013-08-25 19:35:27 -05:00
mdipierro
62840d6e40 Merge branch 'master' of github.com:web2py/web2py 2013-08-25 19:27:46 -05:00
mdipierro
de7deeddf8 Merge pull request #183 from niphlod/issue/tests
added boilerplate to be able to run tests from anywhere
2013-08-25 17:26:10 -07:00
niphlod
f5f6f365f9 added boilerplate to be able to run tests from anywhere. Added test for validate_and_insert too. 2013-08-25 18:35:29 +02:00
mdipierro
d43bea6713 fixed typo in globals, thanks Niphlod 2013-08-25 07:40:29 -05:00
mdipierro
5f9b7734b1 Merge branch 'master' of github.com:web2py/web2py 2013-08-24 16:31:22 -05:00
mdipierro
301d449147 Merge pull request #182 from rpedroso/redis-mocktable-callable
redis_session: support new session logic
2013-08-24 14:30:59 -07:00
Ricardo Pedroso
a4e0fb34c2 support new session logic 2013-08-24 15:33:41 +01:00
mdipierro
ee9ac8f267 Merge branch 'master' of github.com:web2py/web2py 2013-08-24 07:57:56 -05:00
mdipierro
1437c4d8c4 Merge pull request #181 from niphlod/issue/scheduler_namespace
fix issue with scheduler namespace. Thanks @limedrop for spotting this.
2013-08-24 05:57:29 -07:00
niphlod
cbddfb5cdf fix issue with scheduler namespace. Thanks @limedrop for spotting this. 2013-08-24 14:05:08 +02:00
mdipierro
bbd149b39f Merge branch 'master' of github.com:web2py/web2py 2013-08-24 05:19:41 -05:00
mdipierro
c9aa8020a7 Merge pull request #180 from gi0baro/issue1641
Support querying for null values in mongoDB
2013-08-24 03:19:35 -07:00
mdipierro
80279a8d8d Merge branch 'master' of github.com:web2py/web2py 2013-08-24 05:18:52 -05:00
mdipierro
ae2d800b0b Merge pull request #179 from nursix/master
Ability to send emails with empty message body.
2013-08-24 03:18:37 -07:00
mdipierro
07aa9843f3 fixed problem with get_app when app does not exist 2013-08-23 14:46:20 -05:00
mdipierro
34cd24886e fixed missing error in design when app does not exist 2013-08-23 14:37:51 -05:00
mdipierro
f17270291e removed customize it 2013-08-23 14:22:21 -05:00
gi0baro
db957fc489 Support querying for null values in mongoDB 2013-08-23 13:18:49 +02:00
Dominic König
bc03ef84fc Ability to send emails with empty message body. 2013-08-22 22:56:23 +02:00
mdipierro
5d67db3bfd fixing more bugs in new session handling 2013-08-22 04:32:47 -05:00
Michele Comitini
21b1b0fa48 Merge ssh://github.com/web2py/web2py 2013-08-22 11:09:03 +02:00
mdipierro
1d14949e17 fixed latest mdmdb problem? 2013-08-22 03:46:59 -05:00
mdipierro
18601c4f72 solved problems with auth and cookie expire 2013-08-22 02:38:49 -05:00
mdipierro
9d9190584e fixed Encoding problem in 'format' from define_table on GAE, thanks Juan 2013-08-22 02:32:00 -05:00
mdipierro
7936ab8ef9 fixed env['QUERY_STRING'], thanks Anthony 2013-08-22 02:19:34 -05:00
mdipierro
93b9b4dfbe trying to trigget travis.... 2013-08-21 17:27:48 -05:00
mdipierro
5b120cd64f Merge pull request #176 from mcabo/patch-1
Update dal.py
2013-08-21 15:24:08 -07:00
mdipierro
f0bcef14b0 reverted issue 1639:DAL, define_table and Field unpacked serialized attributes 2013-08-21 17:23:11 -05:00
mdipierro
fc8690a146 Merge pull request #177 from michele-comitini/session_id_fix
session id null on cookieless client.
2013-08-21 05:14:57 -07:00
Michele Comitini
6a297d854b error on partition usage fixed 2013-08-21 12:56:49 +02:00
Michele Comitini
c9d69c0219 session id null on cookieless client. 2013-08-21 12:17:12 +02:00
mdipierro
d162499e73 pdfinvoice 2013-08-21 05:07:53 -05:00
mdipierro
70a8284cb5 fixed issue 1643:grid - export HTML - missing charset=UTF-8, problems with non-ASCII-chars; proposal, thanks Martin 2013-08-21 04:39:55 -05:00
Michele Comitini
9228204722 Merge ssh://github.com/web2py/web2py 2013-08-21 11:37:13 +02:00
mdipierro
d1525cf6ec adapter.connect = None after adapter.close_connection 2013-08-21 04:29:39 -05:00
mcabo
cef7d64d97 Update dal.py
I think It will be useful to update the table contents and to validate the data previously.

On the other hand, I think there is something weird in the update_or_insert definition (Class table) because it is not working properly on data updating.
2013-08-21 11:13:10 +02:00
mdipierro
4f1d6e6f31 fixed possible memdb issue with table(id), thanks Luca 2013-08-21 02:54:23 -05:00
mdipierro
f3ac3a8740 Merge pull request #175 from niphlod/enhancement/admin_python_version
fix for issue 1642
2013-08-21 00:44:24 -07:00
mdipierro
e332a4f441 Merge pull request #174 from niphlod/issue/restful_contenttype
figure out correctly the content-type for request.restful. Thanks @mcabo
2013-08-21 00:42:59 -07:00
mdipierro
e964ff8b6f Merge branch 'master' of github.com:web2py/web2py 2013-08-21 02:42:05 -05:00
mdipierro
e5fd451b9d Merge pull request #173 from niphlod/fix/redis_sessions
standardized keyprefix
2013-08-21 00:41:19 -07:00
mdipierro
f9940825a1 fixed issue 1639:DAL, define_table and Field unpacked serialized attributes, thanks Alan 2013-08-21 02:37:31 -05:00
mdipierro
fd857b15f6 fixed issue 1638:imap: content as list field type and other small changes, thanks Alan 2013-08-21 02:34:14 -05:00
niphlod
3421447d7f fix for issue 1642 2013-08-20 22:22:29 +02:00
niphlod
ab58af3c87 figure out correctly the content-type for request.restful. Thanks @mcabo 2013-08-20 21:23:18 +02:00
niphlod
8fe821ed0c standardized keyprefix 2013-08-20 20:59:14 +02:00
mdipierro
6448518ce0 allow to change session in db to session in file 2013-08-20 11:15:51 -05:00
mdipierro
343bb984f3 Merge pull request #172 from gi0baro/redis-sess
Fix in redis_session.py select: prevent errors when value is integer/long
2013-08-20 09:00:21 -07:00
mdipierro
dee4e6a980 new session logic 2013-08-20 10:58:36 -05:00
gi0baro
05f3e01ece Fix in redis_session.py select: prevent errors when value is integer/long 2013-08-20 16:53:08 +02:00
mdipierro
56dcaff236 fixed a problem with sortable grid, new icons 2013-08-20 03:22:54 -05:00
mdipierro
9a86f4f0f3 removed print from sqlhtml.py 2013-08-20 01:34:30 -05:00
mdipierro
90931657e4 fixed issue 1633:IMAP support for storing messages, thanks Alan and Prachi 2013-08-19 08:44:57 -05:00
mdipierro
c49ae3df04 fixed again issue 1630:memdb id error -- tries casting None to long. 2013-08-19 08:04:33 -05:00
mdipierro
8121e2b99c fixed regex in app.example.yaml, thanks Luca 2013-08-18 02:50:26 -05:00
mdipierro
aa644ceeb0 isProgrammingError, thanks Alan 2013-08-18 02:09:14 -05:00
mdipierro
28cfd0a0f2 fixed issue 1634:retrieve password regression, thanks christophe.varoqui 2013-08-17 11:31:36 -05:00
mdipierro
030304a6eb Merge pull request #169 from reingart/master
pyfpdf contrib template & html updates
2013-08-17 09:18:30 -07:00
mdipierro
85e689462f Merge pull request #170 from niphlod/enhancement/profiler_dir
profiler now save dumps in a dir
2013-08-17 09:08:42 -07:00
niphlod
ad29ebe866 profiler now save dumps in a dir 2013-08-17 14:02:46 +02:00
Mariano Reingart
f391c9cf22 updated pyfpdf (template Row.copy, fixes issue 1255) 2013-08-16 02:27:53 -03:00
Mariano Reingart
e4d8c4ea17 updated pyfpdf (html enhancements) 2013-08-16 02:27:47 -03:00
mdipierro
0d663507e6 http://www.451unavailable.org/ 2013-08-15 17:15:59 -05:00
mdipierro
c4f7c49846 fixed issue 1631:elements(..., replace=None) deletes the first element only 2013-08-15 10:06:21 -05:00
mdipierro
2cdcdaf932 possibly fixed Issue 1630:memdb id error -- tries casting None to long., thanks Luca 2013-08-15 09:21:58 -05:00
mdipierro
61d81c01c4 refactoring of belongs, thanks Jonathan 2013-08-15 09:09:19 -05:00
Michele Comitini
2e2bf0c01b Merge ssh://github.com/web2py/web2py 2013-08-14 21:30:25 +02:00
mdipierro
8d97fe3d26 Merge pull request #168 from niphlod/issue/request_body
fixed issue with request.body. Needs refactoring
2013-08-14 09:30:27 -07:00
Michele Comitini
1585af5efb Merge branch 'issue/request_body' of https://github.com/niphlod/web2py 2013-08-14 17:34:42 +02:00
niphlod
17dcd836dd fixed issue with request.body. Needs refactoring 2013-08-13 23:44:59 +02:00
mdipierro
ff479a0a63 Merge pull request #167 from michele-comitini/select_first_needs_limitby
NEEDS TESTING
2013-08-13 06:58:42 -07:00
mdipierro
9acdad2736 Merge pull request #166 from michele-comitini/jsonrpc_fix
removed wrong exception that masked other errors
2013-08-13 06:57:01 -07:00
mdipierro
ce62a7e679 Merge pull request #165 from niphlod/enhancement/1626
added enhancement 1626, marker shown in grid also for default orderby
2013-08-13 06:55:11 -07:00
Michele Comitini
f8bd8c274c first() backed by limitby to avoid memory and cpu cycles wasting 2013-08-13 09:18:36 +02:00
Michele Comitini
e132ccbd51 removed wrong exception that masked other errors 2013-08-13 08:54:26 +02:00
niphlod
dd582c61e9 added enhancement 1626, marker shown in grid also for default orderby 2013-08-12 23:59:03 +02:00
Michele Comitini
39ba6f2357 Merge ssh://github.com/web2py/web2py 2013-08-12 10:06:01 +02:00
mdipierro
8fbab4d505 fixed run(...cronjob), my fault, thanks Jonathan 2013-08-09 16:08:42 -05:00
mdipierro
5b94e8f4aa fixed logic for tickets in db? 2013-08-09 15:57:27 -05:00
mdipierro
b618811d2a fixed typo in belongs 2013-08-09 15:16:42 -05:00
mdipierro
10b5eccc73 re-fixing issue 1623, thanks niphlod for checking (still this can be done better) 2013-08-09 15:06:53 -05:00
mdipierro
d4281194c9 fixed issue 1624:GoogleSQLAdapter has no driver property, thanks Felipe Meirelles 2013-08-09 14:13:58 -05:00
mdipierro
87c9a4373a Merge pull request #164 from niphlod/issue/1622
fixed issue #1622. Thanks @kyleflanagan for reporting it
2013-08-09 12:08:46 -07:00
niphlod
567ee5f379 fixed issue #1622. Thanks @kyleflanagan for reporting it 2013-08-09 21:05:28 +02:00
mdipierro
a71998def0 fixed issue 1623:Storing tickets in DB will produce a deadlock on an internal error, thanks lumurer 2013-08-09 13:38:22 -05:00
mdipierro
aeb15317e0 smarted BELONGS, thanks Jonathan 2013-08-09 11:05:52 -05:00
mdipierro
9c1702f5c3 richer structure in DISABLED 2013-08-09 04:49:10 -05:00
mdipierro
a3222f601a richer structure in DISABLED 2013-08-09 04:39:01 -05:00
mdipierro
c6a3a8f61a fixed Issue 1569:Add auth.register_bare, thanks Alan 2013-08-09 03:38:52 -05:00
mdipierro
08214d72d9 simplified upload logic 2013-08-08 14:20:28 -05:00
mdipierro
182192857f settings.is_source 2013-08-08 03:25:10 -05:00
mdipierro
856b6d658e allow passing args and vars to shell, thanks Jonathan 2013-08-07 18:03:36 -05:00
mdipierro
146d83583d Merge pull request #163 from niphlod/issue/grid_and_groupby
fixed issue with grid and groupby
2013-08-07 07:30:48 -07:00
mdipierro
991f07909c VERSION? 2013-08-07 09:03:05 -05:00
mdipierro
8e81e44b24 alternative solution to issue 1610, thanks Alan 2013-08-07 08:53:05 -05:00
niphlod
ad2f177592 fixed issue with grid and groupby 2013-08-07 15:39:54 +02:00
mdipierro
ae4d9dab10 fixed issue 1618:markmin problem with blockquote 2013-08-07 07:47:45 -05:00
mdipierro
237ace5f7f minor edits in dal 2013-08-07 07:29:02 -05:00
mdipierro
438e198e53 no more self.next in Auth, thanks Niphlod 2013-08-07 07:04:05 -05:00
mdipierro
90069aacda fixed(?) count(*) problem in grid 2013-08-07 04:14:18 -05:00
mdipierro
db9ff09ae7 scripts/import_static.py 2013-08-06 17:17:29 -05:00
mdipierro
44670d8bb4 scripts/import_static.py 2013-08-06 12:51:36 -05:00
mdipierro
a7828d7904 fixed issue 1612, thanks gi0baro 2013-08-06 08:58:21 -05:00
mdipierro
7d0bda7e87 group_by_value feature on DAL, that will allow more then 1 field for the grouping, thanks Yair 2013-08-06 06:57:19 -05:00
mdipierro
b0e9140508 web3py backport of lazy get_vars,post_vars and vars, thanks Niphlod (may need more testing) 2013-08-06 06:46:07 -05:00
mdipierro
349aa6c0a5 no more editable, create, etc, on groupby in grid 2013-08-06 05:12:56 -05:00
mdipierro
7220c78581 fixed bug about lazy WSGI middleware, thanks Anthony 2013-08-06 01:59:11 -05:00
mdipierro
1caea9313a ITJP in support 2013-08-05 10:38:17 -05:00
Michele Comitini
ba7662910a Merge ssh://github.com/web2py/web2py 2013-08-05 15:28:28 +02:00
mdipierro
b41b278535 Merge pull request #162 from szimszon/master
The disabled_with message should be translatable
2013-08-05 05:39:43 -07:00
szimszon
58d8328899 disable_with message should be translatable 2013-08-05 13:16:29 +02:00
szimszon
ee102fbfe8 disable_with message should be translatable 2013-08-05 13:14:52 +02:00
mdipierro
9db6ebf4f6 new pbkdf2_ctypes.py, works on Mac, thanks Michele 2013-08-05 02:34:03 -05:00
mdipierro
fbf3a20918 in view/layout, response.files.insert instead of append 2013-08-04 17:01:17 -05:00
mdipierro
773d07b3dc Merge pull request #160 from niphlod/enhancement/1611
fixed issue 1611 (scheduler's migrate should follow Auth's migrate behaviour)
2013-08-04 14:35:51 -07:00
mdipierro
8be4d06245 Merge pull request #159 from niphlod/issue/mysql_wiki
fixed bug with Mysql. Thanks @Adi for reporting.
2013-08-04 14:35:05 -07:00
niphlod
ae567462d3 fixed issue 1611 (scheduler's migrate should follow Auth's migrate behaviour) 2013-08-04 20:56:52 +02:00
mdipierro
5eacefb581 issue 1612:mongodb adapter does raw blob data, thanks Alan 2013-08-04 12:53:17 -05:00
niphlod
2c81a44fab fixed bug with Mysql. Thanks @Adi for reporting. 2013-08-03 17:55:50 +02:00
Michele Comitini
2af872da5a Merge ssh://github.com/web2py/web2py 2013-08-03 12:29:15 +02:00
mdipierro
2c622a7f62 Merge pull request #158 from niphlod/fix/scheduler_sys_path
fix issue with sys.path.
2013-08-03 00:49:22 -07:00
mdipierro
7e67f495e0 Merge pull request #157 from niphlod/issue/orderby_limitby_groupby
fixed bug introduced with commit "no more removal of ORDERBY in MSSQL"
2013-08-03 00:48:11 -07:00
mdipierro
51a7496f2e Merge pull request #155 from rpedroso/dal-break-typo
fix typo in dal.py
2013-08-03 00:47:17 -07:00
mdipierro
8526722ac8 Merge pull request #154 from gokceneraslan/master
Fix form validators in admin application.
2013-08-03 00:46:24 -07:00
niphlod
6cb91ab60d fix issue with sys.path. Now the path looks like 'root/gluon', 'root/site-packages', 'root' like in a normal web request 2013-08-03 02:46:59 +02:00
niphlod
c0600a9e2e fixed bug introduced with commit: df4d8a5238 2013-08-02 21:14:00 +02:00
Ricardo Pedroso
99d73e03a5 fix typo in dal.py 2013-08-02 15:54:48 +01:00
Gökçen Eraslan
275cc3bfb4 Fix form validators in admin application. 2013-08-01 17:50:01 +03:00
mdipierro
eb2c0e6ca1 added better handling of missing library, thanks Michele 2013-08-01 08:23:24 -05:00
mdipierro
df4d8a5238 no more removal of ORDER BY in MSSQL 2013-08-01 02:49:27 -05:00
mdipierro
a2566ef7ab call to build_parsemap() on __init__ instead of at every select(), thanks Niphlod 2013-08-01 02:00:08 -05:00
mdipierro
d3c723666a Merge pull request #150 from niphlod/enhancement/roadmap
added roadmap in the community docs section
2013-07-31 23:54:41 -07:00
mdipierro
f8362986c7 Merge pull request #149 from michele-comitini/oauth1_timeout_fix
oauth1 timeout. pbkdf2_ctypes repository reference in docstring
2013-07-31 23:53:29 -07:00
Michele Comitini
788b9e317f Merge ssh://github.com/web2py/web2py 2013-07-31 23:48:29 +02:00
niphlod
0e4aa6a395 added roadmap in the community docs section 2013-07-31 21:48:06 +02:00
mdipierro
8a011cf3ac table.field.referent, table._references 2013-07-31 11:45:14 -05:00
mdipierro
ab9a35b541 table.field.referent 2013-07-31 11:25:15 -05:00
Michele Comitini
8fb1a954ba oauth1 timeout. pbkdf2_ctypes repository reference in docstring 2013-07-30 23:32:47 +02:00
Michele Comitini
be13a8edec Merge ssh://github.com/web2py/web2py 2013-07-30 23:25:22 +02:00
mdipierro
26c8fcd5b3 catched attributeerror 2013-07-30 09:12:22 -05:00
mdipierro
487cfc1cf7 Merge pull request #148 from michele-comitini/pbkdf2_ctypes
[READ BEFORE APPLYING] pbkdf2 implemented ctypes wrapper around OpenSSL native implementation.
2013-07-30 06:59:48 -07:00
Michele Comitini
60792d943f pbkdf2_ctypes updated from upstream 2013-07-29 18:59:40 +02:00
mdipierro
0019dad19c fixed problem with alias and record versioning 2013-07-29 07:51:36 -05:00
mdipierro
abeb4541fe better autocomplete in web2pu shell 2013-07-28 05:47:36 -05:00
Michele Comitini
c4c331d645 pbkdf2 implemented ctypes wrapper around OpenSSL native implementation: 6x speedup 2013-07-27 16:34:09 +02:00
Michele Comitini
2be04b667c Merge ssh://github.com/web2py/web2py 2013-07-27 16:28:10 +02:00
mdipierro
18bed27bae Merge pull request #147 from mpranjic/masterfix
fixed auth_event logging
2013-07-27 04:58:24 -07:00
mdipierro
30a570538b fixed linked tables again 2013-07-27 06:47:25 -05:00
mdipierro
6faacfbf36 fixed issue 1607:NamedTemporaryFile broke GAE, thanks Alan 2013-07-26 15:56:03 -05:00
mpranjic
215cefd1e0 fixed auth_event logging 2013-07-26 10:35:36 +02:00
mdipierro
6aa0ff50b2 fixed bug in sqlform.grid 2013-07-26 03:03:49 -05:00
mdipierro
b63e8994e4 upgraded analytics.min.js, thanks Paolo 2013-07-25 08:14:16 -05:00
mdipierro
61f5522661 fixed issue 1604:After web2py Upgrade, int status codes are no longer respected, thanks cfhowes 2013-07-25 05:14:54 -05:00
mdipierro
ccdbb9a588 fixed issue 1605:mongodb select fails with long limitby, thanks Alan 2013-07-25 05:12:29 -05:00
mdipierro
8b7a638e9f appadmin_manage_without_https, thanks Anthony 2013-07-25 05:04:35 -05:00
mdipierro
182b385734 better next validation, thanks Andre Kablu 2013-07-23 11:09:14 -05:00
mdipierro
a340de8c1e better solution 1602, thanks Alan 2013-07-23 08:41:53 -05:00
Michele Comitini
cb7a7cec29 Merge ssh://github.com/web2py/web2py 2013-07-23 10:36:47 +02:00
mdipierro
e6271dd5f1 fixed possible _next vulnerability 2013-07-23 02:06:42 -05:00
mdipierro
2d59e86ab9 removed e, no None in IS_JSON 2013-07-23 01:05:09 -05:00
Michele Comitini
73565a4718 Merge branch 'native_json_local_check' 2013-07-22 23:27:49 +02:00
Michele Comitini
f52b7def1d Merge ssh://github.com/web2py/web2py 2013-07-22 23:27:35 +02:00
Michele Comitini
50f305ec64 Merge ssh://github.com/web2py/web2py into native_json_local_check 2013-07-22 23:25:54 +02:00
mdipierro
44985f0076 removed non-translatable json error 2013-07-22 14:52:53 -05:00
mdipierro
71407b4c6d Merge pull request #146 from michele-comitini/native_json_local_check
improved json validator to output meaningful error
2013-07-22 12:40:36 -07:00
mdipierro
839c3fbeff fixed issue 1602 again, thanks Alan 2013-07-22 09:13:23 -05:00
Michele Comitini
7194188e2f Merge branch 'master' of github.com:michele-comitini/web2py into native_json_local_check 2013-07-22 15:33:28 +02:00
Michele Comitini
8d7f6b7b7f improved json validator to output meaningful error 2013-07-22 15:07:12 +02:00
Michele Comitini
d2ade8afb1 Merge ssh://github.com/web2py/web2py 2013-07-22 14:51:31 +02:00
mdipierro
60d0812f77 fixed issue 1596:Alias don't work with record versioning 2013-07-22 04:48:53 -05:00
mdipierro
b192634946 fixed issue 1599:Shell relative paths while webserver's are absolute in dal, thanks Alan 2013-07-22 04:10:36 -05:00
mdipierro
87ea056565 fixed issue 1602:Retrieve migration data from db fails if table is not yet created 2013-07-22 04:04:28 -05:00
Michele Comitini
c127dff8e6 Merge ssh://github.com/web2py/web2py 2013-07-22 10:38:28 +02:00
mdipierro
124c85a5ce fixed typo in changelog, thanks niphlod 2013-07-21 17:27:33 -05:00
mdipierro
24067bfc37 fixed issue 1600:Centralized migrations log, thanks Alan 2013-07-21 17:15:31 -05:00
mdipierro
e020d5a6e2 removed '[__+-+...+-+__]' from last commit 2013-07-21 16:56:13 -05:00
mdipierro
5ce5b5672b Merge pull request #144 from michele-comitini/dal_sum_expression_fix
changed way to detect missing key since None is already a possible value
2013-07-21 14:53:26 -07:00
mdipierro
41c3f6a0b4 Merge pull request #145 from michele-comitini/postgresql_json_bug
bugfix native json fields were not supported correcly
2013-07-21 14:51:12 -07:00
Michele Comitini
abf138c842 bugfix native json fields were not supported correcly 2013-07-21 23:32:58 +02:00
Michele Comitini
a208e8cc9f changed way to detect missing key since None is already a possible value 2013-07-21 16:42:14 +02:00
Michele Comitini
7a9cf045de Merge branch 'master' of ssh://github.com/web2py/web2py 2013-07-21 16:37:55 +02:00
mdipierro
94a33dc47f fixed issue 1601:admin edit page first tab closing issue, thanks Paolo 2013-07-20 13:00:43 -05:00
mdipierro
3a9f328ab2 fixed issue 1598:Add SQLite to supported database stored migrations, thanks Alan (also reverted virtualfields that break tests) 2013-07-20 12:54:45 -05:00
mdipierro
650fec547b improved scripts/extract_mysql_models.py, thanks Andre Kablu 2013-07-19 17:42:15 -05:00
mdipierro
92c33f6a2b define_tables(migrate=None,fake_migrate=None) defaults to DAL(migrate=..,fake_migrate=...), thanks Paolo and Jonathan 2013-07-19 12:43:07 -05:00
mdipierro
67424d941a Merge pull request #143 from michele-comitini/table_name_quoting_bug
fix for postgresql when using an alias.
2013-07-19 10:13:33 -07:00
mdipierro
be842ecfa9 Merge pull request #141 from carpaIdea/master
admin - site page - small visual enhancements
2013-07-19 10:11:09 -07:00
mdipierro
0f2f6a35f4 no more autocomplete for date/time inputs, thaks Paolo 2013-07-19 11:31:32 -05:00
mdipierro
5ebaab4ac1 fixed issue 1591:Allow sql log customization 2013-07-19 04:38:55 -05:00
mdipierro
79ac2cf607 synced web2py_bootstrap.css, fixed issue 1595:web2py_bootstrap.css in welcome, admin and examples app not in sync anymore, thanks lightdot 2013-07-19 04:34:47 -05:00
mdipierro
bf3d345ce5 fixed issue 1594:radio widget layout conflicts with bootstrap, thanks Paolo Caruccio 2013-07-19 04:33:18 -05:00
mdipierro
5add14bf68 possibly fixed a problem with virtualfields in fields option of SQLFORM.grid, thanks peckto 2013-07-19 03:28:11 -05:00
Paolo Caruccio
32275c00d7 admin - site page - small visual enhancements 2013-07-18 21:11:26 +02:00
Michele Comitini
f79aea6255 fix for postgresql when using an alias. 2013-07-18 11:42:52 +02:00
Michele Comitini
c2ecb2fe5d Merge ssh://github.com/web2py/web2py 2013-07-18 11:25:58 +02:00
mdipierro
e0d3d99be0 Merge pull request #140 from carpaIdea/master
files toggle in admin, maybe as Massimo would want it
2013-07-18 00:24:48 -07:00
mdipierro
8004dc81f4 fixed conflict 2013-07-18 02:23:31 -05:00
Paolo Caruccio
1e5831969b files toggle in admin, maybe as Massimo would want it 2013-07-18 01:56:45 +02:00
Michele Comitini
460b76f527 removed pycrypto leaving only strxor for speeding up pbkdf2 2013-07-18 00:54:44 +02:00
mdipierro
8d46c57985 Merge branch 'master' of github.com:web2py/web2py 2013-07-17 17:20:04 -05:00
mdipierro
a182d322c6 Merge pull request #138 from niphlod/issue/1592
fix issue 1592
2013-07-17 15:19:37 -07:00
mdipierro
30f0215dc6 fixed a problem in recent commit when pycrypto is missing, the fix is temporary 2013-07-17 17:19:29 -05:00
niphlod
bb7715445a fix issue 1592 2013-07-17 23:18:04 +02:00
ilvalle
50e336bc3a Config API, session is used only when filesystem is not available for storing data 2013-07-17 21:47:00 +02:00
Michele Comitini
b8e423b24a Merge ssh://github.com/web2py/web2py 2013-07-17 16:49:43 +02:00
mdipierro
63ca73d6f0 fixed issue 1587:Mongodb error on id 2013-07-17 07:37:38 -05:00
mdipierro
cd14782641 Merge pull request #136 from michele-comitini/speed_triks1
optimizations. Switch to PyCrypto support in pbkdf2 when possible.
2013-07-17 05:24:19 -07:00
ilvalle
786fffe269 settings tab in admin editor 2013-07-17 11:56:47 +02:00
Michele Comitini
f8c20760d5 optimizations. Switch to PyCrypto support in pbkdf2 when possible. 2013-07-17 03:01:04 +02:00
Michele Comitini
49c189547b Merge ssh://github.com/web2py/web2py 2013-07-17 02:59:33 +02:00
mdipierro
1be0f3f468 fixed problem with tempfiles in Android, thanks Fernando Pacheco 2013-07-16 13:15:11 -05:00
mdipierro
acbdeca03b fixed bug in recent commit, thanks Olivier Johner 2013-07-16 05:19:13 -05:00
mdipierro
0eb0619c0c Merge pull request #135 from carpaIdea/master
customization of upload package input in admin interface
2013-07-15 07:50:24 -07:00
mdipierro
a7cc24254b fixed issue 1586:MSSQL Date format is language dependent, thanks score2000 2013-07-15 09:34:04 -05:00
mdipierro
b60452ef47 fixed issue topic/web2py/LGxJR85pG88, thanks Oliver 2013-07-15 09:22:01 -05:00
Paolo Caruccio
38828c9ece customization of upload package input in admin interface 2013-07-15 00:27:49 +02:00
mdipierro
fdad44315f reduced memory footprint by conditionally loading Tk 2013-07-14 16:52:42 -05:00
mdipierro
5c3d2edf3b moved the locals restoring logic, thanks ozancag 2013-07-14 15:50:23 -05:00
mdipierro
af2ae42fdf Merge branch 'master' of github.com:web2py/web2py 2013-07-14 14:37:15 -05:00
mdipierro
848f021f71 Merge pull request #134 from niphlod/issue/admin_refactor
first step to a nicer code style of admin
2013-07-14 12:37:02 -07:00
mdipierro
c5b88a557d Merge branch 'master' of github.com:web2py/web2py 2013-07-14 14:36:27 -05:00
mdipierro
51eca64fde Merge pull request #133 from niphlod/feature/js_inline
normalized behaviour in A() handler, fixed anonymous function block.
2013-07-14 12:36:00 -07:00
mdipierro
8fc93db229 Merge branch 'master' of github.com:web2py/web2py 2013-07-14 14:35:39 -05:00
mdipierro
27535b032d Merge pull request #132 from mpranjic/masterfix
updating jquery mobile to 1.3.1
2013-07-14 12:35:27 -07:00
mdipierro
569bf16977 Merge branch 'master' of github.com:web2py/web2py 2013-07-14 14:35:02 -05:00
mdipierro
7a0f6eafb7 Merge pull request #131 from swayf/feature/multiple_submit_buttons_in_grid
allows add multiple submit buttons in "selectable" mode in SQLFORM.grid ...
2013-07-14 12:34:50 -07:00
mdipierro
927e30eb45 Merge branch 'master' of github.com:web2py/web2py 2013-07-14 14:33:48 -05:00
mdipierro
e34bdb5d67 Merge pull request #124 from oliveiraev/fix-pymysql-charset
Adding some charsets
2013-07-14 12:33:27 -07:00
niphlod
40d1ff9d17 first step to a nicer code style of admin 2013-07-14 20:13:37 +02:00
niphlod
2d95327a79 normalized behaviour in A() handler, fixed anonymous function block. 2013-07-14 19:42:49 +02:00
mdipierro
44697f5544 setting locale to default, fixed issue 1583, thanks ozancag 2013-07-14 06:05:49 -05:00
mdipierro
1a58701d57 files toggle in admin, not yet as I would want it 2013-07-14 04:57:59 -05:00
Oleg
59f8362f75 syntax fix for python 2.5 2013-07-14 11:32:40 +02:00
mdipierro
324b71c3af fixed issue 1582:Cannot login_bare in a web2py shell, thanks Alan 2013-07-13 19:10:12 -05:00
mdipierro
70f34e4532 better scripts/setup-web2py-nginx-uwsgi-ubuntu.sh, thanks Anthony 2013-07-12 11:58:16 -05:00
mdipierro
d1065178bd css.patch, less html5 syntax error noise, thanks Jonathan 2013-07-12 09:52:31 -05:00
mpranjic
b0ac67a8f6 updating jquery mobile to 1.3.1 2013-07-12 12:19:33 +02:00
mdipierro
9643086b34 TRHEAD->__TRHEAD__ as Jonathan suggested 2013-07-11 13:01:47 -05:00
mdipierro
8c19075f82 Merge pull request #130 from carpaIdea/master
some fixes for small visual bugs in bootstrap layout
2013-07-11 10:54:03 -07:00
mdipierro
db715021bf Merge pull request #128 from mpranjic/masterfix
updating jQueryUI version
2013-07-11 10:52:58 -07:00
mdipierro
31c26dc03d Merge pull request #129 from michele-comitini/select_speedup1
speedup in case of keyed  tables
2013-07-11 10:51:21 -07:00
mdipierro
988ee82496 fixed issue 1579:Row.__getitem__(): count of 0 raises AttributeError, thanks Dominic 2013-07-11 11:49:49 -05:00
mdipierro
207105a21e fix to web2py_bookstrap.css, thanks Paolo 2013-07-11 11:35:46 -05:00
mdipierro
6566b2d2ed html patch, thanks Jonathan, but TRHEAD commented 2013-07-11 11:28:12 -05:00
Oleg
773b19d373 allows add multiple submit buttons in "selectable" mode in SQLFORM.grid (with different decorate css classes) 2013-07-11 18:11:37 +02:00
mdipierro
5ec22132a3 sync'd with gluino again 2013-07-11 09:14:41 -05:00
Paolo Caruccio
1b7bbfaf95 fixes for small visual bugs in bootstrap layout
- form input error text when formstyle='bootstrap' has fixed width.
In narrow screens:
- topbar has space in left and right sides;
- login button in topbar is unlined.
2013-07-10 15:55:51 +02:00
mdipierro
cadf0e946a synced with gluino 2013-07-09 16:15:21 -05:00
Michele Comitini
dd7aff8136 speedup in case of keyed tables 2013-07-09 09:07:43 +02:00
mdipierro
89e158cd1d fixed potential problem with unwanted translation of log messages 2013-07-08 08:47:24 -05:00
mdipierro
b4fe6720ae fixed potential problem with unwanted translation of log messages 2013-07-08 08:39:43 -05:00
mpranjic
2a85fb099b updating jQueryUI version, 1.8 is not working with jQuery 1.10 2013-07-08 12:00:08 +02:00
mdipierro
317efea09b Merge pull request #126 from swayf/feature/bootstrap_same_control_size
fix for deprecated input-xlarge class to make input and select fields...
2013-07-08 01:03:54 -07:00
Oleg
59095ca11f fix for deprecated input-xlarge class to make input and select fields the same size. 2013-07-08 09:46:19 +02:00
mdipierro
d3d77e3c84 fixed issue 1575:rows.as_list serializes date and time fields as strings instead of date time.date, thanks Alan 2013-07-08 01:38:38 -05:00
mdipierro
ec96eaef74 auth log messages are not longer translated, thanks Anthony 2013-07-08 01:21:28 -05:00
mdipierro
e7565845a0 fixed problem with web2py.js, thanks Niphlod 2013-07-07 12:25:31 -05:00
mdipierro
2888983036 fixed issue Issue 1549:signature of original link is lost after successful login, thanks Oleb Butovich 2013-07-06 16:06:25 -05:00
mdipierro
1bad215015 appadmin manage patch, thanks Anthony 2013-07-06 16:04:26 -05:00
Michele Comitini
1940ec2eba Merge ssh://github.com/web2py/web2py 2013-07-05 23:12:16 +02:00
mdipierro
a7021bece2 speedup in getattr, thanks Michele 2013-07-05 02:13:24 -05:00
mdipierro
dd7fc3a856 Merge pull request #123 from michele-comitini/row_speedup3
Row speedup3
2013-07-05 00:09:35 -07:00
Evandro Oliveira
531e6bd15d Adding some charsets
Newer versions of MySQL have more UTF-8 collations in addition to the
new utf8_mb4 charset/collation.

For some additional information about utf8_mb4, please refer to
http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
2013-07-04 13:49:42 -03:00
Michele Comitini
a8a10d6d08 uncommented faster code 2013-07-04 16:01:28 +02:00
Michele Comitini
a974c90dcf row speedups 2013-07-04 15:57:17 +02:00
Michele Comitini
fa755a64d9 Merge ssh://github.com/web2py/web2py 2013-07-04 15:31:35 +02:00
mdipierro
0c013f6b59 fixed typo, thanks Michele 2013-07-03 17:16:56 -05:00
mdipierro
5abfa27f3f rows.repr -> rows.render 2013-07-03 15:24:24 -05:00
Michele Comitini
42594fd66f Merge ssh://github.com/web2py/web2py 2013-07-03 18:07:04 +02:00
mdipierro
73d03cd48c auth.get_or_create_user(login=False) 2013-07-03 04:11:03 -05:00
mdipierro
42c36bd295 fixed Issue 1572:mongodb contains operator typo, thanks Alan 2013-07-03 04:00:32 -05:00
mdipierro
9a85a132ae calendar z-index:2000 2013-07-03 01:53:34 -05:00
Michele Comitini
ec45a1a942 Merge ssh://github.com/web2py/web2py 2013-07-03 01:21:31 +02:00
mdipierro
b28d155f0e fixed a problem with missing _extra 2013-07-02 08:33:47 -05:00
mdipierro
6017e749eb no more collapsible menu if not is_mobile, thanks Paolo 2013-07-02 08:03:51 -05:00
mdipierro
9ebab678c6 fixed problem with admin replacing text, thanks Niphlod 2013-07-02 07:40:00 -05:00
mdipierro
182bbbdcc2 fixed issue 1562:The dspval of integer value zero is nbsp not 0, thanks iiijjjiii 2013-07-02 07:21:09 -05:00
mdipierro
a449c4ede5 fixed issue 1570:Recent web2py does no longer support table-aliasing, thanks Dominic 2013-07-02 07:17:37 -05:00
mdipierro
c633ab450a Merge pull request #121 from tinio/memcache-bug
This looks to be a typo left behind from previous code when checking for an __memcache_client
2013-07-02 05:13:56 -07:00
Aurelio Tinio
afa96da8e9 check for __memcache_client not __mc_instance 2013-07-01 10:43:33 -07:00
mdipierro
1e8c9e89f3 possibly fixed issue 1570:Recent web2py does no longer support table-aliasing, thanks Dominic 2013-07-01 05:51:57 -05:00
Michele Comitini
ebee894b59 Merge ssh://github.com/web2py/web2py 2013-06-30 22:09:16 +02:00
mdipierro
ad8c1165b7 removed BaseException = Exception logic, thanks Jonathan 2013-06-30 11:29:43 -05:00
mdipierro
480ea80ed8 fixed typo in basic_auth_realm = basic_auth_realm(), thanks Jonathan 2013-06-30 10:47:10 -05:00
mdipierro
3407cf6584 made the WSGI compatibility layer lazy, nobody uses it anyway and it may be broken, probably should be removed 2013-06-30 09:19:26 -05:00
mdipierro
d218b052a1 fixed issues 1568, no spaces in usermames, thanks Iceberg 2013-06-29 17:07:17 -05:00
mdipierro
d955af59af Merge pull request #119 from niphlod/issue/1567
fixed issue 1567 with scheduler and Mysql
2013-06-29 15:03:19 -07:00
niphlod
8666d3520e fixed issue 1567 with scheduler and Mysql 2013-06-29 22:49:05 +02:00
mdipierro
363aa2ff97 Merge pull request #117 from michele-comitini/row_speedup2
Some speedups
2013-06-29 09:17:37 -07:00
mdipierro
ddc7f81c00 Merge pull request #118 from niphlod/feature/component_refactor
fixed the collapse function, refactored LOAD() to use new web2py.js
2013-06-28 02:47:59 -07:00
Michele Comitini
4b94fe637d restored the regex 2013-06-28 02:07:22 +02:00
niphlod
917d2087c5 fixed the collapse function, refactored LOAD() to use new web2py.js 2013-06-27 22:31:11 +02:00
Michele Comitini
c4bff4437f removed useless comment 2013-06-27 22:01:35 +02:00
Michele Comitini
c25f337ffe Row code speedups 2013-06-27 21:58:35 +02:00
mdipierro
81fa9b1984 removed check for missing driver 2013-06-27 07:21:40 -05:00
mdipierro
768b49224c fixed Issue 1563:Web2py in error when the request contains a json string corresponding to a list, thanks Hono Sandai 2013-06-27 01:51:03 -05:00
mdipierro
92757a4e2b Merge pull request #115 from niphlod/feature/js_inline
nicer alignment, removed leftovers, new listwidget and passwordwidget
2013-06-26 23:01:05 -07:00
niphlod
81495f7cca nicer alignment, removed leftovers, new listwidget and passwordwidget 2013-06-27 00:25:44 +02:00
mdipierro
cdf8ee8d85 web2py.js with no inline code, thanks Niphlod (this upgrade required upgrading web2py.js 2013-06-26 05:12:47 -05:00
mdipierro
ec4a55fc9e if not logged-in no [wiki] menu 2013-06-26 04:02:17 -05:00
mdipierro
e3728da256 better german translation for admin, thanks Michael Kallweit 2013-06-26 02:54:31 -05:00
mdipierro
474af626f0 fixed a bug in revision b1d117199fdb 2013-06-25 16:56:25 -05:00
mdipierro
198dc8e0cd quoting table names 2013-06-25 15:40:06 -05:00
mdipierro
29f0428889 fixed Issue 1560:Smartgrid doesn work with Google app engine 1.8.1 2013-06-25 09:10:03 -05:00
Michele Comitini
8cab6b8ac0 Merge ssh://github.com/web2py/web2py 2013-06-25 10:43:25 +02:00
michele-comitini
5a3a316658 Merge pull request #1 from michele-comitini/basic_auth
Basic auth
2013-06-25 01:33:02 -07:00
mdipierro
7564f5f671 speedup CONTAINS when un-necessary REPLACE 2013-06-24 14:24:36 -05:00
mdipierro
51e510e30f Merge branch 'master' of github.com:web2py/web2py 2013-06-24 08:49:27 -05:00
mdipierro
a2cd373b3e Merge pull request #113 from michele-comitini/basic_auth
Session renewal fix + record versioning fix + postgres fk reference fix
2013-06-24 06:48:58 -07:00
Michele Comitini
e311da3441 "reference table.field" type bugfix 2013-06-24 15:23:57 +02:00
mdipierro
fd833be535 edited link to realpython 2013-06-24 02:07:18 -05:00
mdipierro
b5056b04f8 fixed __delattr__, thanks Vinicius 2013-06-24 01:48:48 -05:00
Michele Comitini
c8cb3c94ef added empty line 2013-06-24 00:57:24 +02:00
Michele Comitini
b632970960 record versioning must ignore tables without _id field. 2013-06-24 00:52:15 +02:00
Michele Comitini
285811f852 check that session_id exists before trying to renew session from the db 2013-06-24 00:20:11 +02:00
mdipierro
b980d32d02 fixed issue 1557:imap: unexpected date format is not handled, thanks Alan 2013-06-23 08:51:42 -05:00
mdipierro
37c2441507 fixed issue 1556:imap: the encoding field is not writable, thanks Alan 2013-06-23 08:50:14 -05:00
mdipierro
bb78217f44 fixed Issue 1555:imap: default string field represent ignores encoding, thanks Alan 2013-06-23 08:47:51 -05:00
mdipierro
b0d8a0f0c7 fixed Issue 1553:IMAP row content field is not bar decoded, thanks Alan 2013-06-23 08:45:56 -05:00
mdipierro
47890a8454 fixed issue 1552:Missing ssl_ca_certificate option in HttpServer instantiation in we2pyDialog, thanks Jamie Sabin 2013-06-23 00:23:33 -05:00
mdipierro
a526dfe774 fixed issue 1548:Firebird migrations drop column 2013-06-23 00:15:41 -05:00
mdipierro
97ba1379d7 no more maxcharlength, what will break? 2013-06-22 23:52:57 -05:00
mdipierro
578352d500 added a link that was lost 2013-06-22 01:46:39 -05:00
mdipierro
318e8046ba appadmin now works with lazy tables, thanks Anthony 2013-06-22 01:34:19 -05:00
mdipierro
24077f802b allow compute fields to depend on compute fields defined earlier, thanks Tim Richardson 2013-06-21 10:16:10 -05:00
mdipierro
3ce0c30b68 Merge pull request #110 from timrichardson/computed_fields
allow compute fields to depend on compute fields defined earlier
2013-06-21 08:12:43 -07:00
mdipierro
ffa08817ea Merge pull request #112 from ilvalle/codemirror
codemirror 3.14
2013-06-21 08:06:04 -07:00
ilvalle
867c99469c codemirror 3.14 2013-06-21 16:03:20 +02:00
mdipierro
1d38b87719 jQuery('#component').reload() 2013-06-21 06:44:37 -05:00
mdipierro
9682f4a6e3 Rows.repr(), thanks Anthony 2013-06-21 01:54:08 -05:00
mdipierro
1509559e78 avoid recursion in rewrite, thanks Jonathan 2013-06-21 01:47:34 -05:00
Tim Richardson
c3be2e5f8a test case for the changes allowing a compute field to refer to an
earlier defined compute field
2013-06-21 11:20:17 +10:00
Tim Richardson
545e304a73 minor typo (but hopefully will start travis on my repository ) 2013-06-21 09:52:31 +10:00
mdipierro
08f813d670 resynced recent patches, sorry for the mess 2013-06-20 16:44:16 -05:00
Tim Richardson
4c2fba134d fixed a typo in error message 2013-06-21 03:34:51 +10:00
Tim Richardson
5dd452554e allow compute fields to depend on compute fields defined earlier 2013-06-21 03:21:13 +10:00
mdipierro
e055c3af7e fixed issue 1527 with smartgrid (again), thanks ato.steil 2013-06-18 07:44:50 -05:00
mdipierro
7e245e3fbe partial fix for issue 1531, disable validation in crud search 2013-06-18 07:23:01 -05:00
mdipierro
f01f74ed61 reverted new german translation 2013-06-18 06:30:13 -05:00
mdipierro
4b2afc8ae1 fixed Issue 1541:[REQ] support for dot=T('.') in IS_DECIMAL_IN_RANGE() 2013-06-18 04:45:16 -05:00
mdipierro
ad61a61d91 removed gql.py and added gae memcache incr 2013-06-18 04:42:28 -05:00
mdipierro
676dc2e377 no clickable headers for virtual fields, thanks Anthony 2013-06-17 10:41:56 -05:00
mdipierro
5f9615bd10 removed unwanted print statement 2013-06-17 09:16:37 -05:00
mdipierro
4b00c2eb30 added/removed files to hg/git, thanks Lightdot 2013-06-17 08:10:10 -05:00
mdipierro
85643ae55e fixed Issue 1539:user_groups are not updated during and after impersonation, thanks kmouts 2013-06-17 08:05:02 -05:00
mdipierro
215fd658f1 more secure sessions, now pass tests, thanks André Kablu 2013-06-17 04:41:07 -05:00
mdipierro
19f754704c fixed Issue 1538:Update Script setup-web2py-nginx-uwsgi-centos64.sh, thanks jniltinho 2013-06-16 16:59:20 -05:00
mdipierro
d04f2ff502 merged some code form issue 1534 Session ID not changed after privilege level change, thanks kablubr 2013-06-16 07:20:54 -05:00
mdipierro
9b9e64e9ef fixed Issue 1522:Trigger for primary key on oracle database 2013-06-16 07:07:13 -05:00
mdipierro
d4a2411eac fixed Issue 1530:Impersonation events not recorded if redirections onaccept, thanks kmouts 2013-06-16 06:56:50 -05:00
mdipierro
e7724f9017 fixed Issue 1532:mongodb: why to catch connection exceptions? thanks Alan 2013-06-16 06:52:17 -05:00
mdipierro
4a0bc28b09 no references in archive tables 2013-06-16 03:26:46 -05:00
mdipierro
d1660cf0c1 better layout.html and web2py_bootstra.css, thanks Paolo 2013-06-16 03:19:08 -05:00
mdipierro
cb0856f70a Merge pull request #108 from ilvalle/editor
Editor improvements
2013-06-15 11:54:52 -07:00
mdipierro
5f6fd16e84 allow customization of default /manage/auth, thanks Anthony 2013-06-14 16:09:28 -05:00
mdipierro
4310d3e2d6 fixed Issue 1528:SQLFORM.smartgrid: Bug in links, thanks jjachuf 2013-06-13 23:42:22 -05:00
mdipierro
7b303deade Merge pull request #107 from robertop23/master
Fixed Uncaught CodeMirror.Pass
2013-06-13 20:45:01 -07:00
Roberto Perdomo
54f55a9b75 Fixed Uncaught CodeMirror.Pass on expand abbreviation with tab. Now the autoindent works! 2013-06-13 22:01:56 -04:30
Paolo
234c926d98 added buttons to manage editor font-size 2013-06-13 22:56:01 +02:00
mdipierro
c0ba74dd88 fixed Issue 1526:MongoDBAdapter contains() doesn't work for list:reference types, thanks schlegel 2013-06-13 15:30:59 -05:00
mdipierro
98c19740a2 better appadmin, thanks Anthony 2013-06-13 15:20:50 -05:00
ilvalle
ebc27cbc46 fix input search z-index 2013-06-13 09:18:20 +02:00
ilvalle
377d3a9ff3 added input box for a faster file search and opening 2013-06-12 13:36:58 +02:00
ilvalle
4f15c03686 fire a warning before closing an unsaved file 2013-06-12 13:18:48 +02:00
mdipierro
6af173c853 fixed help_field(s) 2013-06-11 08:00:48 -05:00
mdipierro
4a24523c10 fixed vertical scroll issue with editor, thanks LightDot 2013-06-10 21:29:46 -05:00
mdipierro
a2a1e95c96 Merge pull request #105 from robertop23/master
Codemirror Fixed active line
2013-06-10 19:26:50 -07:00
Roberto Perdomo
4d043acfff Fixed Error: 'Uncaught TypeError: Cannot read property 'parent' of null codemirror.js:4815' 2013-06-10 20:54:34 -04:30
mdipierro
71b024297d Merge pull request #104 from ilvalle/editor
admin editor: fix theme selector and full screen
2013-06-10 06:31:55 -07:00
ilvalle
9e2bb2c08a admin editor: fix theme selector and full screen 2013-06-10 15:22:00 +02:00
mdipierro
5d6b4842ba fixed Issue 1233:improve webclient 2013-06-10 06:19:42 -05:00
mdipierro
ca2fe00933 codemirror3, thanks Roberto 2013-06-09 21:43:18 -05:00
mdipierro
4753ebe958 Merge branch 'master' of github.com:web2py/web2py 2013-06-09 19:15:47 -05:00
mdipierro
29268fc91f Merge pull request #103 from ilvalle/theme
fix admin editor  (full-screen and theme selector)
2013-06-09 17:15:32 -07:00
mdipierro
09291e0df2 CAST in sql only when strincly necessary, still, can be better 2013-06-09 17:00:54 -05:00
mdipierro
2444b5c587 CAST in sql, needs more work 2013-06-09 16:57:13 -05:00
mdipierro
bf3770dc98 fixed Issue 1520:incomplete fix for json and csv import 2013-06-09 16:43:49 -05:00
mdipierro
484b8e5cc9 possibly fixed issue 1446:contains/cast to string problem 2013-06-09 16:41:46 -05:00
mdipierro
4c9967e17e fixed Issue 1501:Links None in AppAdmin 2013-06-09 16:30:42 -05:00
mdipierro
fa91475836 fixed Issue 1477:File exported by export_to_csv cannot be read by import_from_csv 2013-06-09 16:27:00 -05:00
ilvalle
afedd8c235 fix full-screen and theme selector 2013-06-09 19:48:57 +02:00
mdipierro
c75ef1af4f fixed issue with customizing class of input fields, thanks Anthony 2013-06-09 10:27:05 -05:00
mdipierro
73f447167e fixed Issue 1519:MongoDB fails when inserting list:reference values, thanks Alan 2013-06-08 18:51:14 -05:00
mdipierro
cccc6565eb fixed as_json for output of joins, thanks Alan 2013-06-08 09:40:45 -05:00
mdipierro
6c2030f820 fixed some problem with latest editor tab, thanks Paolo 2013-06-07 17:35:47 -05:00
Massimo
ba2702c0d2 cp -R in Makefile 2013-06-06 10:54:16 -05:00
Massimo
31b1334720 Merge branch 'master' of github.com:web2py/web2py 2013-06-06 10:52:07 -05:00
Massimo
1326b38e6f cp -R in Makefile 2013-06-06 10:51:37 -05:00
mdipierro
afc47e180e Merge pull request #98 from ilvalle/master
Online editor with tabs
2013-06-06 08:51:29 -07:00
Massimo
f463de5a45 R-2.5.1 2013-06-06 10:36:33 -05:00
mdipierro
8829780def Merge pull request #101 from rpedroso/anyserver-eventlet
monkey patch eventlet
2013-06-06 08:33:36 -07:00
mdipierro
a302d52698 Merge pull request #102 from mbroadst/post-vars-in-delete-requests
allow to process post vars in DELETE requests
2013-06-06 08:32:47 -07:00
Massimo
00087198e0 R-2.5.1 2013-06-06 10:24:14 -05:00
Massimo
ea3aa62476 fixed show_if with LOAD, thanks Niphlod 2013-06-04 16:41:05 -05:00
Matt Broadstone
176c9f4ad9 allow to process post vars in DELETE requests 2013-06-04 15:26:32 -04:00
Massimo
0fdab02d68 fixed auth.settings.manager_group_role 2013-06-04 09:31:53 -05:00
ilvalle
131eda75a6 theme selector (js part) 2013-06-04 10:08:50 +02:00
mdipierro
0fcb5f2ccd fixed missing import in last commit, thanks Tim 2013-06-03 22:41:24 -05:00
mdipierro
27287d246a fixed Issue 1512:AutocompleteWidget, help_fields parameter, thanks Mirek 2013-06-03 22:17:11 -05:00
mdipierro
2234cd245c fixed memory leak in issue 1493 2013-06-03 22:12:05 -05:00
mdipierro
c5980cd312 grid displays Virtual Fields 2013-06-03 21:48:55 -05:00
Ricardo Pedroso
4e8dbffd0e monkey patch eventlet 2013-06-04 00:28:54 +01:00
mdipierro
50dcd7a572 conditional fields 2013-06-03 17:48:13 -05:00
mdipierro
35f1cca768 Merge pull request #99 from michele-comitini/master
removed useless orderby
2013-06-02 19:44:44 -07:00
mdipierro
e5bde6c0b1 Merge pull request #100 from niphlod/issue/static_version
fixed serving static files with static_version
2013-06-02 19:43:45 -07:00
mdipierro
d31bba2670 No more default capture of integrity error 2013-06-01 18:24:44 -05:00
niphlod
4f806a1db9 fixed serving static files with static_version 2013-06-01 14:02:48 +02:00
mdipierro
f64232df30 change in appadmin auth 2013-05-31 21:34:38 -05:00
mdipierro
ecc2f0004c removed manage from auth 2013-05-31 21:31:21 -05:00
mdipierro
4f2e327d33 appadmin/auth_manage and appadmin/manage, thanks Anthony 2013-05-31 21:29:28 -05:00
Massimo
3ce3171dff user/manage, thanks Anthony 2013-05-31 11:25:56 -05:00
Massimo
0850cadfdc allow hash_vars in verify signature, thanks Anthony 2013-05-31 10:41:28 -05:00
Michele Comitini
53a5a44def Merge ssh://github.com/web2py/web2py 2013-05-31 15:56:44 +02:00
Michele Comitini
ad1d414485 removed automatic orderby on db.table[id] expression and db.table(id) call 2013-05-31 15:55:52 +02:00
mdipierro
ba22f9a3a5 new twitter widget in admin, deleted old 2013-05-31 08:29:19 -05:00
mdipierro
51de1740f9 new twitter widget in admin 2013-05-31 08:20:34 -05:00
Massimo
1c012b92d5 possibly fixed dropbox_auth bug? 2013-05-30 12:25:21 -05:00
Massimo
7377922211 upgraded timeEntry in calendar, now works with latest jQuery 2013-05-30 12:10:01 -05:00
mdipierro
fae120f1ea new setup_app and Makefile for OSX python 2.7 2013-05-29 11:40:07 -05:00
mdipierro
a915054602 reverting https://code.google.com/p/web2py/issues/detail?id=1500 as discussed https://groups.google.com/ dE-Fu9prKyI 2013-05-28 22:45:15 -05:00
ilvalle
c741fc4a6b fix breakpoint 2013-05-28 16:29:48 +02:00
ilvalle
ad718b48e8 code cleanup (to remove the code of former editors)
fix breakpoints integration
2013-05-28 14:34:01 +02:00
mdipierro
dd97b9c8dd fixed as_dict for functions, thanks Martin Hufsky and Alan 2013-05-27 11:50:31 -05:00
mdipierro
d1e25796e9 fixed Issue 1505:Json fields imported from csv do not work with postgresql, thanks anonoofish 2013-05-27 10:41:57 -05:00
mdipierro
e38cfc5767 fixed issue 1504, static asset management config in app.yaml, thanks Niphlod 2013-05-27 10:37:38 -05:00
mdipierro
69c888d071 Issue 1506: length argument wrong with unicode 2013-05-27 10:33:37 -05:00
ilvalle
9b4888e6d7 initial import for tabs in the online editor 2013-05-27 16:30:27 +02:00
mdipierro
0138b1782d jQuery 1.10.0 2013-05-25 18:36:32 -05:00
mdipierro
9b1b9e73c5 fixed type in dal with simplejson, thanks Mart 2013-05-25 10:39:16 -05:00
mdipierro
0fc60eedfb R-2.7.4 2013-05-24 12:37:43 -05:00
mdipierro
9e19833421 Merge branch 'master' of github.com:web2py/web2py 2013-05-24 11:44:52 -05:00
mdipierro
31318340e2 Merge pull request #97 from drnextgis/master
Use T operator fot title attribute of grid buttons
2013-05-24 09:44:43 -07:00
mdipierro
6cef27e69c fixed display of version 2013-05-24 11:44:40 -05:00
mdipierro
4f6ab86491 fixed Issue 1500:MySQL driver unable to handle IntegrityError, thanks wheresgatsby 2013-05-24 08:35:09 -05:00
mdipierro
4147867098 better handling of delimeters in template, thanks Corne Dickens 2013-05-24 08:28:45 -05:00
Denis Rykov
a0dead1586 Use T operator fot title attribute of grid buttons 2013-05-23 17:58:43 +07:00
mdipierro
0afc18fd24 reverted HTTP(status_message) because redundant 2013-05-19 22:14:43 -05:00
mdipierro
9f695c783e Merge pull request #96 from rpedroso/redis-session
lock in redis session
2013-05-19 17:12:53 -07:00
Ricardo Pedroso
15263ea1d6 add missing client parameter to lua script 2013-05-18 22:26:35 +01:00
Ricardo Pedroso
693c5cd5e4 add an optional lock mechanism to redis sessions 2013-05-18 20:36:53 +01:00
Ricardo Pedroso
cc3f045efa get rid of val == dict() 2013-05-18 20:36:53 +01:00
mdipierro
43806a26e7 grid(...,client_side_delete=True) for redirect(client_size=True) 2013-05-17 14:53:04 -05:00
mdipierro
cb4c4b3eb5 Merge pull request #95 from niphlod/issue/1380
fix small error in parse_boolean
2013-05-17 12:34:44 -07:00
mdipierro
39558267b9 Merge pull request #94 from niphlod/feature/redis_cache
new and improved redis_cache
2013-05-17 12:33:43 -07:00
niphlod
59a3c5a6e6 fix small error in parse_boolean 2013-05-17 21:23:24 +02:00
mdipierro
2c9eeccc0e fixed issue 1496:Delete button in SQLFORM.grid does not cause browser redirect, thanks jppmssaraiva 2013-05-17 14:19:51 -05:00
mdipierro
7576d85dba ics(...,calname=False) 2013-05-17 13:53:32 -05:00
mdipierro
579f0d752f stripe.charge(token=...) 2013-05-16 22:03:20 -05:00
mdipierro
65e9cc2127 alternative escaping of password in DAL uri 2013-05-15 21:35:17 -05:00
niphlod
dc2fd49ecb new and improved redis_cache. Got distributed locking and faster clear() function.
also, the .increment() was a little bit bugged.
2013-05-16 00:44:24 +02:00
mdipierro
a380ae69d5 IS_SLUG patch, thanks Jonathan, Niphlod and Villas 2013-05-15 12:41:28 -05:00
mdipierro
0b84911d38 allow tables with no primary keys 2013-05-15 11:20:30 -05:00
mdipierro
e64c556f84 Merge pull request #93 from rpedroso/memcache-double
double -> float
2013-05-14 10:06:24 -07:00
mdipierro
18644e027e Merge pull request #92 from rpedroso/fcgi_typo
typo in contrib/gateways/fcgi.py
2013-05-14 10:05:35 -07:00
mdipierro
65642c029c Merge pull request #91 from rpedroso/redis-session
redis_session.py small fixes
2013-05-14 10:04:58 -07:00
mdipierro
11540a6132 Merge pull request #90 from rpedroso/dal-typo
dal typo
2013-05-14 10:04:14 -07:00
mdipierro
a6e728316b Merge pull request #89 from espern/french-translation
new french translation + fixed errors in existing translations
2013-05-14 10:03:24 -07:00
Massimo
4cb5e3c674 merged 2013-05-14 12:01:45 -05:00
mdipierro
d918a6b2e2 fixed a minor problem with the sql filter 2013-05-14 00:30:05 -05:00
Ricardo Pedroso
d721451d15 double -> float 2013-05-14 00:40:50 +01:00
Ricardo Pedroso
c5aaebd4a8 typo 2013-05-14 00:15:49 +01:00
Ricardo Pedroso
4c1dbf4e40 one redis instance per application 2013-05-13 21:59:04 +01:00
Ricardo Pedroso
c20c055788 typo: self.session.expiry -> self.session_expiry 2013-05-13 21:31:06 +01:00
Ricardo Pedroso
44c13f9fa3 fix missing variable 2013-05-13 21:29:37 +01:00
Ricardo Pedroso
ae44a9e0ac dal typo 2013-05-13 20:55:55 +01:00
mdipierro
97ba47f339 allow tables without no id and no primary key 2013-05-13 10:12:09 -05:00
mdipierro
8671b897d0 logout after delete user from profile 2013-05-12 20:08:01 -05:00
mdipierro
1a3361a1bb auth.settings.allow_delete_accounts=True 2013-05-12 10:28:08 -05:00
mdipierro
9ac438d05a removed the timeout issues Issue 1488:Web2py not run OpenSUSE 12.3 64Bits but it may now work as intended 2013-05-11 22:11:21 -05:00
mdipierro
18e45ab994 Issue 1489:some improvement in Mail send class, thanks Alan 2013-05-11 22:03:05 -05:00
mdipierro
f00090846e fixed some dropbox issues, thanks Jesus 2013-05-10 08:32:51 -05:00
mdipierro
6590de030c Issue 1481:error using do_connect=False parameter in DAL creation with mongodb and couchdb is fixed, thanks Alan 2013-05-10 08:28:52 -05:00
mdipierro
714fcc5202 Better german trsnalation of admin, thanks Klaus Kappel 2013-05-10 08:26:12 -05:00
mdipierro
becc947556 hack for vertica timestamp field 2013-05-09 22:31:34 -05:00
Massimo
d547a955ac actual_name for readonly table support 2013-05-09 13:10:48 -05:00
mdipierro
97e0736d8e added some code to help debug issue 1471 2013-05-08 16:52:59 -05:00
mdipierro
20db6daa65 patch moves flash to left avoiding submenu, thanks Jesus 2013-05-08 16:44:52 -05:00
mdipierro
3aefb5f6de es.py thanks Jesus Alvaro 2013-05-08 16:42:29 -05:00
Massimo
30818cdf5e Issue 1482:Patch for /gluon/contrib/login_methods/dropbox_account.py, thanks Jesus 2013-05-07 15:48:59 -05:00
Massimo
4089cf2145 Issue 1480:Patch for /gluon/tools.py, thanks Jesus Alvaro 2013-05-07 15:46:23 -05:00
l01c
d7893c5292 new french translation + fixed errors in existing translations 2013-05-07 13:54:39 +02:00
mdipierro
cdd3f6ed00 allow arbitrary username to enable register and sign in with facebook, thanks Ting-Yu Chou 2013-05-06 22:49:04 -05:00
mdipierro
e44254346c reverting previous patch, Anthony is right, the patch is not backward compatible 2013-05-06 19:49:57 -05:00
mdipierro
adf82c1267 fixed Issue 1478:field.uploadfolder instead of request.folder in accepts (sqlhtml.py), thanks szunny 2013-05-06 19:10:12 -05:00
mdipierro
4d98b72702 auth.settings.client_side, thanks Anthony 2013-05-06 18:37:26 -05:00
mdipierro
f02240acd3 support for different representations of IPv4 in IPv6, thanks Jonathan 2013-05-06 07:33:54 +10:00
mdipierro
cabef57851 improved ipv6 address checked, thanks Jonathan 2013-05-06 07:33:54 +10:00
mdipierro
98ad12a06c db(query)(other if cond else None).select() 2013-05-06 07:33:54 +10:00
mdipierro
d454eb2fe7 removed unwated file 2013-05-06 07:33:54 +10:00
mdipierro
0facbe04ef support for different representations of IPv4 in IPv6, thanks Jonathan 2013-05-05 13:31:06 -05:00
mdipierro
8f9f4aae32 improved ipv6 address checked, thanks Jonathan 2013-05-05 10:13:26 -05:00
mdipierro
d5bfaf83ee db(query)(other if cond else None).select() 2013-05-04 10:24:26 -05:00
mdipierro
9e46c3cbc4 removed unwated file 2013-05-04 10:11:55 -05:00
Tim Richardson
d431206e30 Fixed a very minor typo 2013-05-04 22:13:15 +10:00
mdipierro
6adfb8b944 added setup-web2py-nginx-uwsgi-centos64.sh, thanks jniltinho 2013-05-03 22:25:27 -05:00
mdipierro
0c8ccaac9a Merge pull request #87 from michele-comitini/master
fix oauth issues if redirecting in a form | http custom status error message
2013-05-03 20:22:20 -07:00
mdipierro
4f0ee4543b fixed a problem with hiding passwords for uri = list of uris, thanks David 2013-05-03 22:20:05 -05:00
mdipierro
1383d13334 @db.table.add_method.name, thanks Vinicius 2013-05-03 22:15:01 -05:00
mdipierro
1b260c4b84 fixed typo AF_NET 2013-05-03 21:47:51 -05:00
mdipierro
0ff586a1ca removed file that should not be there, thanks Niphlod 2013-05-03 21:46:06 -05:00
mdipierro
95adb233f7 issue Issue 1474 attachment: addrinfo.patch, thanks Jonathan 2013-05-03 21:42:17 -05:00
mdipierro
e7f2e494af fixed Issue 1165:auth.signature: unable to reset is_active to true, thanks Ricardo 2013-05-03 21:37:26 -05:00
Michele Comitini
ded9e5886d fix left over docstring after copying. 2013-05-03 17:35:03 +02:00
Michele Comitini
d2757294af added support for custom state messages in HTTP 2013-05-03 17:30:25 +02:00
Michele Comitini
39da6a68fe Merge ssh://github.com/web2py/web2py 2013-05-03 17:23:17 +02:00
mdipierro
8e4bc72fca IS_IPADDRESS added to __all__ 2013-05-03 08:27:35 -05:00
mdipierro
bc481e954c something went wrong with VCS, trying fix it 2013-05-02 20:32:21 -05:00
Michele Comitini
e4ba924dc1 changed redirections to status code 302 to avoid issues with forms 2013-05-02 02:43:20 +02:00
mdipierro
193510b57d Merge pull request #86 from niphlod/feature/cache.action
cache.action now works with actions raising HTTP internally
2013-05-01 06:46:02 -07:00
mdipierro
88ad882d83 Merge pull request #85 from ilvalle/master
File list sidebar on Admin
2013-05-01 06:45:18 -07:00
mdipierro
a90c4f7953 Merge pull request #84 from niphlod/issue/1464-1465
better T in grid/smartgrid
2013-05-01 06:44:04 -07:00
niphlod
0c2d97b9db cache.action now works with actions raising HTTP internally 2013-04-29 21:07:04 +02:00
ilvalle
1c77fdd9e1 'File list' sidebar when editing a page in admin 2013-04-29 08:52:24 +02:00
mdipierro
681bc9755e fixed potential vulnerability in form CRSF handling, thanks Anthony 2013-04-28 23:09:49 -05:00
mdipierro
31e992696c fixed potential vulnerability in form CRSF handling, thanks Anthony 2013-04-28 23:05:40 -05:00
mdipierro
813411a408 grid.rows 2013-04-28 17:32:10 -05:00
niphlod
1702d1ac1f removed unused imports, fixes issue 1464 (wrong and missing T in grid and smartgrid), fixes issue 1465 (translation of "None" message) 2013-04-28 20:31:10 +02:00
mdipierro
022a2af8b1 Merge pull request #83 from yasinmuaz/patch-1
Turkish language support for Welcome app
2013-04-27 16:30:00 -07:00
yasinmuaz
d46d16bc2b Update and rename tr-tr.py to tr.py 2013-04-27 23:35:44 +03:00
yasinmuaz
ae3ff2313d Update tr-tr.py 2013-04-27 23:04:17 +03:00
yasinmuaz
669586f15e Turkish language support 2013-04-27 22:50:50 +03:00
mdipierro
46fbcc8d22 Merge pull request #82 from leonelcamara/patch-1
Mail - Added hostname to settings before locking
2013-04-26 08:32:00 -07:00
Massimo
178f94af8c fixed optional formatting of empty list:string 2013-04-25 18:10:56 -05:00
Leonel Câmara
2f6b3a0bda Mail - Added hostname to settings before locking
Added settings.hostname before locking settings, the class may need a comment explaining when is settings.hostname needed
2013-04-25 16:34:34 +02:00
mdipierro
97b70eff9f better populate 2013-04-24 18:05:22 -05:00
mdipierro
3efa77b57a Merge pull request #81 from niphlod/issue/1459
fixed issue 1459
2013-04-23 21:25:56 -07:00
mdipierro
48977ba04c Merge pull request #80 from niphlod/issue/1458
fixed issue 1458
2013-04-23 21:25:17 -07:00
mdipierro
94e3271481 fixed a long stanging problem with helo and hostname, thanks Leonel Câmara 2013-04-23 23:21:17 -05:00
niphlod
04f6e7ee38 fixed issue 1459 2013-04-23 23:04:12 +02:00
niphlod
15c9e685c8 fixed issue 1458 2013-04-23 22:35:43 +02:00
mdipierro
b00463bdf4 fixed gluon/contrib/imageutils.py image path, thanks Tito Garrido 2013-04-21 19:50:55 -05:00
mdipierro
c17e642f1f Merge pull request #79 from z4y4ts/master
Adds Query.__rand__ and dal.Query.__ror__
2013-04-20 10:39:55 -07:00
mdipierro
a2e118ec50 fixed Issue 1456:encoding in mail.send, thanks Corne 2013-04-19 23:46:38 -05:00
Alexander Zayats
45bda63ed3 Adds Query.__rand__ and dal.Query.__ror__
Adds __rand__ == __and__ and __ror__ == __or__.

Also strips trailing spaces.
2013-04-18 16:15:06 +03:00
mdipierro
c909af4a86 Merge pull request #77 from niphlod/feature/cache_count_grid
new arg to SQLFORM.grid to help with large datasets
2013-04-17 15:11:38 -07:00
mdipierro
b5a7c7e30f Merge pull request #78 from niphlod/feature/test_markmin
add doctest hook for markmin. It wasn't run previously.
2013-04-17 15:11:29 -07:00
niphlod
6594e7a607 add doctest hook for markmin. It wasn't run previously. 2013-04-17 23:55:11 +02:00
niphlod
4d8dedeb27 new arg to SQLFORM.grid to help with large datasets 2013-04-17 23:01:01 +02:00
mdipierro
b0e3e386e7 Merge pull request #76 from niphlod/feature/coverage
coverage integration
2013-04-16 14:19:58 -07:00
niphlod
ad4870e338 windows-friendly coverage.ini, better handling for custom coverage settings, typo on contenttype.py 2013-04-16 22:47:12 +02:00
mdipierro
c1f0bc3a6d fixed Issue 1453: Missing equivalent for Row.__int__ that works with new long-type record id, thanks Dominic 2013-04-15 22:58:05 -05:00
mdipierro
887d4cc136 enabled doctests (python 2.7 only) 2013-04-15 18:05:59 -05:00
mdipierro
bbe787b7b4 new web2py_bootstrap.js, thanks Paolo Caruccio 2013-04-15 17:58:45 -05:00
mdipierro
7341988b01 hooking old doctests into unittests, thanks Niphlod 2013-04-15 17:19:11 -05:00
mdipierro
44eb880108 added test coverage link 2013-04-15 15:59:40 -05:00
niphlod
c01f860009 added .coveragerc 2013-04-15 21:54:30 +02:00
niphlod
f9315a8cc7 coverage integration, default .coveragerc and .travis.yml ready for coveralls.io 2013-04-15 21:50:36 +02:00
mdipierro
40918f44fd auto parsing of json content-type, thanks Niphlod 2013-04-15 10:16:18 -05:00
mdipierro
9fdb586d03 auth.requires_login() and ajax - don't force just 401, thanks Anthony 2013-04-15 10:06:25 -05:00
mdipierro
448c398341 Merge pull request #75 from michele-comitini/master
isempty() IS_NOT_IN_DB() speedup
2013-04-14 20:46:44 -07:00
mdipierro
618c322603 more more span6 in form in wiki 2013-04-12 23:33:36 -05:00
mdipierro
b5c9ed633b fixed title-less layout 2013-04-12 23:30:19 -05:00
mdipierro
80342a22f5 fixed a bug in settings in wiki 2013-04-12 23:21:37 -05:00
Michele Comitini
c999b16a27 Merge with upstream. 2013-04-13 00:04:26 +02:00
Michele Comitini
9bda793d46 orderby disabled where not needed 2013-04-13 00:03:43 +02:00
Massimo
5e9fbdd24f faster labels, thanks Anthony 2013-04-12 13:07:37 -05:00
Massimo
446e641e64 fixed issue 1443, automenu for wiki, thanks Alan 2013-04-12 10:46:58 -05:00
Massimo
7d53ec6d71 fixed loading or routes on winservice, thanks Stephen Tanner 2013-04-12 10:31:55 -05:00
mdipierro
7b0cf5bc12 fixed auth.settings.wiki and make populate generator 2013-04-10 22:14:59 -05:00
mdipierro
a82034d516 auth.wiki(controller=...,function=...) always displays menu 2013-04-10 12:37:38 -05:00
mdipierro
4973361136 Merge branch 'master' of github.com:web2py/web2py 2013-04-10 11:09:44 -05:00
mdipierro
3b69d4bf7b Merge pull request #73 from wangganggithub/master
Add language file: zh-cn.py, zh-tw.py
2013-04-10 09:09:28 -07:00
wangganggithub
fd5e14ea0d Create zh-tw.py
purely a clone of 'zh.py'.
rename to 'zh-tw.py' for more precise
2013-04-10 12:44:21 +08:00
wangganggithub
9fc3b2bc26 Update zh.py
fix 'langcode' from 'zh-cn' to 'zh-tw'.
2013-04-10 12:06:02 +08:00
wangganggithub
19cc977917 Create zh-cn.py
This is a specific language file for 'zh-cn'.
The former 'zh.py' should be renamed to 'zh-tw.py'.

web2py is a good project, thank you very much.
I wish I could do something for you all.
2013-04-10 12:04:49 +08:00
Massimo
ce481d9002 fixed Issue 1439:ajax_error_500 var in web2py_ajax.html includes post vars, thanks Anthony 2013-04-09 16:46:48 -05:00
Massimo
2421a31b25 no links to media if page not saved 2013-04-09 16:42:41 -05:00
Massimo
94c79820b9 links with images in markmin 2013-04-09 16:33:45 -05:00
Massimo
80b38a743f [[http://link http://image img]] in markmin 2013-04-09 16:13:55 -05:00
Massimo
af01b45852 ogg contenttype, thanks Ricardo 2013-04-09 16:00:25 -05:00
Massimo
a2de6f12d1 ogg -> audio/ogg in contenttype 2013-04-09 09:20:28 -05:00
Massimo
2af81d2e7a fixed indonesian languages thanks Steve 2013-04-09 09:07:46 -05:00
mdipierro
0f691f2757 MARKMIN('<unicode>') 2013-04-08 21:45:19 -05:00
mdipierro
be021db3d3 int -> long 2013-04-08 21:42:15 -05:00
mdipierro
acd0ebd09d some clenup 2013-04-08 17:29:21 -05:00
mdipierro
3d5e594070 removed one more 2013-04-08 12:44:52 -05:00
mdipierro
58247e3d6b fixed Issue 1436:SQLFORM.grid search widget omits decimal data type 2013-04-08 12:40:52 -05:00
mdipierro
9f35635233 added Malesian and Indonesian languages, thanks Steve Van Christie 2013-04-08 11:13:15 -05:00
mdipierro
2119bacd22 Merge pull request #71 from grutz/IS_IPADDRESS
Adds IS_IPADDRESS() to gluon/validators.py
2013-04-07 19:41:25 -07:00
mdipierro
d55fab540c Merge pull request #72 from grutz/auth_wiki_migrates
Add migrate control to Auth.wiki()
2013-04-07 19:39:26 -07:00
mdipierro
1344c50f85 fixed Issue 1434:admin page error listing with maximum recursion depth exceeded 2013-04-07 19:55:52 -05:00
mdipierro
e8d97f5706 fixed issue 1433 & 885, login radius integration, thanks Nathan Freeze 2013-04-07 19:44:56 -05:00
mdipierro
35704f3527 new .travis.ci for Pypy testing, thanks Niphlod 2013-04-07 19:42:41 -05:00
mdipierro
96fb5b0755 pypi dal patch, thanks Niphlod 2013-04-07 19:37:32 -05:00
mdipierro
81f017a7c0 fixed OGV content-type 2013-04-06 12:22:46 -05:00
mdipierro
aca3d43f0a R-2.4.6 2013-04-06 12:12:32 -05:00
mdipierro
5a898cc80a fixed Issue 1406:Table scrollbar problem in IE, thanks czhang2000 2013-04-06 11:13:31 -05:00
mdipierro
bfb3a320bd comment about incompatibility of GAE static mapping and parametric router syntax, thanks Jonathan 2013-04-06 10:14:38 -05:00
mdipierro
c0b1e387b1 fixed Issue 1409:Mail.send defaults for subject, message appear to be wrong 2013-04-06 10:10:37 -05:00
mdipierro
c175e6340d Issue 1415:Untranslated label for SQLFORM 'Check to delete' checkbox, thanks Dmitry 2013-04-06 10:06:27 -05:00
mdipierro
3a5f7b05df attempt to address issue 1424 2013-04-06 10:02:55 -05:00
mdipierro
26babd7e96 fixed Issue 1416:auth.wiki login loop unless the user is admin, thanks Alan 2013-04-06 09:52:42 -05:00
mdipierro
349088a96e fixed Issue 1428:backslash in edit controller URL, thanks Frank 2013-04-06 09:48:51 -05:00
mdipierro
a4ff77bdb9 fixed Issue 1430:options_std.py ssl_certificate and ssl_private_key default value broken on web2py 2.4.5, thanks wprins 2013-04-06 09:44:16 -05:00
mdipierro
8f70d3a802 fixed Issue 1431:Typo in web2py documentation, thanks dabweather.FBI 2013-04-06 09:42:37 -05:00
mdipierro
89021b6409 fixed Issue 1432:Oracle: invalid SQL generated when requires = IS_NOT_IN_DB, thanks jphillips 2013-04-06 09:40:07 -05:00
mdipierro
4a078705b3 fixed issue 1246 with a nested select 2013-04-06 09:38:16 -05:00
Massimo
6eea834777 fixed bug in scheduler context switch, thanks Niphlod 2013-04-05 16:01:13 -05:00
Kurt Grutzmacher
b863ff048e Add migrate control to Auth.wiki()
The Auth.wiki() function does not allow for control of the migration
settings, always defaulting to migrate=True. In some instances the
developer may want to not force migration. This change adds the
ability to set the migrate option. Fake_migrate was not added but
can be if desired.
2013-04-05 09:25:20 -07:00
Kurt Grutzmacher
79a4693f34 Adds IS_IPADDRESS() to gluon/validators.py
IS_IPADDRESS() is mostly a meta function that will call IS_IPV4()
or IS_IPV6 accordingly based upon both dev-configured logic and
library checking of the address given. For instance:

 >>> IS_IPADDRESS()('192.168.1.5')
 ('192.168.1.5', None)

will run through the IS_IPV4() function since the ipaddr.py lib
recognizes it as an IPv4 address. Specific v4 or v6 validation
can be done by setting is_ipv4=True or is_ipv6=True:

 >>> IS_IPADDRESS(is_ipv4=True)('fe80::126c:8ffa:fe22:b3af')
 ('fe80::126c:8ffa:fe22:b3af', 'enter valid IP address')
 >>> IS_IPADDRESS(is_ipv6=True)('192.168.1.1')
 ('192.168.1.1', 'enter valid IP address')

The same arguments for IS_IPV4() and IS_IPV6() are supported and
no changes have been made to either of these two functions. The
goal of this function is to allow IPv4 or IPv6 addresses in a
textfield:

 INPUT(_type='text', _name='name', requires=IS_IPADDRESS())
2013-04-05 09:14:37 -07:00
mdipierro
0f0a62ef7f possible fix for Issue 1426:Count(*) query is incorrect when SQLFORM.grid() contains groupby parameter, thanks daveshih01 2013-04-04 21:11:19 -05:00
mdipierro
cc8a21aedf document better the -X option, thanks Niphlod 2013-04-03 16:49:15 -05:00
mdipierro
38fff6fb91 better reporting in scheduler, thanks Niphlod 2013-04-03 16:42:27 -05:00
mdipierro
e87a2bf0d5 populate(...contents), thanks Vinicius 2013-04-03 14:46:13 -05:00
mdipierro
6b3cdb5a99 fixed string concatenation in MySQL 2013-04-03 11:32:17 -05:00
mdipierro
e2191175da smarter CONTAINS and REPLACE 2013-04-03 09:50:28 -05:00
Massimo
4a7f15bb04 fixed typo in examples page 2013-04-02 16:15:26 -05:00
mdipierro
e6c58c3c6f Issue 1425:Check NoSQL, not GAE or Mongo, thanks Alan 2013-04-02 11:22:53 -05:00
mdipierro
bb2407b468 interfear->interfere, thanks Ramos 2013-04-02 11:21:15 -05:00
mdipierro
07e809acb3 app pack custom 2013-04-02 11:12:40 -05:00
mdipierro
7714b5dc7b remove un-necessary checks 2013-04-01 19:18:56 -05:00
mdipierro
ca85d9adab Issue 1418:Enhancement - SQLFORM.grid param. to change selectable option's submit button text, thanks bpeterso2013 2013-04-01 14:39:20 -05:00
mdipierro
41a9f12024 fixed Issue 1419:Using a recursive select but encountered a broken reference (versioning and auth.signature) 2013-04-01 14:36:14 -05:00
mdipierro
669691bbea Issue 1423:smartgrid multiple links to related table - how to suppress all but one, thanks cjkske 2013-04-01 14:14:41 -05:00
mdipierro
6ac38e7c56 fixed Issue 1414:Error with ldap_auth and using allowed_groups against AD 2008, thnaks Peter Gastinger 2013-04-01 12:45:09 -05:00
mdipierro
359758804b fixed contains(field) in postgresq for list:string 2013-04-01 09:32:44 -05:00
mdipierro
9400a0c7a1 fixed spanish translation, thanks neoecos 2013-03-31 19:14:17 -05:00
mdipierro
ea34d1b3a0 fixed issue 1422, rss serializer encoding, thanks neoecos 2013-03-31 19:11:31 -05:00
mdipierro
72e9921901 fixed problem with hideerror, thanks Ricardo 2013-03-31 19:09:27 -05:00
mdipierro
d6af8279bc Merge pull request #68 from mictee/any_of_validator
Added an ANY_OF validator
2013-03-31 16:17:48 -07:00
mdipierro
cd005b01c0 Merge pull request #69 from grutz/IS_IPV6
Adds IS_IPV6() validator using Google ipaddr.py library
2013-03-31 16:16:50 -07:00
mdipierro
fa04c23bbf Merge branch 'master' of github.com:web2py/web2py 2013-03-31 18:15:41 -05:00
mdipierro
6ecc09f286 Merge pull request #70 from gokceneraslan/patch-1
Render form content instead
2013-03-31 16:14:53 -07:00
mdipierro
4b0f6aff73 better Expose 2013-03-31 15:32:15 -05:00
Gökçen Eraslan
c451f57d4e Render form content instead 2013-03-29 22:25:39 +01:00
Kurt Grutzmacher
721cb2b90a Adds IS_IPV6() validator using Google ipaddr.py library
ipaddr.py library rev/3144 has been approved as a standard python
library for python3. IS_IPV4() was not modified to use the library.
2013-03-29 08:55:06 -07:00
mdipierro
01d5302a2d no more bzr 2013-03-29 02:31:41 -05:00
mdipierro
706324b9c6 cleanup of whitespaces in scripts 2013-03-29 02:30:15 -05:00
mdipierro
244d3c68eb fixed newlines 2013-03-29 02:13:35 -05:00
mdipierro
fcfa8aa917 added common_filter tests 2013-03-29 02:08:41 -05:00
mdipierro
8438a432e9 fixed issue 1405, ORDERBY and mssql, thanks Niphlod 2013-03-28 15:18:44 -05:00
mdipierro
9d5e0b24f7 Merge pull request #66 from mictee/arch_run_script
Improved process handling an error handling in web2py.archlinux.sh
2013-03-28 13:09:40 -07:00
mdipierro
4480acd6f7 Merge pull request #67 from michele-comitini/master
avoid ordering on limitby
2013-03-28 13:05:09 -07:00
mdipierro
cd1ce28639 encoding in mail.send, thanks Jonathan 2013-03-28 14:59:06 -05:00
mdipierro
bf5fbd8b09 fixed issue 1411, list of vars when using radiowidget, thanks Dmitry Mosin 2013-03-28 14:46:31 -05:00
mdipierro
515e284c22 issue 1412, common_filters and joins, thanks Felipe Merelles 2013-03-28 14:44:32 -05:00
mictee
f98548827a Added an ANY_OF validator that allows a value to be valid according to any of a list of validators. 2013-03-26 17:24:19 +01:00
Michele Comitini
b67e57f275 avoid ordering on limitby 2013-03-26 15:30:53 +01:00
mictee
7005fb655c Improved process handling an error handling in web2py.archlinux.sh 2013-03-26 13:47:41 +01:00
mdipierro
b9189771d0 fixed mongodb issue 1401 and improvements, thanks Alan 2013-03-25 15:27:45 -05:00
mdipierro
b15211064d fixed NoSQL Json, thanks Alan 2013-03-25 15:25:29 -05:00
Massimo
30ea9ac56b fixed cache and it.py, thanks Niphlod 2013-03-22 15:38:05 -05:00
Massimo
dab4950f14 fixed cs BOM hopefully 2013-03-22 15:37:00 -05:00
Massimo
0fce3655d5 enabling test_web tests in travis, thanks Niphlod 2013-03-21 15:10:32 -05:00
Massimo
91504fbc2c better test_web.py, thanks Niphlod 2013-03-21 12:04:39 -05:00
Massimo
4b17684980 fixed issue 1397, fixed CHAR_LENGTH in Firebird thanks Villas 2013-03-21 11:29:31 -05:00
Massimo
675245eb15 fixed issue 1398, brackets in libspatialite load extension, thanks rmdpedroso 2013-03-21 11:21:53 -05:00
mdipierro
3494fa2d0d changed the logic behind tz 2013-03-18 22:48:52 -05:00
mdipierro
87a593845c added a test, thanks Jonathan 2013-03-18 22:03:39 -05:00
Massimo
b9d80fcdc7 R-2.4.5 2013-03-18 17:37:49 -05:00
Massimo
3f7d085f73 fixed timezone and textarea default width 2013-03-18 17:34:06 -05:00
Massimo
d57dd72780 upgraded fpdf, better tests, passes travis.ci tests, thanks Niphlod 2013-03-18 16:59:57 -05:00
Massimo
a8d1d5cfcf upgraded fpdf, better tests, passes travis.ci tests, thanks Niphlod 2013-03-18 16:52:47 -05:00
mdipierro
8857e3d521 IS_DATE/DATETIME/etc. (timezone=user_timezone in hrs) 2013-03-17 18:53:19 -05:00
mdipierro
3b1a5be1be fixed (possibly) truncate for GAE 2013-03-17 15:27:47 -05:00
mdipierro
c9a63a8524 fixed issue 1393, cast_keys in dict for python 2.5 support, thanks Alan and Niphlod 2013-03-17 12:11:10 -05:00
mdipierro
cd967d2551 new travis.ci 2013-03-16 20:53:24 -05:00
mdipierro
92b5247f9f typo Fir(e)bird, thanks Jonathan 2013-03-15 21:27:52 -05:00
mdipierro
45a5b436c8 patched fpdf for 2.5, thanks Niphlod 2013-03-15 15:28:50 -05:00
mdipierro
bfd385f969 travis badge in README, thanks niphlod 2013-03-15 15:12:01 -05:00
mdipierro
f693fe6b2a added .travis.yml 2013-03-15 14:55:36 -05:00
mdipierro
b040159a9b fixed issue 1385, thanks Alan 2013-03-15 14:14:40 -05:00
mdipierro
f3af2a1999 fixed issue 1382, sanitizer accepts mailto, thanks lightdot 2013-03-15 10:17:33 -05:00
mdipierro
f613a4cc99 wiki.settings, thanks Alan 2013-03-15 10:14:33 -05:00
mdipierro
e4a96125a6 fixed issue 1390, dateTtime separator in MSSQL, thanks score2000 2013-03-15 10:05:52 -05:00
mdipierro
e48074ff54 fixed issue 1391, sub for decimal 2013-03-15 10:00:45 -05:00
mdipierro
2ed122a534 fixed typo, thank you Philipp Storz 2013-03-15 09:49:46 -05:00
mdipierro
65c0d9b18b italian patch 2013-03-15 09:46:55 -05:00
mdipierro
6702694590 fixed slidetoggle boxes in new admin, thanks Annet and Niphlod 2013-03-15 09:44:22 -05:00
mdipierro
6f0d4d039e fixed upload default values, thanks Marin Pranjic 2013-03-15 09:38:47 -05:00
mdipierro
1325b0e48f Merge pull request #65 from michele-comitini/master
HTTP exceptions in jsonrpc2
2013-03-15 07:25:55 -07:00
Michele Comitini
7421eb8068 avoid treating HTTP redirections or status codes generated in jsonrpc2 functions as error exceptions 2013-03-14 21:54:38 +01:00
Michele Comitini
6c7a9a4030 avoid treating HTTP redirections or status codes generated in jsonrpc2 functions as error exceptions 2013-03-14 21:49:05 +01:00
Massimo
ba0a143717 scheduler patch allows termination of tasks, thanks niphlod 2013-03-12 10:40:57 -05:00
mdipierro
28bcb5ed6c added sessions in cookie for examples 2013-03-11 18:12:01 -05:00
mdipierro
44fd637a1f R-2.4.4 2013-03-11 15:26:36 -05:00
mdipierro
f13aed1a84 R-2.4.3 2013-03-11 14:41:10 -05:00
mdipierro
cb3de825f2 /examples/default/version/raw 2013-03-11 14:38:04 -05:00
mdipierro
fd4c775710 split->partition, thanks Ricardo 2013-03-11 14:28:48 -05:00
mdipierro
3e550b3e97 Merge branch 'master' of github.com:web2py/web2py 2013-03-11 14:25:01 -05:00
mdipierro
7a543250f9 Merge pull request #64 from michele-comitini/master
uwsgi doen't like unicode headers
2013-03-11 12:24:38 -07:00
mdipierro
a071f07634 fixed issue with version 2013-03-11 14:22:40 -05:00
Michele Comitini
a078f860d2 basic auth header changed to string from unicode 2013-03-11 18:42:00 +01:00
mdipierro
2bfd7a2467 fixed issue 1327, breadcrumbs in smartgrid 2013-03-11 11:10:45 -05:00
mdipierro
55c9392de4 fixed ccache, issue 1377 2013-03-11 10:22:40 -05:00
mdipierro
7991b555ff fixed some style issues 2013-03-11 10:01:03 -05:00
mdipierro
eab7815c24 Merge pull request #63 from michele-comitini/master
rfc basic auth challenge
2013-03-11 07:46:29 -07:00
mdipierro
79c09de103 fixed download bug 2013-03-11 09:45:20 -05:00
mdipierro
24daa335b6 examples uses cookie based sessions 2013-03-11 08:50:01 -05:00
Michele Comitini
812ba9d52b docstring improved 2013-03-11 14:40:34 +01:00
mdipierro
00fb3b56cc fixed some links 2013-03-11 08:25:44 -05:00
Michele Comitini
3644d081f6 rfc compliant basic auth 2013-03-11 13:13:08 +01:00
mdipierro
f05c46b3f1 partially fixed alignment in examples 2013-03-11 01:02:31 -05:00
mdipierro
13e76fe278 removed sitemap 2013-03-11 00:58:14 -05:00
mdipierro
0906ae28c1 no more plugin wiki 2013-03-10 22:12:46 -05:00
mdipierro
04905adb89 new examples based on bootstrap. no more skeleton.css 2013-03-10 21:58:50 -05:00
mdipierro
9767109d4e changed retrieve again 2013-03-10 17:40:36 -05:00
mdipierro
a57919bc4d share widget 2013-03-10 17:08:43 -05:00
mdipierro
c7c94d1f8f added image 2013-03-10 17:04:53 -05:00
mdipierro
817e6c3313 changed header of example... should move examples to bootstrap 2013-03-10 16:55:47 -05:00
mdipierro
a23f4c5c88 Merge branch 'master' of github.com:web2py/web2py 2013-03-10 15:58:24 -05:00
mdipierro
eac9768549 Merge pull request #62 from michele-comitini/master
jsonrpc-2.0
2013-03-10 13:58:18 -07:00
mdipierro
a42fb6b558 Merge branch 'master' of github.com:web2py/web2py 2013-03-10 15:57:17 -05:00
mdipierro
879e825b61 Merge pull request #61 from clach04/master
Improved Ingres support, no longer needs IngresDBI, uses pyodbc instead
2013-03-10 13:56:55 -07:00
mdipierro
07f4310153 questions in examples 2013-03-10 15:45:15 -05:00
mdipierro
10c67e5be3 google group, no chat 2013-03-10 13:05:58 -05:00
mdipierro
1279d5ddaa added codemirror link, thanks Niphlod 2013-03-10 12:55:22 -05:00
mdipierro
2af15e4b27 fixed help link again 2013-03-10 12:51:09 -05:00
mdipierro
3096fcf045 chat in admin 2013-03-10 12:48:04 -05:00
mdipierro
831492448a a2enmod wsgi in ubuntu setup script, thanks badweather.FBI 2013-03-10 11:38:36 -05:00
mdipierro
a5284e846c DIV(...,data=dict(action='whatever') 2013-03-10 11:27:13 -05:00
mdipierro
22accaced3 cache.client 2013-03-10 11:14:30 -05:00
mdipierro
f92d97f36e fixed bug in encode/decode, thanks Jonathan 2013-03-10 11:06:20 -05:00
mdipierro
4f0a16a24c fixed flash 2013-03-10 11:04:43 -05:00
mdipierro
72dade793a attempt to support unicode in IT_MATCH 2013-03-10 10:45:29 -05:00
mdipierro
8addc54015 better cron stopping, thanks Álvaro José Iradier 2013-03-10 10:21:47 -05:00
mdipierro
25ab6f9a07 better twitter feed display 2013-03-10 09:10:30 -05:00
mdipierro
b853f72e0c possibly fixed size spike in uploads in grid, thanks Ricardo 2013-03-10 08:25:54 -05:00
mdipierro
449a658521 fixed GAE to better support ustom_qualifier, thanks cfhowes 2013-03-10 08:19:28 -05:00
mdipierro
7776a22533 fixed Ingres constr typo, thanks Chris Clark 2013-03-10 07:54:44 -05:00
Michele Comitini
554eccc14a fixed request missing current prefix causing wrongly handled exceptions. 2013-03-09 21:29:06 +01:00
Michele Comitini
8cd6928da3 Revert "fixed request missing current prefix causing wrongly handled exceptions."
This reverts commit 8c28be1041.
Removed NEWINSTALL by error.
2013-03-09 21:21:26 +01:00
Michele Comitini
8c28be1041 fixed request missing current prefix causing wrongly handled exceptions. 2013-03-09 21:16:58 +01:00
mdipierro
810aa8f4f3 noconfirm in grid, thanks Niphlod 2013-03-09 09:36:17 -06:00
mdipierro
8e5be952bf fixed alignment in admin tooltips, thanks Paolo 2013-03-09 09:34:27 -06:00
mdipierro
5a560fee8a cleaned up examples/controller/global.py 2013-03-09 00:17:56 -06:00
clach04
21819ffc5d Remove dependency on IngresDBI, use pyodbc instead for Ingres/Vectorwise support. 2013-03-08 18:09:41 -08:00
mdipierro
1f8bdd6061 fixed search in design 2013-03-08 19:22:51 -06:00
Massimo
523c813439 fixed some layout problems 2013-03-08 16:30:11 -06:00
mdipierro
7ee638bc36 Merge pull request #60 from michele-comitini/master
oauth 2 fixes
2013-03-08 10:13:17 -08:00
mdipierro
76c515d3af Merge pull request #59 from pyner/patch-1
Update gluon/globals.py
2013-03-08 10:11:50 -08:00
Massimo
1c8ce00657 reverted recent change to retrieve, thanks Anthony for pointing out why the original correct is better than the 'fixed' one 2013-03-08 12:06:05 -06:00
Michele Comitini
0f4bbecd2a Merge with upstream 2013-03-08 18:36:52 +01:00
Michele Comitini
e292f5a869 removed http_x_forwarded for until a better solution is found. 2013-03-08 18:36:06 +01:00
Massimo
da25c6f843 fixed CONTAINS (again) 2013-03-08 10:19:13 -06:00
Massimo
5122fbe110 fixed issue 1366, minor rewrite in retrieve, thanks Dominic 2013-03-08 10:16:48 -06:00
Massimo
dee3a3b655 fixed issue 1358, himBH>jQuery, thanks FeDjango 2013-03-08 10:06:03 -06:00
mdipierro
4e2bcd22d9 added cheatsheet 2013-03-06 12:37:44 -06:00
mdipierro
17890027a6 fixed issue 1357, date/datetime serialization in as_dict, thanks Alan 2013-03-06 12:31:39 -06:00
mdipierro
5e93804525 fixed issue 1359, typo in dal custom qualifier, thanks Vincenzo 2013-03-06 12:28:48 -06:00
mdipierro
778070dd8a fixed issue 1361, typo in contains, thanks Villas 2013-03-06 12:27:06 -06:00
mdipierro
74ecc762f3 fixed issue 1363, failsafe when languages folder does not exist, thanks Roberto 2013-03-06 12:24:30 -06:00
mdipierro
63f7b35cf8 fixed issue 1364, unicode in emails, thanks Corne 2013-03-06 12:21:22 -06:00
Massimo
0c3f4601cc 5th edition book link 2013-03-05 14:29:54 -06:00
mdipierro
9f0760c887 2.4.2 2013-03-03 21:23:16 -06:00
mdipierro
6d787d3e7e fixed typo in keyed tables, thanks Denes 2013-03-03 13:49:44 -06:00
mdipierro
f79b04884c dal parse_date should always return date, issue 1344, thanks Niphlod 2013-03-02 12:56:12 -06:00
mdipierro
23af844d5b added content-type entries, thanks Niphlod 2013-03-02 12:54:36 -06:00
mdipierro
ea7d82acf9 auth.accessible_query(query or set), isue 1356, thanks Alan 2013-03-02 12:52:22 -06:00
mdipierro
f492148958 cs language no BOM, thanks David 2013-03-02 11:29:55 -06:00
mdipierro
8414e638ec fixed problem with keyed tables, thanks Denes 2013-03-02 09:18:04 -06:00
Massimo
0193db35b6 added Czech, thanks you David Herman 2013-03-01 12:46:20 -06:00
mdipierro
b891723bab Form serialization enhancement, issue 1351, thanks Alan 2013-02-27 09:53:36 -06:00
mdipierro
1d8aa5672e re-synced plugin mobile, just in case 2013-02-27 09:48:06 -06:00
Massimo
0def24381e more attributes in virtual fields, thanks Donatas Burba 2013-02-26 11:40:59 -06:00
mdipierro
b441e99e95 fixed has_membership True for invalid groups 2013-02-25 23:19:55 -06:00
mdipierro
40ceb92195 experimental patch to disable automatic GAE indexing, thanks howesc 2013-02-23 14:51:45 -06:00
mdipierro
38cac5dd58 no more xxx, thanks Howesc 2013-02-22 18:45:26 -06:00
mdipierro
b64bf54f3e fixed keyed table issue, thanks Denes 2013-02-22 10:18:59 -06:00
Massimo
5d9fc2e9af fixed issue VirtualFields in select options 2013-02-21 10:21:31 -06:00
Massimo
9c970632c5 scheduler patch, thanks Niphlod 2013-02-21 10:16:30 -06:00
Massimo
58c32f5a05 patch for sanitizer allowed tags, thanks Alan 2013-02-21 09:58:28 -06:00
Massimo
8961060461 issue 1350, enhance form serialization for services/json output, thanks Alan 2013-02-21 09:45:16 -06:00
Massimo
5f290544e0 writedoc.py 2013-02-20 10:38:02 -06:00
mdipierro
7f4dc7ed42 added logging in db._lastsql the CREATE TABLE 2013-02-18 13:54:10 -06:00
pyner
101b74398f Update gluon/globals.py
typescript support (http://www.typescriptlang.org/)
2013-02-18 14:36:12 -05:00
mdipierro
a36366ac61 changed in requires which may have fixed issue 1330 2013-02-17 21:30:21 -06:00
mdipierro
55afa0f31d upgraded fpdf to 1.7.1 2013-02-17 11:28:02 -06:00
mdipierro
892471d8e5 fixed issue 1340, bugs in as_dict, thanks Alan 2013-02-17 09:49:44 -06:00
mdipierro
4334ae38ed fixed issue 1339, faster IS_NOT_IN_DB 2013-02-17 01:00:01 -06:00
mdipierro
be2ef9b626 fixed issue 1336 again 2013-02-16 10:00:35 -06:00
mdipierro
954e84db3c reverting change to issue 1336 2013-02-16 09:31:47 -06:00
mdipierro
8e63c8f937 using google for QR codes, thanks 黄祥 2013-02-16 09:15:26 -06:00
mdipierro
93f26540e6 allow component that do not reload, thanks Niphlod 2013-02-15 17:33:55 -06:00
mdipierro
08150f3a9d fixed issue 1337, as_dict(...,field_options=True), thanks Alan 2013-02-15 17:29:00 -06:00
mdipierro
c9ad41288f uri not None, issue 1336, thanks Anthony 2013-02-15 17:25:58 -06:00
mdipierro
46d3fd92c9 _insert_empty, thanks Alan 2013-02-15 17:24:37 -06:00
Massimo
564f07e354 IS_EXPR(lambda value: None(=) 2013-02-15 10:51:30 -06:00
Massimo
5618350c0b added web2py.gif, thanks Niphlod 2013-02-14 17:34:04 -06:00
Massimo
77808c958c web2py icon in ubuntu, thanks Niphlod 2013-02-14 16:10:57 -06:00
Massimo
c121589499 fixed bug in latest commit, thanks Niphlod 2013-02-14 14:41:52 -06:00
Massimo
18d2cc4f12 fixed issue 1334, thanks Jonathan Bohren 2013-02-14 14:22:46 -06:00
Massimo
50193471d6 better IS_NOT_IN_DB, new scheduler API, after_connection dal callback, thanks Niphlod 2013-02-14 14:15:27 -06:00
mdipierro
7ef19ecf47 allow a dict as uri, issue 1316, thanks Alan 2013-02-13 09:36:07 -06:00
mdipierro
098da4124f fixed yaml import issue 1333, thanks Alan 2013-02-13 09:31:26 -06:00
mdipierro
b39788f883 fixed issue 1331, unkown http_x_forwarded_for, thanks Tyrone 2013-02-13 09:29:47 -06:00
mdipierro
ae803727e9 auth.settings.ondelete='CASCADE', issue 1328 2013-02-13 08:41:31 -06:00
mdipierro
f2dca4698c issue 1325 (hidden->display:none), thanks Anthony 2013-02-13 08:35:42 -06:00
mdipierro
b940837c51 upgraded pypyodbc.py, thanks 江文 <jiangwen365@gmail.com> 2013-02-11 00:26:59 -06:00
mdipierro
481b6455f3 added pypyodbc 2013-02-10 23:28:32 -06:00
mdipierro
b5b3fda329 'user' -> self.settings.function, thanks Vishal Agarwal 2013-02-10 23:22:34 -06:00
mdipierro
a634c055c4 Merge pull request #58 from mwielgoszewski/master
Cryptographic vulnerabilities: Key as IV, insecure HMAC comparison
2013-02-10 15:17:54 -08:00
mdipierro
6a4012bfcc Merge pull request #57 from michele-comitini/master
OAuth 2.0 rfc6749 compliance
2013-02-10 15:15:43 -08:00
mdipierro
befa55d0e1 Merge pull request #56 from jbohren-forks/fix-formstyle-help
Switching style class for auto-generated form help to "help-block"
2013-02-10 15:14:40 -08:00
mdipierro
e31a9005ba Merge branch 'master' of github.com:web2py/web2py 2013-02-10 17:13:43 -06:00
mdipierro
aaa379ead0 Make the menu html serializer pass LI items through as-is (allows for separators), issue github 55, thanks Jonathan Bohren 2013-02-10 17:12:44 -06:00
mdipierro
c31ac85bfa Merge pull request #55 from jbohren-forks/fix-manual-li-in-menu
Make the menu html serializer pass LI items through as-is (allows for separators)
2013-02-10 15:12:15 -08:00
Michele Comitini
33ada924e8 manage https scheme without relying only on wsgi info 2013-02-09 15:06:33 +01:00
Michele Comitini
211462ecbc Merge github.com:web2py/web2py 2013-02-09 02:27:16 +01:00
Massimo
ae12b74620 mysql regexp 2013-02-08 13:01:36 -06:00
Massimo
66c3855e23 id!=None in grid 2013-02-08 12:42:10 -06:00
mdipierro
343f295b6b better parse as rest, thanks Denes 2013-02-07 05:37:14 -06:00
mdipierro
f90dbb9321 fixed custom_import indentation 2013-02-06 17:22:11 -06:00
mdipierro
5ab85ee20e fixed importing of local packages first (I hope) 2013-02-06 11:34:42 -06:00
mdipierro
0c0830c1df added missing files to git 2013-02-06 10:32:02 -06:00
mdipierro
4a8a41de91 if False: import import_all 2013-02-06 10:21:41 -06:00
mdipierro
9afa21cd30 simpler Makefile 2013-02-06 10:12:13 -06:00
mdipierro
d1d3c171fd fixed issue 1321, shorter admin titles, thanks Argetlam Akshet 2013-02-06 09:53:52 -06:00
Massimo
a7c6268d2c unlocking session in download 2013-02-05 13:23:51 -06:00
Massimo
409495cc70 removed pypyodbc test 2013-02-05 10:44:16 -06:00
mdipierro
0460ffdb28 added span and strong to allowed_tags 2013-02-05 08:49:58 -06:00
mdipierro
cbb9a1fdbe added pypyodbc.py, thanks Derek 2013-02-05 08:46:32 -06:00
mdipierro
ba603528d7 grid breadcrumbs uses field.label, not field.name, thanks Michael Beller 2013-02-04 16:45:42 -06:00
mdipierro
9069f06857 fixed cache expiration in grid downloads, thanks Niphlod 2013-02-04 15:12:15 -06:00
mdipierro
8f76efeb2f fixed issue 1320 (http://timelessrepo.com/json-isnt-a-javascript-subset), thanks Alan 2013-02-04 10:03:29 -06:00
mdipierro
4fb8333299 added comments to explain caveats with last commit 2013-02-04 10:01:00 -06:00
mdipierro
6b9d7af4ed passing parameters for contains case_sensitive but often ignored. :-( 2013-02-04 09:55:21 -06:00
mdipierro
7c1f6c2195 optional_args 2013-02-04 09:37:44 -06:00
mdipierro
90f8f223b9 fixed issue 1318, as_yaml, thanks Alan 2013-02-04 09:28:09 -06:00
mdipierro
d06a1a68a0 allow export/import of db models, issue 1316 (experimental), thanks Alan 2013-02-03 09:11:13 -06:00
mdipierro
af7a922cac fixed issue 1315, IE9 layout, thanks Duffy Nicholas 2013-02-03 09:09:18 -06:00
mdipierro
a6d4e2340e reverted last change, better to use wiki.menu 2013-02-01 21:24:30 -06:00
mdipierro
ecdd7f6733 fixed menus in auth.wiki() 2013-02-01 21:16:21 -06:00
mdipierro
d407bdbbbc better scripts/setup-web2py-nginx-uwsgi-on-centos.sh, thanks Alan 2013-01-30 14:25:49 -06:00
mdipierro
ef06262393 returning more info from auth.wiki, thanks Paolo 2013-01-30 12:48:08 -06:00
mdipierro
0328ed49b9 fixed mssql3 groupby/orderby issue, thanks Niphlod. 2013-01-30 12:30:23 -06:00
mdipierro
0719af011b operator serilization in DAL, thanks Alan 2013-01-30 09:45:00 -06:00
mdipierro
14bd35e348 fixed issue 1306 rendering of width in markmin, thanks dickschrauwen 2013-01-30 09:41:41 -06:00
mdipierro
8740fea7c1 allow multiple left joins in grid 2013-01-30 09:29:49 -06:00
Massimo
45969c7628 added note to scripts/setup-web2py-nginx-uwsgi-on-centos.sh, thanks Alan 2013-01-29 16:27:46 -06:00
Massimo
698286dbe0 Query/Set enhancements for client/service apps, thanks Alan 2013-01-29 16:25:10 -06:00
mdipierro
d238b5e86d Row.__delitem__ 2013-01-28 20:48:02 -06:00
Marcin Wielgoszewski
d16b5899e8 never use secret key as an initialization vector 2013-01-27 12:47:19 -05:00
Marcin Wielgoszewski
76b035b800 actually use the constant-time compare function in secure_loads 2013-01-27 12:23:42 -05:00
mdipierro
3bb8d5e235 configurable appadmin graphs, thanks Jose 2013-01-27 10:25:02 -06:00
mdipierro
8fe3934c6e fixed codemirror syntax highlighting, thanks Mariano 2013-01-27 09:59:19 -06:00
mdipierro
ec7c8f0248 added bottom right save button in edit_languages, issue 1300 2013-01-27 09:46:22 -06:00
Massimo
147b2d889d db.as_json/as_xml thanks Alan (This is tentative and experimental) 2013-01-25 15:36:23 -06:00
Massimo
ca330a99e2 issue 1302, support for expressions in CONTAINS, thanks Paolo 2013-01-25 15:29:04 -06:00
Michele Comitini
2eeb1e74b2 gluon/tools.py: correct error codes for Jsonrpc-2.0 exceptions.
gluon/contrib/login_methods/oauth20_account.py: removed dead code.
2013-01-25 21:41:14 +01:00
Massimo
d4e68e6c18 more modular setup-web2py-nginx-uwsgi-ubuntu, thanks Paolo and Niphlod 2013-01-24 15:52:21 -06:00
Massimo
356643d509 check whether pgsql supports json fields, thanks Alan 2013-01-24 10:51:44 -06:00
Michele Comitini
9a957c907a merge with upstream 2013-01-24 02:10:16 +01:00
Michele Comitini
d97ef82bb7 removed need for globals 2013-01-24 02:06:19 +01:00
Michele Comitini
a751c0e03a Compliance with rfc6749. Added backward compatibility with Facebook custom implementation. Simpler and faster flow. 2013-01-24 02:04:01 +01:00
mdipierro
4c50c69fbb fixed gevent monkey patching problem, thank you JimK 2013-01-23 08:49:00 -06:00
mdipierro
b1f77b9c4a reverted 4622 codemirror3 because broke zencoding and drops support for IE7, we do not use the new features anyway. Sorry 2013-01-23 08:17:59 -06:00
Michele Comitini
2db2737e86 Updated to rfc6749. Added backward compatibility to match facebook implementation. Simpler flow. 2013-01-23 12:43:27 +01:00
Massimo
b7f2991246 fixed font-family in codemirror, thanks Mariano 2013-01-22 16:27:00 -06:00
Jonathan Bohren
c4483b4587 Switching message type for auto-generated forms 2013-01-22 00:00:46 -05:00
Jonathan Bohren
9c63b7c71b Make the menu html serializer pass LI items through as-is 2013-01-21 23:48:42 -05:00
mdipierro
a443631f11 fixed IS_JSON, thanks Alan 2013-01-21 16:42:42 -06:00
mdipierro
d15f13dcbd Adapter.native_json 2013-01-21 14:13:05 -06:00
mdipierro
1518cbd16e fixed json odd behavior 2013-01-21 14:05:45 -06:00
mdipierro
65cd2233f3 fixed tkMessageBox problem, thanks Bruno 2013-01-21 08:39:44 -06:00
mdipierro
8ac1a8cc05 json-rpc2 support, thanks Michele 2013-01-21 08:36:00 -06:00
mdipierro
d369310a5c commented unwanted style info in admin 2013-01-21 08:25:20 -06:00
mdipierro
1d15871a69 fixed incorrect template validator in wiki, thanks Alan 2013-01-20 21:36:02 -06:00
mdipierro
35e7f4265b allows modifiers in parse_as _rest, thanks Denes 2013-01-20 21:24:07 -06:00
mdipierro
bb0be8a523 attempt to fix issue 1296, ipv6 header parsing 2013-01-20 14:51:53 -06:00
mdipierro
6684754a47 fixed issue 1295, more git issues, thanks Alan 2013-01-20 14:50:20 -06:00
mdipierro
c214999e27 fixed issue 1294, thanks Vincent Chevrier 2013-01-20 14:48:45 -06:00
mdipierro
9e1ce571e4 fixed issue with multiple string expressions in select 2013-01-20 14:22:59 -06:00
mdipierro
2b968814c5 fixed previous commit error 2013-01-20 14:13:43 -06:00
Michele Comitini
8abff891c3 Added batch (serial) processing 2013-01-20 15:36:17 +01:00
Michele Comitini
e8189636b3 again correct management of null id: avoid returning None by sending empty string. 2013-01-20 00:14:02 +01:00
Michele Comitini
795886d2f2 again correct management of null id. 2013-01-20 00:07:12 +01:00
Michele Comitini
d17f3bedd3 correct management of null id. 2013-01-20 00:03:22 +01:00
Michele Comitini
9311e7c94f fixed comment for jsonrpc-2.0 example. 2013-01-19 23:54:02 +01:00
Michele Comitini
10193dd014 forward compatibility with jsonrpc-2.0 for @service.jsonrpc annotation. 2013-01-19 23:51:30 +01:00
Michele Comitini
bc44bb0fe9 Merge github.com:web2py/web2py 2013-01-19 23:27:58 +01:00
Michele Comitini
e980c5d762 Merge github.com:web2py/web2py 2013-01-19 18:33:13 +01:00
Michele Comitini
6a497b3894 jsonrpc 2.0 added to services. 2013-01-19 18:32:17 +01:00
Massimo
317d910cd3 .vtt in contenttype, thanks Magnitus 2013-01-18 10:01:01 -06:00
Massimo
6248fb89b3 .vtt in contenttype, thanks Magnitus 2013-01-18 10:01:01 -06:00
Massimo
51f5e40b37 fatch IMAP inbox size in dal, thanks Alan 2013-01-18 09:20:30 -06:00
Massimo
ad048a8d5b fatch IMAP inbox size in dal, thanks Alan 2013-01-18 09:20:30 -06:00
Massimo
7b4a0515be fixed issue 1291, casting to string for like operator, thanks Dominic 2013-01-18 09:14:19 -06:00
Massimo
3d9d9448aa fixed issue 1291, casting to string for like operator, thanks Dominic 2013-01-18 09:14:19 -06:00
Massimo
e90000545b highligthing wiki menu items, 1290, thanks Paolo 2013-01-18 09:09:21 -06:00
Massimo
dc248dbbde highligthing wiki menu items, 1290, thanks Paolo 2013-01-18 09:09:21 -06:00
Massimo
ea01ec0f0e fixed issue 1289, fixed wiki templates, thanks Alan 2013-01-18 09:05:39 -06:00
Massimo
cf0c62f0c4 fixed issue 1289, fixed wiki templates, thanks Alan 2013-01-18 09:05:39 -06:00
Massimo
ddc6da53b3 fixed searilization of request/response/session in tickets (they are stored as html, thanks Dominik 2013-01-17 17:33:17 -06:00
Massimo
bb40239ed0 fixed searilization of request/response/session in tickets (they are stored as html, thanks Dominik 2013-01-17 17:33:17 -06:00
Massimo
a2aa738f19 removed un-necessary code, thanks Mariano 2013-01-17 11:34:52 -06:00
Massimo
c2ae4776a2 removed un-necessary code, thanks Mariano 2013-01-17 11:34:52 -06:00
mdipierro
c0e1987b66 Merge pull request #52 from jbohren-forks/stable
Fixing indentation in readme
2013-01-17 09:11:36 -08:00
mdipierro
344f7cc5df Merge pull request #52 from jbohren-forks/stable
Fixing indentation in readme
2013-01-17 09:11:36 -08:00
mdipierro
b7118a7d44 Merge pull request #51 from TierraDelFuego/master
Change/deletion in call to python interpreter
2013-01-17 09:11:18 -08:00
mdipierro
dea15ab6bd Merge pull request #51 from TierraDelFuego/master
Change/deletion in call to python interpreter
2013-01-17 09:11:18 -08:00
Massimo
b1f74213c6 fixed issue 1279, sys.prefix in tickets, thanks mjmare 2013-01-17 11:08:32 -06:00
Massimo
5b92d712f4 fixed issue 1279, sys.prefix in tickets, thanks mjmare 2013-01-17 11:08:32 -06:00
Massimo
1122ad65ec codemirror 3, thnaks Roberto Perdomo and Mariano Reingart 2013-01-17 11:00:56 -06:00
Massimo
ab410b6707 codemirror 3, thnaks Roberto Perdomo and Mariano Reingart 2013-01-17 11:00:56 -06:00
mdipierro
5f9094e7d1 wiki(templates=None), thanks Alan 2013-01-16 11:23:29 -06:00
mdipierro
fb4c749115 wiki(templates=None), thanks Alan 2013-01-16 11:23:29 -06:00
mdipierro
3a1c03894f json export in grid, thanks Alan 2013-01-16 09:41:36 -06:00
mdipierro
b171a92449 json export in grid, thanks Alan 2013-01-16 09:41:36 -06:00
Michele Comitini
e5a8319f0b Merge github.com:web2py/web2py 2013-01-16 12:22:56 +01:00
mdipierro
8f79000d2d fixed recent bug in dal, thanks Denes 2013-01-15 22:23:00 -06:00
mdipierro
a4e926b637 fixed recent bug in dal, thanks Denes 2013-01-15 22:23:00 -06:00
Jonathan Bohren
8ffc89def2 Fixing indentation in readme 2013-01-15 18:09:27 -05:00
Massimo
92cef0b811 scheduler patch, thanks Niphlod 2013-01-15 15:54:29 -06:00
Massimo
ad684bfdfc scheduler patch, thanks Niphlod 2013-01-15 15:54:29 -06:00
Massimo
ccc1de2595 minor refactoring to avoid compatibility problems 2013-01-15 13:26:14 -06:00
Massimo
16b37b1061 minor refactoring to avoid compatibility problems 2013-01-15 13:26:14 -06:00
Massimo
10a39fd52c another parse_as_rest patch, thanks Denes 2013-01-15 13:19:54 -06:00
Massimo
97385d3310 another parse_as_rest patch, thanks Denes 2013-01-15 13:19:54 -06:00
Massimo
8a2c0c320e IMAP attachments in .select(), thanks Alan 2013-01-15 13:09:59 -06:00
Massimo
cea9145400 IMAP attachments in .select(), thanks Alan 2013-01-15 13:09:59 -06:00
Massimo
cf5f1c9c6e fixed git errors issues, thanks Alan, wonderful work 2013-01-15 13:08:27 -06:00
Massimo
1c69eb4ce4 fixed git errors issues, thanks Alan, wonderful work 2013-01-15 13:08:27 -06:00
mdipierro
918971cab8 fixing issue 1276 again, thanks Alan 2013-01-14 15:30:01 -06:00
mdipierro
c1a534bee2 fixing issue 1276 again, thanks Alan 2013-01-14 15:30:01 -06:00
mdipierro
41f5dfaffc gluon/scheduler.py 2013-01-14 15:26:46 -06:00
mdipierro
c60fffc34a gluon/scheduler.py 2013-01-14 15:26:46 -06:00
mdipierro
d05aceb3f3 fixed issue 1276, preserving subject encoding in IMAP adapter, thanks Alan 2013-01-14 09:44:47 -06:00
mdipierro
9dbf0bbbcd fixed issue 1276, preserving subject encoding in IMAP adapter, thanks Alan 2013-01-14 09:44:47 -06:00
mdipierro
cb2c5aae48 fixed issue 1273, default int as_dict, thanks Alan 2013-01-14 09:42:59 -06:00
mdipierro
10af0102f4 fixed issue 1273, default int as_dict, thanks Alan 2013-01-14 09:42:59 -06:00
mdipierro
a2663fc8dd parse_as_rest patch, thanks Denes 2013-01-14 09:18:43 -06:00
mdipierro
fb5e6e927f parse_as_rest patch, thanks Denes 2013-01-14 09:18:43 -06:00
mdipierro
4bbe6ed195 minor fix in parse_as_rest 2013-01-13 13:15:38 -06:00
mdipierro
69fa34b3c5 minor fix in parse_as_rest 2013-01-13 13:15:38 -06:00
mdipierro
b49de3eccb Row.as_xml and Rows.as_csv, issue 1275, thank you Alan 2013-01-13 13:08:41 -06:00
mdipierro
b1f51c30a6 Row.as_xml and Rows.as_csv, issue 1275, thank you Alan 2013-01-13 13:08:41 -06:00
mdipierro
63a049d336 admin/languages/sr-*.py thanks Sasa Kelecevic 2013-01-13 10:44:07 -06:00
mdipierro
05fdf963af admin/languages/sr-*.py thanks Sasa Kelecevic 2013-01-13 10:44:07 -06:00
TierraDelFuego
9b9b79ed58 Add a file to ignore. 2013-01-12 23:41:28 -08:00
TierraDelFuego
97cf2475cf Add a file to ignore. 2013-01-12 23:41:28 -08:00
TierraDelFuego
e363ee0994 Change the call to python from /usr/bin/python to /usr/bin/env python so the correct python is called when using virtualenv. Remove the the call if not needed. 2013-01-12 23:34:35 -08:00
TierraDelFuego
473960a394 Change the call to python from /usr/bin/python to /usr/bin/env python so the correct python is called when using virtualenv. Remove the the call if not needed. 2013-01-12 23:34:35 -08:00
TierraDelFuego
5ff925d583 Removing call to python where it is not needed. 2013-01-12 22:53:43 -08:00
TierraDelFuego
ef60909d4c Removing call to python where it is not needed. 2013-01-12 22:53:43 -08:00
mdipierro
97b22438fa fixed issue 1271, admin/languages/ru.py, thanks Dmitry.Mosin 2013-01-12 14:12:19 -06:00
mdipierro
3eba79d6c5 fixed issue 1271, admin/languages/ru.py, thanks Dmitry.Mosin 2013-01-12 14:12:19 -06:00
mdipierro
b747ac27cb row.as_json simplification thanks Alan 2013-01-12 14:09:05 -06:00
mdipierro
fcf7b1a025 row.as_json simplification thanks Alan 2013-01-12 14:09:05 -06:00
mdipierro
f02735de81 row.as_son, rows.as_json, rows.as_xml, thanks Alan 2013-01-12 14:04:15 -06:00
mdipierro
4c15575194 row.as_son, rows.as_json, rows.as_xml, thanks Alan 2013-01-12 14:04:15 -06:00
mdipierro
bb6e130bfe fixed typo in ru.py, issue 1271, thanks Dmitry.Mosin 2013-01-11 13:38:03 -06:00
mdipierro
e4526f4725 fixed typo in ru.py, issue 1271, thanks Dmitry.Mosin 2013-01-11 13:38:03 -06:00
mdipierro
ec8d9a3714 fixed issue with hiding password, thanks Niphlod 2013-01-11 09:02:22 -06:00
mdipierro
96f4c944c1 fixed issue with hiding password, thanks Niphlod 2013-01-11 09:02:22 -06:00
mdipierro
cc66524e1f imapdb(query).select(imapdb.INBOX.sender, imapdb.INBOX.subject, imapdb.INBOX.seen), issue 1269, thanks Alan 2013-01-10 23:15:46 -06:00
mdipierro
ea07c9dcd8 imapdb(query).select(imapdb.INBOX.sender, imapdb.INBOX.subject, imapdb.INBOX.seen), issue 1269, thanks Alan 2013-01-10 23:15:46 -06:00
mdipierro
7c5c27f556 links to user have _rel='nofollow' 2013-01-10 23:12:01 -06:00
mdipierro
7a94b2dbd6 links to user have _rel='nofollow' 2013-01-10 23:12:01 -06:00
Massimo
b8cfc9630f fixed preview of auth.wiki pages 2013-01-10 15:13:29 -06:00
Massimo
563239147f fixed preview of auth.wiki pages 2013-01-10 15:13:29 -06:00
Massimo
70d701db5b changed pages grid in auth.wiki 2013-01-10 14:54:21 -06:00
Massimo
683f8ebdc7 changed pages grid in auth.wiki 2013-01-10 14:54:21 -06:00
Massimo
b20d963f56 No more templates in wiki, security vulnearbility 2013-01-10 14:29:50 -06:00
Massimo
df653f9f78 No more templates in wiki, security vulnearbility 2013-01-10 14:29:50 -06:00
Massimo
7614955591 IMAP DAL enhancements, thanks Alan 2013-01-10 13:04:38 -06:00
Massimo
8a1b37e8ec IMAP DAL enhancements, thanks Alan 2013-01-10 13:04:38 -06:00
Massimo
8eadfe3d79 fixed issue 1268, better grid search options, thanks Paolo Angulo 2013-01-10 13:01:12 -06:00
Massimo
b9120ddce4 fixed issue 1268, better grid search options, thanks Paolo Angulo 2013-01-10 13:01:12 -06:00
Michele Comitini
4bf840abf3 Merge github.com:web2py/web2py 2013-01-10 00:25:31 +01:00
mdipierro
90dbf440c7 optional mail.settings.sender, thanks Michele 2013-01-09 16:57:19 -06:00
mdipierro
e46f920929 optional mail.settings.sender, thanks Michele 2013-01-09 16:57:19 -06:00
mdipierro
6ebed79500 fixed problem with render_tags 2013-01-09 16:10:33 -06:00
mdipierro
9357a37509 fixed problem with render_tags 2013-01-09 16:10:33 -06:00
mdipierro
f02676f264 Wiki.render_base(body) 2013-01-09 15:41:21 -06:00
mdipierro
cac8e89670 Wiki.render_base(body) 2013-01-09 15:41:21 -06:00
mdipierro
9e9fde2e8f no warp buttons 2013-01-09 12:50:05 -06:00
mdipierro
a0b62b1392 no warp buttons 2013-01-09 12:50:05 -06:00
mdipierro
db1a788082 no warp buttons 2013-01-09 12:44:35 -06:00
mdipierro
5a93299fc3 no warp buttons 2013-01-09 12:44:35 -06:00
mdipierro
f84ac09e31 form.custom.delete 2013-01-09 11:13:05 -06:00
mdipierro
c1cdb365f1 form.custom.delete 2013-01-09 11:13:05 -06:00
mdipierro
45e8e20eae parse_as_rest(patterns=[('...',query)] 2013-01-09 10:44:58 -06:00
mdipierro
0eefcd7d4f parse_as_rest(patterns=[('...',query)] 2013-01-09 10:44:58 -06:00
mdipierro
4ce3ebf1fd fixed issue 1262, table.insert() empty, thanks Alan 2013-01-09 10:18:42 -06:00
mdipierro
d454389356 fixed issue 1262, table.insert() empty, thanks Alan 2013-01-09 10:18:42 -06:00
mdipierro
65bc1062f5 fixed add class 2013-01-09 09:16:50 -06:00
mdipierro
6e347619f4 fixed add class 2013-01-09 09:16:50 -06:00
Massimo
980aedf314 some cleanup patches, thanks Alan 2013-01-08 15:31:17 -06:00
Massimo
3a608f3fde some cleanup patches, thanks Alan 2013-01-08 15:31:17 -06:00
Massimo
4946ebf154 fixed issue 1260, auth.settings.update_fields, thanks Nafiux 2013-01-08 15:23:44 -06:00
Massimo
361700734f fixed issue 1260, auth.settings.update_fields, thanks Nafiux 2013-01-08 15:23:44 -06:00
Massimo
2d606e6836 actions='#', fixed issue 1253, thanks yaribaud 2013-01-08 14:38:05 -06:00
Massimo
1dfb6824a3 actions='#', fixed issue 1253, thanks yaribaud 2013-01-08 14:38:05 -06:00
Massimo
aba8d8f871 fixed conflict 2013-01-08 11:45:53 -06:00
Massimo
3788ec3f9a fixed conflict 2013-01-08 11:45:53 -06:00
Massimo
3b56ed3cfd fixed bootstrap class in SQLHTML, de ja vu 2013-01-08 11:45:04 -06:00
Massimo
62c4711f8e fixed bootstrap class in SQLHTML, de ja vu 2013-01-08 11:45:04 -06:00
mdipierro
1b08152594 fixed issue 1229, _class and bootstrap in SQLFORM, thanks Paolo Valleri 2013-01-08 09:31:18 -06:00
mdipierro
292a71e8bb fixed issue 1229, _class and bootstrap in SQLFORM, thanks Paolo Valleri 2013-01-08 09:31:18 -06:00
mdipierro
ec21e81f19 json field in DAL, thanks Alan 2013-01-08 09:23:18 -06:00
mdipierro
5e18932429 json field in DAL, thanks Alan 2013-01-08 09:23:18 -06:00
mdipierro
2da5b2191f fixed bug self._tables, thanks Mart 2013-01-08 09:17:42 -06:00
mdipierro
4369f2742b fixed bug self._tables, thanks Mart 2013-01-08 09:17:42 -06:00
mdipierro
424ea22334 Row.__copy__, fixed issue 1255 2013-01-08 09:10:34 -06:00
mdipierro
d22b93caf4 Row.__copy__, fixed issue 1255 2013-01-08 09:10:34 -06:00
mdipierro
88d2216780 fixed issue 1254, change of scope for web2py-component-command and web2py-component-flash, thanks Paolo valleri 2013-01-08 09:06:30 -06:00
mdipierro
9e41d679c4 fixed issue 1254, change of scope for web2py-component-command and web2py-component-flash, thanks Paolo valleri 2013-01-08 09:06:30 -06:00
mdipierro
30e32c07b9 fixed issue 1252, thanks Mark Weissen 2013-01-08 08:58:30 -06:00
mdipierro
03a464efd9 fixed issue 1252, thanks Mark Weissen 2013-01-08 08:58:30 -06:00
mdipierro
bd485d37c9 fixed st_x and st_y, thanks Paolo Valleri 2013-01-08 08:49:18 -06:00
mdipierro
e27f82b610 fixed st_x and st_y, thanks Paolo Valleri 2013-01-08 08:49:18 -06:00
mdipierro
69d00a50a6 support for motor and pulsar servers, thanks Niphlod 2013-01-07 10:34:31 -06:00
mdipierro
55afa4f2ea support for motor and pulsar servers, thanks Niphlod 2013-01-07 10:34:31 -06:00
mdipierro
c625be0a4a fixed another geodal issue, thanks Paolo 2013-01-06 09:28:01 -06:00
mdipierro
4bd8b96dc9 fixed another geodal issue, thanks Paolo 2013-01-06 09:28:01 -06:00
mdipierro
46d5035437 fixed dist type, thanks Paolo Valleri 2013-01-05 18:46:10 -06:00
mdipierro
ca87312c49 fixed dist type, thanks Paolo Valleri 2013-01-05 18:46:10 -06:00
mdipierro
b3e791b4d4 fixed geoPoint bug, thanks Paolo Valleri 2013-01-05 18:36:23 -06:00
mdipierro
4d0389db7b fixed geoPoint bug, thanks Paolo Valleri 2013-01-05 18:36:23 -06:00
mdipierro
54866ecef5 fixed auto patterns, thanks Denes 2013-01-03 21:30:17 -06:00
mdipierro
9147929204 fixed auto patterns, thanks Denes 2013-01-03 21:30:17 -06:00
mdipierro
828a4d7a60 stopped error progragation in ajax, thanks Niphlod 2013-01-02 18:58:54 -06:00
mdipierro
062de22fde stopped error progragation in ajax, thanks Niphlod 2013-01-02 18:58:54 -06:00
mdipierro
91be7eb3dc fixed opener in oauth2, thanks Ignacio Ocampo 2013-01-01 21:09:09 -06:00
mdipierro
0368d83484 fixed opener in oauth2, thanks Ignacio Ocampo 2013-01-01 21:09:09 -06:00
mdipierro
532ddf1d9a fixed issue 1249, thanks Alan 2013-01-01 19:08:46 -06:00
mdipierro
8824742a4c fixed issue 1249, thanks Alan 2013-01-01 19:08:46 -06:00
mdipierro
dd3055836a fixed issue 1251, imporved mongodb support, thanks Alan 2013-01-01 19:03:44 -06:00
mdipierro
9a5e9c5e69 fixed issue 1251, imporved mongodb support, thanks Alan 2013-01-01 19:03:44 -06:00
mdipierro
ed42c3e489 fixed issue 1246, is_active and left joins 2012-12-31 15:17:55 -06:00
mdipierro
1ceb587875 fixed issue 1246, is_active and left joins 2012-12-31 15:17:55 -06:00
mdipierro
117a0b9849 fixed issue 1247 Missing URL for Delete button, thanks Boris and Niphlod 2012-12-31 14:38:43 -06:00
mdipierro
af31e2e079 fixed issue 1247 Missing URL for Delete button, thanks Boris and Niphlod 2012-12-31 14:38:43 -06:00
mdipierro
52c1ba67e3 added setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh, thanks Richard 2012-12-30 15:16:39 -06:00
mdipierro
b442f005a9 added setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh, thanks Richard 2012-12-30 15:16:39 -06:00
mdipierro
9557c46dcf fixed redirection in login page, thanks Osman Masood 2012-12-28 16:19:50 -06:00
mdipierro
e233a14eec fixed redirection in login page, thanks Osman Masood 2012-12-28 16:19:50 -06:00
mdipierro
60093e81b0 debugger patch, thanks Mariano 2012-12-28 15:45:14 -06:00
mdipierro
f8d012ac56 debugger patch, thanks Mariano 2012-12-28 15:45:14 -06:00
mdipierro
1fe2877a14 removed commit error 2012-12-28 10:49:32 -06:00
Michele Comitini
db4446b023 Merge github.com:web2py/web2py 2012-12-28 15:53:36 +01:00
mdipierro
556de70f20 changed color scheme and fixed bug in graph model 2012-12-28 01:22:05 -06:00
mdipierro
6026b5996c changed color scheme and fixed bug in graph model 2012-12-28 01:22:05 -06:00
mdipierro
1d6de8e0a8 fixed problem with representation of user without last_name, thanks Bruno 2012-12-28 01:08:33 -06:00
mdipierro
902f228565 fixed problem with representation of user without last_name, thanks Bruno 2012-12-28 01:08:33 -06:00
mdipierro
e8a7c0257e fixed issue with lack of charset in driver, thanks Felipe Meirelles 2012-12-27 14:27:18 -06:00
mdipierro
53d251bed5 fixed issue with lack of charset in driver, thanks Felipe Meirelles 2012-12-27 14:27:18 -06:00
mdipierro
c8d4e03ead fixed debugger, thanks Mariano and Paolo 2012-12-26 11:55:05 -06:00
mdipierro
a4ba43f77b fixed debugger, thanks Mariano and Paolo 2012-12-26 11:55:05 -06:00
mdipierro
4ddb7dea28 graph font style, thanks Jose 2012-12-26 11:44:41 -06:00
mdipierro
997c5103a7 graph font style, thanks Jose 2012-12-26 11:44:41 -06:00
mdipierro
c8b0686c2f fixed grid with id field not called id, issue 972 2012-12-25 21:01:59 -06:00
mdipierro
2365c34ce3 fixed grid with id field not called id, issue 972 2012-12-25 21:01:59 -06:00
mdipierro
400f27ef55 fixed generation of html in graphs, thanks Alan 2012-12-25 20:32:21 -06:00
mdipierro
cdedbaa1e9 fixed generation of html in graphs, thanks Alan 2012-12-25 20:32:21 -06:00
mdipierro
16540936db some cleanup 2012-12-25 12:21:08 -06:00
mdipierro
adbeaffa39 some cleanup 2012-12-25 12:21:08 -06:00
mdipierro
c173beac43 fixed issue 1244, default CBC mode for sessions in cookies, thanks Pearu Peterson 2012-12-25 09:44:44 -06:00
mdipierro
e9e3906357 fixed issue 1244, default CBC mode for sessions in cookies, thanks Pearu Peterson 2012-12-25 09:44:44 -06:00
mdipierro
0d5e1ba1d3 fixed examples, thanks Joe 2012-12-24 16:14:05 -06:00
mdipierro
83ed22f64e fixed examples, thanks Joe 2012-12-24 16:14:05 -06:00
mdipierro
c573003167 edit CHANGELOG 2012-12-24 14:04:07 -06:00
mdipierro
6acb695660 edit CHANGELOG 2012-12-24 14:04:07 -06:00
mdipierro
cb87a32775 removed errors in previous commit 2012-12-24 13:55:00 -06:00
mdipierro
5d4ef568a1 removed errors in previous commit 2012-12-24 13:55:00 -06:00
mdipierro
ebda5cb2bc admin based on bootstrap, thanks Paolo 2012-12-24 13:49:06 -06:00
mdipierro
3710d43cfc admin based on bootstrap, thanks Paolo 2012-12-24 13:49:06 -06:00
mdipierro
9981ae4d5f graphiz support added, thanks Jose 2012-12-24 12:14:08 -06:00
mdipierro
56295371a4 graphiz support added, thanks Jose 2012-12-24 12:14:08 -06:00
mdipierro
9caea58a3c fixed issue 1241 with auth.wiki content error, thanks Alan 2012-12-24 11:23:30 -06:00
mdipierro
bd923806be fixed issue 1241 with auth.wiki content error, thanks Alan 2012-12-24 11:23:30 -06:00
mdipierro
6fc307cf7b better reporting of 500 ajax errors, issue 832, thanks Paolo Velleri 2012-12-24 11:21:37 -06:00
mdipierro
a0a9e92fc1 better reporting of 500 ajax errors, issue 832, thanks Paolo Velleri 2012-12-24 11:21:37 -06:00
mdipierro
2d5f558b54 fixed issue 1240, problem with rejected upload forms 2012-12-23 23:33:53 -06:00
mdipierro
ffdff5490a fixed issue 1240, problem with rejected upload forms 2012-12-23 23:33:53 -06:00
mdipierro
ea20769242 fixed calendar.js Date conflict, issue 1243 2012-12-23 23:02:28 -06:00
mdipierro
335f76665b fixed calendar.js Date conflict, issue 1243 2012-12-23 23:02:28 -06:00
mdipierro
1c410638da fixed problem with padding in secure sessions in cookies, issue 1239, thanks pearu.peterson 2012-12-23 22:12:19 -06:00
mdipierro
b8afb04de8 fixed problem with padding in secure sessions in cookies, issue 1239, thanks pearu.peterson 2012-12-23 22:12:19 -06:00
mdipierro
ee2c4f339a fixed possible scheduler problem, thanks Mike Dickun and Niphlod 2012-12-23 15:07:43 -06:00
mdipierro
62a9c460e4 fixed possible scheduler problem, thanks Mike Dickun and Niphlod 2012-12-23 15:07:43 -06:00
mdipierro
ba0e51ad02 fixed analytics.min.js 2012-12-22 21:27:05 -06:00
mdipierro
5aa719daf5 fixed analytics.min.js 2012-12-22 21:27:05 -06:00
mdipierro
a99014ad26 auth.signature.is_active is notnull and migration will set default value 2012-12-22 10:54:29 -06:00
mdipierro
7ac570f4e9 auth.signature.is_active is notnull and migration will set default value 2012-12-22 10:54:29 -06:00
mdipierro
6280ca5d36 return geo data in text always (since not all support json) 2012-12-22 10:19:49 -06:00
mdipierro
96286844fb return geo data in text always (since not all support json) 2012-12-22 10:19:49 -06:00
mdipierro
b39b6d9715 return geo data in json always 2012-12-22 10:10:54 -06:00
mdipierro
ff7b78bb6a return geo data in json always 2012-12-22 10:10:54 -06:00
mdipierro
728d634672 params in serve_json can be dict of list 2012-12-22 08:58:28 -06:00
mdipierro
f500ea46d4 params in serve_json can be dict of list 2012-12-22 08:58:28 -06:00
mdipierro
0cdfe3d57b remporary reverting model sorting patch until better understanding 2012-12-21 00:22:51 -06:00
mdipierro
a1d38d6633 remporary reverting model sorting patch until better understanding 2012-12-21 00:22:51 -06:00
mdipierro
7c906c8b89 possibly fixed issue table_archive_archive...archive 2012-12-21 00:20:06 -06:00
mdipierro
bb7594f6c5 possibly fixed issue table_archive_archive...archive 2012-12-21 00:20:06 -06:00
mdipierro
91045b918f fixed problem with - button in list widget, thanks howesc 2012-12-21 00:17:08 -06:00
mdipierro
7644b1693e fixed problem with - button in list widget, thanks howesc 2012-12-21 00:17:08 -06:00
mdipierro
95a5b2eea2 geoPoint, getLine, geoPolygon 2012-12-20 18:16:40 -06:00
mdipierro
c75cd39282 geoPoint, getLine, geoPolygon 2012-12-20 18:16:40 -06:00
mdipierro
76ad8258f5 semantic version support in admin 2012-12-20 15:47:46 -06:00
mdipierro
b81810bb02 semantic version support in admin 2012-12-20 15:47:46 -06:00
mdipierro
c1f47cdc44 support for semantic versioning 2012-12-20 15:39:57 -06:00
mdipierro
27cfdb6ac4 support for semantic versioning 2012-12-20 15:39:57 -06:00
mdipierro
64d6691e61 added improved scripts/setup-web2py-nginx-uwsgi-ubuntu.sh, thanks Niphlod 2012-12-20 09:22:24 -06:00
mdipierro
95b3ca839a added improved scripts/setup-web2py-nginx-uwsgi-ubuntu.sh, thanks Niphlod 2012-12-20 09:22:24 -06:00
mdipierro
9bf964b918 db.table.field.abs() 2012-12-20 09:03:13 -06:00
mdipierro
dcf0a7ccc9 db.table.field.abs() 2012-12-20 09:03:13 -06:00
mdipierro
dd9a3c8b7e wiki patches, thanks Niphlod 2012-12-19 16:07:50 -06:00
mdipierro
3f8bf01b20 wiki patches, thanks Niphlod 2012-12-19 16:07:50 -06:00
mdipierro
5a9b1a0a33 fixed issue 1226, delete_cascade class 2012-12-19 11:53:03 -06:00
mdipierro
e342e68737 fixed issue 1226, delete_cascade class 2012-12-19 11:53:03 -06:00
mdipierro
0ab37d9538 reverted the - button after list:string because of problems 2012-12-19 11:44:30 -06:00
mdipierro
08ff08c4e6 reverted the - button after list:string because of problems 2012-12-19 11:44:30 -06:00
mdipierro
02d488c458 on_failure in grid, fixed issue 1232, thanks dev.ldhughes 2012-12-19 11:37:56 -06:00
mdipierro
267e891a9e on_failure in grid, fixed issue 1232, thanks dev.ldhughes 2012-12-19 11:37:56 -06:00
mdipierro
af85a2cf25 changed of scheduler column names, this breaks scheduler backard compatibility 2012-12-19 11:24:55 -06:00
mdipierro
536ca3ec34 changed of scheduler column names, this breaks scheduler backard compatibility 2012-12-19 11:24:55 -06:00
mdipierro
ec28f5c494 fixed problem with impersonate and login_onaccept not a list 2012-12-19 11:21:06 -06:00
mdipierro
4daada1142 fixed problem with impersonate and login_onaccept not a list 2012-12-19 11:21:06 -06:00
mdipierro
a221e0cbee T('Add') in grid, thanks Tito Garrido 2012-12-18 20:28:44 -06:00
mdipierro
34f3220d1a T('Add') in grid, thanks Tito Garrido 2012-12-18 20:28:44 -06:00
mdipierro
e93c49fb8c fixed problem with grid appending to fields 2012-12-18 09:31:30 -06:00
mdipierro
aa3f671d86 fixed problem with grid appending to fields 2012-12-18 09:31:30 -06:00
mdipierro
515cc6b829 preventing invalid query when exporting a rows object, thanks Niphlod 2012-12-18 09:22:28 -06:00
mdipierro
8d174225f7 preventing invalid query when exporting a rows object, thanks Niphlod 2012-12-18 09:22:28 -06:00
mdipierro
3cd0b78edb fixed streamer gzip expiration, thanks Niphlod 2012-12-17 17:16:09 -06:00
mdipierro
5140564fc5 fixed streamer gzip expiration, thanks Niphlod 2012-12-17 17:16:09 -06:00
mdipierro
b465c9f9d5 R-2.3.2 2012-12-17 09:00:46 -06:00
mdipierro
d115b4216c fixed issue 1227, entropy check with IS_STRONG, thanks Clavin Sim 2012-12-17 08:50:08 -06:00
mdipierro
3dd857aa9f fixed issue 1225, NEWINSTALL ignored 2012-12-17 08:46:33 -06:00
mdipierro
c99d34aecc cursor point in share.js, issue 1123, thanks Nathan 2012-12-16 12:36:28 -06:00
mdipierro
c03a7e2f90 added oneall login support, issue 1124, thanks Nathan 2012-12-16 12:34:08 -06:00
mdipierro
1a5a974c06 fixed example in examples from pull-request, thanks tpng 2012-12-14 14:28:31 -06:00
mdipierro
9354417f76 R-2.3.1 2012-12-14 09:22:09 -06:00
mdipierro
6e7ad1d7b8 modernizr 2.6.2 2012-12-14 09:21:00 -06:00
mdipierro
32d7efc55d fixed possible issue with share.js 2012-12-14 09:17:30 -06:00
mdipierro
fb93e83f96 upgraded bootstrap, jquery, and analytics 2012-12-14 08:24:58 -06:00
mdipierro
fb03c15223 fixed paths in admin debug.py, thanks Mariano 2012-12-13 18:09:11 -06:00
mdipierro
7185d4d8c1 CHANGELOG edits 2012-12-13 12:54:39 -06:00
mdipierro
ddbddf6c2f edited CHANGELOG, 2.3.0 rc2 2012-12-13 11:53:30 -06:00
mdipierro
29c1874bc1 fixed aes 2012-12-13 11:28:52 -06:00
mdipierro
242dca7365 allow web shell working when https is required 2012-12-13 11:10:59 -06:00
mdipierro
5ddd7f0a6f removed debug print statement, thanks Niphlod 2012-12-13 08:22:10 -06:00
mdipierro
37acdc0cc6 partially fixed issue 832, auth.requires raises 401 on ajax, thanks Paolo Valleri 2012-12-12 22:07:20 -06:00
mdipierro
380c78b758 fixed formstyle_bootstrap, thanks Anthony 2012-12-12 22:03:39 -06:00
mdipierro
06237a48c4 added NEWINSTALL to git, issue 1217, thanks dev.ldhughes 2012-12-12 21:49:27 -06:00
mdipierro
f6f82a1be1 fixed ip4 client validation, issue 1218, thanks Joachim Breitsprecher 2012-12-12 21:47:55 -06:00
mdipierro
6fafba0772 fixed css issue 1219, thanks Paolo 2012-12-12 21:46:09 -06:00
mdipierro
2cb2484cd0 analytics.js 2012-12-12 21:30:57 -06:00
mdipierro
8fa903f17a allow LOADing multiple grids, thanks Niphlod 2012-12-12 21:14:25 -06:00
mdipierro
6d61f9d0ef fixed typo in docstring, issue 1210, thanks francois.delpierre 2012-12-11 20:50:10 -06:00
mdipierro
7a85625743 revised setup-web2py-nginx-uwsgi-ubuntu.sh, thanks Vinicious 2012-12-11 20:15:15 -06:00
mdipierro
21e2e5e2af fixed typo in globals, issue 1213, thanks jkellas 2012-12-11 15:54:57 -06:00
mdipierro
5188b64704 Added intro tutorial, thanks Michael Herman 2012-12-11 10:53:31 -06:00
mdipierro
128ff10ade sorting importing models was broken, now fixed, thanks Joel Samuelsson 2012-12-11 08:25:48 -06:00
mdipierro
a98f45f875 fixed winservice problem 2012-12-10 21:32:36 -06:00
mdipierro
c02b79f0c3 fixed problem with clear and session_hash 2012-12-09 14:29:37 -06:00
mdipierro
8d6a19aeb2 fixed issue 1208 (auth on GAE) by disabling virtual fields in auth.user on GAE 2012-12-08 18:31:41 -06:00
mdipierro
fa08472392 fixed issue 1208 (auth on GAE) by disabling virtual fields in auth.user on GAE 2012-12-08 18:25:04 -06:00
mdipierro
22d872c7e5 fixed issue 1207, IS_IN_SET(list_of_ints), thanks Alan 2012-12-07 10:58:43 -06:00
mdipierro
c5a7c8d8f9 fixed problem CRYPT password comparsion, issue 1203, thanks Alan 2012-12-06 23:04:29 -06:00
mdipierro
e08fdc42cf fixed escaping of response.js, issue 1205, thanks max.morais.dmm 2012-12-06 23:02:09 -06:00
mdipierro
30ff19b271 regex simplification 2012-12-06 16:56:29 -06:00
mdipierro
42ff4aa0d8 fixed issue 1202, commas in attachments, thanks simonm3 2012-12-05 16:49:24 -06:00
mdipierro
fcd960149d fixed issue 1187, custom widget hadnling error in case for nonzero formatter, thanks Maria Mitica 2012-12-05 16:34:55 -06:00
mdipierro
f6dc70dd9b himBH>jQuery, thanks Niphlod 2012-12-05 15:33:30 -06:00
mdipierro
f5368f988e better paymenttech support, BSD license 2012-12-05 15:31:38 -06:00
mdipierro
c86a4467d3 fixed IS_STRONG **** issue, issue 1098 2012-12-05 15:24:15 -06:00
mdipierro
9c41f48786 lazy sqlhtml_validators, fixed issue 931 2012-12-05 14:18:00 -06:00
mdipierro
9202be6fba fixed web2py_bootstrap.css, thanks Paolo 2012-12-05 13:53:46 -06:00
mdipierro
73f2da5087 allow more customization of db._adapter.types 2012-12-05 11:57:18 -06:00
mdipierro
32823d8288 fixed issue 440, reference to primary keys 2012-12-05 11:35:23 -06:00
mdipierro
7e4c533357 db.define_table('person',Field('name'),Field.Virtual('namey',lambda row: row.person.name+'y')), fixed issue 374 2012-12-05 11:23:11 -06:00
mdipierro
d1e73c8f79 fixed issue 265 2012-12-05 11:03:16 -06:00
mdipierro
3cf2ca4347 db.thing(name='Cohen',_orderby=db.thing.name), thanks Yair 2012-12-05 09:01:03 -06:00
mdipierro
a058a39976 experimental support for MSSQL pagination 2012-12-04 18:30:36 -06:00
mdipierro
c75eab9e73 paymentech.py 2012-12-04 10:56:30 -06:00
mdipierro
d01750601b 2.3.0 rc1 2012-12-04 09:02:41 -06:00
mdipierro
2b21c8ec8d uri='informi-se://... 2012-12-04 08:48:27 -06:00
mdipierro
b1b295f700 added interact.html to git 2012-12-04 08:32:26 -06:00
mdipierro
07afe71f37 fixed filename in dal storage, thanks Marin 2012-12-03 18:02:45 -06:00
mdipierro
5347bd03f1 possibly fixed issue 1169 2012-12-03 17:39:17 -06:00
mdipierro
d964970c9e fixed escape->encodeURIComponent in autocomplete, issue 1198, thanks Dmitry 2012-12-03 17:11:18 -06:00
mdipierro
bfcda54fa2 check_reserved in welcome, thanks Marin 2012-12-03 16:30:13 -06:00
mdipierro
411ef4549e closeflash patch, thanks Paolo, issue 1191 2012-12-03 16:06:27 -06:00
mdipierro
ca18d164e3 MENU(li_first, li_last..), fixed issue 1200, thanks dev to null 2012-12-03 14:42:37 -06:00
mdipierro
f6c1ae20c9 better grid errors, issue 1135 2012-12-03 14:28:00 -06:00
mdipierro
fdf7d5661d fixed problem with raw_args 2012-12-03 14:04:17 -06:00
mdipierro
cabe9603c2 fixed cronjobs broken in 4278, fixed issue 1190 2012-12-03 13:16:14 -06:00
mdipierro
abca14d9ae improved heroku script 2012-12-03 11:01:11 -06:00
mdipierro
ce0180a23a support for in and not in smart_query 2012-12-03 08:15:58 -06:00
mdipierro
96de4348fa auth.settings.login_onfail, thanks Yair 2012-12-02 08:27:17 -06:00
mdipierro
7aef84ae90 added missing form.html to examples 2012-12-01 16:39:31 -06:00
mdipierro
1bfd5bc20a removed test, lazy table do not suport self references 2012-11-30 14:30:49 -06:00
mdipierro
7c8ecbe126 wiki(menugroups=['wiki_editor']) 2012-11-30 09:02:35 -06:00
mdipierro
eda7e27394 fixed error reporting in dal 2012-11-30 08:34:11 -06:00
mdipierro
b6947c5f25 fixed problem with lazy tables and self references 2012-11-29 23:54:29 -06:00
mdipierro
792b313891 Allow for Field Validators to handle None values, fixed issue 1183, thanks Joe Barnhart 2012-11-29 22:35:20 -06:00
mdipierro
a56030b6c1 allow -R ...pyc, fixed issue 1186, thanks Corne.Dickens 2012-11-29 18:21:06 -06:00
mdipierro
9291d38bb5 added missing fileutils, fixed issue 1193, thanks Yager 2012-11-29 17:13:30 -06:00
mdipierro
33271c8386 fixed issue 1197, Virtual Fields are stored in session 2012-11-29 17:05:27 -06:00
mdipierro
1a2d11560f do not redirect after auth.logout() if next is None 2012-11-29 09:52:48 -06:00
mdipierro
fabc3a5db1 new router patch fixes runaway vulnerability, thanks Jonathan 2012-11-27 11:29:36 -06:00
mdipierro
25f16b5315 fixed bug in getlist thanks roger 2012-11-27 10:17:22 -06:00
mdipierro
c4ffbf4b2b style upload button 2012-11-27 10:11:52 -06:00
mdipierro
24531b85c6 fixed issue 1174, cache folder in examples 2012-11-24 11:12:20 -06:00
mdipierro
b8ca2a1e97 fixed issue 1174, cache folder in examples 2012-11-24 11:07:07 -06:00
mdipierro
fe4713ad88 fixed issue 1176, truncate on GAE+SQL 2012-11-24 10:58:44 -06:00
mdipierro
43c97bd8cc fixed issue 1179, welcome.w2p created if not exists 2012-11-24 10:48:27 -06:00
mdipierro
71fb544eaa added .woff contenttype, fixed issue 1181, thanks Chris 2012-11-24 10:35:47 -06:00
mdipierro
2323b07d07 rocket support for IPV6, thanks Chirs Winebrinner 2012-11-24 10:15:37 -06:00
mdipierro
291e7ebb57 Merge branch 'master' of github.com:web2py/web2py 2012-11-24 10:09:48 -06:00
mdipierro
7794090bfe Merge pull request #44 from cwinebrinner/rocket_ipv6_and_cleanup
explorigin/Rocket merged and IPv6 support added
2012-11-24 08:06:54 -08:00
mdipierro
2f06fe4d2a fixed router regex runaway, thanks Jonathan 2012-11-23 11:58:36 -06:00
mdipierro
b41e89586c fixed ldap security issue, thanks demetrio 2012-11-23 08:02:01 -06:00
Charles Winebrinner
bd13035a17 Added IPv6 support for Rocket, refactored some code, and fixed some bugs. 2012-11-18 01:03:04 -06:00
Charles Winebrinner
c6c54ad98d Merged explorigin/Rocket and brought web2py's rocket more in line with upstream. 2012-11-18 00:32:24 -06:00
Charles Winebrinner
a9ec60e4b9 Fixed a typo in utils.py. 2012-11-18 00:32:24 -06:00
Charles Winebrinner
1deee02eff PEP8'd rocket.py.footer (to be removed from rocket.py). 2012-11-18 00:32:24 -06:00
mdipierro
b27f2a59f4 better heroku script 2012-11-17 22:28:51 -06:00
mdipierro
d7a38b5350 better heroku support 2012-11-17 22:14:42 -06:00
mdipierro
db02948e08 added heroku support 2012-11-17 21:38:28 -06:00
mdipierro
7b1351daa3 fixed broken session in recent trunk 2012-11-17 13:28:50 -06:00
mdipierro
a317c223c4 fixed issue 1173, request.requires_https, thanks Maciej 2012-11-17 12:14:28 -06:00
mdipierro
ffe118c45a fixed typo in response.updated, issue 1167, thanks dedirock 2012-11-17 12:06:39 -06:00
mdipierro
e53a175740 better list widget, thanks Howesc 2012-11-17 12:04:29 -06:00
mdipierro
2b05b92de8 fixed issue 1152, gae sql varchar limit, and fixed typo in fpdf 2012-11-17 11:46:46 -06:00
mdipierro
80ba8c2992 fixed image_map in gluon/contrib/fpdf/html.py 2012-11-17 09:16:07 -06:00
mdipierro
18ca3bb1c1 fixed broken HTT_HOST in routes_in 2012-11-17 08:59:55 -06:00
mdipierro
851053e4ec extra or {}, thanks villas 2012-11-16 16:24:13 -06:00
Michele Comitini
5f1566db49 Merge github.com:web2py/web2py 2012-11-16 11:31:05 +01:00
mdipierro
045f5b4578 auth.wiki(extra) 2012-11-15 14:34:20 -06:00
mdipierro
a63b8ca9ca patches for @service.jsonrpc and exportclasses, thanks niphlod 2012-11-15 13:40:04 -06:00
mdipierro
1425a46c00 fixed generic.xml 2012-11-15 12:29:28 -06:00
mdipierro
1268d76ae8 do not create a new session if nothing in session file 2012-11-14 15:33:18 -06:00
mdipierro
0f2df1b46c fixed issue 1160, show button for linked tables even if referenced column is not readable 2012-11-14 15:00:04 -06:00
mdipierro
f90d871fb6 fixed issue 1158, redirect client_side in auth forms embedded via LOAD, thanks PyCon support 2012-11-14 14:12:32 -06:00
mdipierro
019211cb80 possible solution to issue 1154, onvalidation = dict(onsuccess= [...]) 2012-11-14 13:47:56 -06:00
mdipierro
bc9e3427a0 jQuery 1.8.2 2012-11-14 08:44:11 -06:00
mdipierro
54dabd979b fixed 2.5 issues with scheduler 2012-11-13 16:27:26 -06:00
mdipierro
180c508d83 fixed CAS login for extra url fields, thanks efaisal 2012-11-09 14:11:37 -06:00
mdipierro
0001e35400 fixed issue 1144, start webservert at 0.0.0.0 2012-11-08 16:19:44 -06:00
mdipierro
3ae5774404 HTML(doctype=''), issue 1140 2012-11-08 11:29:47 -06:00
mdipierro
bce7bd7fa7 fixed issue 1143, grid/smartgrid GAE improvements, thanks Howesc 2012-11-08 10:05:46 -06:00
mdipierro
ec429af686 fies typo in dal, issue 1146, thanks guruyaya 2012-11-08 10:04:24 -06:00
mdipierro
e11aa24b7d typo in compileapp, issue 1149, thanks Corne 2012-11-08 10:02:46 -06:00
mdipierro
c5ecf80b65 possibly fixed issue 1151 2012-11-08 09:59:10 -06:00
mdipierro
fc739f242d fixed issue 1147, belongs(None), thanks Marin 2012-11-06 14:26:28 -06:00
mdipierro
3f266a188a grid buttons_placement and links_placement , thanks Niphlod 2012-11-06 10:36:45 -06:00
mdipierro
e1bcd86e5e changed in custom_import 2012-11-06 09:47:02 -06:00
Michele Comitini
b16fc6b19a Merge github.com:web2py/web2py 2012-11-06 05:02:10 +01:00
mdipierro
ad2b332fa0 improved scheduler, thanks Niphlod 2012-11-05 12:39:17 -06:00
mdipierro
22e2b4864f fixed rss serializer again, thanks Charles Winebrinner 2012-11-04 20:45:25 -06:00
mdipierro
7115c44cb8 fixed rss serializer again, thanks Charles Winebrinner 2012-11-04 19:55:15 -06:00
mdipierro
d33871db98 fixed rss2 again 2012-11-04 19:29:18 -06:00
mdipierro
9ced73cf1d fixed problem in rss2.py 2012-11-04 18:12:41 -06:00
mdipierro
0d9cb51021 adding missing views 2012-11-04 09:14:47 -06:00
mdipierro
3448db8e67 fixed issue 1136, prevent redirection loop, better form, usability as embedded widgets, thanks Alan 2012-11-03 11:54:46 -05:00
mdipierro
dec6afa0f1 better google wallet, checks parameters 2012-11-01 22:01:57 -05:00
mdipierro
755a860011 many scheduler improvements, thanks Niphlod 2012-11-01 21:35:53 -05:00
mdipierro
3173d75dad fixed issue 1124, create new auth.wiki page from slug model, thanks Nico 2012-11-01 21:33:06 -05:00
mdipierro
f52c981316 better gluon.tools.Expose, thanks Richard 2012-11-01 21:09:09 -05:00
mdipierro
d16ad52a56 fixed issue 1132, unicode in IS_IN_DB validator 2012-11-01 21:07:47 -05:00
mdipierro
f02fe585c8 fixed issue 1134, gae dal delete, thanks Howesc 2012-11-01 21:01:46 -05:00
mdipierro
bb5a613ad2 fixed issue 1130, prevent exception for virtual fields in forms, thanks hi21alt 2012-10-31 11:43:11 -05:00
mdipierro
15e5b1a2f0 scripts/extract_sqlite_models.py, thanks Michele 2012-10-31 10:23:56 -05:00
mdipierro
863140fec9 allows to customize the A in a MENU, thanks ilvalle 2012-10-31 10:22:20 -05:00
mdipierro
16540d32ae fixed issue 1117, snitize of unicode, thanks Bill 2012-10-31 10:02:08 -05:00
mdipierro
6801ed07d8 fixed issue 1127, SQLTABLE column with virtual fields, thanks hi21alt 2012-10-31 09:52:43 -05:00
mdipierro
783d049668 fixed issue 1129, recapcha message error, thanks Friedrich 2012-10-31 09:50:37 -05:00
mdipierro
f62c8f6489 allow to pass hidden to crud.update 2012-10-31 09:14:58 -05:00
Michele Comitini
33ebb0ce84 Merge github.com:web2py/web2py 2012-10-31 11:20:32 +01:00
Michele Comitini
3d1dfadc18 removed prints 2012-10-30 17:40:13 +01:00
Michele Comitini
9f2e135e80 improved regex matching 2012-10-30 17:39:49 +01:00
Massimo
c404db4a08 fixed sync languages, thanks Yair 2012-10-30 11:09:50 -05:00
Massimo
5713ec1365 fixed validator recent typo 2012-10-30 09:42:03 -05:00
mdipierro
bd6b719c32 reverted changes about formatting None 2012-10-29 22:25:19 -05:00
mdipierro
30ffb3492a gluon/contrib/login_methods/dropbox_account.py, get client 2012-10-29 22:22:36 -05:00
mdipierro
23f34e0f80 page and media preview in wiki, thanks Niphlod 2012-10-29 21:38:09 -05:00
mdipierro
d1ac7981dd moved toolbar logic to dal, thanks Niphlod 2012-10-29 18:13:58 -05:00
mdipierro
28d320e5ac added informix to list, thanks Christopher 2012-10-29 18:11:52 -05:00
mdipierro
827ea1808a if user_group_name is None, user_group_role is also None 2012-10-29 14:00:29 -05:00
mdipierro
18d97c0609 csv can return a generator, thanks Jonathan 2012-10-29 11:36:04 -05:00
mdipierro
094646d5ba validator.formatter checks None 2012-10-29 10:09:07 -05:00
mdipierro
2b0943b57d fixed redirection after change password, issue 1112, thanks Friedrich 2012-10-29 09:31:51 -05:00
mdipierro
c6f3bda227 fixed issue 1118, reload page when called by component, thanks Paolo 2012-10-29 09:28:19 -05:00
mdipierro
8e9a190fef fixed toolbar issue 1111, thanks niphlod 2012-10-29 09:06:52 -05:00
mdipierro
db21f663fe fixed issue 1120, bug introduced in latest utils.py import. thanks Yair 2012-10-29 08:59:54 -05:00
mdipierro
554640b103 fixed issue 1121, appadmin interface to cache, thanks Paolo 2012-10-29 08:57:43 -05:00
mdipierro
ba1a28f47a fixed bug in sessions2trach.py, issue 1111, thanks Szimszon 2012-10-29 08:53:50 -05:00
Michele Comitini
c58c6157e9 pulling custom_import from upstream 2012-10-29 10:11:18 +01:00
mdipierro
056ffa300a following Joe and Jonathan's advice, None value is formatted 2012-10-28 12:01:09 -05:00
Michele Comitini
d450d48e99 Merge github.com:web2py/web2py 2012-10-28 14:38:03 +01:00
Michele Comitini
0aa87fed63 model generator for sqlite legacy databases. 2012-10-28 14:37:34 +01:00
mdipierro
70cc551bba better utils.py, thanks Niphlod 2012-10-27 14:37:40 -05:00
Michele Comitini
78cf7e0622 Merge github.com:web2py/web2py 2012-10-27 21:26:31 +02:00
mdipierro
b44f82c13c removed redundant assignment, thanks Niphlod 2012-10-26 15:51:17 -05:00
mdipierro
8fe14215e1 fixed scheduler bug, thanks Niphlod 2012-10-26 15:49:47 -05:00
mdipierro
b87d3fb481 fixed commit mistake, thanks Nico 2012-10-25 17:23:05 -05:00
mdipierro
88cfa5ef2a fixed issue 1096, thanks Howesc 2012-10-25 10:23:50 -05:00
mdipierro
913d6331c6 fixed issue 1104, thanks Paolo Valleri 2012-10-25 10:19:50 -05:00
mdipierro
a1a6cd0d07 fixed issue 1109 2012-10-25 10:11:51 -05:00
mdipierro
88e554fb7e fixed issue 1113, thanks Nico 2012-10-25 10:07:39 -05:00
mdipierro
6394953a17 fixed issue 1114, thanks Friedrich 2012-10-25 10:04:04 -05:00
mdipierro
c7019930fd operators in grid are not translated, thanks Friedrich Weber 2012-10-25 10:02:40 -05:00
mdipierro
1b15818ab6 better pep8 in ldap_auth.py, thanks Gyuris 2012-10-25 08:47:36 -05:00
mdipierro
a48b008f99 wiki edit menu pages conditional to login 2012-10-25 08:22:34 -05:00
mdipierro
7ec816bf73 better sessions2trash.py, thanks Jim 2012-10-25 08:17:30 -05:00
Massimo
fd16eb767e fixed missing sys in languages 2012-10-24 16:04:32 -05:00
mdipierro
90bcc9b08b dal almost runs with python 3.3 but fails a test on 2.5 2012-10-23 11:30:02 -05:00
mdipierro
3d6be9a383 dal compiles with python 3.3 2012-10-23 11:13:29 -05:00
mdipierro
d575d8053f template compiles with python 3.0 2012-10-23 10:45:17 -05:00
mdipierro
50497b3c1f languages.py closer to python 3.0 support 2012-10-23 10:28:46 -05:00
mdipierro
49b40a1cf3 utils compiles with python 3 2012-10-23 10:17:23 -05:00
mdipierro
36518ecbeb reverted changs to utils 2012-10-23 10:13:17 -05:00
mdipierro
28e773f9a7 utils compiles with python 3 2012-10-23 10:11:33 -05:00
mdipierro
5247981fa8 aes python 3 compiles (but does work well?) 2012-10-23 09:54:07 -05:00
mdipierro
ea6714e89b aes new raise compliant 2012-10-23 09:44:34 -05:00
mdipierro
5a63fddf02 reverted previous change but still problems with concurency multiple dbs in different folders in same app 2012-10-22 22:52:40 -05:00
mdipierro
510e8d70d7 THREAD_LOCAL folder not reset in dal 2012-10-22 22:49:35 -05:00
mdipierro
108aeb0ee1 portable languages 2012-10-22 22:21:11 -05:00
mdipierro
46610d59ce language changes 2012-10-22 22:14:40 -05:00
mdipierro
b5603d6956 minor fix in dal for rare condition 2012-10-22 18:50:18 -05:00
Michele Comitini
ccb976e233 Merge github.com:web2py/web2py 2012-10-22 23:38:35 +02:00
mdipierro
f0efd80e44 minor fix in dal for rare condition 2012-10-22 15:07:38 -05:00
Michele Comitini
d10774b3ae Merge github.com:web2py/web2py 2012-10-22 12:51:58 +02:00
mdipierro
b7208616cd R-2.2.1 2012-10-21 10:54:13 -05:00
mdipierro
cdaf4f651b assign_task takes better care for group_names, thanks Niphlod 2012-10-21 09:23:26 -05:00
mdipierro
ce979d2945 fixed a problem with capitalization in wiki 2012-10-20 19:38:54 -05:00
Michele Comitini
a451796562 merge with upstream after pep8 2012-10-21 00:12:30 +02:00
mdipierro
5aa27fc562 assign_task takes better care for group_names, thanks Niphlod 2012-10-20 15:27:13 -05:00
mdipierro
dc23087847 fixed issue 1102, thanks howesc 2012-10-20 10:12:04 -05:00
mdipierro
28084cf99a fixed issue 1109, thanks Niphlod 2012-10-20 10:11:08 -05:00
mdipierro
5d439bdc30 fixed issue 1100, thanks sherdim 2012-10-20 10:08:58 -05:00
mdipierro
3f4330d9b1 removed print statements from scheduler, thanks Niphlod 2012-10-20 10:03:57 -05:00
mdipierro
b9a1056503 back button in mobile admin demo 2012-10-19 18:43:14 -05:00
mdipierro
98353bc18a fixed problem with new importer and custom import 2012-10-19 18:36:39 -05:00
mdipierro
32a9d36934 populate fix and pep8 2012-10-19 14:59:30 -05:00
mdipierro
295084976b pep8 in scripts/*.py 2012-10-19 14:22:42 -05:00
mdipierro
d053900032 fixed pep8 in apps 2012-10-19 14:13:37 -05:00
mdipierro
c7943b8977 upgraded feedparer and PyRSS2Gen 2012-10-19 12:59:58 -05:00
mdipierro
6aa5edc7ff many pep8 improvements 2012-10-19 12:33:53 -05:00
mdipierro
71ec15190b some pep8 changes (fixed spacing at end) 2012-10-19 10:37:07 -05:00
mdipierro
3a66f5e330 fixed some pep8 stuff 2012-10-19 09:40:17 -05:00
mdipierro
ea9ae52e10 scheduler.queue_task, thank Niphlod 2012-10-18 18:20:51 -05:00
mdipierro
ec0d7e6ecf codemirror autoresize 2012-10-18 13:42:49 -05:00
mdipierro
8d5c82c531 scheduler.queue_task(...), thanks Niphlod 2012-10-18 13:02:19 -05:00
mdipierro
3124fd90b9 better openshift error 2012-10-17 17:00:50 -05:00
mdipierro
255cb5e1de faster scheduler, thanks Niphlod 2012-10-17 16:01:29 -05:00
mdipierro
a2a011f007 remove excessive session saving with caching of mobile_agent 2012-10-17 14:33:52 -05:00
mdipierro
1da32b81cf fixed appadmin bug and excessive session saving 2012-10-17 14:30:02 -05:00
mdipierro
b1e5ed4018 fixed problem with session in cookie, thanks Niphlod 2012-10-17 12:04:19 -05:00
mdipierro
5d2967abdf T.is_writable, thanks Fran 2012-10-17 09:13:48 -05:00
Massimo
3ea3d1a5f8 inlined sluggify 2012-10-16 11:47:16 -05:00
Massimo
6a8423bd88 customizable session cookie expriration 2012-10-16 11:23:41 -05:00
Massimo
7798e49d8a session cookie data no expires by default 2012-10-16 11:14:52 -05:00
Massimo
fd0f48f028 fixed auth.impersonating again, thanks Ricardo 2012-10-16 11:08:42 -05:00
Massimo
418e753684 current.T.is_writable=False no languages write, thanks Fran 2012-10-16 10:54:33 -05:00
Massimo
03eb760cd7 fixed issue 1092, thanks nicozanf 2012-10-16 10:34:36 -05:00
Massimo
90098648df users can switch between sessions storage types 2012-10-16 10:25:28 -05:00
mdipierro
00f1ab4393 improved session data in cookie 2012-10-16 07:44:22 -05:00
mdipierro
7119d53a86 improved session data in cookie 2012-10-16 07:10:33 -05:00
mdipierro
2afb8a5a96 fixed bug with auth.impersonate(0) 2012-10-16 06:19:39 -05:00
mdipierro
efcc2cf249 sessions in secure cookies, session.connect(cookie_key='mypassword') 2012-10-16 06:15:45 -05:00
mdipierro
bd5db6b48e reverting some test but session.__hash needs work 2012-10-15 21:49:43 -05:00
mdipierro
44d81b897a fixed problem with session __hash 2012-10-15 20:43:51 -05:00
mdipierro
5623db50fa fixed issue with storing Row in session 2012-10-15 19:39:25 -05:00
mdipierro
647ac1f84b more languages patches, thanks Vladyslav 2012-10-15 16:28:51 -05:00
mdipierro
e24b644a09 fixed make pip 2012-10-15 14:48:45 -05:00
mdipierro
c3a33c3795 who page 2012-10-15 14:44:04 -05:00
mdipierro
4e4f515ef1 better markmin with links in links, thanks Vladyslav 2012-10-15 07:43:23 -05:00
mdipierro
3f5bc60406 R-2.1.1 2012-10-15 06:40:55 -05:00
mdipierro
66fa7a1ea9 fixed error for missing driver 2012-10-15 06:36:44 -05:00
mdipierro
afa4d11c88 updated changelog 2012-10-15 06:15:33 -05:00
mdipierro
0cfb9681e6 improved custom_inport with app-level track changes 2012-10-15 05:55:45 -05:00
mdipierro
321b9c5999 better errors in custom_import, thanks Michele 2012-10-15 05:46:57 -05:00
mdipierro
3d9024561c -Y starts cron 2012-10-15 05:33:21 -05:00
Michele Comitini
1d5e4d7090 removed print 2012-10-15 11:34:31 +02:00
Michele Comitini
484f53224d Reverted to the import using fromlist, but with working traceback. 2012-10-15 11:20:04 +02:00
mdipierro
b49b8b4778 reverted custom_install tests 2012-10-14 20:07:54 -05:00
mdipierro
a03994d587 cron disabled by default unless -H 2012-10-14 18:29:17 -05:00
Michele Comitini
3c0b58322a Merge github.com:web2py/web2py 2012-10-15 00:35:25 +02:00
Michele Comitini
6dd9af61fd custom import fixes 2012-10-15 00:34:41 +02:00
mdipierro
48a4277ea2 fixed issue 1088 2012-10-14 16:40:49 -05:00
mdipierro
7731b96bcf auth = Auth(db).define_tables() in one line 2012-10-14 15:55:45 -05:00
mdipierro
54a6dee35d changed default driver for sqlite, thanks Niphlod 2012-10-14 15:32:33 -05:00
mdipierro
efbe8bd857 DAL(...,do_connect=False,migrate_enabled=False) 2012-10-14 15:08:25 -05:00
mdipierro
5ae3d5afdc auth_wiki extra fields, thanks Alan 2012-10-14 14:44:37 -05:00
mdipierro
dca071cb6f added storage of length, notnull, unique in .table files 2012-10-14 14:41:28 -05:00
mdipierro
238c04ff68 wiki preview patch, thanks Niphlod 2012-10-14 14:28:17 -05:00
mdipierro
1702f9cb19 bettere errors in custom_import, thanks Michele 2012-10-14 14:20:12 -05:00
mdipierro
76d619fb34 faster better web2py_uuid, thanks Michele 2012-10-14 14:16:43 -05:00
Michele Comitini
66dd7d4337 Merge github.com:web2py/web2py 2012-10-14 02:21:53 +02:00
Michele Comitini
344def2b3d Trying to simplify custom import. 2012-10-14 02:13:51 +02:00
mdipierro
40c09a5d80 new tests in test_web, tests static/_1.2.3/... 2012-10-13 14:36:20 -05:00
mdipierro
0b0fddb886 removed un-necessary setup_exe_2.6.py 2012-10-13 10:16:06 -05:00
mdipierro
d9f83927e1 no more custom_import_install in gaehandler.py 2012-10-13 09:37:41 -05:00
mdipierro
d8d85815ad redis session patch, thanks Niphlod 2012-10-13 09:26:53 -05:00
mdipierro
4d569d3f7d fixed issue 1081, conflict betweeen web2py css error and bootstrap error classes, thanks Paolo and lapcchan 2012-10-13 09:25:32 -05:00
Michele Comitini
db699de008 Merge github.com:web2py/web2py 2012-10-13 15:17:58 +02:00
mdipierro
10aa5d4c8c fixed issue 1084 2012-10-12 22:16:23 -05:00
mdipierro
06eaf803b5 ip address validator fixed 2012-10-12 18:17:06 -05:00
Michele Comitini
dc448f0033 Merge github.com:web2py/web2py 2012-10-12 21:17:03 +02:00
Massimo
63a5e953ba fixed problem with renaming of the rewrite.thread to rewrite.THREAD_LOCAL 2012-10-12 12:19:08 -05:00
Massimo
0f725d0d68 some minor simplifications in rewrite.py 2012-10-12 11:48:25 -05:00
Massimo
d61a4529f3 improved speed of regex_url_in 2012-10-12 11:33:02 -05:00
mdipierro
aadde5a791 much better custom_import, smaller, faster, and finally works with shell 2012-10-11 22:03:20 -05:00
mdipierro
ca5efcc032 fixed cron 2012-10-11 16:48:07 -05:00
mdipierro
a13c77d836 just alignment of custom_import 2012-10-11 09:23:36 -05:00
mdipierro
85edef0802 faster init on gae and better gae_memcache 2012-10-11 08:27:58 -05:00
Massimo
b3841e19d2 added comments in cache, thanks Michele 2012-10-10 15:16:21 -05:00
Michele Comitini
8d40ec9c1d Merge github.com:web2py/web2py 2012-10-10 21:21:04 +02:00
mdipierro
eaadd12c0e fixed problem with DAL on googlesql 2012-10-10 12:20:25 -05:00
mdipierro
1b780e3178 fixed impval=0, thanks vp 2012-10-10 12:10:51 -05:00
mdipierro
ae597dac7f increased admin (is_local) security, thanks Jonathan 2012-10-10 12:00:59 -05:00
mdipierro
83cd22077e rocket passes all pathoc tests without hang 2012-10-10 11:57:30 -05:00
mdipierro
6cd25ff346 faster local_hosts lookup 2012-10-10 11:43:06 -05:00
mdipierro
1a1bb7abd7 fixed issue 1077, thanks c.guimaraes 2012-10-10 11:25:25 -05:00
mdipierro
66aeff12fc fixed gae_memcache increment bug, issue 1079, thanks in4tunio 2012-10-10 11:21:01 -05:00
mdipierro
d5cdcf9285 many improvements in cache, lazy cache.ram and cache.disk 2012-10-10 11:03:52 -05:00
mdipierro
48d2ea7424 many improvements in cache 2012-10-10 11:01:09 -05:00
mdipierro
4222430988 better toolbar, thanks Niphlod 2012-10-10 09:19:01 -05:00
mdipierro
e95809a442 auth.wiki preview, thanks Niphlod 2012-10-10 09:18:09 -05:00
Michele Comitini
85ee2ca272 web2py_uuid 2x speedup 2012-10-10 00:06:10 +02:00
Massimo
45dd57e49e redis_sessions.py, thanks Niphlod 2012-10-09 14:36:34 -05:00
Massimo
e68ab9c746 added jquery.mobile 1.2.0 2012-10-09 09:04:27 -05:00
Michele Comitini
c98aa8e5af Merge github.com:web2py/web2py 2012-10-09 10:13:32 +02:00
mdipierro
89c4e562ee some work on mongodb but references do not work 2012-10-08 22:09:25 -05:00
mdipierro
72f5d51ca4 fixed time_expire typo in mamcache, thanks Bruno 2012-10-08 12:09:00 -05:00
mdipierro
3cab47a13d fixed problem with close all instances when no instances 2012-10-08 11:03:21 -05:00
mdipierro
19e7871355 removed rc1 2012-10-08 09:15:33 -05:00
mdipierro
f99d5d6b34 2.1.0rc1 2012-10-07 22:45:38 -05:00
mdipierro
90ed2b0c51 clearing zombie list. Should not be necessary but what the heck 2012-10-07 13:31:02 -05:00
mdipierro
64c7fdf057 fixed issue 1074, thanks mjmare 2012-10-07 10:48:37 -05:00
mdipierro
aa2ff6e3f2 fixed issue 1072 2012-10-07 10:13:20 -05:00
mdipierro
5b19b606c4 fixed routes example, issue 1073 2012-10-07 10:12:04 -05:00
mdipierro
700a639c8e fixed routes example, issue 1073 2012-10-07 10:11:10 -05:00
mdipierro
ab987cd740 db.define_table(...,redefine=True) 2012-10-07 01:10:08 -05:00
mdipierro
7cdef717d0 zombie dal is here, should fix scheduler problems while retaining Row/Rows serialization 2012-10-07 01:07:49 -05:00
mdipierro
626baf5705 Try the mobile interface link in site 2012-10-05 10:38:58 -05:00
mdipierro
2841fbbf61 fixed mobile admin, and improved it 2012-10-05 10:24:14 -05:00
mdipierro
b142fa9f7e lazy tables re-appeared in appadmin 2012-10-05 09:01:51 -05:00
mdipierro
6ab5c9d116 fixed IMAP reconnect 2012-10-05 07:25:21 -05:00
mdipierro
80a77b256e Auth use request.requires_https, thanks Yarin 2012-10-05 07:18:35 -05:00
mdipierro
de5546c713 fixed issue 990 2012-10-04 21:52:04 -05:00
mdipierro
1f07dc517e minor indentation change 2012-10-04 21:45:25 -05:00
mdipierro
3841025ffc fixed url_in(request, environ)[1]['PATH_INFO'] 2012-10-04 20:39:00 -05:00
mdipierro
f7c364d34b fixed issue 1067 2012-10-04 20:36:30 -05:00
mdipierro
669cb6547d removed depredation working, thanks Niphlod 2012-10-04 20:17:12 -05:00
mdipierro
9d4e854723 scheduler non-writable field, thanks Niphlod 2012-10-04 20:10:55 -05:00
mdipierro
a9f4585a36 Auth(secure=True), thanks Yarin and Niphlod 2012-10-04 15:12:52 -05:00
mdipierro
deaee3f6a8 fixed setup, thanks Mike 2012-10-04 15:06:58 -05:00
mdipierro
7a35973bbf fixed preblem with db singledon serialization in tickets 2012-10-04 11:53:04 -05:00
mdipierro
a0b0584be8 fixed wiki for missing body 2012-10-04 10:44:35 -05:00
mdipierro
66d9ead746 fixed problem with __new__ deprecated 2012-10-04 08:44:26 -05:00
mdipierro
8945dffb0c allow re-definition of tables 2012-10-04 08:35:39 -05:00
Michele Comitini
101aef7474 merge from upstream 2012-10-03 22:46:34 +02:00
Massimo
d026b39988 better request.requires_https, thanks Yarin and Niphlod 2012-10-03 12:32:12 -05:00
Massimo
2b99fd0ba6 fixed some problem with grid 2012-10-03 11:58:50 -05:00
Massimo
4ab78a096b fixed issue 1064 2012-10-03 11:54:03 -05:00
Massimo
9c5ba437de fised issue 1063 2012-10-02 14:55:56 -05:00
Massimo
b41490a6f6 wiki uses contains instead of startswith, thanks David 2012-10-02 14:50:16 -05:00
mdipierro
563934dcac fixed issue 738 2012-10-01 21:16:42 -05:00
mdipierro
e8702e757e attempt to fix issue 981 2012-10-01 21:11:45 -05:00
mdipierro
f4595ced2d possibly fixed 1020 2012-10-01 20:52:02 -05:00
mdipierro
6cc29e4527 fixed DAL.__new__ and SQLFORM.factory 2012-10-01 19:15:37 -05:00
mdipierro
485719ca1f more customizaiton of booleans 2012-10-01 17:07:06 -05:00
Michele Comitini
940024823e merge from upstream 2012-10-01 22:57:46 +02:00
mdipierro
187140f083 better generic.xml, thanks Derek 2012-10-01 15:54:35 -05:00
mdipierro
89cbe815a7 fixed issue 1031, thanks David 2012-10-01 14:49:42 -05:00
mdipierro
3d28d1c2a7 another rocket fix 2012-10-01 14:25:38 -05:00
mdipierro
8a638c6115 fixed textarea for long translation strings in admin 2012-10-01 12:30:02 -05:00
mdipierro
a71cd3058a speedup in build-environment, thanks Michele 2012-10-01 12:01:35 -05:00
mdipierro
720ce51dcd fixed rocket (removed handling of static files, faster parse headers, pathoc fault-tolerant) 2012-10-01 11:57:45 -05:00
mdipierro
727993dd45 simplification in after_update 2012-09-30 16:50:57 -05:00
Michele Comitini
40a82aa2dd Merge github.com:web2py/web2py 2012-09-30 22:01:09 +02:00
mdipierro
5e12803efa self.connector 2012-09-30 14:45:47 -05:00
mdipierro
8ffa5bbbcb adapter have do_connect 2012-09-30 14:19:52 -05:00
mdipierro
f502708f7a made contrib.pbkdf2 optionional for utils 2012-09-30 13:47:49 -05:00
mdipierro
ec82c6b8af cleaner code in dal 2012-09-30 13:40:41 -05:00
mdipierro
417c94470f fixed Storage copy 2012-09-30 13:20:05 -05:00
mdipierro
396f4449d8 experimental DAL rewrite (work in progress) 2012-09-30 08:37:27 -05:00
mdipierro
27e0f08ee9 fixed issues with grid form and b.parent 2012-09-30 08:32:03 -05:00
mdipierro
c0ad842851 fixed admin and new dal 2012-09-30 07:30:08 -05:00
mdipierro
2348709622 fixed some bugs with singleton and remobed password from session.auth.user 2012-09-30 07:26:23 -05:00
mdipierro
5f727f6e6e fixed problem with order of lazyness in DAL serialization in session 2012-09-30 00:23:15 -05:00
mdipierro
d42dfeb268 login works fine with lazy DAL 2012-09-30 00:10:25 -05:00
mdipierro
610cef4bb9 reverted DAL singleton until better understood 2012-09-29 23:47:30 -05:00
mdipierro
812e2535c0 Better LazySet 2012-09-29 23:38:07 -05:00
mdipierro
2ad2a6c77f pickle.dumps(db(query).select() now always works and loads restore the full object (almost) 2012-09-29 23:20:37 -05:00
mdipierro
f99a1406bb DAL is now a pickeable singleton 2012-09-29 22:33:18 -05:00
mdipierro
662261c590 in dal renamed thread to thread_local 2012-09-29 20:59:50 -05:00
mdipierro
fd1495effe MemcacheClient(time_expire=3600) 2012-09-29 20:20:03 -05:00
mdipierro
6150be51b1 better rocket parsing, support for multiline headers 2012-09-29 18:39:53 -05:00
mdipierro
0c2d0178db made new web2py_uuid working on python 2.5 2012-09-29 18:35:09 -05:00
mdipierro
0b4df40f60 yet faster web2py_uuid by caching urandom results 2012-09-29 17:56:43 -05:00
mdipierro
b7ac9b8757 more web2py_uuid speedup, thanks Michele 2012-09-29 17:16:35 -05:00
mdipierro
5e88150ee3 fixed issue 1046, thanks Houdini 2012-09-29 10:17:06 -05:00
mdipierro
309b051dbb fixed copy.copy(storage), thanks Corne 2012-09-29 09:55:57 -05:00
mdipierro
759de1e911 prettidate works with future dates, thanks Sanjoy 2012-09-29 09:53:46 -05:00
mdipierro
6a1a44b493 fixed issue 1044, thanks Paolo 2012-09-28 20:20:05 -05:00
mdipierro
828aa493a6 static asset management, thanks Niphlod 2012-09-28 17:06:11 -05:00
Massimo
6c5227b6b3 fixed issue 1042, thanks Dominic 2012-09-28 12:47:36 -05:00
Massimo
3ea23a97ed closed issue 995, thanks Peter 2012-09-28 12:38:03 -05:00
mdipierro
f7b5922fd9 fixed issue 1040 2012-09-28 09:25:27 -05:00
mdipierro
8bee93c236 faster web2py_uuid() thanks Michele 2012-09-28 09:21:03 -05:00
mdipierro
8e6e7ed4cc fixed search in wiki again for firebird 2012-09-28 08:51:18 -05:00
mdipierro
2c156e850a fixed menu hoover issue 1036, thanks Paolo 2012-09-27 22:28:59 -05:00
mdipierro
6fff0f5eee fixed many bugs in dal, thanks Mart Senecal 2012-09-27 22:15:56 -05:00
mdipierro
29201be7f0 fixed problem with pypy 2012-09-27 22:09:23 -05:00
mdipierro
f667c6224f added better comments to address issue 1033 2012-09-27 21:45:19 -05:00
mdipierro
ab6f0fd62d fixed field_parent references broken in 2.0.x, thanks Marin 2012-09-27 15:12:36 -05:00
mdipierro
da23a195ab removed some un-necessary has_attr 2012-09-27 14:43:57 -05:00
mdipierro
b1ec80793c fixed add button in grid 2012-09-27 14:21:55 -05:00
mdipierro
55cd08865f fixed issue 1032, thanks Carlos 2012-09-27 14:09:05 -05:00
mdipierro
4efd08a66f http 422, better tagcloud, possibly fixed firbird issue with tagcloud 2012-09-27 14:05:43 -05:00
mdipierro
ded6b0579d possibly fixed issue 1031, thanks villas 2012-09-26 12:45:56 -05:00
Massimo
534e8a629e db.get(,default=None), thanks Carlos 2012-09-25 16:18:52 -05:00
Massimo
b42436909f distinct instead of groupby 2012-09-25 14:56:49 -05:00
Massimo
b30c1af78a test 2012-09-25 14:50:32 -05:00
mdipierro
d984652ab7 CAS should disabled retrive username 2012-09-24 22:44:19 -05:00
mdipierro
440885cee2 synced web2py.js, thanks Jeremy 2012-09-24 20:18:30 -05:00
mdipierro
547ad1e9dc db().select(...query.case('true','false)) code cleanup 2012-09-24 18:09:22 -05:00
mdipierro
e7e875bb7b db().select(...query.case('true','false)) 2012-09-24 18:06:07 -05:00
mdipierro
c41f9972c3 gluon/contrib/comet_messaging.py -> gluon/contrib/websocket_messaging.py 2012-09-24 16:21:11 -05:00
mdipierro
be76f61c96 nore more typo fixed, thanks niphlod 2012-09-24 15:54:58 -05:00
mdipierro
ffca891f57 data, no attr, thanks Niphlod 2012-09-24 15:13:34 -05:00
mdipierro
40d3ff40f6 apos entity fix, thanks Michele 2012-09-24 12:48:39 -05:00
mdipierro
b8b2eadf2e better setup-web2py-nginx-uwsgi-ubuntu.sh, thanks Bruno 2012-09-24 12:44:42 -05:00
mdipierro
ec16dc8cec crud methods have FORM **attributes, thanks Daniel 2012-09-24 12:43:22 -05:00
mdipierro
e8a2b3b10f fixed https://github.com/web2py/web2py/pull/33, fetching Oracle Clobs, thanks dhx 2012-09-24 12:39:28 -05:00
mdipierro
bcb6e477cf fixed issue 1028, thanks Sherdim 2012-09-24 11:59:57 -05:00
mdipierro
823dbdfcc1 addClass/hasClass entropy_check, thanks Niphlod 2012-09-24 11:50:59 -05:00
mdipierro
9cfffa8a78 fixed minify code to fix paths in css files, thanks Jeremy 2012-09-24 10:11:35 -05:00
mdipierro
862543a12c css:inline patch,thanks Jeremy 2012-09-24 09:25:26 -05:00
mdipierro
6e20017723 SQLFORM().accepts(onvalidation=dict(onchange=lambda....)), thanks Alan 2012-09-23 19:24:05 -05:00
mdipierro
e7fd8ee0b7 linked_tables in smartgrid can be a dict() 2012-09-23 19:16:27 -05:00
mdipierro
554fe30288 better entropy colors and optional callback, thanks Niphlod 2012-09-23 17:00:34 -05:00
mdipierro
3fbd80728d better entropy colors and optional callback, thanks Niphlod 2012-09-23 16:58:11 -05:00
mdipierro
1fb81bec39 linked_tables in smartgrid can be a dict() 2012-09-23 16:31:44 -05:00
mdipierro
2e0e559c59 linked_tables in smartgrid can be a dict() 2012-09-23 16:30:31 -05:00
mdipierro
68f63dc89b moved layout.js in web2py_bootstrap.js and include_files(extensions=[...]), thanks Jeremy 2012-09-23 14:37:50 -05:00
mdipierro
d8417955b3 entropy check code in web2py.js, thanks Niphlod 2012-09-23 14:07:50 -05:00
Michele Comitini
f4cc813740 fixed apos encoding. 2012-09-22 23:37:06 +02:00
Michele Comitini
39f5c04f94 added comment 2012-09-22 23:14:15 +02:00
Michele Comitini
f1fcb886a0 utf-8 entities pre-encoding speedup. 2012-09-22 23:10:07 +02:00
Michele Comitini
7b373ecb71 compatibility with xhtml "apos" entity and entity decoding speedup. 2012-09-22 22:58:55 +02:00
mdipierro
c9fc88e8de fixed typo in validators 2012-09-22 11:19:14 -05:00
mdipierro
92ade120af removed some duplication of code in dal.py, thanks Mart 2012-09-22 10:11:17 -05:00
mdipierro
613252f210 restored comments in boostrap_css.css 2012-09-22 09:54:53 -05:00
mdipierro
db99f6f34a moved entropy js back to user.html 2012-09-22 09:52:08 -05:00
mdipierro
768dbf5bd3 formstyle='inline' for forms with single field 2012-09-21 22:49:45 -05:00
mdipierro
305e7906b9 reverted 4077 because distinct on and groupby are not equivalent. Moreover distinct on is supported only by postgresql because potentially non-deterministic and should be discouraged. Thanks Alexander 2012-09-21 22:29:55 -05:00
mdipierro
0fc03982c8 broken long lines in minify 2012-09-21 22:23:45 -05:00
mdipierro
dea823f575 fixed share Google+, thanks nicozanf 2012-09-21 22:14:08 -05:00
mdipierro
44d0b21eb9 Merge branch 'master' of https://github.com/nicozanf/web2py 2012-09-21 22:13:09 -05:00
mdipierro
58cff21ced moved entropy JS in PasswordWidget but the source should be moved in separate file 2012-09-21 22:12:17 -05:00
mdipierro
78cc80714d added missing patch, thanks Niphlod 2012-09-21 22:01:51 -05:00
Nico Zanferrari
67ad20ce5a Modified share to Buzz to Google+ 2012-09-22 00:10:23 +02:00
nicozanf
db116d0a07 Merge pull request #3 from mdipierro/master
up
2012-09-21 14:32:55 -07:00
Michele Comitini
5f7befcfbd merge 2012-09-21 23:26:25 +02:00
Michele Comitini
dbcbc5eb95 merge 2012-09-21 23:25:09 +02:00
mdipierro
2be3037ed3 cleanup web2py_bootstrap.css 2012-09-21 09:37:37 -05:00
mdipierro
eb1a3da363 scheduler optimization for single process, thanks Niphlod 2012-09-21 08:58:43 -05:00
mdipierro
fd9b100423 user.html has entrpy color-coding, thanks Niphlod 2012-09-21 08:57:11 -05:00
mdipierro
3c8c25d680 hidden fields should be visible 2012-09-21 08:29:16 -05:00
nicozanf
a0e26dfc2d Merge pull request #1 from mdipierro/master
test
2012-09-20 13:29:35 -07:00
mdipierro
49f7d6bab1 added search to codemirror 2012-09-20 13:25:54 -05:00
mdipierro
358ec48d8a better zip_static_files.py, thanks Niphlod 2012-09-20 11:19:11 -05:00
mdipierro
afbbfd7e46 fixed issue 1021, thanks Edouard and Jonathan 2012-09-20 11:16:51 -05:00
nicozanf
45391c7cc8 Unnecessary calls to logging()
the module logging() is not imported and called unnecessary.
2012-09-20 17:52:55 +03:00
mdipierro
2fc2275495 possibly fixed issue 1020 2012-09-20 09:27:05 -05:00
mdipierro
b6bba49d47 changed brand color 2012-09-20 09:24:38 -05:00
mdipierro
887f02f859 better layout yet, thanks Paolo 2012-09-20 09:19:21 -05:00
mdipierro
a5ef1c8e3b new web2py_bootstrap_nojs.css, thanks Paolo 2012-09-20 09:16:04 -05:00
mdipierro
cac6633bf7 entropy computation in IS_STRONG, thanks Jonathan 2012-09-20 09:14:51 -05:00
mdipierro
738059f56a fixed a problem with reset_password redirect loop 2012-09-19 23:04:10 -05:00
mdipierro
ef7b1c1454 mail.send(...,sender='Mr X <%(sender)s>') 2012-09-19 00:03:06 -05:00
mdipierro
cf30f1b255 mail.send(...,sender='Mr X <%(sender)s>') 2012-09-19 00:00:18 -05:00
Michele Comitini
4c4462987e Merge github.com:web2py/web2py 2012-09-19 00:26:30 +02:00
mdipierro
d21af5b277 enhanced imapadapter, thanks Alan 2012-09-18 13:39:16 -05:00
mdipierro
a72cdcfd90 fixed recent typo, thanks Christian 2012-09-18 13:37:41 -05:00
mdipierro
0e3f7a0706 possibly fixed issue 1016 2012-09-18 13:35:47 -05:00
mdipierro
15622d2e92 some more CSS fixes, thanks Paolo 2012-09-17 21:37:13 -05:00
mdipierro
554bb815c9 bootstrap 2.1.1, thanks Paolo 2012-09-17 21:32:49 -05:00
mdipierro
8c14e64909 improved minify, thanks Niphlod 2012-09-17 21:25:05 -05:00
mdipierro
b1d3e8faaa IS_IN_DB cacheable=True 2012-09-17 16:22:30 -05:00
mdipierro
9784c198e3 fixed a problem with order of table definitions in auth.wiki, thanks David 2012-09-17 14:23:13 -05:00
mdipierro
642a9c5c94 fixed problem with missing wiki_media.filename 2012-09-17 11:47:07 -05:00
mdipierro
c83bdbd14e fixed issue 1014, thanks Sherdim 2012-09-17 11:43:26 -05:00
mdipierro
6880727e4f better layout, thanks Paolo 2012-09-17 11:36:00 -05:00
mdipierro
db2ef362af fixed comment 2012-09-17 10:26:17 -05:00
mdipierro
233f0cfd0d fixed issue 1005, thanks howesc 2012-09-17 09:36:13 -05:00
mdipierro
3340398cd7 fixed imap dal __contains__ issue 1013, thanks Alan 2012-09-17 09:12:13 -05:00
mdipierro
d2d07a3fc1 cid argument in SQLTABLE, thanks Massimiliano 2012-09-17 08:58:01 -05:00
mdipierro
1b9e7daca5 fixed ducktyping problem, thanks Jonathan 2012-09-17 07:13:26 -05:00
mdipierro
68e8cd64f1 fixed exception on missin stored_password 2012-09-17 07:10:51 -05:00
mdipierro
3b053b5d60 scripts/zip_static_files.py, thanks Niphlod 2012-09-16 15:55:10 -05:00
mdipierro
74284193dc niphlod is right, no need to to restrict gzip streaming to rocket 2012-09-16 15:54:20 -05:00
mdipierro
c9a7b2394d convert distinct to groupby when not supported 2012-09-16 15:51:51 -05:00
mdipierro
6d79d3352c better streamer 2012-09-16 15:38:31 -05:00
mdipierro
508b3e1db7 adding missing import in scheduler 2012-09-16 14:10:39 -05:00
mdipierro
34a71b5e2d possibly fixed issue 1011 2012-09-16 13:55:29 -05:00
mdipierro
49fb0c90ad fixed problem with error on liststring widget 2012-09-16 13:06:43 -05:00
mdipierro
82bb245d43 fixed alignment in forms with list:string 2012-09-16 12:23:19 -05:00
mdipierro
fa480b0bc3 fixed datetime T in scheduler 2012-09-16 11:46:03 -05:00
mdipierro
05d351cd68 fixed issue 1010, error reporting on list:string 2012-09-16 11:43:03 -05:00
mdipierro
60b6fd11f9 better impersonate, thanks Alan 2012-09-16 10:43:39 -05:00
mdipierro
f5003bb07a typo in new appadmin.html 2012-09-16 08:53:01 -05:00
mdipierro
3bc94b2794 auth.wiki(render='markmin'), thanks Guruyaya 2012-09-15 15:42:44 -05:00
mdipierro
8960f91c7b wiki file should be filename, thanks David 2012-09-15 13:41:24 -05:00
mdipierro
b52cf468af gae_memcache.clear(), thanks Matt 2012-09-14 21:17:01 -05:00
mdipierro
4031b49d77 cache.with_prefix(cache.ram,'prefix'), thanks Bruno 2012-09-14 16:08:25 -05:00
mdipierro
7afb5072c7 db.t.f.epoch(), thanks Niphlod 2012-09-14 15:51:58 -05:00
mdipierro
0a2f810264 fixed google+ share 2012-09-14 09:42:16 -05:00
mdipierro
afcbfccdc4 db(table).select() uses table._id<>None instead of table._id>0 2012-09-14 09:27:09 -05:00
mdipierro
037215da47 fixed typo in setup script, thanks Devon 2012-09-14 09:23:31 -05:00
mdipierro
ac736c6deb uninstalled apps backup under deposit 2012-09-14 08:47:42 -05:00
mdipierro
9ada6555e4 removed troublesome chipin widget 2012-09-13 21:48:40 -05:00
mdipierro
0cd5e0869d tables and field names should be allowed to start in a number, thanks Adi 2012-09-13 21:04:45 -05:00
mdipierro
e478e836a2 R-2.0.9 2012-09-13 17:48:19 -05:00
mdipierro
369681d76d R-2.0.9 2012-09-13 17:06:17 -05:00
mdipierro
d8cf6810b8 conditional paginator makes better grid 2012-09-13 14:56:42 -05:00
mdipierro
b6a00269af yet more layout improvements, thanks Paolo 2012-09-13 14:12:06 -05:00
mdipierro
8f267a19c4 fixed grid layout again 2012-09-13 14:06:58 -05:00
mdipierro
59d9645f33 fixed routes.examples.py 2012-09-13 09:28:44 -05:00
mdipierro
ab985d90f7 some more flash style changes 2012-09-13 09:08:12 -05:00
mdipierro
1894c4b855 yellow flash-top, thanks Paolo 2012-09-13 08:35:47 -05:00
mdipierro
c2109e9744 fixed dt = time_expire in memcache, thanks Bruno 2012-09-13 08:30:20 -05:00
mdipierro
7755a58bb3 fixed error style again 2012-09-13 07:46:16 -05:00
mdipierro
1b0890ae6e better error messages 2012-09-13 07:18:23 -05:00
mdipierro
78540624ae forgiving T for unicode, thanks Vladyslav 2012-09-13 06:59:42 -05:00
mdipierro
1db243e236 fixed bug in mem(e)cache 2012-09-13 06:58:45 -05:00
mdipierro
9cca0dcce8 masking passwords in toolbar, thanks Bruno 2012-09-13 06:55:58 -05:00
mdipierro
c9f05b0299 more flexible notifications 2012-09-12 22:53:59 -05:00
mdipierro
9224e0c3f2 removed applications/welcome/private/auth.key 2012-09-12 11:26:21 -05:00
mdipierro
8fb24e5315 removed unnecessary line 2012-09-12 11:16:51 -05:00
mdipierro
92557c8225 fixed issue 1000, broken GAE belongs for field id, thanks Alan 2012-09-12 11:10:58 -05:00
mdipierro
33e6975ac4 fixed issue 999 removed unwanted redirect in grid 2012-09-12 11:08:32 -05:00
mdipierro
e02309bc44 fixed span12 problem in welcome 2012-09-12 10:43:40 -05:00
mdipierro
a6269d77ae navbar dropdown, thanks Paolo 2012-09-12 10:18:34 -05:00
mdipierro
ad6ed03f0d fixed minify caching problem, thanks Niphlod 2012-09-12 09:55:56 -05:00
mdipierro
e3a9044164 moved deafult headers logic, thanks Niphlod 2012-09-11 17:32:46 -05:00
mdipierro
9a781c0f2b more examples in routes.example.py 2012-09-11 16:49:30 -05:00
mdipierro
00eb0d8a85 yet simpler header logic, thanks Anthony and Niphlod 2012-09-11 14:06:44 -05:00
mdipierro
722fb1fb91 removed headers from response.stream 2012-09-11 14:02:55 -05:00
mdipierro
9182e7a882 better languages.py, thanks Vladyslav 2012-09-11 13:37:16 -05:00
mdipierro
49c82bcd65 allow removal of headers with response.headers[key]=None 2012-09-11 12:59:45 -05:00
mdipierro
87a1a861b8 possible fix for default response haders 2012-09-11 12:53:44 -05:00
mdipierro
c17e191815 menu has empty components 2012-09-11 10:28:31 -05:00
mdipierro
dbf7a3f72d auth.wiki(restrict_search=True) authors can only search their own pages 2012-09-11 10:25:56 -05:00
mdipierro
fc3efaed3d better handling of cross-domain urls in parametric router, thanks Jonathan 2012-09-11 09:55:58 -05:00
mdipierro
314278ac69 fixed issue 996 2012-09-11 09:53:08 -05:00
mdipierro
7356c122de fixed issue 993, thanks Sherdim 2012-09-11 09:39:13 -05:00
mdipierro
664a0bc812 fixed a problem with dal and uploadfields not been created, blob fields should hidden 2012-09-11 09:27:00 -05:00
mdipierro
bee9f00da8 fixed a problem with dal and uploadfields not been created 2012-09-11 09:25:13 -05:00
mdipierro
c3d1d959b2 markmin improvement thanks Villas and Vladyslav 2012-09-11 08:35:58 -05:00
mdipierro
7bb465df07 fixed bug in cache minify, thanks Jeremy 2012-09-11 08:24:59 -05:00
mdipierro
25ca7fe6fe smarter select although join/left ignore common fields 2012-09-10 18:26:46 -05:00
mdipierro
566f030902 stream allows for optional headers and fixed a formtyle bug, thanks Anthony 2012-09-10 17:29:41 -05:00
Michele Comitini
37e3f95538 Merge github.com:web2py/web2py 2012-09-10 22:28:45 +02:00
mdipierro
830b6f120d possibly fixed dropbox_account.py, issue 991 2012-09-10 11:34:37 -05:00
mdipierro
addb7dfd3a removed editarea, amy, ace; included zencoding support for codemirror 2012-09-10 10:59:28 -05:00
mdipierro
87d2b22446 fixed GAE default problem, thanks Jan-Karen and Alan 2012-09-10 09:56:36 -05:00
mdipierro
a1559c5802 fixed issue 989, thanks Dominic 2012-09-10 07:51:45 -05:00
mdipierro
9453009de6 fixed issue 974 2012-09-10 07:47:52 -05:00
mdipierro
199aceefc1 fixed bug in wiki can_manage 2012-09-10 07:40:33 -05:00
mdipierro
f0aca3374f upgraded pysimplesoap to revision e054a3903c1d, version 1.06c 2012-09-09 21:39:57 -05:00
mdipierro
bb326e4030 line highlight and fullscreen in codemirror, thanks lightdot 2012-09-09 16:57:09 -05:00
mdipierro
23c46f150f more more mixing of tab and spaces with codemirror 2012-09-09 14:58:50 -05:00
mdipierro
2d990499d2 codemirror line wrapping 2012-09-09 14:32:25 -05:00
mdipierro
a15bed17d8 new codemirror style 2012-09-09 14:24:26 -05:00
mdipierro
fd808a85df improved the script setup-web2py-ubuntu.sh, thanks Martin 2012-09-09 14:15:14 -05:00
mdipierro
931eefd260 added codemirror ot gitbub, made default for testing 2012-09-09 13:54:37 -05:00
mdipierro
1d4d52c9c9 fixed issue 974, thanks Corne 2012-09-09 09:49:56 -05:00
mdipierro
97bcdfd73a fixed issue 964, thanks Jonathan 2012-09-09 09:20:45 -05:00
mdipierro
ebcd7a16a9 fixed a bug and replace div anchor with span anchor, as suggested by Vladyslav 2012-09-09 09:14:50 -05:00
mdipierro
7002dcec0e codemirror seems to work with admin 2012-09-08 23:22:42 -05:00
mdipierro
d29d543e95 auth.wiki(render='html') 2012-09-08 22:22:06 -05:00
mdipierro
653b8826d4 fixed jQuery multiselect in admin 2012-09-08 21:59:49 -05:00
mdipierro
57072adc57 auth.wiki(render) is exposed 2012-09-08 20:33:24 -05:00
mdipierro
d02035a1a1 possibly fixed issue 981 2012-09-08 19:03:07 -05:00
mdipierro
7265736ce2 possibly fixed issue 964 2012-09-08 19:02:19 -05:00
mdipierro
0534080b83 added caching tests and minor rewtite 2012-09-08 16:04:07 -05:00
mdipierro
edfc09c755 backward compatible caching options 2012-09-08 15:46:25 -05:00
mdipierro
b2c2762f06 experimental codemirror 2012-09-08 14:50:53 -05:00
mdipierro
c90a0592dd better cron defaults, thanks Jonathan 2012-09-07 09:38:42 -05:00
mdipierro
b85baefad9 R-2.0.8 2012-09-06 21:33:11 -05:00
mdipierro
f8fce42df7 R-2.0.8 2012-09-06 21:32:44 -05:00
mdipierro
1e6fa4159a fixed makrmin again, note to self: always trust Valdyslav about markmin 2012-09-06 10:54:04 -05:00
mdipierro
a8bc251a94 compted fields visible in SQLFORM(readonly=True) 2012-09-06 08:59:11 -05:00
mdipierro
d8ba67e2e3 fixed issue 977, contains empty list, thanks iiijjjjiii 2012-09-06 08:41:23 -05:00
mdipierro
141bf7f0a3 moved the ttab_out in markmin2html before @{...}, I think this is the right thing 2012-09-06 08:15:29 -05:00
Massimo Di Pierro
b464d5a5b7 fixed some problems with MARKMIN, thanks Vladyslav 2012-09-05 16:59:46 -05:00
mdipierro
1b496525b1 fixed admin version display, thanks Marin 2012-09-05 10:47:46 -05:00
mdipierro
a70524bb74 R-2.0.7 2012-09-05 09:26:38 -05:00
mdipierro
fea2dec9f7 updated tags 2012-09-04 18:33:23 -05:00
mdipierro
dd99652087 simplified grid console logic and style 2012-09-04 17:58:52 -05:00
Michele Comitini
f42984612f Merge github.com:web2py/web2py 2012-09-04 22:37:20 +02:00
mdipierro
22dca58c9a R-2.0.7 2012-09-04 15:32:27 -05:00
mdipierro
450101be8e fixed issue 976 with quoting in pg8000 2012-09-04 15:09:02 -05:00
mdipierro
fe14686586 fixed problem with headers in components 2012-09-04 15:07:09 -05:00
mdipierro
0c3c90af6a prevent exception in admin, thanks Marin 2012-09-04 14:47:13 -05:00
mdipierro
3a9c8d9c0f fixed update with compute fields (again) and ecomponents in markmin 2012-09-04 14:43:38 -05:00
mdipierro
c16f051e5b try fetchall except, back in executesql, thanks Carlos 2012-09-03 16:15:06 -05:00
mdipierro
ec1608ba19 executesql(fetch=False) 2012-09-03 14:35:01 -05:00
mdipierro
74fb16a758 minor changes in web2py.css 2012-09-03 10:18:15 -05:00
mdipierro
6cf7b7b606 fixed input-xlarge class issue, thanks Anthony 2012-09-03 08:55:54 -05:00
mdipierro
6dcec8a176 updated markmin docs 2012-09-03 08:54:45 -05:00
mdipierro
9c7786d06b fixed error in admin login 2012-09-03 08:47:10 -05:00
mdipierro
52a796ef92 faster custom_import, thanks Michele 2012-09-03 08:17:05 -05:00
mdipierro
ae2eefc6bf executesql allows fields and/or colnames to be independently specfied, thanks Ahtony and Niphlod 2012-09-03 08:12:40 -05:00
mdipierro
148e099f58 CACHED_REGEXES_MAX_SIZE, thanks Anthony 2012-09-03 08:09:49 -05:00
Michele Comitini
d7f27b8ae7 speed optimization in custom_import.py by using local namespace 2012-09-03 08:40:14 +02:00
mdipierro
0351f37e67 fixed backward compatibility issue in dal with __int__, thanks Dominic 2012-09-02 22:34:24 -05:00
mdipierro
69bac57058 conditional session connect only 2012-09-02 22:30:33 -05:00
mdipierro
cbcac3af70 routes_in = [('/welcome','/welcome',dict(web2py_disable_session = True))] 2012-09-02 15:09:32 -05:00
mdipierro
2b030a5e87 routes_in = (regex, value, custom_env) 2012-09-02 15:03:25 -05:00
mdipierro
8eb15627bf allow navbar without define_tables, thanks Anthony 2012-09-02 14:52:52 -05:00
Michele Comitini
9a5e8172d6 Merge github.com:web2py/web2py 2012-09-02 21:42:06 +02:00
mdipierro
ae8bf7b60d faster re.compile in validators 2012-09-02 12:26:16 -05:00
mdipierro
c292b896e3 conditional models with cached re.compile, thanks Anthony 2012-09-02 12:12:59 -05:00
mdipierro
f35b7283c0 capitalized regex in dal.py 2012-09-02 11:58:56 -05:00
mdipierro
b746581d5a less regex in dal.py 2012-09-02 11:50:35 -05:00
mdipierro
d93a8d41d2 removed one re.compile in rewrite filter_url 2012-09-02 11:12:46 -05:00
mdipierro
e27466b8a6 optional re.compile of generic_patterns 2012-09-02 11:05:19 -05:00
mdipierro
90ca080b1e R-2.0.6 2012-09-01 22:35:40 -05:00
mdipierro
9a89a9beac fixed bug in tickets2emails, thanks Niphlod 2012-09-01 22:33:46 -05:00
mdipierro
0f94ac864b fixed bug in language file that corrupts files on language update, thanks kverdecia2 2012-09-01 22:32:12 -05:00
mdipierro
f6b345632f fixed typo, thanks Mart 2012-09-01 07:01:38 -05:00
mdipierro
5db296c542 R-2.0.5 2012-08-31 16:28:40 -05:00
mdipierro
eb45052021 scheduler validators, thanks Niphlod 2012-08-31 16:15:59 -05:00
mdipierro
43cee04283 2.0.5 2012-08-31 16:11:56 -05:00
mdipierro
5cab46f2a1 better timezone logic 2012-08-31 16:04:13 -05:00
mdipierro
08443a452d better timezone logic 2012-08-31 16:00:23 -05:00
mdipierro
dcb934fb45 R-2.0.4 2012-08-31 15:38:37 -05:00
mdipierro
68c80d619d minor cleanup 2012-08-31 14:27:50 -05:00
mdipierro
fa2d2ba91c adding README, again 2012-08-31 13:37:30 -05:00
mdipierro
58a4874632 fixed problem with case in migrations 2012-08-31 13:32:22 -05:00
mdipierro
a973276ad6 SQL(debug=True) logs migration info 2012-08-31 11:08:20 -05:00
mdipierro
515e7f3dab support for self reference with non standard id 2012-08-31 10:21:37 -05:00
mdipierro
07486b27a7 yet better markmin has [[NEWLINE]], thanks Vladyslav 2012-08-31 09:02:54 -05:00
mdipierro
358301338c try... execpt plural_rules 2012-08-31 00:31:51 -05:00
mdipierro
6ebac86632 added plural rules again 2012-08-31 00:29:09 -05:00
mdipierro
bc176bfbf2 fixed postgresql uri bug 2012-08-31 00:11:33 -05:00
mdipierro
e46141adf9 fixed plural rules with pkgutil 2012-08-30 23:55:14 -05:00
mdipierro
61c33a7038 windows and osx cannot find the rules folder, for now, ignore it 2012-08-30 23:07:51 -05:00
mdipierro
83cf74b71b another driver selection issue 2012-08-30 22:36:10 -05:00
mdipierro
0038f9d43e improved logic in dal driver selection (fixed) 2012-08-30 22:19:59 -05:00
mdipierro
8e24ce9f30 improved logic in dal driver selection 2012-08-30 22:10:46 -05:00
mdipierro
529026f0f4 fixed 'fdb' is not defined issue, thanks villas 2012-08-30 20:24:56 -05:00
mdipierro
5b0ac94211 fixed typo in index_name 2012-08-30 20:19:01 -05:00
mdipierro
5ab33643c8 Rows.find(f,limitby=(0,10)) 2012-08-30 20:07:34 -05:00
mdipierro
88e72ff62a added empty applications/examples/languages/README else folder not version controller in git and hg 2012-08-30 17:36:19 -05:00
mdipierro
2df3282840 fixed issue 964, thanks Michael and Jonathan 2012-08-30 17:04:07 -05:00
mdipierro
171f94b9ea R-2.0.3 2012-08-30 15:38:41 -05:00
mdipierro
feb27b919b fixed bug in smartgrid header, thanks Adi 2012-08-30 15:36:36 -05:00
mdipierro
1641b10e79 cacheable select in grid, thanks Anthony 2012-08-30 15:26:58 -05:00
mdipierro
98ff3b0677 fixed bug in pluralization, thanks Vladyslav 2012-08-30 15:20:36 -05:00
mdipierro
15923fceaf new default firebird driver, thanks mariuz 2012-08-30 15:10:45 -05:00
mdipierro
0553e5b50e fixing missing use_username issue, thanks Annet 2012-08-30 15:01:22 -05:00
mdipierro
f83803ffad fixed path find for pluralization rules 2012-08-30 14:54:40 -05:00
mdipierro
d5291b57ab logging rotation in example, thanks Jonathan 2012-08-30 14:49:50 -05:00
mdipierro
3709dcedd2 fixed AttributeError: 'Expression' object has no attribute '_table' issue 2012-08-30 14:42:32 -05:00
mdipierro
2b83928cab fixed janrain login with GAE 2012-08-30 08:31:52 -05:00
mdipierro
e9dcabae7d fixed bug in markmin 2012-08-30 08:17:28 -05:00
mdipierro
4845237eba fixed grin without login, thanks Liam 2012-08-30 08:14:10 -05:00
mdipierro
eb2c2ea0a0 update link fixed, thanks Niphlod 2012-08-30 08:09:33 -05:00
mdipierro
be7390424a allow tasks without timeout 2012-08-30 08:05:09 -05:00
mdipierro
1ebc4dfad2 2.0.2 2012-08-29 22:00:59 -05:00
mdipierro
341a35410d better webclient.py 2012-08-29 21:57:09 -05:00
mdipierro
7250e27ba1 changed vars in example and test for webclient 2012-08-29 18:31:23 -05:00
mdipierro
d6c34a0142 more comments in webclient.py 2012-08-29 18:27:30 -05:00
mdipierro
00377325f0 added timing and history to webclient 2012-08-29 18:22:07 -05:00
mdipierro
34edf3e724 simplied handling of postbacks 2012-08-29 18:14:24 -05:00
mdipierro
31a695f73f more test improvements, thanks Jonathan 2012-08-29 18:01:27 -05:00
mdipierro
c6a22d237b updated gluon/tests/__init__.py, thanks Jonathan 2012-08-29 17:59:44 -05:00
mdipierro
9cb7fd0a00 updated CHANGELOG 2012-08-29 17:44:07 -05:00
mdipierro
f7bd69fad4 webclient.py and test_web.py 2012-08-29 17:40:03 -05:00
mdipierro
178925cd56 fixed problem with computed fields 2012-08-29 16:05:41 -05:00
mdipierro
de88f3bde9 fixed problem with iterator in template.py 2012-08-29 15:42:51 -05:00
mdipierro
9c98db6fa6 2.0.1 rc5 2012-08-29 15:13:10 -05:00
mdipierro
e69a22748f removed code comitted accidentally 2012-08-29 15:12:46 -05:00
mdipierro
a40b55d8d4 fixed some problems with admin no GAE, still readonly 2012-08-29 15:09:08 -05:00
mdipierro
b5809db9eb fixed error with referenced_by, thanks Marin 2012-08-29 10:28:04 -05:00
mdipierro
fa9c91de83 catch missing winservice 2012-08-29 10:12:11 -05:00
mdipierro
ceb48bd472 fixed to(env={}), thanks Anthony 2012-08-29 10:05:51 -05:00
mdipierro
9861a33c72 support for HEAD requests 2012-08-29 08:22:35 -05:00
Michele Comitini
ddb61d75ca Merge github.com:web2py/web2py 2012-08-29 14:42:05 +02:00
mdipierro
edeb237777 dict instead of {} where possible 2012-08-29 07:27:28 -05:00
Michele Comitini
e5f9358cf9 commit merge 2012-08-29 14:24:14 +02:00
mdipierro
a2d70980d8 fixed the case of missing tickets and a typo in last commit 2012-08-28 22:14:59 -05:00
mdipierro
5daf7e5a9b simplified template.py 2012-08-28 21:11:27 -05:00
mdipierro
6b606aaa24 lots of simplifications (again) 2012-08-28 20:38:11 -05:00
mdipierro
a001a10bac lots of simplifications 2012-08-28 20:30:32 -05:00
mdipierro
8860c9a1dd Row.__nonzero__, thanks Marin 2012-08-28 19:11:43 -05:00
mdipierro
5af9fe0a3e temp vars in dal.py (fixed error) 2012-08-28 19:07:26 -05:00
mdipierro
e821955c97 temp vars in dal.py 2012-08-28 18:52:25 -05:00
mdipierro
3884878efb faster lazytables check 2012-08-28 16:52:30 -05:00
mdipierro
56716e7a20 catching AttributeError 2012-08-28 15:36:05 -05:00
mdipierro
cd58e034ca added backward compatibility fix for row.id when id not called id (doh) 2012-08-28 14:57:23 -05:00
mdipierro
0ad9e3b707 fixed changelog 2012-08-28 14:45:08 -05:00
mdipierro
9f8134a51b fixed issue with row[db.table.field] for result of join, thanks Dominic 2012-08-28 14:26:49 -05:00
mdipierro
94096d0276 some more optimizations in parse rows 2012-08-28 14:03:59 -05:00
mdipierro
ad0b9a08c6 updated languages/default.py 2012-08-28 11:42:22 -05:00
mdipierro
fa501eff6d fixed mobile issue, thanks Martin 2012-08-28 10:56:19 -05:00
mdipierro
6e8fbf5f8e more flexible auth.wiki, thanks Alan 2012-08-28 10:54:06 -05:00
mdipierro
869b430ba6 fixed issue 959, thanks Haag 2012-08-28 10:44:51 -05:00
mdipierro
d7e100ac71 RecordUpdater, RecordDeleted and compute on update 2012-08-28 10:32:01 -05:00
mdipierro
617aa3627a db().count(cache=...) 2012-08-28 10:02:21 -05:00
mdipierro
266208c13d many iteritems optimizations 2012-08-28 09:35:36 -05:00
mdipierro
632493f654 many speed improvements, thanks Michele 2012-08-28 08:28:36 -05:00
Michele Comitini
f9afeb51f8 always use dict for environment 2012-08-28 00:25:22 +02:00
Michele Comitini
eb33b3fd5c speeding with map() 2012-08-28 00:03:31 +02:00
mdipierro
43fc70695d improved toorbar, thanks Anthony 2012-08-27 16:16:25 -05:00
mdipierro
093ca1b506 capitalization in appadmin 2012-08-27 15:29:27 -05:00
mdipierro
d01bb00ca2 slightly slicker appadmin 2012-08-27 15:13:27 -05:00
mdipierro
fb52fac9cc slightly slicker appadmin 2012-08-27 15:08:20 -05:00
mdipierro
8a5c79d05b R-2.0.1rc4 2012-08-27 14:54:11 -05:00
mdipierro
ce968db278 toolbar() shows non-lazy tables, thanks Anthony 2012-08-27 14:07:25 -05:00
mdipierro
d241c9f7cb 100x faster db().select(cache=...) 2012-08-27 13:30:42 -05:00
mdipierro
ecba8d44a9 better test_languages.py 2012-08-27 13:10:52 -05:00
mdipierro
ba385cf5b1 fixed a bunch of typos form recent commits, thanks Jonathan 2012-08-27 12:55:41 -05:00
mdipierro
ab88eca645 fixed some typos, thanks Jonathan 2012-08-27 12:15:30 -05:00
mdipierro
ddf4465c00 possibly faster auth 2012-08-27 12:02:53 -05:00
mdipierro
1c3f113122 scripts/bench.py 2012-08-27 11:07:52 -05:00
mdipierro
3ff4176e1f faster and leaner languages, should be 100% backward compatible, plurals work again 2012-08-27 10:57:26 -05:00
mdipierro
a3dfc9f621 better portalocker 2012-08-27 10:13:47 -05:00
mdipierro
222364e040 better portalocker 2012-08-27 10:06:09 -05:00
mdipierro
e5568aaa82 faster languages.py, still disabled plurals 2012-08-27 07:41:34 -05:00
mdipierro
47dcc8badd simplified languages.py, disable (for today) plural subsystem 2012-08-27 01:43:04 -05:00
mdipierro
6a0198aff5 scripts/rmorphans.py 2012-08-26 21:34:24 -05:00
mdipierro
b7c7a3468a title.png was needed after all 2012-08-26 21:20:23 -05:00
mdipierro
118424d686 removed lots of legacy files 2012-08-26 21:14:02 -05:00
mdipierro
4e0cdaddf7 fixed forced hideerror, thanks Jim 2012-08-26 20:46:02 -05:00
mdipierro
249f13f4bc fixed issue 961 with DIV.add_class, thanks Dulakian 2012-08-26 19:02:44 -05:00
mdipierro
030203effd no more has_key 2012-08-26 18:34:50 -05:00
mdipierro
334e150638 internal simplications in Auth 2012-08-26 17:57:10 -05:00
mdipierro
308f790f3c removed an inconcistency in Auth 2012-08-26 17:53:27 -05:00
mdipierro
d47dbc604e more simplification in Auth 2012-08-26 17:48:37 -05:00
mdipierro
96d193f7dd auto-login after reset password 2012-08-26 17:28:19 -05:00
mdipierro
3e94ca4f45 fixed login_onaccept, thanks Martin 2012-08-26 17:05:52 -05:00
mdipierro
d16033a417 more tests about dal 2012-08-26 15:51:15 -05:00
mdipierro
cab9afee44 fixed some problems with html.py tests and postprocessing, thanks Michael 2012-08-26 14:12:09 -05:00
mdipierro
1041e42f8d some speadup in dal parse 1.5x 2012-08-26 11:50:48 -05:00
mdipierro
6ed30dfbfe fixed xml() again 2012-08-26 10:41:26 -05:00
mdipierro
329f22f72c improved Table (10x), DAL(2x), Row(10x) without memory leak 2012-08-26 09:32:10 -05:00
Michele Comitini
8ac8164b06 Merge github.com:web2py/web2py 2012-08-26 11:22:06 +02:00
mdipierro
4e719c5858 xml(row_name,rows_name) 2012-08-26 00:00:15 -05:00
mdipierro
6577c656be db().select().xml(strict=True) 2012-08-25 23:54:23 -05:00
mdipierro
f76ec47fe3 minor imprvements in DAL repr 2012-08-25 23:06:28 -05:00
mdipierro
50cd630127 yet better storage, thanks Michele 2012-08-25 18:42:27 -05:00
Michele Comitini
7085e05388 used __slots__ to reduce memory ad speedup class methods lookup. 2012-08-26 01:05:02 +02:00
Michele Comitini
3962a80192 Merge github.com:web2py/web2py
Conflicts:
	gluon/contrib/login_methods/rpx_account.py
2012-08-26 00:50:46 +02:00
mdipierro
4079288a51 major optimization in Storage, Table, Row (2x), thanks Michele 2012-08-25 16:19:50 -05:00
mdipierro
6dfd16b62a typo in Storage, thanks Michele 2012-08-25 15:50:01 -05:00
mdipierro
4067c89260 R-2.0.1-rc3 2012-08-25 15:08:18 -05:00
mdipierro
dcce7fc39a fixed @//// in wiki and pep8 spacing 2012-08-25 11:29:11 -05:00
mdipierro
0a95246cb0 fixed anchor in markmin 2012-08-25 11:25:58 -05:00
mdipierro
eecaf85df6 updated changelog 2012-08-25 11:22:28 -05:00
mdipierro
13061671f8 GIT_MISSING message, thanks Niphlod 2012-08-25 11:17:39 -05:00
mdipierro
c2900480d7 better fix of recycle Response in template, thanks Anthony 2012-08-24 23:47:47 -05:00
mdipierro
fb65fdf25e changelog update 2012-08-24 23:37:10 -05:00
mdipierro
92e1213fe2 fixed some styles for auth.wiki 2012-08-24 23:11:45 -05:00
mdipierro
d21b3b4b8a executesql(fields=,columns=),thanks Anthony 2012-08-24 22:52:45 -05:00
mdipierro
c1945c9429 template render can recycle a Response(), thanks Anthony 2012-08-24 22:40:18 -05:00
mdipierro
1d56e253d7 DIV.elements(replace=...), thanks Anthony 2012-08-24 22:17:49 -05:00
mdipierro
a3df5c465e added .btn class in admin for grid 2012-08-24 19:24:58 -05:00
mdipierro
5491456985 more forgining auto links in markmin 2012-08-24 17:39:59 -05:00
mdipierro
ca80e47f3d new widget.py thanks Niphlod 2012-08-24 17:32:26 -05:00
mdipierro
929a5289e2 better error reporing on app_create failures 2012-08-24 17:05:18 -05:00
mdipierro
814f5d9448 auth links should have same scheme as app 2012-08-24 16:36:14 -05:00
mdipierro
f5e6fb6fbd another multi_user_mode fix 2012-08-24 16:24:43 -05:00
mdipierro
423f305fd0 added links to multi_user_mode management 2012-08-24 16:17:32 -05:00
mdipierro
9cc6c4ee3e fixed scripts/setup-web2py-nginx-uwsgi-ubuntu.sh \r 2012-08-24 15:53:10 -05:00
mdipierro
ccb0d25939 reverted to bootstrap 2.0 because of problems 2012-08-24 15:34:03 -05:00
Massimo Di Pierro
8d5855c93a fixed another bug in lazy Auth, thanks Villas 2012-08-24 13:45:13 -05:00
Massimo Di Pierro
9724bfb20e fixed typos in recent commit, thanks Angelo and Villas 2012-08-24 11:04:24 -05:00
Massimo Di Pierro
611aa6391a fixed bug in lazy auth, thanks Villas 2012-08-24 10:14:12 -05:00
Massimo Di Pierro
001ca98855 fixed problem with dal expressions being parenthesized, thanks Daniel 2012-08-24 10:05:07 -05:00
Massimo Di Pierro
0e84b4b269 renamed bootswatch*.css as web2py_bootstrap*.css 2012-08-24 09:53:57 -05:00
Massimo Di Pierro
3c51815d78 upgraded to Bootstrap 2.1.0 thanks Alec Taylor 2012-08-24 09:44:13 -05:00
Massimo Di Pierro
9969cd4c8c better generation of link in rpx_account, thanks Michele 2012-08-24 09:26:48 -05:00
Massimo Di Pierro
4ea9b1182f fixed app_cleanup of cache, thanks Spiffytech 2012-08-24 09:24:50 -05:00
Massimo Di Pierro
257501ce37 improved oparsing of CLOB in Oracle, thanks Daniel 2012-08-24 09:23:20 -05:00
Massimo Di Pierro
eb802838ee fixed problem with _listify, thanks Daniel 2012-08-24 09:15:34 -05:00
Massimo Di Pierro
c309588ae4 added missing table permission, thanks Daniel 2012-08-24 08:57:14 -05:00
mdipierro
e527f49d73 added contrib test, thanks Mariano 2012-08-23 18:59:32 -05:00
mdipierro
2bbe361783 fixed problem with fpdf import in generics, thanks Adrew 2012-08-23 16:56:26 -05:00
mdipierro
6c7de5a0b0 fixed tag rendering end edit menu permissions 2012-08-23 15:04:08 -05:00
mdipierro
113268b12a better style in wiki search and tagcloud 2012-08-23 14:52:45 -05:00
mdipierro
96d4de8277 T bug in tools 2012-08-23 14:33:43 -05:00
mdipierro
10d5b48643 smarter index.html for wiki 2012-08-23 13:19:19 -05:00
mdipierro
b3a8047ba3 edited makefile 2012-08-23 12:44:31 -05:00
mdipierro
9bd008021d R-2.0.1-rc2 2012-08-23 11:11:41 -05:00
mdipierro
2915dc75d3 fixed auth with lazy auth 2012-08-23 10:56:40 -05:00
mdipierro
e4d0e03078 lazy auth? 2012-08-23 10:48:36 -05:00
mdipierro
3785a4b5db reverted accidental tools change 2012-08-23 10:09:49 -05:00
mdipierro
f7f9e23246 fixed problem with on_define 2012-08-23 10:08:00 -05:00
mdipierro
945437e04d db.define_table('person',Field('name'),on_define=lambda table: [table.name.set_attributes(writable=False)]), thanks Jonathan 2012-08-23 09:20:25 -05:00
mdipierro
4d25413229 added Killer Web Development link, thanks Anthony 2012-08-23 09:00:56 -05:00
mdipierro
dacff1fc09 added DIV.add_class, DIV.remove_class, thanks Dulakian, fixed issue 952 2012-08-23 08:54:34 -05:00
mdipierro
4262511f91 restoring Settings backward compatibility, thanks Dominic 2012-08-23 08:42:47 -05:00
mdipierro
57b7018a83 fixed changelog typos, thanks Niphlod 2012-08-23 08:37:55 -05:00
mdipierro
d2999307d8 removed unwanted trailing spaces from fpdf 2012-08-23 08:36:50 -05:00
mdipierro
a528df0b2e moved pyfpdf to fpdf, thanks Mariano 2012-08-23 08:35:41 -05:00
mdipierro
c4c9024ee0 new pyfpdf, thanks Mariano 2012-08-23 08:31:04 -05:00
Michele Comitini
6bdde2379e Merge github.com:web2py/web2py 2012-08-23 14:10:50 +02:00
mdipierro
dac059e85e minor edits in changelog 2012-08-22 19:47:15 -05:00
mdipierro
a3d20386fc R-2.0.0rc1 2012-08-22 18:09:25 -05:00
mdipierro
9c3e4cf03a tag in Makefile 2012-08-22 18:08:58 -05:00
mdipierro
0630f4e298 cleaned up changelog for 2.0 2012-08-22 17:35:41 -05:00
mdipierro
dde46a4ee4 wiki.auth() has wiki-menu page 2012-08-22 17:07:44 -05:00
mdipierro
3b0d1ab410 reverting bootstrap 2.1.0 because messes up navbar 2012-08-22 16:03:03 -05:00
mdipierro
3ae625077f bootstrap 2.0 2012-08-22 15:59:06 -05:00
mdipierro
e36a3f9e33 fixed colors in navbar 2012-08-22 15:48:45 -05:00
mdipierro
7e5726a247 bootstrap 2.1.0 2012-08-22 15:36:55 -05:00
mdipierro
8ec67ea190 bootstrap 2.1.0 2012-08-22 15:36:28 -05:00
mdipierro
9d793348e2 reverted Storage again, check for bug not reliable, :-( 2012-08-22 15:27:19 -05:00
mdipierro
715daf6824 fixed have_bug 2012-08-22 13:00:28 -05:00
mdipierro
7db563066b bug detection for Storage, reverted improvements in dal :-( 2012-08-22 10:48:17 -05:00
mdipierro
b9fd6e5c68 simplied router logic, thanks Jonathan 2012-08-22 08:40:55 -05:00
mdipierro
68f2f0c400 Martin's menu patch 2012-08-22 08:38:04 -05:00
mdipierro
c400743bc3 confirm spelling, thanks sethkinast 2012-08-22 08:32:00 -05:00
mdipierro
e1fe556abb fixed portalocker in Storage, restored appadmin 2012-08-21 22:19:43 -05:00
mdipierro
ffe3faeb5f automenu 2012-08-21 22:07:18 -05:00
mdipierro
2f4f7711dc jquery 1.8.0 2012-08-21 22:03:53 -05:00
mdipierro
ecc6de6a02 scgi friendly patch, thanks Michele 2012-08-21 21:53:59 -05:00
Michele Comitini
8d94f99e4e Merge github.com:web2py/web2py 2012-08-22 03:22:34 +02:00
mdipierro
1fedbd105e fixed a bug in Row, recently introduced 2012-08-21 18:20:07 -05:00
Michele Comitini
68e1b496f1 use the URL to respect routers directives 2012-08-22 01:13:10 +02:00
mdipierro
3283ce144c fixed a problem with lazy tables and self.__dict__=self magic 2012-08-21 17:42:01 -05:00
mdipierro
3843406ba9 Table, DAL and Row use self.__dict__=self 2012-08-21 15:56:53 -05:00
mdipierro
fbb6efa5cf new Storage passes all tests 2012-08-21 14:41:43 -05:00
mdipierro
3812548447 another attempt at new Storage, thanks Jonathan 2012-08-21 14:30:02 -05:00
mdipierro
a16e51ad7b reverted Storage again. :-( 2012-08-21 13:38:27 -05:00
mdipierro
a709e7ba56 Fixed issue 834, thanks Paolo 2012-08-21 12:42:04 -05:00
mdipierro
f09ecfd458 fixed unwanted membershin in wiki, thanks Alan 2012-08-21 11:39:27 -05:00
mdipierro
c31193b45c new Storage class, thanks Oscar Benjamin 2012-08-21 11:34:55 -05:00
mdipierro
1ef131354f fixed common field concatenation 2012-08-21 09:52:23 -05:00
mdipierro
70fd93ac8f timezone support in dal, assumes local time is gmt time 2012-08-21 09:06:21 -05:00
mdipierro
e70f8e8c51 more options in response.stream, thanks Alan 2012-08-21 08:55:41 -05:00
mdipierro
55349d8e2f better bootstrap formstyle, thanks Dulakian 2012-08-21 08:53:39 -05:00
mdipierro
8d923a5765 fixed backward compatibility issue formstyles, thanks Dominic 2012-08-21 08:52:06 -05:00
Michele Comitini
845effd5ed Merge github.com:web2py/web2py 2012-08-21 15:48:38 +02:00
mdipierro
e5afc3ede8 fixed cut and paste error, thanks Martin 2012-08-21 07:57:09 -05:00
mdipierro
22cfb6ddab reverted storage.py again 2012-08-20 21:56:26 -05:00
mdipierro
5bcc8f750b another attempt at faster Storage 2012-08-20 21:54:02 -05:00
mdipierro
608e3245e0 better options_std.py, thanks Niphlod 2012-08-20 16:03:19 -05:00
mdipierro
c7074d5e4d better web2py.py thanks Niphlod 2012-08-20 16:02:11 -05:00
mdipierro
7898e4aac3 Storage.__class__ = dict tricks isinstance 2012-08-20 12:04:55 -05:00
mdipierro
6673743406 fixed is_impersonating, thanks Martin 2012-08-20 11:57:30 -05:00
mdipierro
c10584a068 ://HOSTNAME in auth.wiki 2012-08-20 11:16:25 -05:00
mdipierro
c8e34a9c24 removed debug line in scheduler, thanks Niphlod 2012-08-20 10:58:12 -05:00
mdipierro
3ca4e928da better check for frozen, thanks Niphlod 2012-08-20 10:57:11 -05:00
mdipierro
8846dbf6a1 added gluon/contrib/rules/__init__.py, thanks Niphlod 2012-08-20 10:55:01 -05:00
mdipierro
a90028441a fixed mongo issue, thanks Uolter 2012-08-20 08:06:28 -05:00
mdipierro
5a4148b712 fixed vimeo oembed 2012-08-19 18:36:18 -05:00
mdipierro
2c798909d7 auth.wiki makes admin wiki_editor group member 2012-08-19 18:20:16 -05:00
mdipierro
b163ddca76 fixed problem with plugin delete, thanks Alan 2012-08-19 15:11:04 -05:00
mdipierro
1fa2b5ad28 fixed missing dropdowns, thanks Alan 2012-08-19 15:02:39 -05:00
mdipierro
9f7f495961 fixed filter plugins 2012-08-19 13:53:45 -05:00
mdipierro
0214613182 fixed issue 937, thanks Dulakian 2012-08-19 13:49:26 -05:00
mdipierro
51dfb71063 fixed issue 936 with new couchdb, thanks Dulakian 2012-08-19 13:45:23 -05:00
mdipierro
ef8d8bf094 better grid console 2012-08-19 13:43:28 -05:00
mdipierro
e5f974a390 moved export links to the bottom 2012-08-19 12:44:42 -05:00
mdipierro
56abad1f27 better localizaion of sqlhtml, thanks Martin 2012-08-19 10:18:03 -05:00
mdipierro
d4f1da3018 better logic in appadmin csv, thanks Paolo Betti 2012-08-19 10:12:31 -05:00
mdipierro
146f9584d9 more readable scheduler, thanks Niphlod 2012-08-19 10:03:28 -05:00
mdipierro
9f2c0d52f1 IS_EXPR_environment.patch, fixed issue 938, thanks Anthony 2012-08-19 10:02:29 -05:00
mdipierro
e2c5647c26 Dutch language files, thanks Robert Kooij 2012-08-18 20:11:04 -05:00
Michele Comitini
e038c0afad Merge github.com:web2py/web2py 2012-08-19 01:58:27 +02:00
mdipierro
3d1dcd063b simplified syntax in auth.wiki @///function 2012-08-18 18:10:22 -05:00
mdipierro
49a5b3025b improved auth.wiki @{/a/c/f/args} 2012-08-18 17:50:50 -05:00
mdipierro
28f76bc9e3 reverted change that broke primary key check in appadmin 2012-08-18 16:21:52 -05:00
mdipierro
f6867bc2d9 more cleanup, Table.__init__ still needs lots of work 2012-08-18 10:11:23 -05:00
mdipierro
19d674b4e5 streamlined Field.__init__ 2012-08-18 10:03:50 -05:00
mdipierro
e6bed63344 fixed form, @{component:...} in auth.wiki, @{...} in markmin 2012-08-18 00:10:36 -05:00
mdipierro
85c721393e autolinks checks extension better 2012-08-17 23:12:01 -05:00
mdipierro
e57309770c better @{key:args} in markmin 2012-08-17 23:07:20 -05:00
mdipierro
911fb4e226 made shure that tools works with lazy tables (but auth_* fields not lazy) 2012-08-17 22:45:56 -05:00
mdipierro
9d71ec6821 new Storage object makes some code 10x faster 2012-08-17 21:29:36 -05:00
mdipierro
2475e42c16 many optimizations in LAZY_TABLES, passes all tests, thanks Bruno 2012-08-17 20:59:48 -05:00
mdipierro
7cb1d74aa8 better scheduler, thanks Niphlod and dhx 2012-08-17 18:57:19 -05:00
mdipierro
a3f671544d lazy tables 2012-08-17 18:56:45 -05:00
mdipierro
7772fdc556 updated CHANGELOG 2012-08-17 14:48:14 -05:00
mdipierro
80fe196b5a better scheduler, thanks Niphlod and dhx 2012-08-16 17:51:08 -05:00
mdipierro
e76bcf0ea9 removed unwanted whitespaces 2012-08-16 11:56:07 -05:00
mdipierro
f498421515 fixed prettydate, thanks Anthony 2012-08-16 11:06:04 -05:00
mdipierro
d05eb2aa6e fixed security issue in grid 2012-08-16 10:54:38 -05:00
mdipierro
d2bbc9adaf added missing _id, thanks Paolo Valleri 2012-08-16 09:39:51 -05:00
mdipierro
16ea8462c8 fixed another SQLFORM.formstyles, thanks Anthony 2012-08-16 09:38:47 -05:00
mdipierro
2095889eff IS_IN_DB validator for auth_user username/email, thanks Anthony, fixed issue 934 2012-08-15 17:30:43 -05:00
mdipierro
aacfdb62bb another attempt at memcache 2012-08-15 17:24:25 -05:00
mdipierro
64af8ae88f another attempt at memcache 2012-08-15 17:18:24 -05:00
mdipierro
92a66c0d11 SQLFORM.formstyles, thanks Anthony 2012-08-15 17:08:10 -05:00
mdipierro
d9ef136111 better memcache support? 2012-08-15 14:55:55 -05:00
mdipierro
def270c298 fixed issue 928, thanks dulakian and Anthony 2012-08-15 14:23:44 -05:00
mdipierro
f25e92d443 \w_ replaced with \w, thanks Osman 2012-08-15 09:12:55 -05:00
mdipierro
91c88d56eb count is integer, thanks Osman Masood 2012-08-15 09:06:36 -05:00
mdipierro
5145272415 gaekeyfilterpatch, thanks Howesc, issue 930 2012-08-14 20:37:47 -05:00
mdipierro
f3d97a1107 fixed magnifying glass in design page 2012-08-14 20:36:07 -05:00
mdipierro
360f778ade fixed admin url upload, thanks Marin 2012-08-14 20:26:43 -05:00
mdipierro
57aff944b3 fixed path, thanks Jonathan 2012-08-14 19:32:09 -05:00
mdipierro
f72056eff6 removed un-necessary line, thanks Alexei 2012-08-13 23:17:46 -05:00
mdipierro
4d15bc4375 os.sep in DAL, thanks Jonathan 2012-08-13 13:29:59 -05:00
mdipierro
8939abb370 raise HTTP(...,cookies=request.cookies) 2012-08-13 11:02:43 -05:00
mdipierro
4dcadcf78f gnicorn fix, thanks Ander Arbelaiz 2012-08-13 10:46:02 -05:00
mdipierro
a1f2442d35 fixed admin min length, thanks Anthony 2012-08-12 10:38:42 -05:00
mdipierro
fcc9bc51f6 improved security in grid but still a problem 2012-08-11 22:05:23 -05:00
mdipierro
aab147ac3c fixed menu size, thanks Angelo 2012-08-11 21:42:07 -05:00
mdipierro
560f049825 minor change in markmin supports #head 2012-08-11 14:44:02 -05:00
mdipierro
4b4fa2361b added part of bootswatch improvements, thanks Angelo 2012-08-10 13:01:35 -05:00
mdipierro
0b8328a876 fixed Issue 927:add autoscroll widget to debugger interactive shell, thanks Anthony 2012-08-10 12:55:56 -05:00
mdipierro
b2fb74555c fixed bug in simple_hash 2012-08-10 12:49:12 -05:00
mdipierro
91c891b32f simplified more CRYPT logic and removed hmac_hash, functionality included in simple_hash, thanks David 2012-08-09 23:34:37 -05:00
mdipierro
853c065e01 fixed compatibility issues in CRYPT 2012-08-09 23:09:51 -05:00
mdipierro
bd9c1e525a allows strings as select args, thanks dhx 2012-08-09 08:57:58 -05:00
mdipierro
4e073be361 htth->http typo 2012-08-08 22:33:50 -05:00
mdipierro
3c4336d25c better navbar, thanks Anthony 2012-08-08 18:56:02 -05:00
mdipierro
990f1b1ea9 smartgrid(...fields=dict(...)) 2012-08-08 15:40:43 -05:00
mdipierro
cd627963e6 fixed issue 578, thanks Thomas Dallagnese 2012-08-08 15:19:21 -05:00
mdipierro
e4421db04e fixed issue 578, thanks Thomas Dallagnese 2012-08-08 15:17:57 -05:00
mdipierro
c7b4060fa7 fixed issue 578, thanks Thomas Dallagnese 2012-08-08 15:16:58 -05:00
mdipierro
549f3f27dc better redirect, thanks Anthony 2012-08-08 14:20:05 -05:00
mdipierro
7f97301e06 fixed issue 478, thank you Matthew Norris, sorry this took so long 2012-08-08 14:15:32 -05:00
mdipierro
4911f3f2f1 fixed issue 324, thanks jredrejo and sorry it took me 1 year to find your patch 2012-08-08 13:59:54 -05:00
mdipierro
802bb67324 fixed multiple autocomplete for table 2012-08-08 13:52:04 -05:00
mdipierro
d0a5bf7485 moved favicon.* in images 2012-08-08 13:24:49 -05:00
mdipierro
d1da96a46c indentantion 2012-08-08 13:16:24 -05:00
mdipierro
2f36ee450c fixed issue 391, thanks Dulakian 2012-08-08 12:40:04 -05:00
mdipierro
daa8707822 Oracle: new trigger resets the sequence so the next value will be the one given in the data, thanks dhx 2012-08-08 12:29:45 -05:00
mdipierro
1c2ad3b331 redirect(...,type='auto') 2012-08-08 12:17:54 -05:00
mdipierro
c1ac4f4b8b improved is_valid_ip_address 2012-08-08 10:23:03 -05:00
mdipierro
084c22c282 redirect(...) now works on ajax responses, thanks Anthony 2012-08-08 10:05:09 -05:00
mdipierro
084f19c212 fixed navbar separators 2012-08-08 09:43:07 -05:00
mdipierro
d7c00f2240 better info to debug issue 921 2012-08-08 09:35:01 -05:00
mdipierro
fdc895a1db fixed issue 924, thanks dirkk0 2012-08-08 09:24:58 -05:00
mdipierro
0b7eefd862 reverted http://code.google.com/p/web2py/source/detail?r=65caec4dae5f7c971d406beb0eb3b32f471d84a4, thanks Anthony 2012-08-07 22:45:46 -05:00
mdipierro
3849108cae removed redundant strings in tools, thanks Anthony 2012-08-07 20:39:17 -05:00
mdipierro
ac04b183a6 fixed issue 923, thanks Martin 2012-08-07 19:53:42 -05:00
mdipierro
b27a976712 router map_static, thanks Jonathan 2012-08-07 19:39:45 -05:00
mdipierro
7b01c196d1 removed form.vars.upload_newfilename 2012-08-07 16:53:03 -05:00
mdipierro
4dd04a8a92 fixed issue 669, maxlength in grid for any str representation 2012-08-07 16:40:55 -05:00
mdipierro
9be9b05d42 fixed navbar customization, thanks Anthony 2012-08-07 16:33:39 -05:00
mdipierro
711a2573c0 issue 812 auth.signature labels are translated 2012-08-07 15:13:57 -05:00
mdipierro
e22f45c878 fixed issue 569, translation of date-time error messages, thanks iceberg 2012-08-07 14:30:31 -05:00
mdipierro
a28e32f78b fixed issue 488, important security issues, monkeypatch pymysql, thanks Roman 2012-08-07 14:04:19 -05:00
mdipierro
228387bf4f make CRYPT with salt but not key compatible with third party systems 2012-08-07 12:26:33 -05:00
mdipierro
176bf74d49 fixed issue 433 2012-08-07 12:12:43 -05:00
mdipierro
686ff2bfeb auth.requires_login(otheriwise=A(..)) 2012-08-07 11:31:10 -05:00
mdipierro
ef90f698d5 confirmation before exiting the edit page 2012-08-07 11:21:48 -05:00
mdipierro
5885464341 possibe fix to attributes distinct in mongodbadapter 2012-08-07 09:33:28 -05:00
mdipierro
e7c8b08a43 prevent double listsings of apps in widget, thanks Marin 2012-08-07 09:15:58 -05:00
mdipierro
5ff910baa6 LOAD can do upload with new jQuery? 2012-08-06 23:01:50 -05:00
mdipierro
0d99d9fc9e addressed issue 916 and reverted some changes but not convinced this is always the right solution 2012-08-06 21:24:35 -05:00
mdipierro
15a3241437 fixed create button in admin, thanks Nico 2012-08-06 20:54:19 -05:00
mdipierro
b870074e5c valid html5 welcome, thanks Rob McC 2012-08-06 17:36:51 -05:00
mdipierro
8675b833ed scheduler uses pid to id running tasks, thanks Niphlod 2012-08-06 13:40:03 -05:00
mdipierro
9e5c6cc5be remove db from examples 2012-08-06 10:56:30 -05:00
mdipierro
bc38d3c8f5 new scheduler uses utc time, thanks Niphlod 2012-08-06 10:15:36 -05:00
mdipierro
a244adfb4b reverted changes in admin and examples, thanks Anthony 2012-08-06 10:13:37 -05:00
mdipierro
b94b473736 fixing error in previous commit, thanks Anthony 2012-08-06 09:59:21 -05:00
mdipierro
4f97fb6310 fixing error in previous commit, thanks Anthony 2012-08-06 09:58:15 -05:00
mdipierro
c08d5773e8 removed some un-necessary files in examples and the cache in db running demo 2012-08-06 08:57:06 -05:00
mdipierro
06f6e83c3c fixed copyright year, where possible 2012-08-06 07:25:24 -05:00
mdipierro
3f1b2ec50f remove some legacy translations in admin 2012-08-06 07:16:00 -05:00
mdipierro
4ec117b943 fixed encoding-decoding of flash, thanks Anthony 2012-08-06 06:28:32 -05:00
mdipierro
1dc9c59768 from setuptools import setup, thanks Arun and Zodman, issue 650 2012-08-05 21:35:54 -05:00
mdipierro
ac8ac3a07e request.args(-i), issue 919, thanks David Adley 2012-08-05 21:26:16 -05:00
mdipierro
89cabf6006 new centos5 install script, issue 918, thanks Alan 2012-08-05 21:21:11 -05:00
mdipierro
50b9a3d230 populate list:reference, issue 917, thanks Simonm3 2012-08-05 21:19:57 -05:00
mdipierro
aaa1bbddd2 jpg in markmin autolinks, thanks Villas 2012-08-05 19:52:19 -05:00
mdipierro
cccd7c2d33 fixed welcome menu, thanks Villas 2012-08-05 19:46:46 -05:00
mdipierro
57447cb0cf improved upload logic, thanks Marin 2012-08-03 09:02:38 -05:00
mdipierro
8a7a723289 improved upload logic, thanks Marin 2012-08-03 09:01:02 -05:00
mdipierro
e7b92202f2 new schaeduler, thanks Niphlod and Marin 2012-08-03 08:57:54 -05:00
mdipierro
2b51006819 fixed impersonating? 2012-08-03 00:55:18 -05:00
mdipierro
2fbec9ab8f possibly fixed issue 647 2012-08-02 21:51:05 -05:00
mdipierro
4867235e02 new centOS sctrips uses Python 2.6 instead of 2.7 because centOS problems, thanks Peter 2012-08-02 21:37:56 -05:00
mdipierro
796c8ff979 possible fix to address upload problem, thanks Marin 2012-08-02 21:28:38 -05:00
mdipierro
923857b957 Field(...'upload',default=path) looks in current app folder, thanks Marin 2012-08-02 10:17:15 -05:00
mdipierro
071b39f39b auth.wiki() has _create 2012-08-02 00:17:23 -05:00
mdipierro
1233eea690 ignore force_prefix for editors 2012-08-02 00:02:45 -05:00
mdipierro
ad3f34b8f1 auth.wiki() is much better, supports autolinks 2012-08-01 23:49:55 -05:00
mdipierro
8a06a98b18 avoid attemts to duplicate archive tables 2012-08-01 17:04:40 -05:00
mdipierro
75cf1f1844 reverted part of previous test 2012-08-01 12:01:17 -05:00
mdipierro
0962d0b7fb scheduler in widget menu, thanks Niphlod 2012-08-01 09:04:32 -05:00
mdipierro
fdce26f7a8 better permission handling for auth.wiki, not yet for wiki_media 2012-08-01 01:02:45 -05:00
mdipierro
4ffb597954 tentative fix to ajax problem, thanks Vladyslav, needs test, may break flash=DIV() 2012-07-31 22:03:46 -05:00
mdipierro
d259939263 more language patches, thanks Vladyslav 2012-07-31 22:02:51 -05:00
mdipierro
4ce0ab1800 fixed GAE belong issue, thanks Jonathan and Christian 2012-07-31 19:25:51 -05:00
mdipierro
2123e485d8 fixed import_from_csv_field and new tests, thanks Jonathan 2012-07-31 19:24:26 -05:00
mdipierro
a26d8245ab come web2py.css cleanup 2012-07-31 15:06:26 -05:00
mdipierro
8ff38c9669 reverted incorrect change to autolinks 2012-07-31 13:46:19 -05:00
mdipierro
29c15cde1d some dal.py indentation work 2012-07-31 12:07:11 -05:00
mdipierro
750f593f03 autolink expand_one now does unicode 2012-07-31 11:22:39 -05:00
mdipierro
daab23eb6e fixed update_on_insert 2012-07-31 10:47:23 -05:00
mdipierro
40591357b4 removed some possible tckets in auth 2012-07-30 22:07:08 -05:00
mdipierro
275363de2b markmin and languages autolinks, thanks Vladyslav 2012-07-30 20:23:05 -05:00
mdipierro
9c592383c7 possible fix for issue 188, thanks Marin 2012-07-30 16:25:35 -05:00
mdipierro
462788f6c5 issue 902, admin can peek private, thanks Alan 2012-07-29 21:55:51 -05:00
mdipierro
5a42b18325 working auth.wiki on security 2012-07-29 21:02:24 -05:00
mdipierro
23f2f23ac3 some blogging capabilities to auth.wiki 2012-07-29 20:55:01 -05:00
mdipierro
3446a85bca wiki force_prefix again 2012-07-29 18:09:41 -05:00
mdipierro
fc33fe8f44 wiki force_prefix 2012-07-29 17:37:32 -05:00
mdipierro
4861f67f84 auth.wiki supports load 2012-07-29 16:52:11 -05:00
mdipierro
039f5c25c5 improved router, thanks Jonathan 2012-07-29 16:21:45 -05:00
mdipierro
6bbd0c2736 router patch, thanks Jonathan 2012-07-29 13:57:01 -05:00
mdipierro
d017aacf6d fixed json and xml search in auth.wiki() 2012-07-29 10:43:35 -05:00
mdipierro
f2a8bad6fd improved scripts/setup-web2py-nginx-uwsgi-on-centos.sh, thanks Alan 2012-07-29 10:37:04 -05:00
mdipierro
297b4167e9 wiki services 2012-07-29 10:32:46 -05:00
mdipierro
794c0c1b3e better wiki _search 2012-07-29 10:04:30 -05:00
mdipierro
b3f67561b1 setup-web2py-nginx-uwsgi-on-centos.sh, thanks Peter 2012-07-29 08:24:26 -05:00
mdipierro
78c378522c fixed is_impersonating 2012-07-29 07:31:01 -05:00
mdipierro
c90779265a fixed issue qith clicking on toplevel menus 2012-07-28 23:04:30 -05:00
mdipierro
4da505ca1f made git pull thread safe, thanks Andrew 2012-07-28 22:37:19 -05:00
mdipierro
eea0fc4b26 fixed IS_LENGTH for value==None again 2012-07-28 21:33:00 -05:00
mdipierro
c7a7890148 made admin uploads more secure 2012-07-28 20:51:18 -05:00
mdipierro
1a20488a0d increased security in appadmin 2012-07-28 20:19:15 -05:00
mdipierro
558b4ed4cd allow serialization of SQLCustomTypes, thanks Anthony 2012-07-28 19:28:36 -05:00
mdipierro
4141e2b5d6 issue 913, handle html5 input types, thanks Howesc 2012-07-28 19:14:19 -05:00
mdipierro
3167e454e7 issue 912, handle lists of more than 30 references on GAE, thanks Howesc 2012-07-28 19:11:16 -05:00
mdipierro
be93995a3b fixed IS_LENGTH 2012-07-28 02:24:09 -05:00
mdipierro
498774d47e admin has forms 2012-07-28 02:08:53 -05:00
mdipierro
32847ed4f7 FORM.dialog -> FORM.confirm 2012-07-28 01:00:57 -05:00
mdipierro
7650e6de95 using FORM.dialog 2012-07-28 00:56:06 -05:00
mdipierro
4350ddaec0 better mongodb import 2012-07-27 17:25:30 -05:00
mdipierro
c7ac700355 fixed Recapcha, thanks Osman Masood 2012-07-27 16:53:34 -05:00
Michele Comitini
4a2215793d Merge github.com:web2py/web2py 2012-07-27 23:10:36 +02:00
mdipierro
4e50aee372 captures error in widget gethostaddr, thanks Patrick 2012-07-27 09:32:36 -05:00
mdipierro
8120f75ace BR()+BR() 2012-07-26 17:53:35 -05:00
mdipierro
33ed6dd806 issue 909, secure login_bare, thanks szimszon 2012-07-26 17:42:20 -05:00
mdipierro
322202b7e7 detect ips 2012-07-26 17:37:51 -05:00
mdipierro
c3f2868805 FORM.dialog 2012-07-26 09:41:39 -05:00
mdipierro
2b145f6e6b consolidated buttons on site 2012-07-26 08:12:29 -05:00
mdipierro
897c1f3766 validate request.client 2012-07-26 07:49:12 -05:00
mdipierro
b887c0cf0b Local/Public 2012-07-26 07:37:31 -05:00
mdipierro
b2990c8b1a do not assume library.zip 2012-07-26 06:57:27 -05:00
mdipierro
7fafe4ae7f radio widget lists ips 2012-07-26 06:42:28 -05:00
mdipierro
6036609a3e fixed order of unzipping 2012-07-26 06:06:13 -05:00
mdipierro
1528d5d67b fixed incompatibility with spreadsheet.py 2012-07-26 05:56:54 -05:00
mdipierro
155c2f4919 make win uses 2.7 2012-07-26 05:43:46 -05:00
mdipierro
cf89cbbff4 fixed issue 907 2012-07-25 21:12:34 -05:00
mdipierro
8b66bf15f0 possibly fixed issue 908 2012-07-25 21:04:56 -05:00
mdipierro
44e5fc96fc fixed winservice, thanks Marin Prajic 2012-07-25 18:34:53 -05:00
mdipierro
f0237e4ec8 lazy_cache docstring 2012-07-25 16:57:17 -05:00
mdipierro
ba80c083ab lazy_lazy_cache->lazy_cache, thanks Anthony 2012-07-25 16:53:21 -05:00
mdipierro
9e45d82049 BR()*5 2012-07-25 16:21:34 -05:00
mdipierro
d7f4e2cc7a possible solution to issue 887 2012-07-24 22:06:09 -05:00
mdipierro
671fb02434 correction to issue 886, thanks Niphlod 2012-07-24 21:23:48 -05:00
mdipierro
3db78d41eb fixed list hideerror, thanks Howesc and Niphold, issue 886 2012-07-24 21:19:58 -05:00
mdipierro
5e3ad2af44 crud.select(fields=[..]), fields can now be string, issue 901 2012-07-24 21:11:35 -05:00
mdipierro
2576690f63 backward compatiblity fix for auth sinature 2012-07-24 06:53:08 -05:00
mdipierro
3a2fd8e6c8 another attempt to fix winservice issue 2012-07-23 17:23:27 -05:00
mdipierro
485d629fc2 solved custom import issue? 2012-07-23 16:19:54 -05:00
mdipierro
cb2232bfbd experimental git support (needs a little more work), thanks Andrew Replogle 2012-07-21 16:12:45 -05:00
mdipierro
ac08356843 admin design shows private files, thanks Alan 2012-07-21 13:29:23 -05:00
Michele Comitini
a7dddda495 Merge branch 'master' of github.com:web2py/web2py 2012-07-21 01:02:53 +02:00
mdipierro
3b0935a68b other improvements, thanks Vladyslav 2012-07-20 17:37:53 -05:00
mdipierro
903b33e511 fixed typo in X509Auth, thanks Michele 2012-07-20 16:47:59 -05:00
mdipierro
f897882299 Copyright date now displays current year, always, thanks Brian Cottingham 2012-07-20 16:45:07 -05:00
mdipierro
aec1cbc81f fixed a problem with db().select().sort() did not follow book specs 2012-07-20 16:32:53 -05:00
mdipierro
b16b8b6f7f oops sh512 2012-07-20 13:51:26 -05:00
mdipierro
2764926ea9 invalid digest %s algorithm, thanks Jonathan 2012-07-20 12:47:06 -05:00
mdipierro
2f1cd20a16 added comment in welcome default.py 2012-07-20 11:27:38 -05:00
mdipierro
8ba850fc3f changed CRYPT, Auth, welcome digest_alg default 2012-07-20 10:31:07 -05:00
mdipierro
6072fa2962 added more CRYPT examples and doctests, fixed other doctests 2012-07-20 10:17:55 -05:00
mdipierro
f905a6e9dc fixed CRYPT 2012-07-20 08:58:13 -05:00
Michele Comitini
beccf647b7 fixed typo in doc string 2012-07-20 15:03:08 +02:00
Michele Comitini
21387a5b8b Merge github.com:web2py/web2py into HEAD 2012-07-20 14:55:24 +02:00
mdipierro
ff05f5d121 smarted CRYPT, thanks Jonathan 2012-07-19 16:56:44 -05:00
mdipierro
f01b61c4c9 better export in grid, thanks Niphlod 2012-07-19 16:25:22 -05:00
mdipierro
f1337d563e reverted part of recent test 2012-07-18 21:47:01 -05:00
mdipierro
b2dd147a2d fixed global_settings.gluon_parent for scripts, thanks Vladyslav 2012-07-18 18:46:43 -05:00
mdipierro
11b5d7d9d0 added a comment about md5, thanks Osman 2012-07-18 18:32:46 -05:00
mdipierro
1427dc976f better auth.wiki 2012-07-18 18:24:58 -05:00
mdipierro
05008158ee better auth.wiki with tag cloud 2012-07-18 17:50:23 -05:00
mdipierro
6a3ef83060 fixed problem with lazyT.__mod__ 2012-07-18 16:03:43 -05:00
mdipierro
af7c29330d more language patches, thanks Vladyslv 2012-07-18 15:35:42 -05:00
mdipierro
20ad8b8b71 missing pickling methods in Storage, thanks marius.v.niekerk 2012-07-18 14:20:46 -05:00
mdipierro
3058edfb8f added conditional zencoding legend if html+edit_area 2012-07-18 14:16:36 -05:00
mdipierro
bafdf36bf3 new syntax pbkdf2(1000,20,sha1) 2012-07-18 13:46:24 -05:00
mdipierro
0f952cfe5f added some more missing files 2012-07-18 13:40:10 -05:00
mdipierro
0e3198a0a6 added missing files from Vladyslav 2012-07-18 12:48:08 -05:00
mdipierro
0881673037 added button import in sqlhtml 2012-07-18 12:45:17 -05:00
mdipierro
a1aebca4d3 fixed an issue with latest CRYPT 2012-07-18 12:34:26 -05:00
mdipierro
1e657f0121 added pbkdf2 support, simplified logic 2012-07-18 12:24:28 -05:00
mdipierro
9cfb1e8afd new languages patch with pluralization, thanks Vladyslav 2012-07-18 11:22:41 -05:00
mdipierro
7b62588d7e reverted last useless patch 2012-07-17 18:06:44 -05:00
mdipierro
d3925f371b extra crsf protection for admin 2012-07-17 18:01:58 -05:00
mdipierro
192303adb1 moved define_signature to define_table but not convinced it is always a good idea 2012-07-17 17:32:35 -05:00
mdipierro
258a645aa1 better export buttons in grid, thanks Niphlod 2012-07-17 17:13:40 -05:00
mdipierro
14b6cc5650 fixed issue 864, thanks Niphlod 2012-07-17 17:11:23 -05:00
mdipierro
9d2ed04ed4 added TSV exporter to grid, thanks niphlod 2012-07-17 16:15:29 -05:00
mdipierro
3c4080eb08 typo close->clone, thanks I.like.privacy.too 2012-07-17 16:11:37 -05:00
mdipierro
dd598d6c2f reverted welcome/default/index because of a problem 2012-07-17 12:50:45 -05:00
mdipierro
80965dd5e3 yet another markmin improvement, thanks Vladyslav 2012-07-17 12:35:57 -05:00
mdipierro
e3e9182293 fixed uniqueness problem in archives 2012-07-17 10:59:26 -05:00
mdipierro
81b8b4c775 fixed problem with recent cache commit 2012-07-17 10:35:45 -05:00
mdipierro
8a2d4d5448 fixed issue 889, scheduler on missing app, thanks Niphlod 2012-07-16 22:48:59 -05:00
mdipierro
06509d79d2 more graful errors 2012-07-16 22:36:29 -05:00
mdipierro
b11ba2e870 latest utf8 and added pyuca, thanks Vladyslav 2012-07-16 22:28:18 -05:00
mdipierro
6002dbe5d6 reverted markmin2html example from Valdyslav 2012-07-16 21:19:14 -05:00
mdipierro
0991667c49 fixed socket.gaierror, thanks Carlos 2012-07-16 20:58:12 -05:00
mdipierro
661b2b87a7 added decimal support for json in serializers.py 2012-07-16 15:53:24 -05:00
mdipierro
2384a5cb7f added utf8 and utf8 support in Markminn, thanks Vladyslav 2012-07-16 15:36:47 -05:00
mdipierro
7872d38fb5 issue 889, thanks spiffytech 2012-07-16 14:25:19 -05:00
mdipierro
6577e4e851 fixed SQLALL._table 2012-07-16 14:11:54 -05:00
mdipierro
a019949628 lazy_lazy_cache 2012-07-16 14:10:22 -05:00
mdipierro
487fc8e4af welcome css pathc, issue 896, thanks Angelo 2012-07-16 13:16:02 -05:00
mdipierro
ded1292495 fixed A as menu item name, issue 987, thanks smogzer 2012-07-16 13:13:45 -05:00
mdipierro
2ae0ee0804 working on wiki_tags 2012-07-15 21:41:43 -05:00
mdipierro
f308343fb0 fixed problem with update_record and ignore_common_filters, issue 892, thanks spiffytech 2012-07-15 18:11:47 -05:00
mdipierro
c9fda71db5 db().select(....) no longer ignores common_filters, issue 893 2012-07-15 18:06:49 -05:00
mdipierro
651ba90c6f Vladyslav acknowledgement 2012-07-15 17:32:24 -05:00
mdipierro
ef7034893d id and class prefix in markmin, thanks Vladyslav 2012-07-15 17:29:55 -05:00
mdipierro
d5f5f5495b improved admin navigation, thanks Vladyslav 2012-07-15 17:28:46 -05:00
mdipierro
8412b4d0cc improved media handling in auth.wiki(), more work needed 2012-07-15 10:03:05 -05:00
mdipierro
96c4d07c0d rewrite patch, thanks Vladyslav (and Jonathan for checking it) 2012-07-14 23:27:06 -05:00
mdipierro
8a819785c5 eaiser wiki. Just do 'def index(): return auth.wiki()' (that is all) 2012-07-14 23:25:34 -05:00
mdipierro
3cba7e727e rewrite of MARKMIN, thanks Vladyslav 2012-07-14 23:05:41 -05:00
mdipierro
1b34f47ec9 many improvements from Vladyslav 2012-07-14 22:45:32 -05:00
mdipierro
709038cc0a no menu in wiki 2012-07-14 20:15:51 -05:00
mdipierro
071e84a2a5 fixed sorting in Wiki 2012-07-14 18:43:43 -05:00
mdipierro
d7d2bd2fe8 fixed a problem with computed fields 2012-07-14 18:24:01 -05:00
mdipierro
842fb69dde fixed recent bug in count 2012-07-14 17:55:25 -05:00
mdipierro
be3a091002 fixed T(T('..')) and added tools.Wiki 2012-07-14 17:50:51 -05:00
mdipierro
b2c0e1ee1d db.table.field.count(True), thanks Niphlod 2012-07-13 18:04:13 -05:00
mdipierro
2780f6f032 upgraded to pymysql 0.2 2012-07-12 15:31:24 -05:00
mdipierro
0616d22aec adding default languages, thanks Vladyslav 2012-07-12 15:23:25 -05:00
mdipierro
5b7ecc5fb2 minor cleanup in languages 2012-07-12 15:13:49 -05:00
mdipierro
4b8e525003 improved language caching, key includes filter 2012-07-12 15:09:19 -05:00
mdipierro
ff1c10fcee improved language handling, thanks Vladyslav 2012-07-12 14:58:29 -05:00
mdipierro
8199074678 streamer improvement, issue 884, thanks Niphlod 2012-07-12 14:05:06 -05:00
mdipierro
dece9f381e ldap_auth.py pep8, thanks Kory 2012-07-12 11:26:45 -05:00
mdipierro
4e8f57cbd9 better markmin, thanks Vladyslav 2012-07-11 23:13:59 -05:00
mdipierro
cdda1ee79e removed some of recent changes until futher study 2012-07-11 22:40:48 -05:00
mdipierro
4d82cc86c1 patched welcome languages, thanks Vladyslav 2012-07-11 22:16:06 -05:00
mdipierro
74da553542 no more import stat in cfs.py, thanks Vladyslav 2012-07-11 22:12:14 -05:00
mdipierro
4a49bdf352 reverted cfs.py 2012-07-11 22:11:20 -05:00
mdipierro
2f8ceb3bc5 no more import stat in cfs.py, thanks Vladyslav 2012-07-11 22:10:14 -05:00
mdipierro
4c5d8f84e7 no more import stat in cfs.py, thanks Vladyslav 2012-07-11 22:08:11 -05:00
mdipierro
0acbcc31cd better language support in admin, thanks Vladyslav 2012-07-11 22:05:38 -05:00
mdipierro
3bfb2147f5 admin-languages.patch, thanks Vladyslav 2012-07-11 22:00:37 -05:00
mdipierro
47b3b3d97c admin-languages-*, thanks Vladyslav 2012-07-11 21:59:08 -05:00
mdipierro
9350bd4849 admin-controllers-default.patch, thanks Vladyslav 2012-07-11 21:57:17 -05:00
mdipierro
d38f9bbe36 for a grid in a component, cancel delete fails, issue 879, thanks simonm3 2012-07-11 18:23:49 -05:00
mdipierro
115101dc77 populate list without duplicates, thanks simonm3 2012-07-11 18:21:41 -05:00
mdipierro
e976bbe66b latest scheduler 2012-07-11 18:16:57 -05:00
mdipierro
748028a7f4 improved ldap_auth.py, thanks Kory 2012-07-11 18:10:49 -05:00
mdipierro
49be6a6c16 table._migrated removed, not necessary 2012-07-11 09:17:30 -05:00
mdipierro
fff1d9e4a3 table._migrated, db._migrated 2012-07-11 09:16:23 -05:00
mdipierro
9fbdd6a05b table._migrated, db._migrated 2012-07-11 09:15:35 -05:00
mdipierro
64ac8fccbd more options with hmac and salt in auth, thanks Dave 2012-07-10 20:40:47 -05:00
mdipierro
e85608ae61 better user.html, thanks Dave 2012-07-10 00:22:35 -05:00
mdipierro
09d2499399 fixed typo in dal, thanks Jonathan 2012-07-09 23:55:16 -05:00
mdipierro
be8ba6603d fixed typo in tools, issue 880, thanks Douglas Philips 2012-07-09 21:40:33 -05:00
mdipierro
092ef99b0d fixed oracle bigint, thanks faridgs 2012-07-09 21:39:07 -05:00
mdipierro
84900fa3c9 fixed typo in dal 2012-07-09 21:09:55 -05:00
mdipierro
0e09f84ab6 better scheduler, thanks Niphlod 2012-07-09 21:08:57 -05:00
mdipierro
fed9258070 auto-add uploadfield 2012-07-09 17:41:31 -05:00
mdipierro
a02644c39e -K allows to specify which apps to cron, thanks Jonathan 2012-07-08 20:28:09 -05:00
mdipierro
d0463c05b2 fixed issue 701, thanks Marius van Niekerk 2012-07-08 17:39:37 -05:00
mdipierro
1068e75902 multiple exports from grid, issue 423, thanks Hong-Khoan Quach 2012-07-08 17:26:44 -05:00
mdipierro
4a93d6866a scripts/setup-web2py-fedora-ami.sh, thanks Charles Law 2012-07-08 17:11:24 -05:00
mdipierro
f7724c4f06 renamed welcome crontab crontab.example, thanks Jonathan 2012-07-08 16:40:01 -05:00
mdipierro
e33094a3d6 improver navbar behavior, thanks Anthony 2012-07-08 09:45:20 -05:00
mdipierro
98295289f0 scheduler patch, issue 878, thanks Toomim 2012-07-07 10:28:21 -05:00
Michele Comitini
2905b1b40c Merge github.com:web2py/web2py into HEAD 2012-07-06 22:59:32 +02:00
mdipierro
56eee69ebf referrer_actions, thanks Anthony 2012-07-06 11:47:25 -05:00
mdipierro
5e4283909b removed varquote, too many problems 2012-07-06 11:32:01 -05:00
Michele Comitini
aeaf0447d5 Merge github.com:web2py/web2py 2012-07-06 16:26:33 +02:00
Michele Comitini
bad7d9b960 Merge branch 'master' of github.com:michele-comitini/web2py 2012-07-06 16:25:58 +02:00
mdipierro
e15e36566c db._debug=True 2012-07-06 08:54:45 -05:00
mdipierro
901c2ebf32 fixed error in recent commit __idx, thanks Joel Carrier 2012-07-05 22:33:43 -05:00
mdipierro
fd3b52a7f8 fixed typo 2012-07-05 22:29:51 -05:00
mdipierro
60cf316e16 check if git installed for openshift 2012-07-05 22:28:54 -05:00
mdipierro
b6667e6da8 fixed language in comments, thanks Clifford 2012-07-05 22:24:34 -05:00
mdipierro
7377cef7ff openshift integration, thanks prelegalwonder 2012-07-05 22:21:18 -05:00
mdipierro
b1a4ed556f no double import contenttype, thanks Salomon Derossi 2012-07-05 22:09:13 -05:00
mdipierro
e6ab9cb597 custom qualifier, thanks david karapetyan 2012-07-05 22:06:27 -05:00
mdipierro
a0b585fc25 db.close(). thanks nick name 2012-07-05 21:32:09 -05:00
mdipierro
db1a42d5e5 catching timout in rocket sendall, thanks nickname 2012-07-05 21:17:20 -05:00
mdipierro
db9c5bd369 fixed typo in recent commit, thanks szimson 2012-07-05 10:51:03 -05:00
mdipierro
bee3c154ef error message on Crypt exception 2012-07-05 10:47:10 -05:00
mdipierro
0d8d8817f4 more varquote(s) but this is a temp solution 2012-07-05 09:31:23 -05:00
mdipierro
6169e192f7 varquote for mssql and postgresql 2012-07-05 09:21:52 -05:00
mdipierro
6864183739 fixed default algorithm with salt, requires hmac_key 2012-07-04 23:30:52 -05:00
mdipierro
2f84135dd9 fixed varquote if no-table and IDENTITY 2012-07-04 22:50:48 -05:00
mdipierro
b83f9fcfda fixed GAE contains,issue 874, thanks Howesc 2012-07-04 22:50:03 -05:00
mdipierro
de771e8117 fixed GAE contains,issue 874, thanks Howesc 2012-07-04 22:48:34 -05:00
mdipierro
cb5a993f41 fixed GAE contains,issue 874, thanks Howesc 2012-07-04 22:47:25 -05:00
mdipierro
ae83fe9ac4 Auth(...,salt=True), thanks Dave Stoll 2012-07-04 19:22:40 -05:00
mdipierro
3d6335ce7c bootstrap 2.0.4 + responsive, issue 858, thanks lightdot 2012-07-04 17:45:55 -05:00
mdipierro
31bbd7707e quotes field and tablenames in mysql, thanks Toomim 2012-07-04 17:37:49 -05:00
mdipierro
5e110aec52 component timeout defauls to oo, issue 871, thanks Simon 2012-07-04 17:05:27 -05:00
mdipierro
8a4f96e619 issue 873, thanks Howesc 2012-07-04 17:02:38 -05:00
mdipierro
4334488891 routes_in=[('/path','303->http://..')] 2012-07-01 22:44:03 -05:00
mdipierro
96893b2c26 more T's in appadmin.py, thanks Vladyslav 2012-06-30 12:11:00 -05:00
mdipierro
91bbe402bb adding 'strong' to 'permitted_tags', and 'a.target' to allowed_attributes, thanks Vladyslav 2012-06-30 12:08:53 -05:00
mdipierro
0e8111a19e for some reason shell forgets settings, this works around temporarily fixes the problem, thanks Vladyslav Kozlovskyy 2012-06-30 11:54:36 -05:00
mdipierro
95c978b705 added setup-scheduler-centos.sh, issue 867, thanks Tyrone 2012-06-29 20:55:44 -05:00
mdipierro
366c11428e issue 523, search_widget can be a dict, thanks Ato 2012-06-29 11:22:04 -05:00
mdipierro
30b67b29df updated memcache to 1.48, thanks Jonathan 2012-06-29 09:34:09 -05:00
mdipierro
17487cd40d better scheduler, thanks Niphlod 2012-06-28 22:50:03 -05:00
mdipierro
0e2b840837 better extension parsing, thanks Corne 2012-06-28 09:56:53 -05:00
mdipierro
0676afd6fd fixed import problem with external dependencies, thanks Corne Dickens 2012-06-28 09:54:22 -05:00
mdipierro
59b1f20926 added WSGIPassAuthorization On to setup scripts, thanks Larry Weinberg 2012-06-28 09:37:47 -05:00
mdipierro
dad67c761a better exception on bug, thanks Jonathan 2012-06-27 18:02:32 -05:00
mdipierro
0f8a29daeb socket timeout on ssl bug 2012-06-27 17:45:09 -05:00
mdipierro
1f7cdfc8eb chipin is back 2012-06-27 16:53:37 -05:00
mdipierro
c37ac11955 distinct in autocomplete, thanks Brent Zeiben 2012-06-25 21:40:16 -05:00
mdipierro
7a2acc2532 reverted last erroneous commit, thanks Niphlod 2012-06-25 16:49:02 -05:00
mdipierro
71fae9efce improved scheduler, thanks Niphlod 2012-06-25 16:36:20 -05:00
mdipierro
3a8a7c911e disabled login form in admin is not secure, issue 859, thanks Tim 2012-06-25 14:40:19 -05:00
mdipierro
83f1be5670 improved spreadsheet, issue 860, thanks Alan 2012-06-25 14:35:10 -05:00
mdipierro
ad55b3f1fd nested DIV in error messages, issue 861 thanks Richard 2012-06-25 14:31:52 -05:00
mdipierro
5e0dddffce fixed quote in url rewrite, thanks Michael 2012-06-25 14:21:18 -05:00
mdipierro
9bc25ea9ff ctrl+C now kills scheduler too, issue 126, thanks Niphlod 2012-06-25 14:18:20 -05:00
mdipierro
d8fd45d545 routes patch, thanks Jonathan 2012-06-25 14:14:44 -05:00
mdipierro
70b3d03235 IS_IN_DB distinct 2012-06-23 09:11:56 -05:00
mdipierro
27d0090d10 fixed imap adepater to deal with inboxes with leading _ or numbers, issue 644, thanks Alan 2012-06-22 13:18:11 -05:00
mdipierro
4830a6fbf2 improved bootswatch, thanks Paolo 2012-06-18 17:07:32 -05:00
mdipierro
71f43c0669 fixed geocode, issue 855, thanks niphllod 2012-06-17 23:36:35 -05:00
mdipierro
90883e5926 improved layout, thanks Paolo 2012-06-17 23:35:03 -05:00
mdipierro
ecdc6088f4 allow dynamical import in template, thanks Fran 2012-06-17 23:16:15 -05:00
mdipierro
f6a46cd5ff db.table.field.belongs(*value), thanks Michael Toomim 2012-06-17 23:12:49 -05:00
mdipierro
d5324315d5 cursor support in DAL for GAE, thanks Christian 2012-06-17 23:09:19 -05:00
mdipierro
5e23048a74 fixed gitingore and hgignore in welcome 2012-06-17 10:12:18 -05:00
mdipierro
8eccb87375 removed btn from buttontext, thanks szimszon 2012-06-17 08:59:35 -05:00
mdipierro
0f506fc47c removed obsolete files and upgraded to jquery 1.7.2 2012-06-16 18:57:59 -05:00
mdipierro
3143ee397b rearranged parse_id 2012-06-16 17:03:11 -05:00
mdipierro
7b6f5dff48 GAE references, thanks Christian 2012-06-16 16:49:06 -05:00
Massimo Di Pierro
2877daa369 imporved web2py.js no longer escapes flash and commands in headers 2012-06-15 13:17:09 -05:00
Massimo Di Pierro
d3c03601c9 updated changelog 2012-06-14 18:47:26 -05:00
Massimo Di Pierro
5179224e6d reverted revision 2799e09d6bb4, until better idea, because of backward compatibility 2012-06-14 15:42:18 -05:00
Massimo Di Pierro
b9aedb9bf5 DAL('postgres2:...') and arrays 2012-06-14 15:25:49 -05:00
Massimo Di Pierro
5dd56a8d94 new grid classes bootstrap compatible, thanks Bruno 2012-06-14 15:08:33 -05:00
Massimo Di Pierro
6db57e9cd2 db.table.field.filter_in, filter_out, issue 845 2012-06-14 14:45:16 -05:00
Massimo Di Pierro
de608f208f grid(groupy=...') 2012-06-14 14:35:15 -05:00
Massimo Di Pierro
9f0be17b74 grid(groupy=...') 2012-06-14 14:35:02 -05:00
Massimo Di Pierro
c8a8415ce8 keepvalue should default to True for edit forms and False for indert forms (backward compatible) 2012-06-14 14:31:30 -05:00
Massimo Di Pierro
9bcb669fda better markin, thanks villas 2012-06-14 14:28:28 -05:00
Massimo Di Pierro
c38c7e6c4e fixed timing attack again, thanks Kirill 2012-06-14 13:00:57 -05:00
Massimo Di Pierro
0209b24bcf issue 844 (SQLCustomType and unicode parsing), thanks admin 2012-06-13 20:02:13 -05:00
Massimo Di Pierro
e5e1837ce8 withprojection->projection, thanks Anthony 2012-06-13 17:14:55 -05:00
Massimo Di Pierro
9cdb9f1600 fixed issue 843, thanks hoatre2001 2012-06-13 17:02:00 -05:00
Massimo Di Pierro
344c2e85c4 make session2trash 2.5 compliant, thanks Douglas 2012-06-13 16:50:53 -05:00
Massimo Di Pierro
0c7f333ec1 ldap_auth.py fix regarding AD, thanks Gyuris 2012-06-13 16:48:58 -05:00
Massimo Di Pierro
01a2981ed4 fixed a potential timing attack, thanks Kirill Spitsin 2012-06-13 16:45:30 -05:00
Massimo Di Pierro
4a06f92c32 optinal projections, thanks Christian and Anthony 2012-06-13 11:53:18 -05:00
Massimo Di Pierro
3d71278d8a fixed bug in navbar link, thanks Anthony 2012-06-12 21:45:07 -05:00
Michele Comitini
7452551877 Merge github.com:web2py/web2py
Conflicts:
	gluon/custom_import.py
2012-06-12 18:35:31 +02:00
Massimo Di Pierro
0d95b7e6ee fixed pymongo import? 2012-06-12 08:25:22 -05:00
Massimo Di Pierro
0c672d4024 fixed newcron bug thanks niphlod 2012-06-12 08:22:29 -05:00
Massimo Di Pierro
c1dd059fa7 improved scheduler behaviour, thanks Michael 2012-06-11 14:29:08 -05:00
Massimo Di Pierro
1e7d41df2b fixed problem with migration of auth_cas, thank you Anthony 2012-06-10 21:17:47 -05:00
Massimo Di Pierro
1ef2f4f1fd store sessions in cookies, needs logic in main, thanks Nick Groenke 2012-06-10 01:18:30 -05:00
Massimo Di Pierro
816e6b3e5f GAE datastore projection support, thanks Christian 2012-06-10 00:32:14 -05:00
Massimo Di Pierro
7102bc2126 fixed makefile for make_web2py 2012-06-09 11:51:29 -05:00
Massimo Di Pierro
35ca046916 implemented cron fix, thanks Michael 2012-06-09 11:20:23 -05:00
Massimo Di Pierro
9a7587ea68 GAE projection - work in progress 2012-06-09 00:07:57 -05:00
Massimo Di Pierro
52a138ed18 newest setup_exe.py, thanks niphlod 2012-06-08 15:20:25 -05:00
Massimo Di Pierro
e2592a23b4 reverted erroneous e808fd6f684a, thanks Carlos 2012-06-07 23:25:40 -05:00
Massimo DiPierro
b94d758bf1 improved import, thanks Michele 2012-06-06 20:30:37 -05:00
Michele Comitini
aa6339bc75 Show import error in a submodule imported by custom_import 2012-06-07 02:16:20 +02:00
Massimo DiPierro
3f58332dc0 fixed welcome layout on lack of auth 2012-06-06 11:37:28 -05:00
Massimo DiPierro
9b9c046e6d merged with online branch 2012-06-06 11:19:42 -05:00
Massimo DiPierro
0d29ba9314 Merge remote-tracking branch 'origin/master' 2012-06-06 11:16:28 -05:00
Massimo DiPierro
fb7f42f4ba removed spaces 2012-06-06 11:06:41 -05:00
Massimo DiPierro
760de8ed64 fixed indentation error, thanks pbreit 2012-06-06 10:54:44 -05:00
Massimo DiPierro
e1f4c1fb67 fixed web2py.py himBH>jQuery, thanks Anthony 2012-06-06 10:51:34 -05:00
Michele Comitini
29b8979bdb White space after \ at eol removed. 2012-06-06 13:07:54 +02:00
Michele Comitini
560aef2a1d Merge branch 'master' of github.com:web2py/web2py 2012-06-06 11:10:56 +02:00
Massimo DiPierro
b45134512a another SQLCustomType improvement, Alexander is right 2012-06-05 20:02:36 -05:00
Massimo DiPierro
95d01663a7 issue 694, thanks dlypka 2012-06-05 18:18:50 -05:00
Massimo DiPierro
e6e542b14f issue 644, thanks Douglas and Alan 2012-06-05 18:08:01 -05:00
Massimo DiPierro
b930458679 Row.__str__ 2012-06-05 18:00:59 -05:00
Massimo DiPierro
87870448c6 do not show errors about already uploaded files 2012-06-05 17:53:26 -05:00
Massimo DiPierro
c562133e9f self refernces, issue 353, 'refernce .', thanks eenns 2012-06-05 17:38:16 -05:00
Massimo DiPierro
72cacb43d2 self refernces, issue 353, 'refernce .', thanks eenns 2012-06-05 17:37:40 -05:00
Massimo DiPierro
4fd95881dc fixed router bug and new test, thanks Jonathan 2012-06-05 17:15:17 -05:00
Massimo DiPierro
5766476fa1 fixed SQLCustomType represent 2012-06-05 10:57:21 -05:00
Massimo DiPierro
6675963f7b fixed typo in sqlhtml.py 2012-06-05 00:02:57 -05:00
Massimo DiPierro
efdabad37e new (better) scheduler, thanks niphlod and szimszon 2012-06-04 18:49:35 -05:00
Massimo DiPierro
dbd7c8e065 customizable breakcrumbs in smartgrid, thanks Paolo 2012-06-04 18:45:17 -05:00
Massimo DiPierro
800ea7d055 ctrl+S for admin save on Mac 2012-06-04 16:03:24 -05:00
Massimo DiPierro
ffe21ee7a6 fixed Romanian translation, thanks Ionel 2012-06-02 16:44:27 -05:00
Massimo DiPierro
4e7c1ae48a fixed issue 826, callable editable in grid, thanks Douglas 2012-06-02 14:47:43 -05:00
Massimo DiPierro
fc7c6d5697 fixed issue 828, related to rest security, thanks Clifford 2012-06-02 14:45:52 -05:00
Massimo DiPierro
f479e0dd31 romanian translation for welcome, thanks ionel 2012-06-02 14:36:17 -05:00
Massimo DiPierro
8869b0a650 romanian translation for admin, thanks ionel 2012-06-02 14:35:05 -05:00
Massimo DiPierro
c6c99eacc3 added welcome/.hgignore and .gitignore, thansk Iceberg 2012-06-02 14:02:16 -05:00
Massimo DiPierro
8436692e88 pyfilestem support for upload to S3, ftp, etc. 2012-05-31 12:48:27 -05:00
Massimo Di Pierro
e4357d2988 fixed pythonrc, thanks Vlad 2012-05-29 00:20:46 -05:00
Massimo Di Pierro
3af2c7153f fixed a problem with path detection in languages, thanks Vlad 2012-05-28 19:15:29 -05:00
Massimo Di Pierro
5c2bab1fb6 fixed problem with shell introduced in recent commit 2012-05-28 16:30:43 -05:00
Massimo Di Pierro
2d051d7ff4 issue 823, thanks mweissen 2012-05-28 16:19:29 -05:00
Massimo Di Pierro
26127e8fde fixed navbar problem with IE, thanks Paolo 2012-05-28 15:55:19 -05:00
Massimo Di Pierro
b4453c6237 reverted latest change, thanks Babak 2012-05-28 15:46:18 -05:00
Massimo Di Pierro
e61e595d21 yet another postgresql connection improvement, thanks Babak 2012-05-28 14:02:12 -05:00
Massimo Di Pierro
b607ff2318 who.html updated 2012-05-28 13:37:48 -05:00
Massimo Di Pierro
a256fe355f allow edit page resize, thanks Vlad 2012-05-28 13:34:09 -05:00
Massimo Di Pierro
f424aef3c3 language files are now searched recursively, thanks Vlad 2012-05-28 13:32:40 -05:00
Massimo Di Pierro
94e1de3cf8 language files are now searched recursively, thanks Vlad 2012-05-28 13:31:40 -05:00
Massimo Di Pierro
5001a0d16f fixed encoding in flash messages, thanks Vlad 2012-05-28 13:23:40 -05:00
Massimo Di Pierro
ac864ceaf4 internationalization in RSS serializer, thanks Vlad 2012-05-28 13:13:49 -05:00
Massimo Di Pierro
8d954bbfc3 result of PYTHONSTARTUP scripts execution (export...; def...) is inserted into global() scope of web2py interactive shell, thanks Vlad 2012-05-28 13:11:12 -05:00
Massimo Di Pierro
68b5581eb5 support for mercurial 2.6, thanks Vlad 2012-05-28 13:08:15 -05:00
Massimo Di Pierro
b48be44134 BEAUTIFY shows cookie values, thanks Vlad 2012-05-28 13:05:30 -05:00
Massimo Di Pierro
54c10e0f97 STRONG helper, thanks Vlad 2012-05-28 13:00:49 -05:00
Massimo Di Pierro
6411045b62 dal connection strigs now allo / in hostnames, thanks Babak 2012-05-28 12:29:19 -05:00
Massimo Di Pierro
de07e0dfc1 better bootswatch support in case no css, thanks Paolo 2012-05-27 17:54:20 -05:00
Massimo Di Pierro
2a4c4b86c8 Ukrainian translations, thanks Vladyslav Kozlovskyy 2012-05-27 17:39:39 -05:00
Massimo Di Pierro
8bf47a940b making ics seriliazer more flexible 2012-05-26 22:38:37 -05:00
Massimo Di Pierro
2819285076 fixed bug in serializers, thanks Louis DaPrato 2012-05-26 20:10:27 -05:00
Massimo Di Pierro
400c038555 added bootswatch.css 2012-05-26 17:53:52 -05:00
Massimo Di Pierro
07e61fc00f fixed problem with ics serializer, thanks Amber 2012-05-26 11:15:52 -05:00
Massimo DiPierro
093b3590e9 fixed bug in serializers 2012-05-25 22:29:07 -05:00
Massimo Di Pierro
3582aa2023 fixed better js for bootswatch menus 2012-05-25 15:03:40 -05:00
Massimo Di Pierro
28dffafd3d fixed js for bootswatch menus 2012-05-25 15:02:30 -05:00
Massimo Di Pierro
3a233f6cfa new welcome menu bootswatch friendly, thanks Paolo Caruccio 2012-05-25 14:52:25 -05:00
Massimo Di Pierro
543f6b9606 fixed problem with handle_charref, thanks Cedric Meyer 2012-05-25 10:38:46 -05:00
Massimo Di Pierro
837ed7fb5e new scheduler (not tested yet), thanks Niphlod 2012-05-24 22:31:51 -05:00
Michele Comitini
9ee964165b Merge branch 'master' of github.com:web2py/web2py 2012-05-23 18:12:06 +02:00
Massimo DiPierro
2fa604df3a fixed bug in mail login introduced in recent commit, issue 818, thanks Carlos 2012-05-23 09:28:00 -05:00
Massimo DiPierro
272c0a35e5 added http://web2py.sinaapp.com/, thanks web2py_lover 2012-05-23 09:25:26 -05:00
Massimo DiPierro
7447071cc4 better and centered welcome layout, thanks Chris May 2012-05-22 09:05:39 -05:00
Michele Comitini
e87f82f65c Merge branch 'master' of github.com:web2py/web2py 2012-05-22 00:03:14 +02:00
Massimo DiPierro
0ae599a94d better setup-web2py-nginx-uwsgi-ubuntu.sh, issue 816, thanks Orsomannaro 2012-05-21 16:50:03 -05:00
Massimo DiPierro
9c26839d15 fixed bug in smartdict, thanks Jonathan 2012-05-21 10:08:44 -05:00
Massimo DiPierro
0206fa024b db(db.a)._update(name=db(db.b.a==db.a.id).nested_select(db.b.id)) 2012-05-21 09:55:05 -05:00
Massimo Di Pierro
7e2fbfacac parse_as_rest returns count, thaks Joseph Piron 2012-05-20 10:09:41 -05:00
Massimo Di Pierro
ec55c1573b {{super}} equals '' if no parent 2012-05-19 22:35:12 -05:00
Massimo DiPierro
5ce35c1726 fixed 5th parameter of menu does not work on mobiles, issue 805, thanks mweissen 2012-05-19 10:11:55 -05:00
Massimo DiPierro
667396904c use applescript to force slash screen on to, thanks Marc 2012-05-19 10:09:38 -05:00
Massimo DiPierro
1f265ee370 fixed logging issue (807), thanks Marc 2012-05-19 10:07:56 -05:00
Massimo Di Pierro
ed354d8646 db.table.field.avg(), issue 803, thanks Ato 2012-05-17 18:14:19 -05:00
Massimo Di Pierro
672f093e15 fixed bug in last commit, thanks Harkirat 2012-05-17 17:52:27 -05:00
Massimo Di Pierro
16ff6cef08 get or create key now defaults to sha512 asn should have all along, thanks Harkirat 2012-05-17 15:56:19 -05:00
Massimo Di Pierro
b00eca75af mail.settings.login can be None,False,0,'' 2012-05-17 10:54:17 -05:00
Massimo Di Pierro
60c4a912cd no more class='' but class=None, thanks Jonathan 2012-05-17 09:55:50 -05:00
Massimo DiPierro
ce01842e2d disabled copied of logging.conf again, problem with python 2.5 2012-05-16 18:23:18 -05:00
Massimo DiPierro
bc929ce463 fixed issue 799, thanks hi21alt 2012-05-16 16:52:09 -05:00
Massimo DiPierro
bc8eeb25e3 Sybase Adapter 2012-05-16 16:45:10 -05:00
Michele Comitini
b10eca0dcb Merge branch 'master' of github.com:web2py/web2py 2012-05-16 22:40:38 +02:00
Massimo DiPierro
279d275c1c restored copy of logging, works today 2012-05-16 11:15:56 -05:00
Michele Comitini
14d24f496e Simplify the https check logic using request.is_https which is smarter. 2012-05-15 22:38:43 +02:00
Massimo Di Pierro
776f39922e removed copy of logging.conf because default logging.example.conf breaks web2py. 2012-05-15 09:06:31 -05:00
Massimo Di Pierro
3d86a99e55 improved csv does not require id field, issue 795, thanks Dominic Koenig 2012-05-14 14:28:35 -05:00
Massimo Di Pierro
bb946b34a8 sys.exit of error on run_system_tests 2012-05-14 14:27:27 -05:00
Massimo Di Pierro
632a8568bb sys.exit(1) of error on run_system_tests 2012-05-14 14:26:34 -05:00
Massimo DiPierro
29a2080772 added comment in Makefile 2012-05-11 21:56:17 -05:00
Massimo DiPierro
bddb8ea651 README.markdown 2012-05-11 21:52:26 -05:00
Massimo DiPierro
327ea4e019 Create default logging.conf if it doesn't exist, thanks Marc 2012-05-11 17:41:25 -05:00
Massimo Di Pierro
d788830df6 another mongodb improvement 2012-05-11 14:52:21 -05:00
Massimo Di Pierro
d73fddc481 2.00.0 release candidate 2012-05-11 08:30:51 -05:00
Massimo Di Pierro
1251313f9c fixed bug in recent widget commit, thanks Gyuris 2012-05-11 08:28:24 -05:00
Massimo Di Pierro
d2c37b1d68 Display import errors in the GUI as well as the terminal, issue 789, thanks Marc 2012-05-11 08:26:53 -05:00
Massimo Di Pierro
b60c4a3191 better teradata adapter, thanks Andrew Willimott 2012-05-11 08:23:00 -05:00
Massimo Di Pierro
d777cde5fc better teradata adapter, thanks Andrew Willimott 2012-05-11 08:14:57 -05:00
Massimo Di Pierro
3bd84e3698 make commit runs tests, let's try.... 2012-05-10 22:36:06 -05:00
Massimo Di Pierro
8ee069be65 gracefully handle if a server is already running on the selected port, thanks Marc 2012-05-10 22:30:45 -05:00
Massimo Di Pierro
d85dce1708 fixed rocket ssl issue 787 2012-05-10 22:29:12 -05:00
Massimo Di Pierro
b92c4653f1 -S a/c/f, issue 786, thanks Carlos Galindo 2012-05-10 22:24:43 -05:00
Massimo Di Pierro
f8b4e40d22 https instead of http on initial startup with certificates, issue 783, thanks shivakumar. 2012-05-10 22:22:27 -05:00
Massimo DiPierro
409ce3f51e web2py.py --run_system_tests, thanks Marc Abramowitz 2012-05-10 18:20:24 -05:00
Massimo DiPierro
827e7985d4 added contrib/imageutils, thanks Bruno and Villas 2012-05-10 18:02:12 -05:00
Massimo DiPierro
323c8ba98e better translation interface, thanks Daniel González Zaballos 2012-05-10 16:30:37 -05:00
Massimo Di Pierro
c9570aab55 anothr attempt to fix mongodb adapter 2012-05-10 15:12:29 -05:00
Massimo Di Pierro
b5bf585f99 fixed mongo select? perhaps 2012-05-10 08:19:21 -05:00
Massimo Di Pierro
9fb7bc06de fixed another typo in recent mongodb commit 2012-05-07 17:40:26 -05:00
Massimo Di Pierro
292c93658d fixed typo in previous commit 2012-05-07 17:36:10 -05:00
Massimo Di Pierro
6e583abbc2 mongodb fix? 2012-05-07 15:27:32 -05:00
Massimo Di Pierro
533719efb9 reverted change to LI(name) in MENU 2012-05-07 12:18:42 -05:00
Massimo Di Pierro
c4fc83c179 fixed bug introduced recently when non-GAE, thanks Dominic Koenig 2012-05-07 08:15:47 -05:00
Massimo Di Pierro
46387d9dd6 better scheduler docs, thanks Michael 2012-05-06 17:32:27 -05:00
Massimo Di Pierro
d79a3d8705 preserve exception in custom_import, thanks Mike Amy 2012-05-06 17:29:58 -05:00
Massimo Di Pierro
95e91329a2 added tox.ini, thanks Marc 2012-05-06 17:27:54 -05:00
Massimo Di Pierro
088bb60e17 edits in README.markdown 2012-05-06 17:21:17 -05:00
Massimo Di Pierro
55297ac68b README->README.markdown, thanks msabramo 2012-05-06 17:19:17 -05:00
Massimo Di Pierro
ec09c58519 closed github issue 5, thanks MoMaT 2012-05-06 16:05:13 -05:00
Massimo Di Pierro
30eeee1e32 fixed github issue 4, thanks ilvalle 2012-05-06 16:01:10 -05:00
Massimo Di Pierro
a836bc6ce6 better backward compatibility in bigint_id=False (default) 2012-05-05 09:01:29 -05:00
Massimo DiPierro
0a826c5239 new bigint type, DAL(...bigint_id=True) works better 2012-05-04 14:01:53 -05:00
Massimo DiPierro
4fd41a4707 portable spatialite import, issue 774, thanks TheBigBamboozle and Denes 2012-05-04 10:47:24 -05:00
Massimo DiPierro
57e586575a better -E -b -L options for scheduler, thanks niphlod 2012-05-04 10:27:05 -05:00
Massimo Di Pierro
be86c1e8ea better check for auto-upload 2012-05-03 21:00:41 -05:00
Massimo Di Pierro
712ef6499f add_permission now prevents duplicates 2012-05-03 20:51:54 -05:00
Massimo Di Pierro
838917c148 better gluon/contrib/autolinks.py, no more <embed><iframe> 2012-05-03 19:00:59 -05:00
Massimo Di Pierro
a609d93836 better gluon/contrib/autolinks.py (still not sure this is behavior I want) 2012-05-03 18:48:30 -05:00
Massimo Di Pierro
b452d0744a better autolinks 2012-05-03 17:56:06 -05:00
Massimo Di Pierro
2d2fdb5743 better gluon/contrib/autolinks.py 2012-05-03 11:54:55 -05:00
Massimo Di Pierro
3afeeeb7c5 better gluon/contrib/autolinks.py 2012-05-03 11:14:21 -05:00
Massimo Di Pierro
089d76a613 gluon/contrib/autolinks.py 2012-05-03 10:04:57 -05:00
Massimo Di Pierro
bbccff76f8 DAL(...,bigint_id=True) 2012-05-02 21:57:24 -05:00
Massimo Di Pierro
d6178047eb removed as in cache.py 2012-05-02 17:26:14 -05:00
Massimo Di Pierro
2bd0f0d90d better title in layout, bootstrap compatible, thanks Omi 2012-05-02 17:14:18 -05:00
Massimo Di Pierro
f50907f109 db._legacyid=True 2012-05-02 16:41:56 -05:00
Massimo Di Pierro
58f070949c fixed onvalidation for SQLFORM, issue 778, thanks Carlos Galindo 2012-05-02 16:08:40 -05:00
Massimo Di Pierro
eef199582a pgp patch, issue 776, thanks szimszon 2012-05-02 16:03:52 -05:00
Massimo Di Pierro
37e6826371 fixed newcron path escaping, issue 772, thanks shikasta.net 2012-05-02 16:00:20 -05:00
Massimo Di Pierro
c9df8f007d scripts/setup-web2py-fedora.sh, thanks ykessler 2012-05-02 15:58:10 -05:00
Massimo Di Pierro
92c374be8a partially accepted patch from issue 767, improved populate, thanks simonm3 2012-05-02 15:49:07 -05:00
Massimo Di Pierro
f356063e90 fixed locking issue with cache disk, thanks gypsy 2012-05-02 15:47:07 -05:00
Massimo Di Pierro
3ca82dae7f db.table.insert(uploadfield=...), ... can not be file or FieldStorage, issue 570 2012-05-02 14:28:13 -05:00
Massimo Di Pierro
0d04e5f68b translate in IS_STRONG, issue 747 partially fixed 2012-05-02 14:12:54 -05:00
Massimo Di Pierro
62dff4c955 new button in user.html 2012-04-30 15:11:39 -05:00
Massimo Di Pierro
3a2c0f8b93 form.add_button(value,link) 2012-04-30 13:45:29 -05:00
Massimo Di Pierro
139845cf60 request.args(0,default=0, cast=int, url_onerror=URL(...)), thanks Anthony 2012-04-30 11:39:37 -05:00
Massimo Di Pierro
5aaa8bde77 request.intargs(i,default,url_onerror=URL(...)) 2012-04-29 18:51:04 -05:00
Massimo Di Pierro
67b05a140e fixed + after lists, thanks Niphlod 2012-04-24 08:39:51 -05:00
Massimo Di Pierro
abb0114f94 fixed Oracle decode problem, thanks Daniel Haag 2012-04-24 08:38:13 -05:00
Massimo Di Pierro
cc8a946e78 fixed scheduler rollback typo, thanks Niphlod 2012-04-23 11:28:33 -05:00
Massimo Di Pierro
ba4565bae3 catching EOFError in admin 2012-04-22 20:27:14 -05:00
Massimo Di Pierro
fb8da0f51c multi manager support in multi user mode 2012-04-22 20:19:47 -05:00
Massimo Di Pierro
e574daa490 fixed oracle issue 764, thanks adesantoasman 2012-04-21 12:19:48 -05:00
Massimo Di Pierro
7bdb3895e2 masking password, , issue 761, thanks jlojunior 2012-04-21 12:17:42 -05:00
Massimo Di Pierro
ac44f2bd00 id and reference now defaults to BIGINT when possible but will not migrate 2012-04-21 12:10:36 -05:00
Massimo Di Pierro
897e86c3bb Issue 756, fixed status code for down for maintenance, thanks Chris 2012-04-21 11:37:35 -05:00
Massimo Di Pierro
f17d4303b5 fixed uploads in GoogleSQLAdapter, thanks Matt, issue 746 2012-04-21 11:26:15 -05:00
Massimo Di Pierro
11c0b934bf temp fix for web2py/yJtJRTUVJTg 2012-04-21 11:10:26 -05:00
Massimo Di Pierro
091a21f769 checking 2012-04-21 11:04:23 -05:00
Massimo Di Pierro
09db0843f7 shoten regex, thanks Jonathan; option to disabled latex for use with MathJax 2012-04-20 10:08:31 -05:00
Massimo Di Pierro
1991189e71 simpler @{} support 2012-04-19 22:51:08 -05:00
Massimo Di Pierro
0109ab141f simpler @{} support 2012-04-19 22:47:52 -05:00
Massimo Di Pierro
f7ecbc2dab better markmin, video, audio, embed, iframe support 2012-04-19 22:34:36 -05:00
Massimo Di Pierro
5a1cdb4e03 no twice no record found 2012-04-19 11:12:25 -05:00
Massimo Di Pierro
ea6a3b65fd separator in grid headers 2012-04-19 11:09:08 -05:00
Massimo Di Pierro
6bdc56a351 fixed mergin in grid 2012-04-19 11:04:08 -05:00
Massimo Di Pierro
da6bd89383 welcome has bootstrap, and cleaner grid 2012-04-19 10:53:04 -05:00
Massimo Di Pierro
0da6403d86 grid.create_form 2012-04-18 21:20:13 -05:00
Massimo Di Pierro
05ba91cde5 better response.files behavior 2012-04-18 17:31:10 -05:00
Massimo Di Pierro
04a82409fe fixed accessible_query 2012-04-17 21:22:11 -05:00
Massimo Di Pierro
ba64a96eba has_permission applies to everybody 2012-04-17 15:29:17 -05:00
Massimo Di Pierro
886ca03a18 auth.settings.everybody_group_id 2012-04-17 15:10:33 -05:00
Massimo Di Pierro
97d733a25f customizable personal group names 2012-04-17 12:32:38 -05:00
Massimo Di Pierro
acd9fa0951 gunicorn? 2012-04-17 10:24:57 -05:00
Massimo Di Pierro
9c46c107f3 fixed pickleablestorage import 2012-04-17 10:02:23 -05:00
Massimo Di Pierro
e389f4ef9e LENGTH fixed in MSSQL, thanks Denes 2012-04-17 09:55:50 -05:00
Massimo Di Pierro
73184a1efd gnuicorn -> gunicorn 2012-04-16 08:16:38 -05:00
Massimo Di Pierro
21a659ef85 fixed typo in gluon tools 2012-04-15 09:55:49 -05:00
Massimo Di Pierro
8e643026b2 reconnect commits first 2012-04-12 09:13:04 -05:00
Massimo Di Pierro
c172a50d38 db._adapter.reconnect() 2012-04-12 08:26:55 -05:00
Massimo Di Pierro
b973db10ca fixed some issue in grid with grid.create_form 2012-04-09 15:57:58 -05:00
Massimo Di Pierro
84b07ad923 fixed datetime-parsing 2012-04-09 09:21:43 -05:00
Massimo Di Pierro
f52268ba3c fixed IS_EMPTY_OR validator, thanks Adam Bryzak 2012-04-09 08:27:25 -05:00
Adam Bryzak
81c36b1d26 Handle empty requires list when wrapping db.table.field.requires in IS_EMPTY_OR 2012-04-09 23:22:15 +10:00
636 changed files with 65560 additions and 24454 deletions

6
.gitignore vendored
View File

@@ -52,5 +52,7 @@ applications/*/*.py[oc]
applications/examples/static/epydoc
applications/examples/static/sphinx
applications/admin/cron/cron.master
HOWTO-web2py-devel
*.sublime-project
*.sublime-workspace
.idea/*

38
.travis.yml Normal file
View File

@@ -0,0 +1,38 @@
language: python
python:
- '2.5'
- '2.6'
- '2.7'
- 'pypy'
install:
- pip install -e .
env:
- DB=sqlite:memory
- DB=mysql://root:@localhost/test_w2p
- DB=postgres://postgres:@localhost/test_w2p
before_script:
- if [[ $TRAVIS_PYTHON_VERSION != '2.7' ]]; then pip install unittest2; fi
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install coverage; fi;
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install python-coveralls; fi
- if [[ $DB == postgres* ]]; then pip install psycopg2; fi;
- if [[ $TRAVIS_PYTHON_VERSION == '2.5' ]]; then pip install pysqlite; fi
- if [[ $DB == mysql* ]]; then mysql -e 'create database test_w2p;'; fi
- if [[ $DB == postgres* ]]; then psql -c 'create database test_w2p;' -U postgres; fi
#Temporal solution to travis issue #155
- sudo chmod 777 /dev/shm
- sudo rm -rf /dev/shm && sudo ln -s /run/shm /dev/shm
matrix:
exclude:
- python: 'pypy'
env: DB=postgres://postgres:@localhost/test_w2p
- python: 'pypy'
env: DB=mysql://root:@localhost/test_w2p
script: export COVERAGE_PROCESS_START=gluon/tests/coverage.ini; ./web2py.py --run_system_tests --with_coverage
after_success:
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then coverage combine; fi
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then coveralls --config_file=gluon/tests/coverage.ini; fi
notifications:
email: true

6
ABOUT Normal file
View File

@@ -0,0 +1,6 @@
web2py is an open source full-stack framework for agile development
of secure database-driven web-based applications, written and programmable in
Python.
Created by Massimo Di Pierro <mdipierro@cs.depaul.edu>

160
CHANGELOG
View File

@@ -1,6 +1,127 @@
## 2.7.1 - 2.7.2
- jQuery 1.10.2
- codemirror 3.18, thanks Paolo
- namespaces in T("Welcome", ns="namespace"), thanks jamarcer (experimental)
- more Auth options, thanks Charles
- more admin configuration, thanks Roberto
- new gluon.contrib.strip.StripeForm for PCI compliant payments
- webclient can hendle lists, thanks Yair
- allows SQLFORM.grid(...,ignore_common_filters=True)
- more translations, thanks Vladyslav
- better session2trash.py, works with scheduler, thanks niphlod
- fixed problem with ENABLED/DISABLED
- many bug fixes, thanks niphlod, michele, anthony, roberto, tim, and others
## 2.6.1 - 2.6.4
Attention all users: For pre 2.6 applications to work with web2py >=2.6, you must copy static/js/web2py.js, controllers/appadmin.py, and views/appadmin.html from the welcome app to your own apps (all of them).
Attention production users: The updated handlers and examples are in handlers/ and examples/. The updated ones will not override the existing ones. To use the new ones it is not sufficient to upgrade web2py, you also need to copy the desired handler/example in the root web2py/ folder.
Attention MySQL users: The length of string fields changed from 255 to 512 bytes. If you have migrations enabled this will trigger a large migration. To prevent it, first set migrate_enabled=False, upgrade, check everything is ok, then add length=255 to your string Fields, then re-enable migrations with migrate_enabled=True if needed.
- better directory structure: handlers/ extras/ examples/
- better MongoDb support, thanks Alan
- better Admin editor interface, thanks Paolo, Roberto (codemirror 3), and Lightdot
- better layout.html and web2py_bootstrap.css, thanks Paolo
- refactored web2py.js makes code more readable, thanks Niphlod
- compute fields can depend on other compute(d) fields
- more functions in appadmin (/manage/auth), thanks Anthony
- support for CAST in SQL generation
- new API jQuery('#component').reload()
- new API rows.render()
- new API table.field.referent, table._references
- new API db(...).validate_and_update(...)
- new API Wiki(..., force_render=True) renders the page source again instead of using cached
- Wiki now automatically parses named component arguments @{f:a=1,b='twp',c=variable}
- auth.get_or_create_user(login=False)
- auth = Auth(crsf_protection = False) prevents creating sessions in login/register forms.
- enable multiple renderers in wiki, thanks Alan
- log messages from Auth are no longer translated (for speed and readability)
- update jQuery mobile to 1.3.1
- reduced memory footprint by conditionally loading Tk
- faster pbkdf2 uses OpenSSL, thanks Michele
- many speed improvements, thanks Michele
- better session logic, prevents false positive when detecting session changes.
- scripts/import_static.py converts a static site to a web2py app (experimental)
- support for new http error code 451
- profiler saves dump in dir, thanks Niphlod
- upgraded pyfpdf, thanks Mariano
- gluon/contrib/pdfinvoice.py for generating PDF invoices (assumes reportlab)
- no more double submission of forms (even without crsf protection), thanks Niphlod
- speedup for define_table, thanks Michele
- settings.cfg to admin, thanks Paolo
- many bugs fixed, thanks Niphlod, Michele, Roberto, Jonathan, and many others
- 2.6,3 specifically fixed a possible DoS vulnerability
- 2.6.4 specifically fixes major problem introduced in 2.6.1 with session logic
## 2.5.2
- Web editor with tabs, thanks ilvalle
## 2.5.1
- New style virtual fields in grid
- Conditional fields (experimental) ``db.table.field.show_if = db.table.otherfield==True`` or ``db.table.field.show_if = db.table.otherfiel.contains(values)``
- auth.settings.manager_group_role="manager" enables http://.../app/appadmin/auth_manage and http://.../app/appadmin/manage for members of the "manager" group. (also experimental)
- support for POST variables in DELETE
- Fixed memory leak when using the TAG helper
## 2.4.7
- pypy support, thanks Niphlod
- more bug fixes
- ...
## 2.4.6
- better tests
- new ANY_OF and IS_IPV6 validators
- new custom save option
- many small bug fixes
## 2.4.5
- travis.ci integration (thanks Marc Abramowitz and Niphlod). Passes all tests (thanks Niplod).
- IS_DATE and IS_DATETIME can specify timezone
## 2.4.1- 2.4.3
- 2D GEO API: geoPoint, getLine, geoPolygon
- support for 'json' field type in DAL
- schema export with db.as_json/as_xml, thanks Alan
- graph representation of models
- support for semantic versioning
- new bootstrap based admin, thanks Paolo
- improved scheduler (and change in scheduler field names), thanks Niphlod
- graphviz support added to adm, thanks Jose
- on_failure in grid
- db.table.field.abs()
- better wiki
- geoPoint, getLine, geoPolygon
- better reporting of 500 ajax errors
- better grid
- improved/fixed mongodb support
- improved parse_as_rest(patterns=...), thanks Denes
- improved IMAP DAL support, thanks Alan
- improved security when cookies in sessions
- Row.as_xml, as_json, as_dict, as_yaml thanks Alan
- smarter custom_import
- setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh
- added support for motor and pulsar servers, thanks Niphlod
- added json-rpc2 support
- added pypyodbc.py driver
- allow auth.settings.ondelete='CASCADE'
- new syntax IS_EXPR(lambda value: ...
- using google for QR codes (although Graph API will be deprecated in 2015)
- upgraded fpdf to 1.7.1
- bug fixes (including issues with calendar.js and archive tables)
## 2.3.1 - 2.3.2
- new virtual fields syntax:
- new virtual fields syntax:
``db.define_table('person',Field('name'),Field.Virtual('namey',lambda row: row.person.name+'y'))``
- db.thing(name='Cohen',_orderby=db.thing.name), thanks Yair
- made many modules Python 3.3 friendly (compile but not tested)
@@ -38,7 +159,7 @@
## 2.1.0
- overall faster web2py
- when apps are deleted, a w2p copy left in deposit folder
- when apps are deleted, a w2p copy is left in deposit folder
- change in cron (it is now disabled by default). removed -N option and introduced -Y.
- faster web2py_uuid() and request initialization logic, thanks Michele
- static asset management, thanks Niphlod
@@ -120,7 +241,7 @@
- increased security in admin against CSRF
- experimental Git integration
- experimental OpenShift deployment
- multi-language pluralization engine
- multi-language pluralization engine
- ace text web editor in admin
- Ukrainian translations, thanks Vladyslav Kozlovskyy
- Romanian translation for welcome, thanks ionel
@@ -149,7 +270,7 @@
TERMINATE (complete the current task and then die)
KILL (kill ASAP)
### Other Improvements
### Other Improvements
- gluon/contrib/webclient.py makes it easy to create functional tests for app
- DIV(..).elements(...replace=...), thanks Anthony
@@ -189,7 +310,7 @@
- db = DAL('mongodb://127.0.0.1:5984/db') (experimental, thanks Mark Breedveld)
- db = DAL('cubrid') (experimental)
- db = DAL('postgres:pg8000:...') and DAL('postgres:psycopg2:...')
- pg8000 now ships with web2py (thanks Mariano)
- pg8000 now ships with web2py (thanks Mariano)
- reponse.delimiters = ('\\[','\\]') (thanks Denes)
- auth.user_groups stores user groups
- auth.is_impersonating()
@@ -214,7 +335,7 @@ fixed a SQLCustomField bug
## 1.99.3
This is a major revision in peparation for web2py 2.0
- moved to GitHub and abandoned Lanchpad
- moved to GitHub and abandoned Lanchpad
- new web site layout, thanks Anthony
- new welcome app using skeleton, thanks Anthony
- jQuery 1.7.1
@@ -319,7 +440,7 @@ This is a major revision in peparation for web2py 2.0
## 1.96.1
- "from gluon import *" imports in every python module a web2py environment (A, DIV,..SQLFORM, DAL, Field,...) including current.request, current.response, current.session, current.T, current.cache, thanks Jonathan.
- conditional models in
- conditional models in
models/<controller>/a.py and models/<controller>/<function>/a.py
- from mymodule import *, looks for mymodule in applications/thisapp/modules first and then in sys.path. No more need for local_import. Thanks Pierre.
- usage of generic.* views is - by default - restricted to localhost for security. This can be changed in a granular way with: response.generic_patterns=['*']. This is a slight change of behavior for new app but a major security fix.
@@ -351,7 +472,7 @@ This is a major revision in peparation for web2py 2.0
- messages in validators have default internationalization
- No more Auth(globals(),db), just Auth(db). Same for Crud and Service.
- scripts/access.wsgi allows apache+mod_wsgi to delegate authentication of any URL to any web2py app
- json now supports T(...)
- json now supports T(...)
- scripts/setup-web2py-nginx-uwsgi-ubuntu.sh
- web2py HTTP responses now set: "X-Powered-By: web2py", thanks Bruno
- mostly fixed generic.pdf. You can view any page in PDF if you have pdflatex installed or if your html follows the pyfpdf convention.
@@ -528,7 +649,7 @@ This is a major revision in peparation for web2py 2.0
recalled
## 1.86.1-1.86.3
- markmin2latex
- markmin2latex
- markmin2pdf
- fixed some bugs
- Storage getfirst, getlast, getall by Kevin and Nathan
@@ -558,7 +679,7 @@ recalled
- Polymmodel support on GAE
- Experimental ListWidget
- moved DAL and routes to thread.local (thanks Jonathan, again)
- scripts/extract_mysql_models.py, thanks Falko Krause and Ron McOuat
- scripts/extract_mysql_models.py, thanks Falko Krause and Ron McOuat
- scripts/dbsessions2trash.py, thanks Scott
## 1.83.2
@@ -660,7 +781,7 @@ recalled
- automatic database retry connect when pooling and lost connections
- OPTGROUP helper, thanks Iceberg
- web2py_ajax_trap captures all form submissions, thank you Skiros
- multicolumn checkwidget and arbitrary chars in multiple is_in_set, thanks hy
- multicolumn checkwidget and arbitrary chars in multiple is_in_set, thanks hy
- Québécois for welcome, thanks Chris
- crud.search(), thanks Mr Freeze
- DAL(...migrate,fake_migrate), thanks Thadeus
@@ -708,7 +829,7 @@ recalled
- fix in delete for GAE
- auth.settings.login_captcha and auth.settings.register_captcha
- crud.settings.create_captcha and crud.settings.update_captcha
- automatic update button in admin
- automatic update button in admin
## 1.76.1
- editarea 0.8.2 + zencoding
@@ -802,7 +923,7 @@ recalled
- New get_vars and post_vars compatible in 2.5 and 2.6 (thanks Tim)
- Major rewrite of gql.py extends DAL syntax on GAE
- No more *.w2p, welcome.w2p is create automatically, base apps are always upgraded
- export_to_csv(delimiter = ',', quotechar = '"', quoting = csv.QUOTE_MINIMAL), thanks Thadeus
- export_to_csv(delimiter = ',', quotechar = '"', quoting = csv.QUOTE_MINIMAL), thanks Thadeus
## 1.73.1
- Fixed problem with storage and comparison of Row objects
@@ -1013,7 +1134,7 @@ recalled
- fixing lots of small bugs with tool and languages
- jquery.1.3.2
##
##
- One more feature in trunk....
@@ -1047,7 +1168,7 @@ recalled
- passes all unittest but test_rewite (not sure it should pass that one)
- Lots of patches from Fran Boone (about tools) and Dougla Soares de Andarde (Python 2.6 compliance, user use of hashlib instead of md5, new markdown2.py)
- db.define_table('mytable',db.Field('somefield'),timestamp)
- db.define_table('mytable',db.Field('somefield'),timestamp)
Example:
``
timestamp=SQLTable(None,'timestamp',
@@ -1216,7 +1337,7 @@ db.define_table('cirlce',
- fixed a bug in sql belongs
## web2py 1.20
- new IFRAME, LABEL, FIELDSET validators
- new IFRAME, LABEL, FIELDSET validators
- P(..cr2br=True) option
- FORM and SQLFORM have hidden=dict(...) option for REST
- testing framework.
@@ -1250,7 +1371,7 @@ db.define_table('cirlce',
- Although we are not infringing the trademark since this is a non-commercial
- product we could have run into some issues. So we have been professional
- and changed the name to web2py.
- Now SQLFORMs and FORM can have a formname and multiple forms are allowed
- Now SQLFORMs and FORM can have a formname and multiple forms are allowed
- per page.
- A new examples/default/index page.
- web2py.py instead of runme.py
@@ -1278,7 +1399,7 @@ db.define_table('cirlce',
- New applications/examples/controller/global.py controller for docs.
## Gluon v1.12
- in sql.py
- in sql.py
- handles NULL values properly
- unicode support (data always stored in utf-8)
- 'date' -> datetime.date ,'time' -> datetime.time, 'datetime' -> datetime.datetime, 'boolean' -> True/False
@@ -1344,7 +1465,7 @@ db.define_table('cirlce',
- bug in sqlhtml with JOINS queries
## EWF v1.7 -> Gluon v1.0
- Name change
- Name change
- Improved layout.html
## EWF v1.6 -> v1.7
@@ -1355,4 +1476,3 @@ db.define_table('cirlce',
## EWF v1.5 -> v1.6 (2007)
- load and save .py in ascii, avoids problem with LF+CR on windows
- added path.join in compileapp, fixed problem with Windows compileapp

View File

@@ -3,7 +3,7 @@
Web2py is Licensed under the LGPL license version 3
(http://www.gnu.org/licenses/lgpl.html)
Copyrighted (c) by Massimo Di Pierro (2007-2011)
Copyrighted (c) by Massimo Di Pierro (2007-2013)
### On Commercial Redistribution

View File

@@ -1,11 +1,11 @@
all:
echo "The Makefile is used to build the distribution."
echo "In order to run web2py you do not need to make anything."
echo "just run web2py.py"
@echo "The Makefile is used to build the distribution."
@echo "In order to run web2py you do not need to make anything."
@echo "just run web2py.py"
clean:
rm -f httpserver.log
rm -f parameters*.py
rm -f -r applications/*/compiled
rm -f -r applications/*/compiled
find ./ -name '*~' -exec rm -f {} \;
find ./ -name '*.orig' -exec rm -f {} \;
find ./ -name '*.rej' -exec rm -f {} \;
@@ -20,7 +20,7 @@ clean:
epydoc:
### build epydoc
rm -f -r applications/examples/static/epydoc/
epydoc --config epydoc.conf
epydoc --config extras/epydoc/epydoc.conf
cp applications/examples/static/title.png applications/examples/static/epydoc
tests:
python web2py.py --run_system_tests
@@ -29,7 +29,8 @@ update:
wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py
echo "remember that pymysql was tweaked"
src:
echo 'Version 2.3.2 ('`date +%Y-%m-%d\ %H:%M:%S`') stable' > VERSION
### Use semantic versioning
echo 'Version 2.7.3-stable+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
### rm -f all junk files
make clean
### clean up baisc apps
@@ -53,42 +54,39 @@ src:
### build web2py_src.zip
echo '' > NEWINSTALL
mv web2py_src.zip web2py_src_old.zip | echo 'no old'
cd ..; zip -r web2py/web2py_src.zip web2py/gluon/*.py web2py/gluon/contrib/* web2py/splashlogo.gif web2py/*.py web2py/README.markdown web2py/LICENSE web2py/CHANGELOG web2py/NEWINSTALL web2py/VERSION web2py/Makefile web2py/epydoc.css web2py/epydoc.conf web2py/app.example.yaml web2py/logging.example.conf web2py_exe.conf web2py/queue.example.yaml MANIFEST.in w2p_apps w2p_clone w2p_run startweb2py web2py/scripts/*.sh web2py/scripts/*.py web2py/applications/admin web2py/applications/examples/ web2py/applications/welcome web2py/applications/__init__.py web2py/site-packages/__init__.py web2py/gluon/tests/*.sh web2py/gluon/tests/*.py
cd ..; zip -r web2py/web2py_src.zip web2py/web2py.py web2py/anyserver.py web2py/gluon/*.py web2py/gluon/contrib/* web2py/extras/* web2py/handlers/* web2py/examples/* web2py/README.markdown web2py/LICENSE web2py/CHANGELOG web2py/NEWINSTALL web2py/VERSION web2py/MANIFEST.in web2py/scripts/*.sh web2py/scripts/*.py web2py/applications/admin web2py/applications/examples/ web2py/applications/welcome web2py/applications/__init__.py web2py/site-packages/__init__.py web2py/gluon/tests/*.sh web2py/gluon/tests/*.py
mdp:
make src
make app
make win
app:
echo 'did you uncomment import_all in gluon/main.py?'
python2.5 -c 'import compileall; compileall.compile_dir("gluon/")'
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
#python web2py.py -S welcome -R __exit__.py
#cd ../web2py_osx/site-packages/; unzip ../site-packages.zip
find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
cd ../web2py_osx/site-packages/; zip -r ../site-packages.zip *
mv ../web2py_osx/site-packages.zip ../web2py_osx/web2py/web2py.app/Contents/Resources/lib/python2.5
#find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
#cd ../web2py_osx/site-packages/; zip -r ../site-packages.zip *
#mv ../web2py_osx/site-packages.zip ../web2py_osx/web2py/web2py.app/Contents/Resources/lib/python2.7
find gluon -path '*.py' -exec cp -R {} ../web2py_osx/web2py/web2py.app/Contents/Resources/{} \;
cp README.markdown ../web2py_osx/web2py/web2py.app/Contents/Resources
cp NEWINSTALL ../web2py_osx/web2py/web2py.app/Contents/Resources
cp LICENSE ../web2py_osx/web2py/web2py.app/Contents/Resources
cp VERSION ../web2py_osx/web2py/web2py.app/Contents/Resources
cp CHANGELOG ../web2py_osx/web2py/web2py.app/Contents/Resources
cp splashlogo.gif ../web2py_osx/web2py/web2py.app/Contents/Resources
cp options_std.py ../web2py_osx/web2py/web2py.app/Contents/Resources
cp routes.example.py ../web2py_osx/web2py/web2py.app/Contents/Resources
cp router.example.py ../web2py_osx/web2py/web2py.app/Contents/Resources
cp app.example.yaml ../web2py_osx/web2py/web2py.app/Contents/Resources
cp queue.example.yaml ../web2py_osx/web2py/web2py.app/Contents/Resources
cp -r extras ../web2py_osx/web2py/web2py.app/Contents/Resources
cp -r examples ../web2py_osx/web2py/web2py.app/Contents/Resources
cp -r handlers ../web2py_osx/web2py/web2py.app/Contents/Resources
cp -r applications/admin ../web2py_osx/web2py/web2py.app/Contents/Resources/applications
cp -r applications/welcome ../web2py_osx/web2py/web2py.app/Contents/Resources/applications
cp -r applications/examples ../web2py_osx/web2py/web2py.app/Contents/Resources/applications
cp applications/__init__.py ../web2py_osx/web2py/web2py.app/Contents/Resources/applications
cd ../web2py_osx; zip -r web2py_osx.zip web2py
mv ../web2py_osx/web2py_osx.zip .
win:
echo 'did you uncomment import_all in gluon/main.py?'
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
#cd ../web2py_win/library/; unzip ../library.zip
find gluon -path '*.pyc' -exec cp {} ../web2py_win/library/{} \;
find gluon -path '*.pyc' -exec cp -R {} ../web2py_win/library/{} \;
cd ../web2py_win/library/; zip -r ../library.zip *
mv ../web2py_win/library.zip ../web2py_win/web2py
cp README.markdown ../web2py_win/web2py/
@@ -96,31 +94,27 @@ win:
cp LICENSE ../web2py_win/web2py/
cp VERSION ../web2py_win/web2py/
cp CHANGELOG ../web2py_win/web2py/
cp splashlogo.gif ../web2py_win/web2py/
cp options_std.py ../web2py_win/web2py/
cp routes.example.py ../web2py_win/web2py/
cp router.example.py ../web2py_win/web2py/
cp app.example.yaml ../web2py_win/web2py/
cp queue.example.yaml ../web2py_win/web2py/
cp -r applications/admin ../web2py_win/web2py/applications
cp -r applications/welcome ../web2py_win/web2py/applications
cp -r applications/examples ../web2py_win/web2py/applications
cp -R extras ../web2py_win/web2py/
cp -R examples ../web2py_win/web2py/
cp -R handlers ../web2py_win/web2py/
cp -R applications/admin ../web2py_win/web2py/applications
cp -R applications/welcome ../web2py_win/web2py/applications
cp -R applications/examples ../web2py_win/web2py/applications
cp applications/__init__.py ../web2py_win/web2py/applications
cd ../web2py_win; zip -r web2py_win.zip web2py
mv ../web2py_win/web2py_win.zip .
run:
python2.5 web2py.py -a hello
python2.7 web2py.py -a hello
commit:
python web2py.py --run_system_tests
make src
echo '' > NEWINSTALL
hg commit -m "$(S)"
#bzr commit -m "$(S)"
git commit -a -m "$(S)"
push:
hg push
git push
git push mdipierro
git push --tags
tag:
git tag -l '$(S)'
hg tag -l '$(S)'

View File

@@ -6,6 +6,13 @@ It is written and programmable in Python. LGPLv3 License
Learn more at http://web2py.com
## Tests
[![Build Status](https://travis-ci.org/web2py/web2py.png)](https://travis-ci.org/web2py/web2py)
[![Coverage Status](https://coveralls.io/repos/web2py/web2py/badge.png)](https://coveralls.io/r/web2py/web2py)
## Installation Instructions
To start web2py there is NO NEED to install it. Just unzip and do:
@@ -26,9 +33,9 @@ That's it!!!
... > other handlers and example files
gluon/ > the core libraries
contrib/ > third party libraries
tests/ > unittests
tests/ > unittests
applications/ > are the apps
admin/ > web based IDE
admin/ > web based IDE
...
examples/ > examples, docs, links
...
@@ -47,9 +54,12 @@ That's it!!!
cron/
tests/
... > your own apps
examples/ > example config files, mv .. and customize
extras/ > other files which are required for building web2py
scripts/ > utility and installation scripts
site-packages/ > additional optional modules
logs/ > log files will go in there
deposit/ > a place where web2py stores apps temporarily
## Issues?

View File

@@ -1 +1 @@
Version 2.3.2 (2012-12-17 08:59:58) stable
Version 2.7.3-stable+timestamp.2013.10.11.18.10.01

View File

@@ -17,8 +17,6 @@ import urllib
path = os.path.dirname(os.path.abspath(__file__))
os.chdir(path)
sys.path = [path] + [p for p in sys.path if not p == path]
import gluon.main
from gluon.fileutils import read_file, write_file
class Servers:
@@ -35,7 +33,7 @@ class Servers:
@staticmethod
def wsgiref(app, address, **options): # pragma: no cover
from wsgiref.simple_server import make_server, WSGIRequestHandler
options = {}
class QuietHandler(WSGIRequestHandler):
def log_request(*args, **kw):
pass
@@ -73,6 +71,7 @@ class Servers:
@staticmethod
def paste(app, address, **options):
options = {}
from paste import httpserver
from paste.translogger import TransLogger
httpserver.serve(app, host=address[0], port=address[1], **options)
@@ -92,12 +91,12 @@ class Servers:
@staticmethod
def gevent(app, address, **options):
from gevent import monkey
monkey.patch_all()
options = options['options']
workers = options.workers
from gevent import pywsgi
from gevent.pool import Pool
pywsgi.WSGIServer(address, app, spawn='workers' in options and Pool(
int(options.workers)) or 'default').serve_forever()
pywsgi.WSGIServer(address, app, spawn=workers and Pool(
int(options.workers)) or 'default', log=None).serve_forever()
@staticmethod
def bjoern(app, address, **options):
@@ -134,6 +133,7 @@ class Servers:
@staticmethod
def gunicorn(app, address, **options):
options = {}
from gunicorn.app.base import Application
config = {'bind': "%s:%d" % address}
config.update(options)
@@ -163,18 +163,22 @@ class Servers:
"tcp://127.0.0.1:9996")
mongrel2_handler(app, conn, debug=False)
@staticmethod
def motor(app, address, **options):
#https://github.com/rpedroso/motor
import motor
app = motor.WSGIContainer(app)
http_server = motor.HTTPServer(app)
http_server.listen(address=address[0], port=address[1])
#http_server.start(2)
motor.IOLoop.instance().start()
def run(servername, ip, port, softcron=True, logging=False, profiler=None):
if logging:
application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase,
logfilename='httpserver.log',
profilerfilename=profiler)
else:
application = gluon.main.wsgibase
if softcron:
from gluon.settings import global_settings
global_settings.web2py_crontype = 'soft'
getattr(Servers, servername)(application, (ip, int(port)))
@staticmethod
def pulsar(app, address, **options):
from pulsar.apps import wsgi
sys.argv = ['anyserver.py']
s = wsgi.WSGIServer(callable=app, bind="%s:%d" % address)
s.start()
def mongrel2_handler(application, conn, debug=False):
@@ -282,10 +286,34 @@ def mongrel2_handler(application, conn, debug=False):
req, data, code=code, status=status, headers=headers)
def run(servername, ip, port, softcron=True, logging=False, profiler=None,
options=None):
if servername == 'gevent':
from gevent import monkey
monkey.patch_all()
elif servername == 'eventlet':
import eventlet
eventlet.monkey_patch()
import gluon.main
if logging:
application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase,
logfilename='httpserver.log',
profiler_dir=profiler)
else:
application = gluon.main.wsgibase
if softcron:
from gluon.settings import global_settings
global_settings.web2py_crontype = 'soft'
getattr(Servers, servername)(application, (ip, int(port)), options=options)
def main():
usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P"
try:
version = read_file('VERSION')
version = open('VERSION','r')
except IOError:
version = ''
parser = optparse.OptionParser(usage, None, optparse.Option, version)
@@ -298,8 +326,8 @@ def main():
parser.add_option('-P',
'--profiler',
default=False,
dest='profiler',
help='profiler filename')
dest='profiler_dir',
help='profiler dir')
servers = ', '.join(x for x in dir(Servers) if not x[0] == '_')
parser.add_option('-s',
'--server',
@@ -318,14 +346,15 @@ def main():
help='port number')
parser.add_option('-w',
'--workers',
default='',
default=None,
dest='workers',
help='number of workers number')
(options, args) = parser.parse_args()
print 'starting %s on %s:%s...' % (
options.server, options.ip, options.port)
run(options.server, options.ip, options.port,
logging=options.logging, profiler=options.profiler)
logging=options.logging, profiler=options.profiler_dir,
options=options)
if __name__ == '__main__':
main()

View File

@@ -11,7 +11,10 @@ import copy
import gluon.contenttype
import gluon.fileutils
response.subtitle = 'Database Administration (appadmin)'
try:
import pygraphviz as pgv
except ImportError:
pgv = None
# ## critical --- make a copy of the environment
@@ -29,17 +32,35 @@ except:
if request.env.http_x_forwarded_for or request.is_https:
session.secure()
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1") and \
(request.function != 'manage'):
raise HTTP(200, T('appadmin is disabled because insecure channel'))
if (request.application == 'admin' and not session.authorized) or \
if request.function == 'manage':
if not 'auth' in globals() or not request.args:
redirect(URL(request.controller, 'index'))
manager_action = auth.settings.manager_actions.get(request.args(0), None)
if manager_action is None and request.args(0) == 'auth':
manager_action = dict(role=auth.settings.auth_manager_role,
heading=T('Manage Access Control'),
tables=[auth.table_user(),
auth.table_group(),
auth.table_permission()])
manager_role = manager_action.get('role', None) if manager_action else None
auth.requires_membership(manager_role)(lambda: None)()
menu = False
elif (request.application == 'admin' and not session.authorized) or \
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
redirect(URL('admin', 'default', 'index',
vars=dict(send=URL(args=request.args, vars=request.vars))))
else:
response.subtitle = T('Database Administration (appadmin)')
menu = True
ignore_rw = True
response.view = 'appadmin.html'
response.menu = [[T('design'), False, URL('admin', 'default', 'design',
if menu:
response.menu = [[T('design'), False, URL('admin', 'default', 'design',
args=[request.application])], [T('db'), False,
URL('index')], [T('state'), False,
URL('state')], [T('cache'), False,
@@ -49,6 +70,10 @@ response.menu = [[T('design'), False, URL('admin', 'default', 'design',
# ## auxiliary functions
# ###########################################################
if False and request.tickets_db:
from gluon.restricted import TicketStorage
ts = TicketStorage()
ts._get_table(request.tickets_db, ts.tablename, request.application)
def get_databases(request):
dbs = {}
@@ -270,14 +295,15 @@ def update():
(db, table) = get_table(request)
keyed = hasattr(db[table], '_primarykey')
record = None
db[table]._common_filter = None
if keyed:
key = [f for f in request.vars if f in db[table]._primarykey]
if key:
record = db(db[table][key[0]] == request.vars[key[
0]], ignore_common_filters=True).select().first()
0]]).select().first()
else:
record = db(db[table].id == request.args(
2), ignore_common_filters=True).select().first()
2)).select().first()
if not record:
qry = query_by_table_type(table, db)
@@ -314,6 +340,9 @@ def state():
def ccache():
cache.ram.initialize()
cache.disk.initialize()
form = FORM(
P(TAG.BUTTON(
T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
@@ -380,7 +409,7 @@ def ccache():
return (hours, minutes, seconds)
for key, value in cache.ram.storage.items():
for key, value in cache.ram.storage.iteritems():
if isinstance(value, dict):
ram['hits'] = value['hit_total'] - value['misses']
ram['misses'] = value['misses']
@@ -460,3 +489,145 @@ def ccache():
return dict(form=form, total=total,
ram=ram, disk=disk, object_stats=hp != False)
def table_template(table):
from gluon.html import TR, TD, TABLE, TAG
def FONT(*args, **kwargs):
return TAG.font(*args, **kwargs)
def types(field):
f_type = field.type
if not isinstance(f_type,str):
return ' '
elif f_type == 'string':
return field.length
elif f_type == 'id':
return B('pk')
elif f_type.startswith('reference') or \
f_type.startswith('list:reference'):
return B('fk')
else:
return ' '
# This is horribe HTML but the only one graphiz understands
rows = []
cellpadding = 4
color = "#000000"
bgcolor = "#FFFFFF"
face = "Helvetica"
face_bold = "Helvetica Bold"
border = 0
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
_colspan=3, _cellpadding=cellpadding,
_align="center", _bgcolor=color)))
for row in db[table]:
rows.append(TR(TD(FONT(row.name, _color=color, _face=face_bold),
_align="left", _cellpadding=cellpadding,
_border=border),
TD(FONT(row.type, _color=color, _face=face),
_align="left", _cellpadding=cellpadding,
_border=border),
TD(FONT(types(row), _color=color, _face=face),
_align="center", _cellpadding=cellpadding,
_border=border)))
return "< %s >" % TABLE(*rows, **dict(_bgcolor=bgcolor, _border=1,
_cellborder=0, _cellspacing=0)
).xml()
def bg_graph_model():
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
subgraphs = dict()
for tablename in db.tables:
if hasattr(db[tablename],'_meta_graphmodel'):
meta_graphmodel = db[tablename]._meta_graphmodel
else:
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
group = meta_graphmodel['group'].replace(' ', '')
if not subgraphs.has_key(group):
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
subgraphs[group]['tables'].append(tablename)
else:
subgraphs[group]['tables'].append(tablename)
graph.add_node(tablename, name=tablename, shape='plaintext',
label=table_template(tablename))
for n, key in enumerate(subgraphs.iterkeys()):
graph.subgraph(nbunch=subgraphs[key]['tables'],
name='cluster%d' % n,
style='filled',
color=subgraphs[key]['meta']['color'],
label=subgraphs[key]['meta']['group'])
for tablename in db.tables:
for field in db[tablename]:
f_type = field.type
if isinstance(f_type,str) and (
f_type.startswith('reference') or
f_type.startswith('list:reference')):
referenced_table = f_type.split()[1].split('.')[0]
n1 = graph.get_node(tablename)
n2 = graph.get_node(referenced_table)
graph.add_edge(n1, n2, color="#4C4C4C", label='')
graph.layout()
#return graph.draw(format='png', prog='dot')
if not request.args:
return graph.draw(format='png', prog='dot')
else:
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
if request.args(0) == 'dot':
return graph.string()
else:
return graph.draw(format=request.args(0), prog='dot')
def graph_model():
return dict(databases=databases, pgv=pgv)
def manage():
tables = manager_action['tables']
if isinstance(tables[0], str):
db = manager_action.get('db', auth.db)
db = globals()[db] if isinstance(db, str) else db
tables = [db[table] for table in tables]
if request.args(0) == 'auth':
auth.table_user()._plural = T('Users')
auth.table_group()._plural = T('Roles')
auth.table_membership()._plural = T('Memberships')
auth.table_permission()._plural = T('Permissions')
if request.extension != 'load':
return dict(heading=manager_action.get('heading',
T('Manage %(action)s') % dict(action=request.args(0).replace('_', ' ').title())),
tablenames=[table._tablename for table in tables],
labels=[table._plural.title() for table in tables])
table = tables[request.args(1, cast=int)]
formname = '%s_grid' % table._tablename
linked_tables = orderby = None
if request.args(0) == 'auth':
auth.table_group()._id.readable = \
auth.table_membership()._id.readable = \
auth.table_permission()._id.readable = False
auth.table_membership().user_id.label = T('User')
auth.table_membership().group_id.label = T('Role')
auth.table_permission().group_id.label = T('Role')
auth.table_permission().name.label = T('Permission')
if table == auth.table_user():
linked_tables=[auth.settings.table_membership_name]
elif table == auth.table_group():
orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
elif table == auth.table_permission():
orderby = 'group_id'
kwargs = dict(user_signature=True, maxtextlength=1000,
orderby=orderby, linked_tables=linked_tables)
smartgrid_args = manager_action.get('smartgrid_args', {})
kwargs.update(**smartgrid_args.get('DEFAULT', {}))
kwargs.update(**smartgrid_args.get(table._tablename, {}))
grid = SQLFORM.smartgrid(table, args=request.args[:2], formname=formname, **kwargs)
return grid

View File

@@ -212,3 +212,25 @@ def toggle_breakpoint():
except Exception, e:
session.flash = str(e)
return response.json({'ok': ok, 'lineno': lineno})
def list_breakpoints():
"Return a list of linenumbers for current breakpoints"
breakpoints = []
ok = None
try:
filename = os.path.join(request.env['applications_parent'],
'applications', request.vars.filename)
# normalize path name: replace slashes, references, etc...
filename = os.path.normpath(os.path.normcase(filename))
for bp in qdb_debugger.do_list_breakpoint():
no, bp_filename, bp_lineno, temporary, enabled, hits, cond = bp
# normalize path name: replace slashes, references, etc...
bp_filename = os.path.normpath(os.path.normcase(bp_filename))
if filename == bp_filename:
breakpoints.append(bp_lineno)
ok = True
except Exception, e:
session.flash = str(e)
ok = False
return response.json({'ok': ok, 'breakpoints': breakpoints})

View File

@@ -11,21 +11,25 @@ import re
from gluon.admin import *
from gluon.fileutils import abspath, read_file, write_file
from gluon.utils import web2py_uuid
from gluon.tools import Config
from glob import glob
import shutil
import platform
try:
from git import *
import git
if git.__version__ < '0.3.1':
raise ImportError("Your version of git is %s. Upgrade to 0.3.1 or better." % git.__version__)
have_git = True
except ImportError:
except ImportError, e:
have_git = False
GIT_MISSING = 'requires gitpython module, but not installed or incompatible version'
GIT_MISSING = 'Requires gitpython module, but not installed or incompatible version: %s' % e
from gluon.languages import (read_possible_languages, read_dict, write_dict,
read_plural_dict, write_plural_dict)
if DEMO_MODE and request.function in ['change_password', 'pack', 'pack_plugin', 'upgrade_web2py', 'uninstall', 'cleanup', 'compile_app', 'remove_compiled_app', 'delete', 'delete_plugin', 'create_file', 'upload_file', 'update_languages', 'reload_routes', 'git_push', 'git_pull']:
if DEMO_MODE and request.function in ['change_password', 'pack', 'pack_custom','pack_plugin', 'upgrade_web2py', 'uninstall', 'cleanup', 'compile_app', 'remove_compiled_app', 'delete', 'delete_plugin', 'create_file', 'upload_file', 'update_languages', 'reload_routes', 'git_push', 'git_pull']:
session.flash = T('disabled in demo mode')
redirect(URL('site'))
@@ -84,10 +88,11 @@ def safe_write(a, value, b='w'):
def get_app(name=None):
app = name or request.args(0)
if app and (not MULTI_USER_MODE or is_manager() or
db(db.app.name == app)(db.app.owner == auth.user.id).count()):
if (app and os.path.exists(apath(app, r=request)) and
(not MULTI_USER_MODE or is_manager() or
db(db.app.name == app)(db.app.owner == auth.user.id).count())):
return app
session.flash = T('App does not exist or your are not authorized')
session.flash = T('App does not exist or you are not authorized')
redirect(URL('site'))
@@ -103,7 +108,7 @@ def index():
if session.authorized:
redirect(send)
elif request.vars.password:
if verify_password(request.vars.password):
if verify_password(request.vars.password[:1024]):
session.authorized = True
login_record(True)
@@ -136,19 +141,17 @@ def check_version():
session.forget()
session._unlock(response)
new_version, version_number = check_new_version(request.env.web2py_version,
WEB2PY_VERSION_URL)
new_version, version = check_new_version(request.env.web2py_version,
WEB2PY_VERSION_URL)
if new_version == -1:
return A(T('Unable to check for upgrades'), _href=WEB2PY_URL)
elif new_version != True:
return A(T('web2py is up to date'), _href=WEB2PY_URL)
elif platform.system().lower() in ('windows', 'win32', 'win64') and os.path.exists("web2py.exe"):
return SPAN('You should upgrade to version %s.%s.%s' % version_number[:3])
return SPAN('You should upgrade to %s' % version.split('(')[0])
else:
return sp_button(URL('upgrade_web2py'), T('upgrade now')) \
+ XML(' <strong class="upgrade_version">%s.%s.%s</strong>'
% version_number[:3])
return sp_button(URL('upgrade_web2py'), T('upgrade now to %s') % version.split('(')[0])
def logout():
@@ -168,7 +171,8 @@ def change_password():
form = SQLFORM.factory(Field('current_admin_password', 'password'),
Field('new_admin_password',
'password', requires=IS_STRONG()),
Field('new_admin_password_again', 'password'))
Field('new_admin_password_again', 'password'),
_class="span4 well")
if form.accepts(request.vars):
if not verify_password(request.vars.current_admin_password):
form.errors.current_admin_password = T('invalid password')
@@ -193,7 +197,7 @@ def site():
class IS_VALID_APPNAME(object):
def __call__(self, value):
if not re.compile('\w+').match(value):
if not re.compile('^\w+$').match(value):
return (value, T('Invalid application name'))
if not request.vars.overwrite and \
os.path.exists(os.path.join(apath(r=request), value)):
@@ -237,10 +241,10 @@ def site():
redirect(URL(r=request))
target = os.path.join(apath(r=request), form_update.vars.name)
try:
new_repo = Repo.clone_from(form_update.vars.url, target)
new_repo = git.Repo.clone_from(form_update.vars.url, target)
session.flash = T('new application "%s" imported',
form_update.vars.name)
except GitCommandError, err:
except git.GitCommandError, err:
session.flash = T('Invalid git repository specified.')
redirect(URL(r=request))
@@ -295,8 +299,8 @@ def site():
apps = [f for f in apps if f in FILTER_APPS]
apps = sorted(apps, lambda a, b: cmp(a.upper(), b.upper()))
return dict(app=None, apps=apps, myversion=myversion,
myplatform = platform.python_version()
return dict(app=None, apps=apps, myversion=myversion, myplatform=myplatform,
form_create=form_create, form_update=form_update)
@@ -340,7 +344,6 @@ def pack():
session.flash = T('internal error: %s' % e)
redirect(URL('site'))
def pack_plugin():
app = get_app()
if len(request.args) == 2:
@@ -355,6 +358,33 @@ def pack_plugin():
session.flash = T('internal error')
redirect(URL('plugin', args=request.args))
def pack_custom():
app = get_app()
base = apath(app, r=request)
if request.post_vars.file:
files = request.post_vars.file
files = [files] if not isinstance(files,list) else files
fname = 'web2py.app.%s.w2p' % app
try:
filename = app_pack(app, request, raise_ex=True, filenames=files)
except Exception, e:
filename = None
if filename:
response.headers['Content-Type'] = 'application/w2p'
disposition = 'attachment; filename=%s' % fname
response.headers['Content-Disposition'] = disposition
return safe_read(filename, 'rb')
else:
session.flash = T('internal error: %s' % e)
redirect(URL(args=request.args))
def ignore(fs):
return [f for f in fs if not (
f[:1] in '#' or f.endswith('~') or f.endswith('.bak'))]
files = {}
for (r,d,f) in os.walk(base):
files[r] = {'folders':ignore(d),'files':ignore(f)}
return locals()
def upgrade_web2py():
dialog = FORM.confirm(T('Upgrade'),
@@ -374,6 +404,10 @@ def uninstall():
dialog = FORM.confirm(T('Uninstall'),
{T('Cancel'): URL('site')})
dialog['_id'] = 'confirm_form'
dialog['_class'] = 'well'
for component in dialog.components:
component['_class'] = 'btn'
if dialog.accepted:
if MULTI_USER_MODE:
@@ -427,32 +461,6 @@ def remove_compiled_app():
redirect(URL('site'))
def delete():
""" Object delete handler """
app = get_app()
filename = '/'.join(request.args)
sender = request.vars.sender
if isinstance(sender, list): # ## fix a problem with Vista
sender = sender[0]
if 'nodelete' in request.vars:
redirect(URL(sender, anchor=request.vars.id))
elif 'delete' in request.vars:
try:
full_path = apath(filename, r=request)
lineno = count_lines(open(full_path, 'r').read())
os.unlink(full_path)
log_progress(app, 'DELETE', filename, progress=-lineno)
session.flash = T('file "%(filename)s" deleted',
dict(filename=filename))
except Exception:
session.flash = T('unable to delete file "%(filename)s"',
dict(filename=filename))
redirect(URL(sender, anchor=request.vars.id2))
return dict(filename=filename, sender=sender)
def delete():
""" Object delete handler """
app = get_app()
@@ -489,10 +497,9 @@ def enable():
os.unlink(filename)
return SPAN(T('Disable'), _style='color:green')
else:
safe_open(filename, 'wb').write(time.ctime())
safe_open(filename, 'wb').write('disabled: True\ntime-disabled: %s' % request.now)
return SPAN(T('Enable'), _style='color:red')
def peek():
""" Visualize object code """
app = get_app(request.vars.app)
@@ -552,15 +559,53 @@ def search():
def edit():
""" File edit handler """
# Load json only if it is ajax edited...
app = get_app(request.vars.app)
app_path = apath(app, r=request)
editor_defaults={'theme':'web2py', 'editor': 'default'}
config = Config(os.path.join(request.folder, 'settings.cfg'),
section='editor', default_values=editor_defaults)
preferences = config.read()
if not(request.ajax):
# return the scaffolding, the rest will be through ajax requests
response.title = T('Editing %s') % app
editarea_preferences = {}
editarea_preferences['FONT_SIZE'] = '10'
editarea_preferences['FULL_SCREEN'] = 'false'
editarea_preferences['ALLOW_TOGGLE'] = 'true'
editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4'
editarea_preferences['DISPLAY'] = 'onload'
for key in editarea_preferences:
if key in globals():
editarea_preferences[key] = globals()[key]
return response.render ('default/edit.html', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences))
# show settings tab and save prefernces
if 'settings' in request.vars:
if request.post_vars: #save new preferences
if config.save(request.post_vars.items()):
response.headers["web2py-component-flash"] = T('Preferences saved correctly')
else:
response.headers["web2py-component-flash"] = T('Preferences saved on session only')
response.headers["web2py-component-command"] = "update_theme('%s');update_editor('%s');jQuery('a[href=#editor_settings] button.close').click();" % (config.read()['theme'], config.read()['editor'])
return
else:
details = {'filename':'settings', 'id':'editor_settings', 'force': False}
details['plain_html'] = response.render('default/editor_settings.html', {'editor_settings':preferences})
return response.json(details)
""" File edit handler """
# Load json only if it is ajax edited...
app = get_app(request.vars.app)
filename = '/'.join(request.args)
response.title = request.args[-1]
if request.vars.app:
path = abspath(filename)
else:
path = apath(filename, r=request)
# Try to discover the file type
# Try to discover the file type
if filename[-3:] == '.py':
filetype = 'python'
elif filename[-5:] == '.html':
@@ -636,6 +681,7 @@ def edit():
code = request.vars.data.rstrip().replace('\r\n', '\n') + '\n'
compile(code, path, "exec", _ast.PyCF_ONLY_AST)
except Exception, e:
# offset calculation is only used for textarea (start/stop)
start = sum([len(line) + 1 for l, line
in enumerate(request.vars.data.split("\n"))
if l < e.lineno - 1])
@@ -645,7 +691,7 @@ def edit():
else:
offset = 0
highlight = {'start': start, 'end': start +
offset + 1, 'lineno': e.lineno}
offset + 1, 'lineno': e.lineno, 'offset': offset}
try:
ex_name = e.__class__.__name__
except:
@@ -655,7 +701,6 @@ def edit():
offset and ' ' +
T('at char %s', offset) or '',
PRE(str(e)))
if data_or_revert and request.args[1] == 'modules':
# Lets try to reload the modules
try:
@@ -675,7 +720,7 @@ def edit():
cfilename = os.path.join(request.args[0], 'controllers',
request.args[2] + '.py')
if os.path.exists(apath(cfilename, r=request)):
edit_controller = URL('edit', args=[cfilename])
edit_controller = URL('edit', args=[cfilename.replace(os.sep, "/")])
view = request.args[3].replace('.html', '')
view_link = URL(request.args[0], request.args[2], view)
elif filetype == 'python' and request.args[1] == 'controllers':
@@ -697,6 +742,7 @@ def edit():
vf = os.path.split(v)[-1]
vargs = "/".join([viewpath.replace(os.sep, "/"), vf])
editviewlinks.append(A(vf.split(".")[0],
_class="editor_filelink",
_href=URL('edit', args=[vargs])))
if len(request.args) > 2 and request.args[1] == 'controllers':
@@ -708,17 +754,7 @@ def edit():
if 'from_ajax' in request.vars:
return response.json({'file_hash': file_hash, 'saved_on': saved_on, 'functions': functions, 'controller': controller, 'application': request.args[0], 'highlight': highlight})
else:
editarea_preferences = {}
editarea_preferences['FONT_SIZE'] = '10'
editarea_preferences['FULL_SCREEN'] = 'false'
editarea_preferences['ALLOW_TOGGLE'] = 'true'
editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4'
editarea_preferences['DISPLAY'] = 'onload'
for key in editarea_preferences:
if key in globals():
editarea_preferences[key] = globals()[key]
return dict(app=request.args[0],
file_details = dict(app=request.args[0],
filename=filename,
filetype=filetype,
data=data,
@@ -728,8 +764,12 @@ def edit():
controller=controller,
functions=functions,
view_link=view_link,
editarea_preferences=editarea_preferences,
editviewlinks=editviewlinks)
editviewlinks=editviewlinks,
id=IS_SLUG()(filename)[0],
force= True if (request.vars.restore or request.vars.revert) else False)
plain_html = response.render('default/edit_js.html', file_details)
file_details['plain_html'] = plain_html
return response.json(file_details)
def resolve():
@@ -791,7 +831,8 @@ def resolve():
diff = TABLE(*[TR(TD(gen_data(i, item)),
TD(item[0]),
TD(leading(item[2:]),
TT(item[2:].rstrip())), _class=getclass(item))
TT(item[2:].rstrip())),
_class=getclass(item))
for (i, item) in enumerate(d) if item[0] != '?'])
return dict(diff=diff, filename=filename)
@@ -801,6 +842,7 @@ def edit_language():
""" Edit language file """
app = get_app()
filename = '/'.join(request.args)
response.title = request.args[-1]
strings = read_dict(apath(filename, r=request))
if '__corrupted__' in strings:
@@ -834,10 +876,14 @@ def edit_language():
# Making the short circuit compatible with <= python2.4
k = (s != k) and k or B(k)
rows.append(P(prefix, k, BR(), elem, TAG.BUTTON(T('delete'),
_onclick='return delkey("%s")' % name), _id=name))
new_row = DIV(LABEL(prefix, k, _style="font-weight:normal;"),
CAT(elem, '\n', TAG.BUTTON(
T('delete'),
_onclick='return delkey("%s")' % name,
_class='btn')), _id=name, _class='span6 well well-small')
rows.append(INPUT(_type='submit', _value=T('update')))
rows.append(DIV(new_row,_class="row-fluid"))
rows.append(DIV(INPUT(_type='submit', _value=T('update'), _class="btn btn-primary"), _class='controls'))
form = FORM(*rows)
if form.accepts(request.vars, keepvalues=True):
strs = dict()
@@ -868,29 +914,27 @@ def edit_plurals():
keys = sorted(plurals.keys(), lambda x, y: cmp(
unicode(x, 'utf-8').lower(), unicode(y, 'utf-8').lower()))
rows = []
row = [T("Singular Form")]
row.extend([T("Plural Form #%s", n + 1) for n in xnplurals])
table = TABLE(THEAD(TR(row)))
tab_rows = []
for key in keys:
name = md5_hash(key)
forms = plurals[key]
if len(forms) < nplurals:
forms.extend(None for i in xrange(nplurals - len(forms)))
tab_col1 = DIV(CAT(LABEL(T("Singular Form")), B(key,
_class='fake-input')))
tab_inputs = [SPAN(LABEL(T("Plural Form #%s", n + 1)), INPUT(_type='text', _name=name + '_' + str(n), value=forms[n], _size=20), _class='span6') for n in xnplurals]
tab_col2 = DIV(CAT(*tab_inputs))
tab_col3 = DIV(CAT(LABEL(XML('&nbsp;')), TAG.BUTTON(T('delete'), _onclick='return delkey("%s")' % name, _class='btn'), _class='span6'))
tab_row = DIV(DIV(tab_col1, '\n', tab_col2, '\n', tab_col3, _class='well well-small'), _id=name, _class='row-fluid tab_row')
tab_rows.append(tab_row)
row = [B(key)]
row.extend([INPUT(_type='text', _name=name + '_' + str(n),
value=forms[n], _size=20) for n in xnplurals])
row.append(TD(
TAG.BUTTON(T('delete'), _onclick='return delkey("%s")' % name)))
rows.append(TR(row, _id=name))
if rows:
table.append(TBODY(rows))
rows = [table, INPUT(_type='submit', _value=T('update'))]
form = FORM(*rows)
tab_rows.append(DIV(TAG['button'](T('update'), _type='submit',
_class='btn btn-primary'),
_class='controls'))
tab_container = DIV(*tab_rows, **dict(_class="row-fluid"))
form = FORM(tab_container)
if form.accepts(request.vars, keepvalues=True):
new_plurals = dict()
for key in keys:
@@ -993,8 +1037,9 @@ def design():
privates.sort()
# Get all static files
MAXNFILES = 1000
statics = listdir(apath('%s/static/' % app, r=request), '[^\.#].*')
statics = [x.replace('\\', '/') for x in statics]
statics = [x.replace('\\', '/') for x in statics[:MAXNFILES]]
statics.sort()
# Get all languages
@@ -1415,7 +1460,7 @@ def errors():
hash2error[hash]['count'] += 1
except KeyError:
error_lines = error['traceback'].split("\n")
last_line = error_lines[-2]
last_line = error_lines[-2] if len(error_lines)>1 else 'unknown'
error_causer = os.path.split(error['layer'])[1]
hash2error[hash] = dict(count=1, pickel=error,
causer=error_causer,
@@ -1483,7 +1528,9 @@ def errors():
else:
for item in request.vars:
if item[:7] == 'delete_':
# delete_all} rows doesn't contain any ticket
# Remove anything else as requested
if item[:7] == 'delete_' and (not item == "delete_all}"):
os.unlink(apath('%s/errors/%s' % (app, item[7:]), r=request))
func = lambda p: os.stat(apath('%s/errors/%s' %
(app, p), r=request)).st_mtime
@@ -1638,26 +1685,6 @@ def update_languages():
redirect(URL('design', args=app, anchor='languages'))
def twitter():
session.forget()
session._unlock(response)
import gluon.tools
import gluon.contrib.simplejson as sj
try:
if TWITTER_HASH:
page = urllib.urlopen("http://search.twitter.com/search.json?q=%%40%s" % TWITTER_HASH).read()
data = sj.loads(page, encoding="utf-8")['results']
d = dict()
for e in data:
d[e["id"]] = e
r = reversed(sorted(d))
return dict(tweets=[d[k] for k in r])
else:
return 'disabled'
except Exception, e:
return DIV(T('Unable to download because:'), BR(), str(e))
def user():
if MULTI_USER_MODE:
if not db(db.auth_user).count():
@@ -1714,29 +1741,26 @@ def git_pull():
{T('Cancel'): URL('site')})
if dialog.accepted:
try:
repo = Repo(os.path.join(apath(r=request), app))
repo = git.Repo(os.path.join(apath(r=request), app))
origin = repo.remotes.origin
origin.fetch()
origin.pull()
session.flash = T("Application updated via git pull")
redirect(URL('site'))
except CheckoutError, message:
except git.CheckoutError:
session.flash = T("Pull failed, certain files could not be checked out. Check logs for details.")
redirect(URL('site'))
except UnmergedEntriesError:
except git.UnmergedEntriesError:
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
redirect(URL('site'))
except git.GitCommandError:
session.flash = T(
"Pull failed, git exited abnormally. See logs for details.")
redirect(URL('site'))
except AssertionError:
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
redirect(URL('site'))
except GitCommandError, status:
session.flash = T(
"Pull failed, git exited abnormally. See logs for details.")
redirect(URL('site'))
except Exception, e:
session.flash = T(
"Pull failed, git exited abnormally. See logs for details.")
redirect(URL('site'))
elif 'cancel' in request.vars:
redirect(URL('site'))
return dict(app=app, dialog=dialog)
@@ -1754,7 +1778,7 @@ def git_push():
form.process()
if form.accepted:
try:
repo = Repo(os.path.join(apath(r=request), app))
repo = git.Repo(os.path.join(apath(r=request), app))
index = repo.index
index.add([apath(r=request) + app + '/*'])
new_commit = index.commit(form.vars.changelog)
@@ -1763,11 +1787,7 @@ def git_push():
session.flash = T(
"Git repo updated with latest application changes.")
redirect(URL('site'))
except UnmergedEntriesError:
except git.UnmergedEntriesError:
session.flash = T("Push failed, there are unmerged entries in the cache. Resolve merge issues manually and try again.")
redirect(URL('site'))
except Exception, e:
session.flash = T(
"Push failed, git exited abnormally. See logs for details.")
redirect(URL('site'))
return dict(app=app, form=form)

View File

@@ -16,6 +16,11 @@ if MULTI_USER_MODE and not is_manager():
session.flash = 'Not Authorized'
redirect(URL('default', 'site'))
from gluon.settings import settings
if not settings.is_source:
session.flash = 'Requires running web2py from source'
redirect(URL(request.application, 'default', 'site'))
forever = 10 ** 8

View File

@@ -43,14 +43,14 @@ def commit():
app = request.args(0)
path = apath(app, r=request)
repo = hg_repo(path)
form = FORM('Comment:', INPUT(_name='comment', requires=IS_NOT_EMPTY()),
form = FORM(T('Comment:'), INPUT(_name='comment', requires=IS_NOT_EMPTY()),
INPUT(_type='submit', _value=T('Commit')))
if form.accepts(request.vars, session):
oldid = repo[repo.lookup('.')]
addremove(repo)
repo.commit(text=form.vars.comment)
if repo[repo.lookup('.')] == oldid:
response.flash = 'no changes'
response.flash = T('no changes')
try:
files = TABLE(*[TR(file) for file in repo[repo.lookup('.')].files()])
changes = TABLE(TR(TH('revision'), TH('description')))
@@ -75,7 +75,7 @@ def revision():
form = FORM(INPUT(_type='submit', _value=T('Revert')))
if form.accepts(request.vars):
hg.update(repo, revision)
session.flash = "reverted to revision %s" % ctx.rev()
session.flash = T("reverted to revision %s") % ctx.rev()
redirect(URL('default', 'design', args=app))
return dict(
files=ctx.files(),

View File

@@ -10,6 +10,10 @@ except ImportError:
session.flash = T('requires python-git, but not installed')
redirect(URL('default', 'site'))
from gluon.settings import settings
if not settings.is_source:
session.flash = 'Requires running web2py from source'
redirect(URL(request.application, 'default', 'site'))
def deploy():
apps = sorted(file for file in os.listdir(apath(r=request)))

View File

@@ -55,7 +55,7 @@ def index():
reset(session)
apps = os.listdir(os.path.join(request.folder, '..'))
form = SQLFORM.factory(Field('name', requires=[IS_NOT_EMPTY(),
IS_ALPHANUMERIC()]))
IS_ALPHANUMERIC()]), _class='span5 well well-small')
if form.accepts(request.vars):
app = form.vars.name
session.app['name'] = app
@@ -83,20 +83,20 @@ def step1():
from gluon.contrib.simplejson import loads
import urllib
if not session.themes:
url = LAYOUTS_APP + '/default/layouts.json'
try:
data = urllib.urlopen(url).read()
session.themes = ['Default'] + loads(data)['layouts']
except:
session.themes = ['Default']
#url = LAYOUTS_APP + '/default/layouts.json'
#try:
# data = urllib.urlopen(url).read()
# session.themes = ['Default'] + loads(data)['layouts']
#except:
session.themes = ['Default']
themes = session.themes
if not session.plugins:
url = PLUGINS_APP + '/default/plugins.json'
try:
data = urllib.urlopen(url).read()
session.plugins = loads(data)['plugins']
except:
session.plugins = []
#url = PLUGINS_APP + '/default/plugins.json'
#try:
# data = urllib.urlopen(url).read()
# session.plugins = loads(data)['plugins']
#except:
session.plugins = []
plugins = [x.split('.')[2] for x in session.plugins]
response.view = 'wizard/step.html'
params = dict(session.app['params'])
@@ -125,19 +125,20 @@ def step1():
default=params.get('login_method', 'local')),
Field(
'login_config', default=params.get('login_config', None)),
Field('plugins', 'list:string', requires=IS_IN_SET(plugins, multiple=True)))
Field('plugins', 'list:string', requires=IS_IN_SET(plugins, multiple=True)),
_class='span7 well well-small')
if form.accepts(request.vars):
session.app['params'] = [(key, form.vars.get(key, None))
for key, value in session.app['params']]
redirect(URL('step2'))
redirect(URL('step2') + '/#xwizard_form')
return dict(step='1: Setting Parameters', form=form)
def step2():
response.view = 'wizard/step.html'
form = SQLFORM.factory(Field('table_names', 'list:string',
default=session.app['tables']))
default=session.app['tables']), _class="span7 well well-small")
if form.accepts(request.vars):
table_names = [clean(t) for t in listify(form.vars.table_names)
if t.strip()]
@@ -157,21 +158,21 @@ def step2():
session.app['page_' + name] = \
'## Manage %s\n\n{{=form}}' % (table)
if session.app['tables']:
redirect(URL('step3', args=0))
redirect(URL('step3', args=0) + '/#xwizard_form')
else:
redirect(URL('step4'))
redirect(URL('step4') + '/#xwizard_form')
return dict(step='2: Tables', form=form)
def step3():
response.view = 'wizard/step.html'
n = int(request.args(0) or 0)
n = int(request.args(-1) or 0)
m = len(session.app['tables'])
if n >= m:
redirect(URL('step2'))
table = session.app['tables'][n]
form = SQLFORM.factory(Field('field_names', 'list:string',
default=session.app.get('table_' + table, [])))
default=session.app.get('table_' + table, [])), _class="span7 well well-small")
if form.accepts(request.vars) and form.vars.field_names:
fields = listify(form.vars.field_names)
if table == 'auth_user':
@@ -187,9 +188,9 @@ def step3():
response.flash = T('invalid circular reference')
else:
if n < m - 1:
redirect(URL('step3', args=n + 1))
redirect(URL('step3', args=n + 1) + '/#xwizard_form')
else:
redirect(URL('step4'))
redirect(URL('step4') + '/#xwizard_form')
return dict(step='3: Fields for table "%s" (%s of %s)'
% (table, n + 1, m), table=table, form=form)
@@ -197,21 +198,21 @@ def step3():
def step4():
response.view = 'wizard/step.html'
form = SQLFORM.factory(Field('pages', 'list:string',
default=session.app['pages']))
default=session.app['pages']), _class="span7 well well-small")
if form.accepts(request.vars):
session.app['pages'] = [clean(t)
for t in listify(form.vars.pages)
if t.strip()]
if session.app['pages']:
redirect(URL('step5', args=0))
redirect(URL('step5', args=0) + '/#xwizard_form')
else:
redirect(URL('step6'))
redirect(URL('step6') + '/#xwizard_form')
return dict(step='4: Pages', form=form)
def step5():
response.view = 'wizard/step.html'
n = int(request.args(0) or 0)
n = int(request.args(-1) or 0)
m = len(session.app['pages'])
if n >= m:
redirect(URL('step4'))
@@ -221,13 +222,13 @@ def step5():
default=session.app.get('page_' + page, []),
comment=A('use markmin',
_href=markmin_url, _target='_blank')),
formstyle='table2cols')
formstyle='table2cols', _class="span7 well well-small")
if form.accepts(request.vars):
session.app['page_' + page] = form.vars.content
if n < m - 1:
redirect(URL('step5', args=n + 1))
redirect(URL('step5', args=n + 1) + '/#xwizard_form')
else:
redirect(URL('step6'))
redirect(URL('step6') + '/#xwizard_form')
return dict(step='5: View for page "%s" (%s of %s)' % (page, n + 1, m), form=form)
@@ -242,7 +243,8 @@ def step6():
Field('generate_menu', 'boolean', default=True),
Field('apply_layout', 'boolean', default=True),
Field('erase_database', 'boolean', default=True),
Field('populate_database', 'boolean', default=True))
Field('populate_database', 'boolean', default=True),
_id="generate_form", _class="form-horizontal span7 well well-small")
if form.accepts(request.vars):
if DEMO_MODE:
session.flash = T('Application cannot be generated in demo mode')

View File

@@ -0,0 +1,480 @@
# coding: utf8
{
'!langcode!': 'cs-cz',
'!langname!': 'čeština',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': 'Kolonka "Upravit" je nepovinný výraz, například "pole1=\'nováhodnota\'". Výsledky databázového JOINu nemůžete mazat ani upravovat.',
'"User Exception" debug mode. An error ticket could be issued!': '"User Exception" debug mode. An error ticket could be issued!',
'%%{Row} in Table': '%%{řádek} v tabulce',
'%%{Row} selected': 'označených %%{řádek}',
'%s %%{row} deleted': '%s smazaných %%{záznam}',
'%s %%{row} updated': '%s upravených %%{záznam}',
'%s selected': '%s označených',
'%Y-%m-%d': '%d.%m.%Y',
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
'(requires internet access)': '(vyžaduje připojení k internetu)',
'(requires internet access, experimental)': '(requires internet access, experimental)',
'(something like "it-it")': '(například "cs-cs")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(soubor **gluon/contrib/plural_rules/%s.py** nenalezen)',
'@markmin\x01Searching: **%s** %%{file}': 'Hledání: **%s** %%{soubor}',
'About': 'O programu',
'About application': 'O aplikaci',
'Access Control': 'Řízení přístupu',
'Add breakpoint': 'Přidat bod přerušení',
'Additional code for your application': 'Další kód pro Vaši aplikaci',
'Admin design page': 'Admin design page',
'Admin language': 'jazyk rozhraní',
'Administrative interface': 'pro administrátorské rozhraní klikněte sem',
'Administrative Interface': 'Administrátorské rozhraní',
'administrative interface': 'rozhraní pro správu',
'Administrator Password:': 'Administrátorské heslo:',
'Ajax Recipes': 'Recepty s ajaxem',
'An error occured, please %s the page': 'An error occured, please %s the page',
'and rename it:': 'a přejmenovat na:',
'appadmin': 'appadmin',
'appadmin is disabled because insecure channel': 'appadmin je zakázaná bez zabezpečeného spojení',
'Application': 'Application',
'application "%s" uninstalled': 'application "%s" odinstalována',
'application compiled': 'aplikace zkompilována',
'Application name:': 'Název aplikace:',
'are not used': 'nepoužita',
'are not used yet': 'ještě nepoužita',
'Are you sure you want to delete this object?': 'Opravdu chcete odstranit tento objekt?',
'Are you sure you want to uninstall application "%s"?': 'Opravdu chcete odinstalovat aplikaci "%s"?',
'arguments': 'arguments',
'at char %s': 'at char %s',
'at line %s': 'at line %s',
'ATTENTION:': 'ATTENTION:',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
'Available Databases and Tables': 'Dostupné databáze a tabulky',
'back': 'zpět',
'Back to wizard': 'Back to wizard',
'Basics': 'Basics',
'Begin': 'Začít',
'breakpoint': 'bod přerušení',
'Breakpoints': 'Body přerušení',
'breakpoints': 'body přerušení',
'Buy this book': 'Koupit web2py knihu',
'Cache': 'Cache',
'cache': 'cache',
'Cache Keys': 'Klíče cache',
'cache, errors and sessions cleaned': 'cache, chyby a relace byly pročištěny',
'can be a git repo': 'může to být git repo',
'Cancel': 'Storno',
'Cannot be empty': 'Nemůže být prázdné',
'Change Admin Password': 'Změnit heslo pro správu',
'Change admin password': 'Změnit heslo pro správu aplikací',
'Change password': 'Změna hesla',
'check all': 'vše označit',
'Check for upgrades': 'Zkusit aktualizovat',
'Check to delete': 'Označit ke smazání',
'Check to delete:': 'Označit ke smazání:',
'Checking for upgrades...': 'Zjišťuji, zda jsou k dispozici aktualizace...',
'Clean': 'Pročistit',
'Clear CACHE?': 'Vymazat CACHE?',
'Clear DISK': 'Vymazat DISK',
'Clear RAM': 'Vymazat RAM',
'Click row to expand traceback': 'Pro rozbalení stopy, klikněte na řádek',
'Click row to view a ticket': 'Pro zobrazení chyby (ticketu), klikněte na řádku...',
'Client IP': 'IP adresa klienta',
'code': 'code',
'Code listing': 'Code listing',
'collapse/expand all': 'vše sbalit/rozbalit',
'Community': 'Komunita',
'Compile': 'Zkompilovat',
'compiled application removed': 'zkompilovaná aplikace smazána',
'Components and Plugins': 'Komponenty a zásuvné moduly',
'Condition': 'Podmínka',
'continue': 'continue',
'Controller': 'Kontrolér (Controller)',
'Controllers': 'Kontroléry',
'controllers': 'kontroléry',
'Copyright': 'Copyright',
'Count': 'Počet',
'Create': 'Vytvořit',
'create file with filename:': 'vytvořit soubor s názvem:',
'created by': 'vytvořil',
'Created By': 'Vytvořeno - kým',
'Created On': 'Vytvořeno - kdy',
'crontab': 'crontab',
'Current request': 'Aktuální požadavek',
'Current response': 'Aktuální odpověď',
'Current session': 'Aktuální relace',
'currently running': 'právě běží',
'currently saved or': 'uloženo nebo',
'customize me!': 'upravte mě!',
'data uploaded': 'data nahrána',
'Database': 'Rozhraní databáze',
'Database %s select': 'databáze %s výběr',
'Database administration': 'Database administration',
'database administration': 'správa databáze',
'Date and Time': 'Datum a čas',
'day': 'den',
'db': 'db',
'DB Model': 'Databázový model',
'Debug': 'Ladění',
'defines tables': 'defines tables',
'Delete': 'Smazat',
'delete': 'smazat',
'delete all checked': 'smazat vše označené',
'delete plugin': 'delete plugin',
'Delete this file (you will be asked to confirm deletion)': 'Smazat tento soubor (budete požádán o potvrzení mazání)',
'Delete:': 'Smazat:',
'deleted after first hit': 'smazat po prvním dosažení',
'Demo': 'Demo',
'Deploy': 'Nahrát',
'Deploy on Google App Engine': 'Nahrát na Google App Engine',
'Deploy to OpenShift': 'Nahrát na OpenShift',
'Deployment Recipes': 'Postupy pro deployment',
'Description': 'Popis',
'design': 'návrh',
'Detailed traceback description': 'Podrobný výpis prostředí',
'details': 'podrobnosti',
'direction: ltr': 'směr: ltr',
'Disable': 'Zablokovat',
'DISK': 'DISK',
'Disk Cache Keys': 'Klíče diskové cache',
'Disk Cleared': 'Disk smazán',
'docs': 'dokumentace',
'Documentation': 'Dokumentace',
"Don't know what to do?": 'Nevíte kudy kam?',
'done!': 'hotovo!',
'Download': 'Stáhnout',
'download layouts': 'stáhnout moduly rozvržení stránky',
'download plugins': 'stáhnout zásuvné moduly',
'E-mail': 'E-mail',
'Edit': 'Upravit',
'edit all': 'edit all',
'Edit application': 'Správa aplikace',
'edit controller': 'edit controller',
'Edit current record': 'Upravit aktuální záznam',
'Edit Profile': 'Upravit profil',
'edit views:': 'upravit pohled:',
'Editing file "%s"': 'Úprava souboru "%s"',
'Editing Language file': 'Úprava jazykového souboru',
'Editing Plural Forms File': 'Editing Plural Forms File',
'Email and SMS': 'Email a SMS',
'Enable': 'Odblokovat',
'enter a number between %(min)g and %(max)g': 'zadejte číslo mezi %(min)g a %(max)g',
'enter an integer between %(min)g and %(max)g': 'zadejte celé číslo mezi %(min)g a %(max)g',
'Error': 'Chyba',
'Error logs for "%(app)s"': 'Seznam výskytu chyb pro aplikaci "%(app)s"',
'Error snapshot': 'Snapshot chyby',
'Error ticket': 'Ticket chyby',
'Errors': 'Chyby',
'Exception %(extype)s: %(exvalue)s': 'Exception %(extype)s: %(exvalue)s',
'Exception %s': 'Exception %s',
'Exception instance attributes': 'Prvky instance výjimky',
'Expand Abbreviation': 'Expand Abbreviation',
'export as csv file': 'exportovat do .csv souboru',
'exposes': 'vystavuje',
'exposes:': 'vystavuje funkce:',
'extends': 'rozšiřuje',
'failed to compile file because:': 'soubor se nepodařilo zkompilovat, protože:',
'FAQ': 'Často kladené dotazy',
'File': 'Soubor',
'file': 'soubor',
'file "%(filename)s" created': 'file "%(filename)s" created',
'file saved on %(time)s': 'soubor uložen %(time)s',
'file saved on %s': 'soubor uložen %s',
'Filename': 'Název souboru',
'filter': 'filtr',
'Find Next': 'Najít další',
'Find Previous': 'Najít předchozí',
'First name': 'Křestní jméno',
'Forgot username?': 'Zapomněl jste svoje přihlašovací jméno?',
'forgot username?': 'zapomněl jste svoje přihlašovací jméno?',
'Forms and Validators': 'Formuláře a validátory',
'Frames': 'Frames',
'Free Applications': 'Aplikace zdarma',
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
'Generate': 'Vytvořit',
'Get from URL:': 'Stáhnout z internetu:',
'Git Pull': 'Git Pull',
'Git Push': 'Git Push',
'Globals##debug': 'Globální proměnné',
'go!': 'OK!',
'Goto': 'Goto',
'graph model': 'graph model',
'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
'Group ID': 'ID skupiny',
'Groups': 'Skupiny',
'Hello World': 'Ahoj světe',
'Help': 'Nápověda',
'Hide/Show Translated strings': 'Skrýt/Zobrazit přeložené texty',
'Hits': 'Kolikrát dosaženo',
'Home': 'Domovská stránka',
'honored only if the expression evaluates to true': 'brát v potaz jen když se tato podmínka vyhodnotí kladně',
'How did you get here?': 'Jak jste se sem vlastně dostal?',
'If start the upgrade, be patient, it may take a while to download': 'If start the upgrade, be patient, it may take a while to download',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
'import': 'import',
'Import/Export': 'Import/Export',
'includes': 'zahrnuje',
'Index': 'Index',
'insert new': 'vložit nový záznam ',
'insert new %s': 'vložit nový záznam %s',
'inspect attributes': 'inspect attributes',
'Install': 'Instalovat',
'Installed applications': 'Nainstalované aplikace',
'Interaction at %s line %s': 'Interakce v %s, na řádce %s',
'Interactive console': 'Interaktivní příkazová řádka',
'Internal State': 'Vnitřní stav',
'Introduction': 'Úvod',
'Invalid email': 'Neplatný email',
'Invalid password': 'Nesprávné heslo',
'invalid password.': 'neplatné heslo',
'Invalid Query': 'Neplatný dotaz',
'invalid request': 'Neplatný požadavek',
'Is Active': 'Je aktivní',
'It is %s %%{day} today.': 'Dnes je to %s %%{den}.',
'Key': 'Klíč',
'Key bindings': 'Vazby klíčů',
'Key bindings for ZenCoding Plugin': 'Key bindings for ZenCoding Plugin',
'languages': 'jazyky',
'Languages': 'Jazyky',
'Last name': 'Příjmení',
'Last saved on:': 'Naposledy uloženo:',
'Layout': 'Rozvržení stránky (layout)',
'Layout Plugins': 'Moduly rozvržení stránky (Layout Plugins)',
'Layouts': 'Rozvržení stránek',
'License for': 'Licence pro',
'Line number': 'Číslo řádku',
'LineNo': 'Č.řádku',
'Live Chat': 'Online pokec',
'loading...': 'nahrávám...',
'locals': 'locals',
'Locals##debug': 'Lokální proměnné',
'Logged in': 'Přihlášení proběhlo úspěšně',
'Logged out': 'Odhlášení proběhlo úspěšně',
'Login': 'Přihlásit se',
'login': 'přihlásit se',
'Login to the Administrative Interface': 'Přihlásit se do Správce aplikací',
'logout': 'odhlásit se',
'Logout': 'Odhlásit se',
'Lost Password': 'Zapomněl jste heslo',
'Lost password?': 'Zapomněl jste heslo?',
'lost password?': 'zapomněl jste heslo?',
'Manage': 'Manage',
'Manage Cache': 'Manage Cache',
'Menu Model': 'Model rozbalovací nabídky',
'Models': 'Modely',
'models': 'modely',
'Modified By': 'Změněno - kým',
'Modified On': 'Změněno - kdy',
'Modules': 'Moduly',
'modules': 'moduly',
'My Sites': 'Správa aplikací',
'Name': 'Jméno',
'new application "%s" created': 'nová aplikace "%s" vytvořena',
'New Application Wizard': 'Nový průvodce aplikací',
'New application wizard': 'Nový průvodce aplikací',
'New password': 'Nové heslo',
'New Record': 'Nový záznam',
'new record inserted': 'nový záznam byl založen',
'New simple application': 'Vytvořit primitivní aplikaci',
'next': 'next',
'next 100 rows': 'dalších 100 řádků',
'No databases in this application': 'V této aplikaci nejsou žádné databáze',
'No Interaction yet': 'Ještě žádná interakce nenastala',
'No ticket_storage.txt found under /private folder': 'Soubor ticket_storage.txt v adresáři /private nenalezen',
'Object or table name': 'Objekt či tabulka',
'Old password': 'Původní heslo',
'online designer': 'online návrhář',
'Online examples': 'Příklady online',
'Open new app in new window': 'Open new app in new window',
'or alternatively': 'or alternatively',
'Or Get from URL:': 'Or Get from URL:',
'or import from csv file': 'nebo importovat z .csv souboru',
'Origin': 'Původ',
'Original/Translation': 'Originál/Překlad',
'Other Plugins': 'Ostatní moduly',
'Other Recipes': 'Ostatní zásuvné moduly',
'Overview': 'Přehled',
'Overwrite installed app': 'Přepsat instalovanou aplikaci',
'Pack all': 'Zabalit',
'Pack compiled': 'Zabalit zkompilované',
'pack plugin': 'pack plugin',
'password': 'heslo',
'Password': 'Heslo',
"Password fields don't match": 'Hesla se neshodují',
'Peeking at file': 'Peeking at file',
'Please': 'Prosím',
'Plugin "%s" in application': 'Plugin "%s" in application',
'plugins': 'zásuvné moduly',
'Plugins': 'Zásuvné moduly',
'Plural Form #%s': 'Plural Form #%s',
'Plural-Forms:': 'Množná čísla:',
'Powered by': 'Poháněno',
'Preface': 'Předmluva',
'previous 100 rows': 'předchozích 100 řádků',
'Private files': 'Soukromé soubory',
'private files': 'soukromé soubory',
'profile': 'profil',
'Project Progress': 'Vývoj projektu',
'Python': 'Python',
'Query:': 'Dotaz:',
'Quick Examples': 'Krátké příklady',
'RAM': 'RAM',
'RAM Cache Keys': 'Klíče RAM Cache',
'Ram Cleared': 'RAM smazána',
'Readme': 'Nápověda',
'Recipes': 'Postupy jak na to',
'Record': 'Záznam',
'record does not exist': 'záznam neexistuje',
'Record ID': 'ID záznamu',
'Record id': 'id záznamu',
'refresh': 'obnovte',
'register': 'registrovat',
'Register': 'Zaregistrovat se',
'Registration identifier': 'Registrační identifikátor',
'Registration key': 'Registrační klíč',
'reload': 'reload',
'Reload routes': 'Znovu nahrát cesty',
'Remember me (for 30 days)': 'Zapamatovat na 30 dní',
'Remove compiled': 'Odstranit zkompilované',
'Removed Breakpoint on %s at line %s': 'Bod přerušení smazán - soubor %s na řádce %s',
'Replace': 'Zaměnit',
'Replace All': 'Zaměnit vše',
'request': 'request',
'Reset Password key': 'Reset registračního klíče',
'response': 'response',
'restart': 'restart',
'restore': 'obnovit',
'Retrieve username': 'Získat přihlašovací jméno',
'return': 'return',
'revert': 'vrátit se k původnímu',
'Role': 'Role',
'Rows in Table': 'Záznamy v tabulce',
'Rows selected': 'Záznamů zobrazeno',
'rules are not defined': 'pravidla nejsou definována',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Spustí testy v tomto souboru (ke spuštění všech testů, použijte tlačítko 'test')",
'Running on %s': 'Běží na %s',
'Save': 'Uložit',
'Save file:': 'Save file:',
'Save via Ajax': 'Uložit pomocí Ajaxu',
'Saved file hash:': 'hash uloženého souboru:',
'Semantic': 'Modul semantic',
'Services': 'Služby',
'session': 'session',
'session expired': 'session expired',
'Set Breakpoint on %s at line %s: %s': 'Bod přerušení nastaven v souboru %s na řádce %s: %s',
'shell': 'příkazová řádka',
'Singular Form': 'Singular Form',
'Site': 'Správa aplikací',
'Size of cache:': 'Velikost cache:',
'skip to generate': 'skip to generate',
'Sorry, could not find mercurial installed': 'Bohužel mercurial není nainstalován.',
'Start a new app': 'Vytvořit novou aplikaci',
'Start searching': 'Začít hledání',
'Start wizard': 'Spustit průvodce',
'state': 'stav',
'Static': 'Static',
'static': 'statické soubory',
'Static files': 'Statické soubory',
'Statistics': 'Statistika',
'Step': 'Step',
'step': 'step',
'stop': 'stop',
'Stylesheet': 'CSS styly',
'submit': 'odeslat',
'Submit': 'Odeslat',
'successful': 'úspěšně',
'Support': 'Podpora',
'Sure you want to delete this object?': 'Opravdu chcete smazat tento objekt?',
'Table': 'tabulka',
'Table name': 'Název tabulky',
'Temporary': 'Dočasný',
'test': 'test',
'Testing application': 'Testing application',
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Dotaz" je podmínka, například "db.tabulka1.pole1==\'hodnota\'". Podmínka "db.tabulka1.pole1==db.tabulka2.pole2" pak vytvoří SQL JOIN.',
'The application logic, each URL path is mapped in one exposed function in the controller': 'Logika aplikace: každá URL je mapována na funkci vystavovanou kontrolérem.',
'The Core': 'Jádro (The Core)',
'The data representation, define database tables and sets': 'Reprezentace dat: definovat tabulky databáze a záznamy',
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup ze souboru je slovník, který se zobrazil v pohledu %s.',
'The presentations layer, views are also known as templates': 'Prezentační vrstva: pohledy či templaty (šablony)',
'The Views': 'Pohledy (The Views)',
'There are no controllers': 'There are no controllers',
'There are no modules': 'There are no modules',
'There are no plugins': 'Žádné moduly nejsou instalovány.',
'There are no private files': 'Žádné soukromé soubory neexistují.',
'There are no static files': 'There are no static files',
'There are no translators, only default language is supported': 'There are no translators, only default language is supported',
'There are no views': 'There are no views',
'These files are not served, they are only available from within your app': 'Tyto soubory jsou klientům nepřístupné. K dispozici jsou pouze v rámci aplikace.',
'These files are served without processing, your images go here': 'Tyto soubory jsou servírovány bez přídavné logiky, sem patří např. obrázky.',
'This App': 'Tato aplikace',
'This is a copy of the scaffolding application': 'Toto je kopie aplikace skelet.',
'This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk': 'This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk',
'This is the %(filename)s template': 'This is the %(filename)s template',
'this page to see if a breakpoint was hit and debug interaction is required.': 'tuto stránku, abyste uviděli, zda se dosáhlo bodu přerušení.',
'Ticket': 'Ticket',
'Ticket ID': 'Ticket ID',
'Time in Cache (h:m:s)': 'Čas v Cache (h:m:s)',
'Timestamp': 'Časové razítko',
'to previous version.': 'k předchozí verzi.',
'To create a plugin, name a file/folder plugin_[name]': 'Zásuvný modul vytvoříte tak, že pojmenujete soubor/adresář plugin_[jméno modulu]',
'To emulate a breakpoint programatically, write:': 'K nastavení bodu přerušení v kódu programu, napište:',
'to use the debugger!': ', abyste mohli ladící program používat!',
'toggle breakpoint': 'vyp./zap. bod přerušení',
'Toggle Fullscreen': 'Na celou obrazovku a zpět',
'too short': 'Příliš krátké',
'Traceback': 'Traceback',
'Translation strings for the application': 'Překlad textů pro aplikaci',
'try something like': 'try something like',
'Try the mobile interface': 'Zkuste rozhraní pro mobilní zařízení',
'try view': 'try view',
'Twitter': 'Twitter',
'Type python statement in here and hit Return (Enter) to execute it.': 'Type python statement in here and hit Return (Enter) to execute it.',
'Type some Python code in here and hit Return (Enter) to execute it.': 'Type some Python code in here and hit Return (Enter) to execute it.',
'Unable to check for upgrades': 'Unable to check for upgrades',
'unable to parse csv file': 'csv soubor nedá sa zpracovat',
'uncheck all': 'vše odznačit',
'Uninstall': 'Odinstalovat',
'update': 'aktualizovat',
'update all languages': 'aktualizovat všechny jazyky',
'Update:': 'Upravit:',
'Upgrade': 'Upgrade',
'upgrade now': 'upgrade now',
'upgrade now to %s': 'upgrade now to %s',
'upload': 'nahrát',
'Upload': 'Upload',
'Upload a package:': 'Nahrát balík:',
'Upload and install packed application': 'Nahrát a instalovat zabalenou aplikaci',
'upload file:': 'nahrát soubor:',
'upload plugin file:': 'nahrát soubor modulu:',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použijte (...)&(...) pro AND, (...)|(...) pro OR a ~(...) pro NOT pro sestavení složitějších dotazů.',
'User %(id)s Logged-in': 'Uživatel %(id)s přihlášen',
'User %(id)s Logged-out': 'Uživatel %(id)s odhlášen',
'User %(id)s Password changed': 'Uživatel %(id)s změnil heslo',
'User %(id)s Profile updated': 'Uživatel %(id)s upravil profil',
'User %(id)s Registered': 'Uživatel %(id)s se zaregistroval',
'User %(id)s Username retrieved': 'Uživatel %(id)s si nachal zaslat přihlašovací jméno',
'User ID': 'ID uživatele',
'Username': 'Přihlašovací jméno',
'variables': 'variables',
'Verify Password': 'Zopakujte heslo',
'Version': 'Verze',
'Version %s.%s.%s (%s) %s': 'Verze %s.%s.%s (%s) %s',
'Versioning': 'Verzování',
'Videos': 'Videa',
'View': 'Pohled (View)',
'Views': 'Pohledy',
'views': 'pohledy',
'Web Framework': 'Web Framework',
'web2py is up to date': 'Máte aktuální verzi web2py.',
'web2py online debugger': 'Ladící online web2py program',
'web2py Recent Tweets': 'Štěbetání na Twitteru o web2py',
'web2py upgrade': 'web2py upgrade',
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
'Welcome': 'Vítejte',
'Welcome to web2py': 'Vitejte ve web2py',
'Welcome to web2py!': 'Vítejte ve web2py!',
'Which called the function %s located in the file %s': 'která zavolala funkci %s v souboru (kontroléru) %s.',
'You are successfully running web2py': 'Úspěšně jste spustili web2py.',
'You can also set and remove breakpoint in the edit window, using the Toggle Breakpoint button': 'Nastavovat a mazat body přerušení je též možno v rámci editování zdrojového souboru přes tlačítko Vyp./Zap. bod přerušení',
'You can modify this application and adapt it to your needs': 'Tuto aplikaci si můžete upravit a přizpůsobit ji svým potřebám.',
'You need to set up and reach a': 'Je třeba nejprve nastavit a dojít až na',
'You visited the url %s': 'Navštívili jste stránku %s,',
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Aplikace bude blokována než se klikne na jedno z tlačítek (další, krok, pokračovat, atd.)',
'Your can inspect variables using the console bellow': 'Níže pomocí příkazové řádky si můžete prohlédnout proměnné',
}

View File

@@ -3,54 +3,62 @@
'!langcode!': 'de',
'!langname!': 'Deutsch',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden',
'%s %%{row} deleted': '%s Zeilen gelöscht',
'%s %%{row} updated': '%s Zeilen aktualisiert',
'%Y-%m-%d': '%Y-%m-%d',
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'(requires internet access)': '(requires internet access)',
'%s %%{row} deleted': '%s %%{row} Zeilen gelöscht',
'%s %%{row} updated': '%s %%{row} Zeilen aktualisiert',
'%Y-%m-%d': '%d.%m.%Y',
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
'(requires internet access)': '(Internet Zugang wir benötigt)',
'(requires internet access, experimental)': '(benötigt Internet Zugang)',
'(something like "it-it")': '(so etwas wie "it-it")',
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(file **gluon/contrib/plural_rules/%s.py** is not found)',
'@markmin\x01Searching: **%s** %%{file}': '@markmin\x01Suche: **%s** Dateien',
'A new version of web2py is available': 'Eine neue Version von web2py ist verfügbar',
'A new version of web2py is available: %s': 'Eine neue Version von web2py ist verfügbar: %s',
'Abort': 'Abbrechen',
'About': 'Über',
'About application': 'Über die Anwendung',
'Additional code for your application': 'Additional code for your application',
'additional code for your application': 'zusätzlicher Code für Ihre Anwendung',
'admin disabled because no admin password': ' admin ist deaktiviert, weil kein Admin-Passwort gesetzt ist',
'About': 'über',
'About application': 'über die Anwendung',
'Additional code for your application': 'zusätzlicher Code für Ihre Anwendung',
'admin disabled because no admin password': 'admin ist deaktiviert, weil kein Admin-Passwort gesetzt ist',
'admin disabled because not supported on google apps engine': 'admin ist deaktiviert, es existiert dafür keine Unterstützung auf der google apps engine',
'admin disabled because unable to access password file': 'admin ist deaktiviert, weil kein Zugriff auf die Passwortdatei besteht',
'Admin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
'Admin is disabled because unsecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
'Admin language': 'Admin language',
'administrative interface': 'administrative interface',
'Admin language': 'Admin-Sprache',
'administrative interface': 'Administrative Schnittstelle',
'Administrator Password:': 'Administrator Passwort:',
'An error occured, please %s the page': 'Ein Fehler ist aufgetereten, bitte %s die Seite',
'and rename it (required):': 'und benenne sie um (erforderlich):',
'and rename it:': ' und benenne sie um:',
'appadmin': 'appadmin',
'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
'Application': 'Anwendung',
'application "%s" uninstalled': 'Anwendung "%s" deinstalliert',
'application compiled': 'Anwendung kompiliert',
'application is compiled and cannot be designed': 'Die Anwendung ist kompiliert kann deswegen nicht mehr geändert werden',
'Application name:': 'Application name:',
'Application name:': 'Name der Applikation:',
'are not used': 'wird nicht verwendet',
'are not used yet': 'wird bisher nicht verwendet',
'Are you sure you want to delete file "%s"?': 'Sind Sie sich sicher, dass Sie diese Datei löschen wollen "%s"?',
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Are you sure you want to delete this object?': 'Sind Sie sich sicher, dass Sie dieses Objekt löschen wollen?',
'Are you sure you want to uninstall application "%s"': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"',
'Are you sure you want to uninstall application "%s"?': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"?',
'Are you sure you want to upgrade web2py now?': 'Sind Sie sich sicher, dass Sie web2py jetzt upgraden möchten?',
'arguments': 'arguments',
'at char %s': 'at char %s',
'at line %s': 'at line %s',
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ACHTUNG: Die Einwahl benötigt eine sichere (HTTPS) Verbindung. Es sei denn sie läuft Lokal(localhost).',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ACHTUNG: Testen ist nicht threadsicher. Führen sie also nicht mehrere Tests gleichzeitig aus.',
'ATTENTION: This is an experimental feature and it needs more testing.': 'ACHTUNG: Dies ist eine experimentelle Funktion und benötigt noch weitere Tests.',
'ATTENTION: you cannot edit the running application!': 'ACHTUNG: Eine laufende Anwendung kann nicht editiert werden!',
'Authentication': 'Authentifizierung',
'Available databases and tables': 'Verfügbare Datenbanken und Tabellen',
'Available databases and tables': 'verfügbare Datenbanken und Tabellen',
'back': 'zurück',
'beautify': 'beautify',
'cache': 'Cache',
'beautify': 'verschönern',
'cache': 'Pufferspeicher',
'cache, errors and sessions cleaned': 'Zwischenspeicher (cache), Fehler und Sitzungen (sessions) gelöscht',
'call': 'call',
'can be a git repo': 'can be a git repo',
'call': 'Aufruf',
'can be a git repo': 'kann ein git Repository sein',
'Cancel': 'Cancel',
'Cannot be empty': 'Darf nicht leer sein',
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nicht Kompilierbar:Es sind Fehler in der Anwendung. Beseitigen Sie die Fehler und versuchen Sie es erneut.',
'cannot create file': 'Kann Datei nicht erstellen',
@@ -62,29 +70,31 @@
'Check for upgrades': 'check for upgrades',
'Check to delete': 'Markiere zum löschen',
'Checking for upgrades...': 'Auf Updates überprüfen...',
'Clean': 'löschen',
'Clean': 'leeren',
'click here for online examples': 'hier klicken für online Beispiele',
'click here for the administrative interface': 'hier klicken für die Administrationsoberfläche ',
'Click row to expand traceback': 'Klicke auf die Zeile für Fehlerverfolgung',
'click to check for upgrades': 'hier klicken um nach Upgrades zu suchen',
'Client IP': 'Client IP',
'code': 'code',
'collapse/expand all': 'collapse/expand all',
'collapse/expand all': 'alles zu- bzw. aufklappen',
'Compile': 'kompilieren',
'compiled application removed': 'kompilierte Anwendung gelöscht',
'Controller': 'Controller',
'Controllers': 'Controller',
'controllers': 'Controllers',
'Copyright': 'Urheberrecht',
'Count': 'Anzahl',
'Create': 'erstellen',
'create file with filename:': 'erzeuge Datei mit Dateinamen:',
'create new application:': 'erzeuge neue Anwendung:',
'Create new simple application': 'Erzeuge neue Anwendung',
'created by': 'created by',
'created by': 'erstellt von',
'crontab': 'crontab',
'Current request': 'Aktuelle Anfrage (request)',
'Current response': 'Aktuelle Antwort (response)',
'Current session': 'Aktuelle Sitzung (session)',
'currently running': 'currently running',
'currently running': 'aktuell in Betrieb',
'currently saved or': 'des derzeit gespeicherten oder',
'customize me!': 'pass mich an!',
'data uploaded': 'Daten hochgeladen',
@@ -97,23 +107,27 @@
'DB Model': 'DB Modell',
'Debug': 'Debug',
'defines tables': 'definiere Tabellen',
'Delete': 'Löschen',
'Delete': 'löschen',
'delete': 'löschen',
'delete all checked': 'lösche alle markierten',
'delete plugin': 'Plugin löschen',
'Delete:': 'Löschen:',
'Deploy': 'deploy',
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
'Delete:': 'löschen:',
'Deploy': 'Installieren',
'Deploy on Google App Engine': 'Auf Google App Engine installieren',
'Deploy to OpenShift': 'Deploy to OpenShift',
'Deploy to OpenShift': 'Auf OpenShift installieren',
'Description': 'Beschreibung',
'design': 'design',
'DESIGN': 'design',
'Design for': 'Design für',
'Detailed traceback description': 'Detailed traceback description',
'direction: ltr': 'direction: ltr',
'Disable': 'Disable',
'Disable': 'Deaktivieren',
'docs': 'docs',
'documentation': 'Dokumentation',
'done!': 'fertig!',
'download layouts': 'download layouts',
'Download .w2p': 'Download .w2p',
'download layouts': 'Layouts herunterladen',
'download plugins': 'download plugins',
'E-mail': 'E-mail',
'EDIT': 'BEARBEITEN',
@@ -128,16 +142,23 @@
'Editing file': 'Bearbeite Datei',
'Editing file "%s"': 'Bearbeite Datei "%s"',
'Editing Language file': 'Sprachdatei bearbeiten',
'Enable': 'Enable',
'Enterprise Web Framework': 'Enterprise Web Framework',
'Error': 'Fehler',
'Error logs for "%(app)s"': 'Fehlerprotokoll für "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'Fehler',
'escape': 'escape',
'Exception instance attributes': 'Atribute der Ausnahmeinstanz',
'Expand Abbreviation': 'Kürzel erweitern',
'export as csv file': 'Exportieren als CSV-Datei',
'exposes': 'stellt zur Verfügung',
'exposes:': 'exposes:',
'extends': 'erweitert',
'failed to compile file because:': 'failed to compile file because:',
'failed to reload module': 'neu laden des Moduls fehlgeschlagen',
'File': 'Datei',
'file "%(filename)s" created': 'Datei "%(filename)s" erstellt',
'file "%(filename)s" deleted': 'Datei "%(filename)s" gelöscht',
'file "%(filename)s" uploaded': 'Datei "%(filename)s" hochgeladen',
@@ -148,25 +169,33 @@
'file saved on %(time)s': 'Datei gespeichert am %(time)s',
'file saved on %s': 'Datei gespeichert auf %s',
'filter': 'filter',
'Find Next': 'Find Next',
'Find Previous': 'Find Previous',
'First name': 'Vorname',
'Frames': 'Frames',
'Functions with no doctests will result in [passed] tests.': 'Funktionen ohne doctests erzeugen [passed] in Tests',
'Get from URL:': 'Get from URL:',
'Git Pull': 'Git Pull',
'Git Push': 'Git Push',
'Go to Matching Pair': 'gehe zum übereinstimmenden Paar',
'Goto': 'Goto',
'graph model': 'graph model',
'Group ID': 'Gruppen ID',
'Hello World': 'Hallo Welt',
'Help': 'Hilfe',
'Hide/Show Translated strings': 'Hide/Show Translated strings',
'Home': 'Home',
'htmledit': 'htmledit',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Falls der obere Test eine Fehler-Ticketnummer enthält deutet das auf einen Fehler in der Ausführung des Controllers hin, noch bevor der Doctest ausgeführt werden konnte. Gewöhnlich führen fehlerhafte Einrückungen oder fehlerhafter Code ausserhalb der Funktion zu solchen Fehlern. Ein grüner Titel deutet darauf hin, dass alle Test(wenn sie vorhanden sind) erfolgreich durchlaufen wurden. In diesem Fall werden die Testresultate nicht angezeigt.',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Falls der obere Test eine Fehler-Ticketnummer enthält deutet das auf einen Fehler in der Ausführung des Controllers hin, noch bevor der Doctest ausgeführt werden konnte. Gewöhnlich Führen fehlerhafte Einrückungen oder fehlerhafter Code ausserhalb der Funktion zu solchen Fehlern. Ein grüner Titel deutet darauf hin, dass alle Test(wenn sie vorhanden sind) erfolgreich durchlaufen wurden. In diesem Fall werden die Testresultate nicht angezeigt.',
'If you answer "yes", be patient, it may take a while to download': '',
'If you answer yes, be patient, it may take a while to download': 'If you answer yes, be patient, it may take a while to download',
'Import/Export': 'Importieren/Exportieren',
'includes': 'Einfügen',
'Index': 'Index',
'index': 'index',
'insert new': 'neu einfügen',
'insert new %s': 'neu einfügen %s',
'insert new': 'neu Einfügen',
'insert new %s': 'neu Einfügen %s',
'inspect attributes': 'inspect attributes',
'Install': 'installieren',
'Installed applications': 'Installierte Anwendungen',
'internal error': 'interner Fehler',
@@ -175,9 +204,10 @@
'Invalid email': 'Ungültige Email',
'invalid password': 'Ungültiges Passwort',
'Invalid Query': 'Ungültige Abfrage',
'invalid request': 'ungültige Anfrage',
'invalid ticket': 'ungültiges Ticket',
'invalid request': 'Ungültige Anfrage',
'invalid ticket': 'Ungültiges Ticket',
'Key bindings': 'Tastenbelegungen',
'Key bindings for ZenCoding Plugin': 'Key bindings for ZenCoding Plugin',
'Key bindings for ZenConding Plugin': 'Tastenbelegungen für das ZenConding Plugin',
'language file "%(filename)s" created/updated': 'Sprachdatei "%(filename)s" erstellt/aktualisiert',
'Language files (static strings) updated': 'Sprachdatei (statisch Strings) aktualisiert',
@@ -189,6 +219,7 @@
'Layout': 'Layout',
'License for': 'Lizenz für',
'loading...': 'lade...',
'locals': 'locals',
'located in the file': 'located in Datei',
'Login': 'Anmelden',
'login': 'anmelden',
@@ -196,7 +227,8 @@
'Logout': 'abmelden',
'Lost Password': 'Passwort vergessen',
'lost password?': 'Passwort vergessen?',
'Main Menu': 'Menú principal',
'Main Menu': 'Menü principal',
'Manage': 'Verwalten',
'Match Pair': 'Paare finden',
'Menu Model': 'Menü Modell',
'merge': 'verbinden',
@@ -207,22 +239,29 @@
'modules': 'Module',
'Name': 'Name',
'new application "%s" created': 'neue Anwendung "%s" erzeugt',
'New application wizard': 'New application wizard',
'New application wizard': 'Neue Anwendung per Assistent',
'new plugin installed': 'new plugin installed',
'New Record': 'Neuer Datensatz',
'new record inserted': 'neuer Datensatz eingefügt',
'New simple application': 'New simple application',
'New simple application': 'Neue einfache Anwendung',
'next 100 rows': 'nächsten 100 Zeilen',
'Next Edit Point': 'nächster Bearbeitungsschritt',
'NO': 'NEIN',
'No databases in this application': 'Keine Datenbank in dieser Anwendung',
'no package selected': 'no package selected',
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
'online designer': 'online designer',
'or alternatively': 'or alternatively',
'Or Get from URL:': 'oder hole es von folgender URL:',
'or import from csv file': 'oder importieren von cvs Datei',
'or provide app url:': 'oder geben Sie eine Anwendungs-URL an:',
'or provide application url:': 'oder geben Sie eine Anwendungs-URL an:',
'Origin': 'Herkunft',
'Original/Translation': 'Original/Übersetzung',
'Original/Translation': 'Original/übersetzung',
'Overwrite installed app': 'installierte Anwendungen überschreiben',
'Pack all': 'verpacke alles',
'Pack compiled': 'Verpacke kompiliert',
'Pack custom': 'Verpacke individuell',
'pack plugin': 'Plugin verpacken',
'Password': 'Passwort',
'Peeking at file': 'Dateiansicht',
@@ -230,9 +269,13 @@
'Plugin "%s" in application': 'Plugin "%s" in Anwendung',
'plugins': 'plugins',
'Plugins': 'Plugins',
'Plural-Forms:': 'Plural-Forms:',
'Powered by': 'Unterstützt von',
'previous 100 rows': 'vorherige 100 zeilen',
'Previous Edit Point': 'vorheriger Bearbeitungsschritt',
'Private files': 'Private files',
'private files': 'private files',
'Project Progress': 'Projekt Fortschritt',
'Query:': 'Abfrage:',
'record': 'Datensatz',
'record does not exist': 'Datensatz existiert nicht',
@@ -241,26 +284,39 @@
'register': 'Registrierung',
'Register': 'registrieren',
'Registration key': 'Registrierungsschlüssel',
'Reload routes': 'Reload routes',
'Remove compiled': 'kompilat gelöscht',
'reload': 'Neu laden',
'Reload routes': 'Routen neu laden',
'Remove compiled': 'Bytecode löschen',
'Replace': 'Replace',
'Replace All': 'Replace All',
'request': 'request',
'Reset Password key': 'Passwortschlüssel zurücksetzen',
'Resolve Conflict file': 'bereinige Konflikt-Datei',
'response': 'Antwort',
'restore': 'wiederherstellen',
'revert': 'zurückkehren',
'Role': 'Rolle',
'Rows in table': 'Zeilen in Tabelle',
'Rows selected': 'Zeilen ausgewählt',
'Running on %s': 'Running on %s',
'rules are not defined': 'rules are not defined',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Running on %s': 'läuft auf %s',
'Save': 'Save',
'save': 'sichern',
'Save file:': 'Save file:',
'Save via Ajax': 'via Ajax sichern',
'Saved file hash:': 'Gespeicherter Datei-Hash:',
'Select Files to Package': 'Dateien zum Paketieren wählen',
'selected': 'ausgewählt(e)',
'session expired': 'Sitzung Abgelaufen',
'session': 'Sitzung',
'session expired': 'Sitzung abgelaufen',
'shell': 'shell',
'Site': 'Seite',
'some files could not be removed': 'einige Dateien konnten nicht gelöscht werden',
'Start wizard': 'start wizard',
'Start searching': 'Start searching',
'Start wizard': 'Assistent starten',
'state': 'Status',
'Static': 'Static',
'static': 'statische Dateien',
'Static files': 'statische Dateien',
'Stylesheet': 'Stylesheet',
@@ -283,27 +339,35 @@
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The output of the file is a dictionary that was rendered by the view': 'The output of the file is a dictionary that was rendered by the view',
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
'the presentations layer, views are also known as templates': 'Die Präsentationsschicht, Views sind auch bekannt als Vorlagen/Templates',
'the presentations layer, views are also known as templates': 'Die präsentationsschicht, Views sind auch bekannt als Vorlagen/Templates',
'There are no controllers': 'Keine Controller vorhanden',
'There are no models': 'Keine Modelle vorhanden',
'There are no modules': 'Keine Module vorhanden',
'There are no plugins': 'There are no plugins',
'There are no plugins': 'Keine Plugins vorhanden',
'There are no private files': 'There are no private files',
'There are no static files': 'Keine statischen Dateien vorhanden',
'There are no translators, only default language is supported': 'Keine Übersetzungen vorhanden, nur die voreingestellte Sprache wird unterstützt',
'There are no translators, only default language is supported': 'Keine übersetzungen vorhanden, nur die voreingestellte Sprache wird Unterstützt',
'There are no views': 'Keine Views vorhanden',
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
'These files are served without processing, your images go here': 'Diese Dateien werden ohne Verarbeitung ausgeliefert. Beispielsweise Bilder kommen hier hin.',
'these files are served without processing, your images go here': 'Diese Dateien werden ohne Verarbeitung ausgeliefert. Beispielsweise Bilder kommen hier hin.',
'This is a copy of the scaffolding application': 'Dies ist eine Kopie einer Grundgerüst-Anwendung',
'This is the %(filename)s template': 'Dies ist das Template %(filename)s',
'Ticket': 'Ticket',
'Timestamp': 'Timestamp',
'Ticket ID': 'Ticket ID',
'Timestamp': 'Zeitstempel',
'TM': 'TM',
'to previous version.': 'zu einer früheren Version.',
'To create a plugin, name a file/folder plugin_[name]': 'Um ein Plugin zu erstellen benennen Sie eine(n) Datei/Ordner plugin_[Name]',
'translation strings for the application': 'Übersetzungs-Strings für die Anwendung',
'Translation strings for the application': 'Translation strings for the application',
'toggle breakpoint': 'toggle breakpoint',
'Toggle Fullscreen': 'Toggle Fullscreen',
'Traceback': 'Traceback',
'translation strings for the application': 'übersetzungs-Strings für die Anwendung',
'Translation strings for the application': 'übersetzungs-Strings für die Anwendung',
'try': 'versuche',
'try something like': 'versuche so etwas wie',
'Try the mobile interface': 'Try the mobile interface',
'try view': 'try view',
'Unable to check for upgrades': 'überprüfen von Upgrades nicht möglich',
'unable to create application "%s"': 'erzeugen von Anwendung "%s" nicht möglich',
'unable to delete file "%(filename)s"': 'löschen von Datein "%(filename)s" nicht möglich',
@@ -311,37 +375,40 @@
'Unable to download app': 'herunterladen der Anwendung nicht möglich',
'unable to parse csv file': 'analysieren der cvs Datei nicht möglich',
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht möglich',
'uncheck all': 'alles demarkieren',
'uncheck all': 'Selektionen entfernen',
'Uninstall': 'deinstallieren',
'update': 'aktualisieren',
'update all languages': 'aktualisiere alle Sprachen',
'Update:': 'Aktualisiere:',
'upgrade web2py now': 'jetzt web2py upgraden',
'upload': 'upload',
'Upload': 'Upload',
'Upload & install packed application': 'Verpackte Anwendung hochladen und installieren',
'Upload a package:': 'Upload a package:',
'Upload and install packed application': 'Upload and install packed application',
'Upload a package:': 'Ein Packet hochladen:',
'Upload and install packed application': 'Verpackte Anwendung hochladen und installieren',
'upload application:': 'lade Anwendung hoch:',
'Upload existing application': 'lade existierende Anwendung hoch',
'upload file:': 'lade Datei hoch:',
'upload plugin file:': 'Plugin-Datei hochladen:',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Benutze (...)&(...) für AND, (...)|(...) für OR, und ~(...) für NOT, um komplexe Abfragen zu erstellen.',
'Use an url:': 'Use an url:',
'user': 'user',
'Use an url:': 'Verwende URL:',
'user': 'Nutzer',
'User ID': 'Benutzer ID',
'variables': 'variables',
'variables': 'Variablen',
'Version': 'Version',
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
'versioning': 'Versionierung',
'View': 'View',
'view': 'View',
'Views': 'Views',
'views': 'Views',
'Versioning': 'Versionierung',
'View': 'Ansicht',
'view': 'Ansicht',
'Views': 'Ansichten',
'views': 'Ansichten',
'Web Framework': 'Web Framework',
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
'web2py Recent Tweets': 'neuste Tweets von web2py',
'Welcome %s': 'Willkommen %s',
'Welcome to web2py': 'Willkommen zu web2py',
'Which called the function': 'Which called the function',
'Which called the function': 'welche die Funktion aufrief',
'Wrap with Abbreviation': 'mit Kürzel einhüllen',
'xml': 'xml',
'YES': 'JA',

View File

@@ -3,202 +3,169 @@
'!langcode!': 'es',
'!langname!': 'Español',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"actualice" es una expresión opcional como "campo1=\'nuevo_valor\'". No se puede actualizar o eliminar resultados de un JOIN',
'%Y-%m-%d': '%Y-%m-%d',
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'%s %%{row} deleted': '%s filas eliminadas',
'%s %%{row} updated': '%s filas actualizadas',
'%Y-%m-%d': '%Y-%m-%d',
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'(requires internet access, experimental)': '(requiere acceso a internet, experimental)',
'(something like "it-it")': '(algo como "it-it")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(file **gluon/contrib/plural_rules/%s.py** is not found)',
'@markmin\x01An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page',
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
'About': 'acerca de',
'About application': 'Acerca de la aplicación',
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
'Administrator Password:': 'Contraseña del Administrador:',
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
'Are you sure you want to delete plugin "%s"?': '¿Está seguro que quiere eliminar el plugin "%s"?',
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
'Are you sure you want to upgrade web2py now?': '¿Está seguro que desea actualizar web2py ahora?',
'Available databases and tables': 'Bases de datos y tablas disponibles',
'Cannot be empty': 'No puede estar vacío',
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
'Cannot compile: there are errors in your app:': 'No se puede compilar: hay errores en su aplicación:',
'Change Password': 'Cambie Contraseña',
'Change admin password': 'cambie contraseña admin',
'Check to delete': 'Marque para eliminar',
'Checking for upgrades...': 'Buscando actulizaciones...',
'Clean': 'limpiar',
'Click row to expand traceback': 'Click row to expand traceback',
'Client IP': 'IP del Cliente',
'Compile': 'compilar',
'Controllers': 'Controladores',
'Count': 'Count',
'Create': 'crear',
'Create new application using the Wizard': 'Create new application using the Wizard',
'Create new simple application': 'Cree una nueva aplicación',
'Current request': 'Solicitud en curso',
'Current response': 'Respuesta en curso',
'Current session': 'Sesión en curso',
'DESIGN': 'DISEÑO',
'Date and Time': 'Fecha y Hora',
'Delete': 'Elimine',
'Delete:': 'Elimine:',
'Deploy on Google App Engine': 'Instale en Google App Engine',
'Description': 'Descripción',
'Design for': 'Diseño para',
'E-mail': 'Correo electrónico',
'EDIT': 'EDITAR',
'Edit': 'editar',
'Edit Profile': 'Editar Perfil',
'Edit application': 'Editar aplicación',
'Edit current record': 'Edite el registro actual',
'Editing Language file': 'Editando archivo de lenguaje',
'Editing file': 'Editando archivo',
'Editing file "%s"': 'Editando archivo "%s"',
'Enterprise Web Framework': 'Armazón Empresarial para Internet',
'Error': 'Error',
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
'Errors': 'errores',
'Exception instance attributes': 'Atributos de la instancia de Excepción',
'File': 'File',
'First name': 'Nombre',
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
'Group ID': 'ID de Grupo',
'Hello World': 'Hola Mundo',
'Help': 'ayuda',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Si el reporte anterior contiene un número de tiquete este indica un falla en la ejecución del controlador, antes de cualquier intento de ejecutat doctests. Esto generalmente se debe a un error en la indentación o un error por fuera del código de la función.\r\nUn titulo verde indica que todas las pruebas pasaron (si existen). En dicho caso los resultados no se muestran.',
'Import/Export': 'Importar/Exportar',
'Install': 'instalar',
'Installed applications': 'Aplicaciones instaladas',
'Internal State': 'Estado Interno',
'Invalid Query': 'Consulta inválida',
'Invalid action': 'Acción inválida',
'Invalid email': 'Correo inválido',
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
'Languages': 'Lenguajes',
'Last name': 'Apellido',
'Last saved on:': 'Guardado en:',
'License for': 'Licencia para',
'Login': 'Inicio de sesión',
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
'Logout': 'fin de sesión',
'Lost Password': 'Contraseña perdida',
'Models': 'Modelos',
'Modules': 'Módulos',
'NO': 'NO',
'Name': 'Nombre',
'New Record': 'Registro nuevo',
'No databases in this application': 'No hay bases de datos en esta aplicación',
'Origin': 'Origen',
'Original/Translation': 'Original/Traducción',
'Overwrite installed app': 'sobreescriba aplicación instalada',
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, no puede cambiar la contraseña aquí',
'Pack all': 'empaquetar todo',
'Pack compiled': 'empaquete compiladas',
'Password': 'Contraseña',
'Peeking at file': 'Visualizando archivo',
'Plugin "%s" in application': 'Plugin "%s" en aplicación',
'Plugins': 'Plugins',
'Powered by': 'Este sitio usa',
'Query:': 'Consulta:',
'Record ID': 'ID de Registro',
'Register': 'Registrese',
'Registration key': 'Contraseña de Registro',
'Remove compiled': 'eliminar compiladas',
'Resolve Conflict file': 'archivo Resolución de Conflicto',
'Role': 'Rol',
'Rows in table': 'Filas en la tabla',
'Rows selected': 'Filas seleccionadas',
'Saved file hash:': 'Hash del archivo guardado:',
'Site': 'sitio',
'Static files': 'Archivos estáticos',
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
'TM': 'MR',
'Table name': 'Nombre de la tabla',
'Testing application': 'Probando aplicación',
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
'There are no controllers': 'No hay controladores',
'There are no models': 'No hay modelos',
'There are no modules': 'No hay módulos',
'There are no static files': 'No hay archivos estáticos',
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
'There are no views': 'No hay vistas',
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
'Ticket': 'Tiquete',
'Timestamp': 'Timestamp',
'To create a plugin, name a file/folder plugin_[name]': 'Para crear un plugin, nombre un archivo/carpeta plugin_[nombre]',
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
'Unable to download': 'No es posible la descarga',
'Unable to download app': 'No es posible descargar la aplicación',
'Unable to download app because:': 'No es posible descargar la aplicación porque:',
'Unable to download because': 'No es posible descargar porque',
'Uninstall': 'desinstalar',
'Update:': 'Actualice:',
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
'Upload existing application': 'Suba esta aplicación',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
'User ID': 'ID de Usuario',
'Version': 'Versión',
'Views': 'Vistas',
'Welcome to web2py': 'Bienvenido a web2py',
'YES': 'SI',
'additional code for your application': 'código adicional para su aplicación',
'admin disabled because no admin password': ' por falta de contraseña',
'Additional code for your application': 'Código adicional para su aplicación',
'admin disabled because no admin password': 'admin deshabilitado por falta de contraseña',
'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
'Admin language': 'Lenguaje de administración',
'administrative interface': 'interfaz administrativa',
'Administrator Password:': 'Contraseña del Administrador:',
'An error occured, please %s the page': 'Ha ocurrido un error, por favor %s la página',
'and rename it (required):': 'y renombrela (requerido):',
'and rename it:': ' y renombrelo:',
'appadmin': 'appadmin',
'appadmin is disabled because insecure channel': 'admin deshabilitado, el canal no es seguro',
'application "%s" uninstalled': 'aplicación "%s" desinstalada',
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installed with md5sum: %(digest)s',
'application compiled': 'aplicación compilada',
'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
'Application name:': 'Nombre de la aplicación:',
'are not used': 'are not used',
'are not used yet': 'are not used yet',
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
'Are you sure you want to delete plugin "%s"?': '¿Está seguro que quiere eliminar el plugin "%s"?',
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
'Are you sure you want to upgrade web2py now?': '¿Está seguro que desea actualizar web2py ahora?',
'arguments': 'argumentos',
'at char %s': 'en el caracter %s',
'at line %s': 'en la línea %s',
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
'Autocomplete': 'Autocomplete',
'Autocomplete Python Code': 'Autocompletar código Python',
'Available databases and tables': 'Bases de datos y tablas disponibles',
'back': 'atrás',
'breakpoint': 'breakpoint',
'breakpoints': 'breakpoints',
'browse': 'buscar',
'cache': 'cache',
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
'can be a git repo': 'puede ser un repositorio git',
'Cannot be empty': 'No puede estar vacío',
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
'Cannot compile: there are errors in your app:': 'No se puede compilar: hay errores en su aplicación:',
'cannot create file': 'no es posible crear archivo',
'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
'Change admin password': 'cambie contraseña admin',
'change editor settings': 'cambiar la configuración del editor',
'Change Password': 'Cambie Contraseña',
'check all': 'marcar todos',
'Check for upgrades': 'buscar actualizaciones',
'Check to delete': 'Marque para eliminar',
'Checking for upgrades...': 'Buscando actulizaciones...',
'Clean': 'limpiar',
'click here for online examples': 'haga clic aquí para ver ejemplos en línea',
'click here for the administrative interface': 'haga clic aquí para usar la interfaz administrativa',
'Click row to expand traceback': 'Click row to expand traceback',
'click to check for upgrades': 'haga clic para buscar actualizaciones',
'click to open': 'click to open',
'click to open': 'click para abrir',
'Client IP': 'IP del Cliente',
'code': 'código',
'commit (mercurial)': 'commit (mercurial)',
'Code listing': 'Listado de código',
'collapse/expand all': 'contraer/expandir todo',
'commit (mercurial)': 'confirmar (mercurial)',
'Compile': 'compilar',
'compiled application removed': 'aplicación compilada removida',
'continue': 'continuar',
'Controllers': 'Controladores',
'controllers': 'controladores',
'Count': 'Count',
'Create': 'Crear',
'create file with filename:': 'cree archivo con nombre:',
'Create new application using the Wizard': 'Crear nueva aplicación utilizando el asistente',
'create new application:': 'nombre de la nueva aplicación:',
'Create new simple application': 'Cree una nueva aplicación',
'Create/Upload': 'Create/Upload',
'created by': 'creado por',
'crontab': 'crontab',
'Current request': 'Solicitud en curso',
'Current response': 'Respuesta en curso',
'Current session': 'Sesión en curso',
'currently running': 'currently running',
'currently saved or': 'actualmente guardado o',
'customize me!': 'Adaptame!',
'data uploaded': 'datos subidos',
'database': 'base de datos',
'database %s select': 'selección en base de datos %s',
'database administration': 'administración base de datos',
'Date and Time': 'Fecha y Hora',
'db': 'db',
'Debug': 'Debug',
'defines tables': 'define tablas',
'Delete': 'Elimine',
'delete': 'eliminar',
'delete all checked': 'eliminar marcados',
'delete plugin': 'eliminar plugin',
'Delete this file (you will be asked to confirm deletion)': 'Elimine este fichero (se le pedirá confirmación)',
'Delete:': 'Elimine:',
'Deploy': 'Deploy',
'Deploy on Google App Engine': 'Instale en Google App Engine',
'Deploy to OpenShift': 'Instale en OpenShift',
'Description': 'Descripción',
'design': 'modificar',
'DESIGN': 'DISEÑO',
'Design for': 'Diseño para',
'Detailed traceback description': 'Detailed traceback description',
'details': 'detalles',
'direction: ltr': 'direction: ltr',
'Disable': 'Deshabilitar',
'docs': 'docs',
'done!': 'listo!',
'Download': 'Descargar',
'download files via http:': 'descargar archivos via http:',
'download layouts': 'descargar layouts',
'download plugins': 'descargar plugins',
'E-mail': 'Correo electrónico',
'EDIT': 'EDITAR',
'Edit': 'editar',
'Edit application': 'Editar aplicación',
'edit controller': 'editar controlador',
'edit controller:': 'edit controller:',
'Edit current record': 'Edite el registro actual',
'Edit Profile': 'Editar Perfil',
'edit views:': 'editar vistas:',
'Editing file': 'Editando archivo',
'Editing file "%s"': 'Editando archivo "%s"',
'Editing Language file': 'Editando archivo de lenguaje',
'Editing myclientapi': 'Editing myclientapi',
'Editing myemail': 'Editing myemail',
'Editing rbare': 'Editing rbare',
'Editing ul': 'Editing ul',
'Enterprise Web Framework': 'Armazón Empresarial para Internet',
'Error': 'Error',
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'errores',
'Exception instance attributes': 'Atributos de la instancia de Excepción',
'Expand Abbreviation': 'Expand Abbreviation',
'export as csv file': 'exportar como archivo CSV',
'exposes': 'expone',
'exposes:': 'expone:',
'extends': 'extiende',
'failed to compile file because:': 'failed to compile file because:',
'failed to reload module': 'recarga del módulo ha fallado',
'failed to reload module because:': 'no es posible recargar el módulo por:',
'File': 'File',
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
@@ -208,76 +175,242 @@
'file does not exist': 'archivo no existe',
'file saved on %(time)s': 'archivo guardado %(time)s',
'file saved on %s': 'archivo guardado %s',
'filter': 'filter',
'Find Next': 'Buscar próximo',
'Find Previous': 'Bucar anterior',
'First name': 'Nombre',
'Frames': 'Frames',
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
'Globals##debug': 'Globals',
'graph model': 'graph model',
'Group ID': 'ID de Grupo',
'Hello World': 'Hola Mundo',
'Help': 'ayuda',
'htmledit': 'htmledit',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Si el reporte anterior contiene un número de tiquete este indica un falla en la ejecución del controlador, antes de cualquier intento de ejecutat doctests. Esto generalmente se debe a un error en la indentación o un error por fuera del código de la función.\r\nUn titulo verde indica que todas las pruebas pasaron (si existen). En dicho caso los resultados no se muestran.',
'Import/Export': 'Importar/Exportar',
'includes': 'incluye',
'insert new': 'inserte nuevo',
'insert new %s': 'inserte nuevo %s',
'inspect attributes': 'inspect attributes',
'Install': 'instalar',
'Installed applications': 'Aplicaciones instaladas',
'Interaction at %s line %s': 'Interaction at %s line %s',
'Interactive console': 'Interactive console',
'internal error': 'error interno',
'Internal State': 'Estado Interno',
'Invalid action': 'Acción inválida',
'Invalid email': 'Correo inválido',
'invalid password': 'contraseña inválida',
'invalid password.': 'invalid password.',
'Invalid Query': 'Consulta inválida',
'invalid request': 'solicitud inválida',
'invalid ticket': 'tiquete inválido',
'Key bindings': 'Key bindings',
'Key bindings for ZenCoding Plugin': 'Key bindings for ZenCoding Plugin',
'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
'languages': 'lenguajes',
'Languages': 'Lenguajes',
'languages updated': 'lenguajes actualizados',
'Last name': 'Apellido',
'Last saved on:': 'Guardado en:',
'License for': 'Licencia para',
'loading...': 'cargando...',
'locals': 'locals',
'Locals##debug': 'Locals',
'Login': 'Inicio de sesión',
'login': 'inicio de sesión',
'manage': 'manage',
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
'Logout': 'fin de sesión',
'Lost Password': 'Contraseña perdida',
'manage': 'gestionar',
'Manage': 'Gestionar',
'merge': 'combinar',
'Models': 'Modelos',
'models': 'modelos',
'Modules': 'Módulos',
'modules': 'módulos',
'Name': 'Nombre',
'new application "%s" created': 'nueva aplicación "%s" creada',
'New application wizard': 'Asistente para nueva aplicación',
'new plugin installed': 'nuevo plugin instalado',
'New Record': 'Registro nuevo',
'new record inserted': 'nuevo registro insertado',
'New simple application': 'Nueva aplicación',
'next': 'next',
'next 100 rows': '100 filas siguientes',
'NO': 'NO',
'No databases in this application': 'No hay bases de datos en esta aplicación',
'No Interaction yet': 'No Interaction yet',
'no match': 'no encontrado',
'no package selected': 'no package selected',
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
'online designer': 'online designer',
'or alternatively': 'or alternatively',
'Or Get from URL:': 'O obtener desde una URL:',
'or import from csv file': 'o importar desde archivo CSV',
'or provide app url:': 'o provea URL de la aplicación:',
'or provide application url:': 'o provea URL de la aplicación:',
'Origin': 'Origen',
'Original/Translation': 'Original/Traducción',
'Overwrite installed app': 'sobreescriba la aplicación instalada',
'Pack all': 'empaquetar todo',
'Pack compiled': 'empaquete compiladas',
'Pack custom': 'empaquetar personalizado',
'pack plugin': 'empaquetar plugin',
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, no puede cambiar la contraseña aquí',
'Password': 'Contraseña',
'password changed': 'contraseña cambiada',
'Peeking at file': 'Visualizando archivo',
'Please': 'Please',
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" eliminado',
'Plugin "%s" in application': 'Plugin "%s" en aplicación',
'plugins': 'plugins',
'Plugins': 'Plugins',
'Plural-Forms:': 'Plural-Forms:',
'Powered by': 'Este sitio usa',
'previous 100 rows': '100 filas anteriores',
'Private files': 'Archivos privados',
'private files': 'archivos privados',
'Query:': 'Consulta:',
'Rapid Search': 'Rapid Search',
'record': 'registro',
'record does not exist': 'el registro no existe',
'record id': 'id de registro',
'Record ID': 'ID de Registro',
'refresh': 'refresh',
'Register': 'Registrese',
'Registration key': 'Contraseña de Registro',
'reload': 'reload',
'Reload routes': 'Reload routes',
'Remove compiled': 'eliminar compiladas',
'Removed Breakpoint on %s at line %s': 'Eliminado punto de ruptura en %s en la línea %s',
'Replace': 'Reemplazar',
'Replace All': 'Reemplazar todos',
'request': 'request',
'Resolve Conflict file': 'archivo Resolución de Conflicto',
'response': 'response',
'restore': 'restaurar',
'return': 'return',
'revert': 'revertir',
'Role': 'Rol',
'Rows in table': 'Filas en la tabla',
'Rows selected': 'Filas seleccionadas',
'rules are not defined': 'rules are not defined',
'Run tests in this file': 'Run tests in this file',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Running on %s': 'Running on %s',
'Save': 'Save',
'save': 'guardar',
'Save file:': 'Guardar:',
'Save file: %s': 'Guardar: %s',
'Save via Ajax': 'Guardar via Ajax',
'Saved file hash:': 'Hash del archivo guardado:',
'selected': 'seleccionado(s)',
'session': 'session',
'session expired': 'sesión expirada',
'Set Breakpoint on %s at line %s: %s': 'Establecer punto de ruptura en %s en la línea %s: %s',
'shell': 'shell',
'Site': 'sitio',
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
'Start searching': 'Iniciar búsqueda',
'Start wizard': 'Iniciar asistente',
'state': 'estado',
'Static': 'Static',
'static': 'estáticos',
'Static files': 'Archivos estáticos',
'step': 'step',
'stop': 'stop',
'submit': 'enviar',
'Submit': 'Submit',
'successful': 'exitoso',
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
'table': 'tabla',
'Table name': 'Nombre de la tabla',
'test': 'probar',
'Testing application': 'Probando aplicación',
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
'The application logic, each URL path is mapped in one exposed function in the controller': 'La lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
'The data representation, define database tables and sets': 'La representación de datos, define tablas y conjuntos de base de datos',
'The presentations layer, views are also known as templates': 'La capa de presentación, las vistas también son llamadas plantillas',
'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
'There are no controllers': 'No hay controladores',
'There are no models': 'No hay modelos',
'There are no modules': 'No hay módulos',
'There are no plugins': 'No hay plugins',
'There are no private files': 'No hay archivos privados',
'There are no static files': 'No hay archivos estáticos',
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
'There are no views': 'No hay vistas',
'These files are not served, they are only available from within your app': 'Estos archivos no son servidos, ellos solo estan disponibles para su aplicación',
'These files are served without processing, your images go here': 'Estos archivos son servidos sin procesar, sus imágenes van aquí',
'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
'this page to see if a breakpoint was hit and debug interaction is required.': 'this page to see if a breakpoint was hit and debug interaction is required.',
'Ticket': 'Tiquete',
'Ticket ID': 'Ticket ID',
'Timestamp': 'Timestamp',
'TM': 'MR',
'to previous version.': 'a la versión previa.',
'To create a plugin, name a file/folder plugin_[name]': 'Para crear un plugin, nombre un archivo/carpeta plugin_[nombre]',
'To emulate a breakpoint programatically, write:': 'To emulate a breakpoint programatically, write:',
'to use the debugger!': 'to use the debugger!',
'toggle breakpoint': 'alternar punto de ruptura',
'Toggle Fullscreen': 'Alternar pantalla completa',
'Traceback': 'Traceback',
'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
'Translation strings for the application': 'Cadenas de caracteres de traducción para la aplicación',
'try': 'intente',
'try something like': 'intente algo como',
'Try the mobile interface': 'Pruebe la interfaz móvil',
'try view': 'try view',
'Type some Python code in here and hit Return (Enter) to execute it.': 'Type some Python code in here and hit Return (Enter) to execute it.',
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
'unable to delete file plugin "%(plugin)s"': 'no es posible eliminar plugin "%(plugin)s"',
'Unable to download': 'No es posible la descarga',
'Unable to download app': 'No es posible descargar la aplicación',
'Unable to download app because:': 'No es posible descargar la aplicación porque:',
'Unable to download because': 'No es posible descargar porque',
'unable to parse csv file': 'no es posible analizar el archivo CSV',
'unable to uninstall "%s"': 'no es posible instalar "%s"',
'unable to upgrade because "%s"': 'no es posible actualizar porque "%s"',
'uncheck all': 'desmarcar todos',
'Uninstall': 'desinstalar',
'update': 'actualizar',
'update all languages': 'actualizar todos los lenguajes',
'Update:': 'Actualice:',
'upgrade now to %s': 'upgrade now to %s',
'upgrade web2py now': 'actualize web2py ahora',
'Upload': 'Subir',
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
'Upload a package:': 'Subir un paquete:',
'Upload and install packed application': 'Suba e instale una aplicación empaquetada',
'upload application:': 'subir aplicación:',
'Upload existing application': 'Suba esta aplicación',
'upload file:': 'suba archivo:',
'upload plugin file:': 'suba archivo de plugin:',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
'User ID': 'ID de Usuario',
'variables': 'variables',
'Version': 'Versión',
'versioning': 'versiones',
'Versioning': 'Versioning',
'view': 'vista',
'Views': 'Vistas',
'views': 'vistas',
'web2py Recent Tweets': 'Tweets Recientes de web2py',
'Web Framework': 'Web Framework',
'web2py is up to date': 'web2py está actualizado',
'web2py online debugger': 'web2py online debugger',
'web2py Recent Tweets': 'Tweets Recientes de web2py',
'web2py upgraded; please restart it': 'web2py actualizado; favor reiniciar',
'Welcome to web2py': 'Bienvenido a web2py',
'YES': 'SI',
'You need to set up and reach a': 'You need to set up and reach a',
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Your application will be blocked until you click an action button (next, step, continue, etc.)',
'Your can inspect variables using the console below': 'Your can inspect variables using the console below',
}

View File

@@ -5,11 +5,11 @@
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression en option tels que "field1 = \'newvalue\'". Vous ne pouvez pas mettre à jour ou supprimer les résultats d\'une jointure "a JOIN"',
'%Y-%m-%d': '%d-%m-%Y',
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
'%s %%{row} deleted': 'lignes %s supprimé',
'%s %%{row} updated': 'lignes %s mis à jour',
'(requires internet access)': '(requires internet access)',
'%s %%{row} deleted': 'lignes %s supprimées',
'%s %%{row} updated': 'lignes %s mises à jour',
'(requires internet access)': '(nécessite un accès Internet)',
'(something like "it-it")': '(quelque chose comme "it-it") ',
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
'@markmin\x01Searching: **%s** %%{file}': 'Cherche: **%s** fichiers',
'A new version of web2py is available: %s': 'Une nouvelle version de web2py est disponible: %s ',
'A new version of web2py is available: Version 1.68.2 (2009-10-21 09:59:29)\n': 'Une nouvelle version de web2py est disponible: Version 1.68.2 (2009-10-21 09:59:29)\r\n',
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATTENTION: nécessite une connexion sécurisée (HTTPS) ou être en localhost. ',
@@ -17,59 +17,59 @@
'ATTENTION: you cannot edit the running application!': "ATTENTION: vous ne pouvez pas modifier l'application qui tourne!",
'About': 'à propos',
'About application': "A propos de l'application",
'Additional code for your application': 'Additional code for your application',
'Additional code for your application': 'Code additionnel pour votre application',
'Admin is disabled because insecure channel': 'Admin est désactivé parce que canal non sécurisé',
'Admin language': 'Admin language',
'Admin language': "Language de l'admin",
'Administrator Password:': 'Mot de passe Administrateur:',
'Application name:': 'Application name:',
'Are you sure you want to delete file "%s"?': 'Etes-vous sûr de vouloir supprimer le fichier «%s»?',
'Are you sure you want to delete plugin "%s"?': 'Etes-vous sûr de vouloir effacer le plugin "%s"?',
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Application name:': "Nom de l'application:",
'Are you sure you want to delete file "%s"?': 'Êtes-vous sûr de vouloir supprimer le fichier «%s»?',
'Are you sure you want to delete plugin "%s"?': 'Êtes-vous sûr de vouloir supprimer le plugin "%s"?',
'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
'Are you sure you want to uninstall application "%s"?': "Êtes-vous sûr de vouloir désinstaller l'application «%s»?",
'Are you sure you want to upgrade web2py now?': 'Are you sure you want to upgrade web2py now?',
'Are you sure you want to upgrade web2py now?': 'Êtes-vous sûr de vouloir mettre à jour web2py maintenant?',
'Available databases and tables': 'Bases de données et tables disponible',
'Cannot be empty': 'Ne peut pas être vide',
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Ne peut pas compiler: il y a des erreurs dans votre application. corriger les erreurs et essayez à nouveau.',
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
'Change admin password': 'change admin password',
'Check for upgrades': 'check for upgrades',
'Cannot compile: there are errors in your app:': 'Ne peut pas compiler: il y a des erreurs dans votre application:',
'Change admin password': 'Changer le mot de passe admin',
'Check for upgrades': 'Vérifier les mises à jour',
'Check to delete': 'Cocher pour supprimer',
'Checking for upgrades...': 'Vérification des mises à jour ... ',
'Clean': 'nettoyer',
'Compile': 'compiler',
'Controllers': 'Contrôleurs',
'Create': 'create',
'Create': 'Créer',
'Create new simple application': 'Créer une nouvelle application',
'Current request': 'Requête actuel',
'Current request': 'Requête actuelle',
'Current response': 'Réponse actuelle',
'Current session': 'Session en cours',
'Date and Time': 'Date et heure',
'Delete': 'Supprimer',
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
'Delete this file (you will be asked to confirm deletion)': 'Supprimer ce fichier (on vous demandera de confirmer la suppression)',
'Delete:': 'Supprimer:',
'Deploy': 'deploy',
'Deploy': 'ployer',
'Deploy on Google App Engine': 'Déployer sur Google App Engine',
'EDIT': 'MODIFIER',
'Edit': 'modifier',
'Edit application': "Modifier l'application",
'Edit current record': 'Modifier cet entrée',
'Edit current record': 'Modifier cette entrée',
'Editing Language file': 'Modifier le fichier de langue',
'Editing file': 'Modifier le fichier',
'Editing file "%s"': 'Modifier le fichier "% s" ',
'Enterprise Web Framework': 'Enterprise Web Framework',
'Error logs for "%(app)s"': 'Journal d\'erreurs pour "%(app)s"',
'Errors': 'erreurs',
'Exception instance attributes': 'Exception instance attributes',
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraînera tests [passed] .',
'Exception instance attributes': "Attributs d'instance Exception",
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraîneront des tests [passed] .',
'Help': 'aide',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': "Si le rapport ci-dessus contient un numéro de ticket, cela indique une défaillance dans l'exécution du contrôleur, avant toute tentative d'exécuter les doctests. Cela est généralement dû à une erreur d'indentation ou une erreur à l'extérieur du code de la fonction.\r\nUn titre verte indique que tous les tests (si définie) passed. Dans ce cas, les résultats des essais ne sont pas affichées.",
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': "Si le rapport ci-dessus contient un numéro de ticket, cela indique une défaillance dans l'exécution du contrôleur, avant toute tentative d'exécuter les doctests. Cela est généralement dû à une erreur d'indentation ou une erreur à l'extérieur du code de la fonction.\r\nUn titre vert indique que tous les tests (si définis) sont passés. Dans ce cas, les résultats des essais ne sont pas affichées.",
'Import/Export': 'Importer/Exporter',
'Install': 'install',
'Installed applications': 'Les applications installées',
'Install': 'Installer',
'Installed applications': 'Applications installées',
'Internal State': 'État Interne',
'Invalid Query': 'Requête non valide',
'Invalid action': 'Action non valide',
'Language files (static strings) updated': 'Fichiers de langue (static strings) Mise à jour ',
'Language files (static strings) updated': 'Fichiers de langue (chaînes statiques) mis à jour ',
'Languages': 'Langues',
'Last saved on:': 'Dernière sauvegarde le:',
'License for': 'Licence pour',
@@ -79,13 +79,13 @@
'Models': 'Modèles',
'Modules': 'Modules',
'NO': 'NON',
'New Record': 'Nouvel Entrée',
'New application wizard': 'New application wizard',
'New simple application': 'New simple application',
'New Record': 'Nouvelle Entrée',
'New application wizard': 'Assistant nouvelle application',
'New simple application': 'Nouvelle application simple',
'No databases in this application': 'Aucune base de données dans cette application',
'Original/Translation': 'Original / Traduction',
'Overwrite installed app': 'overwrite installed app',
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
'Overwrite installed app': "Écraser l'application installée",
'PAM authenticated user, cannot change password here': 'Utilisateur authentifié par PAM, vous ne pouvez pas changer le mot de passe ici',
'Pack all': 'tout empaqueter',
'Pack compiled': 'paquet compilé',
'Peeking at file': 'Jeter un oeil au fichier',
@@ -97,101 +97,101 @@
'Resolve Conflict file': 'Résoudre les conflits de fichiers',
'Rows in table': 'Lignes de la table',
'Rows selected': 'Lignes sélectionnées',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Save': 'Save',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Lancer les tests dans ce fichier (pour lancer tous les fichiers, vous pouvez également utiliser le bouton nommé 'test')",
'Save': 'Enregistrer',
'Saved file hash:': 'Hash du Fichier enregistré:',
'Site': 'site',
'Start wizard': 'start wizard',
'Site': 'Site',
'Start wizard': "Démarrer l'assistant",
'Static files': 'Fichiers statiques',
'Sure you want to delete this object?': 'Vous êtes sûr de vouloir supprimer cet objet? ',
'TM': 'MD',
'Testing application': "Test de l'application",
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "requête" est une condition comme "db.table1.field1==\'value\'". Quelque chose comme "db.table1.field1==db.table2.field2" aboutit à un JOIN SQL.',
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
'There are no controllers': "Il n'existe pas de contrôleurs",
'There are no models': "Il n'existe pas de modèles",
'There are no modules': "Il n'existe pas de modules",
'There are no plugins': 'There are no plugins',
'There are no static files': "Il n'existe pas de fichiers statiques",
'There are no translators, only default language is supported': "Il n'y a pas de traducteurs, est prise en charge uniquement la langue par défaut",
'There are no views': "Il n'existe pas de vues",
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
'The application logic, each URL path is mapped in one exposed function in the controller': "La logique de l'application, chaque chemin d'URL est mappé avec une fonction exposée dans le contrôleur",
'The data representation, define database tables and sets': 'La représentation des données, définir les tables et ensembles de la base de données',
'The presentations layer, views are also known as templates': "Les couches de présentation, les vues sont également appelées modples",
'There are no controllers': "Il n'y a pas de contrôleurs",
'There are no models': "Il n'y a pas de modèles",
'There are no modules': "Il n'y a pas de modules",
'There are no plugins': "Il n'y a pas de plugins",
'There are no static files': "Il n'y a pas de fichiers statiques",
'There are no translators, only default language is supported': "Il n'y a pas de traducteurs, seule la langue par défaut est prise en charge",
'There are no views': "Il n'y a pas de vues",
'These files are served without processing, your images go here': 'Ces fichiers sont renvoyés sans traitement, vos images viennent ici',
'This is the %(filename)s template': 'Ceci est le modèle %(filename)s ',
'Ticket': 'Ticket',
'To create a plugin, name a file/folder plugin_[name]': 'Pour créer un plugin, créer un fichier /dossier plugin_[nom]',
'Translation strings for the application': 'Translation strings for the application',
'Unable to check for upgrades': 'Impossible de vérifier les mises à niveau',
'Translation strings for the application': "Chaînes de traduction pour l'application",
'Unable to check for upgrades': 'Impossible de vérifier les mises à jour',
'Unable to download': 'Impossible de télécharger',
'Unable to download app': 'Impossible de télécharger app',
'Unable to download app because:': 'Unable to download app because:',
'Unable to download because': 'Unable to download because',
'Unable to download app': "Impossible de télécharger l'app",
'Unable to download app because:': "Impossible de télécharger l'app car:",
'Unable to download because': 'Impossible de télécharger car',
'Uninstall': 'désinstaller',
'Update:': 'Mise à jour:',
'Upload & install packed application': 'Upload & install packed application',
'Upload a package:': 'Upload a package:',
'Upload existing application': 'charger une application existante',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilisez (...)&(...) pour AND, (...)|(...) pour OR, et ~(...) pour NOT et construire des requêtes plus complexes. ',
'Use an url:': 'Use an url:',
'Upload & install packed application': "Charger & installer l'application empaquetée",
'Upload a package:': 'Charger un paquet:',
'Upload existing application': 'Charger une application existante',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilisez (...)&(...) pour AND, (...)|(...) pour OR, et ~(...) pour NOT afin de construire des requêtes plus complexes. ',
'Use an url:': 'Utiliser une url:',
'Version': 'Version',
'Views': 'Vues',
'Web Framework': 'Web Framework',
'Web Framework': 'Framework Web',
'YES': 'OUI',
'additional code for your application': 'code supplémentaire pour votre application',
'admin disabled because no admin password': 'admin désactivé car aucun mot de passe admin',
'admin disabled because not supported on google app engine': 'admin désactivé car non pris en charge sur Google Apps engine',
'admin disabled because unable to access password file': "admin désactivé car incapable d'accéder au fichier mot de passe",
'administrative interface': 'administrative interface',
'admin disabled because no admin password': 'admin désactivée car aucun mot de passe admin',
'admin disabled because not supported on google app engine': 'admin désactivée car non prise en charge sur Google Apps engine',
'admin disabled because unable to access password file': "admin désactivée car incapable d'accéder au fichier mot de passe",
'administrative interface': "interface d'administration",
'and rename it (required):': 'et renommez-la (obligatoire):',
'and rename it:': 'et renommez-le:',
'appadmin': 'appadmin',
'appadmin is disabled because insecure channel': 'appadmin est désactivé parce que canal non sécurisé',
'application "%s" uninstalled': 'application "%s" désinstallé',
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installed with md5sum: %(digest)s',
'application "%s" uninstalled': 'application "%s" désinstallée',
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installée avec md5sum: %(digest)s',
'application compiled': 'application compilée',
'application is compiled and cannot be designed': "l'application est compilée et ne peut être désigné",
'application is compiled and cannot be designed': "l'application est compilée et ne peut être modifiée",
'arguments': 'arguments',
'back': 'retour',
'cache': 'cache',
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyé',
'cannot create file': 'ne peu pas créer de fichier',
'cannot upload file "%(filename)s"': 'ne peu pas charger le fichier "%(filename)s"',
'check all': 'tous vérifier ',
'click to check for upgrades': 'Cliquez pour vérifier les mises à niveau',
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyés',
'cannot create file': 'ne peut pas créer de fichier',
'cannot upload file "%(filename)s"': 'ne peut pas charger le fichier "%(filename)s"',
'check all': 'tout vérifier ',
'click to check for upgrades': 'Cliquez pour vérifier les mises jour',
'code': 'code',
'collapse/expand all': 'collapse/expand all',
'compiled application removed': 'application compilée enlevé',
'collapse/expand all': 'tout réduire/agrandir',
'compiled application removed': 'application compilée enlevée',
'controllers': 'contrôleurs',
'create file with filename:': 'créer un fichier avec nom de fichier:',
'create new application:': 'créer une nouvelle application:',
'created by': 'créé par',
'crontab': 'crontab',
'currently running': 'currently running',
'currently saved or': 'actuellement enregistrés ou',
'currently running': 'tourne actuellement',
'currently saved or': 'actuellement enregistré ou',
'data uploaded': 'données chargées',
'database': 'base de données',
'database %s select': 'base de données %s sélectionner',
'database administration': 'administration base de données',
'db': 'db',
'db': 'bdd',
'defines tables': 'définit les tables',
'delete': 'supprimer',
'delete all checked': 'supprimer tout ce qui est cocher',
'delete plugin': ' supprimer plugin',
'delete all checked': 'supprimer tout ce qui est coché',
'delete plugin': ' supprimer le plugin',
'design': 'conception',
'direction: ltr': 'direction: ltr',
'docs': 'docs',
'done!': 'fait!',
'download layouts': 'download layouts',
'download plugins': 'download plugins',
'download layouts': 'télécharger layouts',
'download plugins': 'télécharger plugins',
'edit controller': 'modifier contrôleur',
'edit views:': 'edit views:',
'export as csv file': 'exportation au format CSV',
'edit views:': 'modifier vues:',
'export as csv file': 'export au format CSV',
'exposes': 'expose',
'exposes:': 'exposes:',
'exposes:': 'expose:',
'extends': 'étend',
'failed to reload module': 'impossible de recharger le module',
'failed to reload module because:': 'failed to reload module because:',
'failed to reload module because:': 'impossible de recharger le module car:',
'file "%(filename)s" created': 'fichier "%(filename)s" créé',
'file "%(filename)s" deleted': 'fichier "%(filename)s" supprimé',
'file "%(filename)s" uploaded': 'fichier "%(filename)s" chargé',
@@ -200,7 +200,7 @@
'file does not exist': "fichier n'existe pas",
'file saved on %(time)s': 'fichier enregistré le %(time)s',
'file saved on %s': 'fichier enregistré le %s',
'filter': 'filter',
'filter': 'filtre',
'htmledit': 'edition html',
'includes': 'inclus',
'index': 'index',
@@ -219,14 +219,14 @@
'modules': 'modules',
'new application "%s" created': 'nouvelle application "%s" créée',
'new plugin installed': 'nouveau plugin installé',
'new record inserted': 'nouvelle entrée inséré',
'new record inserted': 'nouvelle entrée insérée',
'next 100 rows': '100 lignes suivantes',
'no match': 'no match',
'no match': 'aucune correspondance',
'or import from csv file': 'ou importer depuis un fichier CSV ',
'or provide app url:': 'or provide app url:',
'or provide app url:': "ou fournir l'URL de l'app:",
'or provide application url:': "ou fournir l'URL de l'application:",
'pack plugin': 'paquet plugin',
'password changed': 'password changed',
'password changed': 'mot de passe modifié',
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" supprimé',
'plugins': 'plugins',
'previous 100 rows': '100 lignes précédentes',
@@ -245,9 +245,9 @@
'submit': 'envoyer',
'table': 'table',
'test': 'tester',
'the application logic, each URL path is mapped in one exposed function in the controller': "la logique de l'application, chaque route URL est mappé dans une fonction exposée dans le contrôleur",
'the data representation, define database tables and sets': 'la représentation des données, défini les tables de bases de données et sets',
'the presentations layer, views are also known as templates': 'la couche des présentations, les vues sont également connus en tant que modèles',
'the application logic, each URL path is mapped in one exposed function in the controller': "la logique de l'application, chaque chemin d'URL est mappé dans une fonction exposée dans le contrôleur",
'the data representation, define database tables and sets': 'La représentation des données, définir les tables et ensembles de la base de données',
'the presentations layer, views are also known as templates': 'la couche de présentation, les vues sont également appelées modèles',
'these files are served without processing, your images go here': 'ces fichiers sont servis sans transformation, vos images vont ici',
'to previous version.': 'à la version précédente.',
'translation strings for the application': "chaînes de traduction de l'application",
@@ -258,22 +258,22 @@
'unable to delete file plugin "%(plugin)s"': 'impossible de supprimer le plugin "%(plugin)s"',
'unable to parse csv file': "impossible d'analyser les fichiers CSV",
'unable to uninstall "%s"': 'impossible de désinstaller "%s"',
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
'unable to upgrade because "%s"': 'impossible de mettre à jour car "%s"',
'uncheck all': 'tout décocher',
'update': 'mettre à jour',
'update all languages': 'mettre à jour toutes les langues',
'upgrade now': 'upgrade now',
'upgrade web2py now': 'upgrade web2py now',
'upload': 'upload',
'upgrade now': 'mettre à jour maintenant',
'upgrade web2py now': 'mettre à jour web2py maintenant',
'upload': 'charger',
'upload application:': "charger l'application:",
'upload file:': 'charger le fichier:',
'upload plugin file:': 'charger fichier plugin:',
'user': 'user',
'user': 'utilisateur',
'variables': 'variables',
'versioning': 'versioning',
'view': 'vue',
'views': 'vues',
'web2py Recent Tweets': 'web2py Tweets récentes',
'web2py Recent Tweets': 'Tweets récents sur web2py ',
'web2py is up to date': 'web2py est à jour',
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
'web2py upgraded; please restart it': 'web2py mis à jour; veuillez le redémarrer',
}

View File

@@ -8,8 +8,10 @@
'%Y-%m-%d': '%d/%m/%Y',
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
'(requires internet access)': '(requires internet access)',
'(requires internet access, experimental)': '(requires internet access, experimental)',
'(something like "it-it")': '(qualcosa simile a "it-it")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(file **gluon/contrib/plural_rules/%s.py** is not found)',
'@markmin\x01An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page',
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
'A new version of web2py is available: %s': 'È disponibile una nuova versione di web2py: %s',
'About': 'informazioni',
@@ -23,6 +25,7 @@
'Admin language': 'Admin language',
'administrative interface': 'administrative interface',
'Administrator Password:': 'Password Amministratore:',
'An error occured, please %s the page': 'An error occured, please %s the page',
'and rename it (required):': 'e rinominala (obbligatorio):',
'and rename it:': 'e rinominala:',
'appadmin': 'appadmin ',
@@ -42,6 +45,7 @@
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "ATTENZIONE: L'accesso richiede una connessione sicura (HTTPS) o l'esecuzione di web2py in locale (connessione su localhost)",
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTZIONE: NON ESEGUIRE PIÙ TEST IN PARALLELO (I TEST NON SONO "THREAD SAFE")',
'ATTENTION: you cannot edit the running application!': "ATTENZIONE: non puoi modificare l'applicazione correntemente in uso ",
'Autocomplete Python Code': 'Autocomplete Python Code',
'Available databases and tables': 'Database e tabelle disponibili',
'back': 'indietro',
'cache': 'cache',
@@ -52,6 +56,7 @@
'cannot create file': 'impossibile creare il file',
'cannot upload file "%(filename)s"': 'impossibile caricare il file "%(filename)s"',
'Change admin password': 'change admin password',
'change editor settings': 'change editor settings',
'change password': 'cambia password',
'check all': 'controlla tutto',
'Check for upgrades': 'check for upgrades',
@@ -73,6 +78,7 @@
'create file with filename:': 'crea un file col nome:',
'create new application:': 'create new application:',
'Create new simple application': 'Crea nuova applicazione',
'Create/Upload': 'Create/Upload',
'created by': 'creato da',
'crontab': 'crontab',
'Current request': 'Richiesta (request) corrente',
@@ -112,18 +118,19 @@
'Edit': 'modifica',
'Edit application': 'Modifica applicazione',
'edit controller': 'modifica controller',
'edit controller:': 'edit controller:',
'Edit current record': 'Modifica record corrente',
'edit profile': 'modifica profilo',
'Edit This App': 'Modifica questa applicazione',
'edit views:': 'modifica viste (view):',
'Editing file "%s"': 'Modifica del file "%s"',
'Editing Language file': 'Modifica file linguaggio',
'Editing %s': 'Editing %s',
'Enterprise Web Framework': 'Enterprise Web Framework',
'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'errori',
'Exception instance attributes': 'Exception instance attributes',
'Exit Fullscreen': 'Exit Fullscreen',
'Expand Abbreviation': 'Expand Abbreviation',
'export as csv file': 'esporta come file CSV',
'exposes': 'espone',
@@ -139,13 +146,17 @@
'file saved on %(time)s': "file salvato nell'istante %(time)s",
'file saved on %s': 'file salvato: %s',
'filter': 'filter',
'Find Next': 'Find Next',
'Find Previous': 'Find Previous',
'Frames': 'Frames',
'Functions with no doctests will result in [passed] tests.': 'I test delle funzioni senza "doctests" risulteranno sempre [passed].',
'Get from URL:': 'Get from URL:',
'Git Pull': 'Git Pull',
'Git Push': 'Git Push',
'graph model': 'graph model',
'Hello World': 'Salve Mondo',
'Help': 'aiuto',
'Hide/Show Translated strings': 'Hide/Show Translated strings',
'htmledit': 'modifica come html',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
'Import/Export': 'Importa/Esporta',
@@ -174,15 +185,16 @@
'License for': 'Licenza relativa a',
'loading...': 'caricamento...',
'locals': 'locals',
'login': 'accesso',
'Login': 'Accesso',
'login': 'accesso',
'Login to the Administrative Interface': "Accesso all'interfaccia amministrativa",
'Logout': 'uscita',
'Main Menu': 'Menu principale',
'Manage': 'Manage',
'Menu Model': 'Menu Modelli',
'merge': 'unisci',
'models': 'modelli',
'Models': 'Modelli',
'models': 'modelli',
'Modules': 'Moduli',
'modules': 'moduli',
'new application "%s" created': 'creata la nuova applicazione "%s"',
@@ -195,12 +207,17 @@
'NO': 'NO',
'No databases in this application': 'Nessun database presente in questa applicazione',
'no match': 'nessuna corrispondenza',
'no package selected': 'no package selected',
'online designer': 'online designer',
'or alternatively': 'or alternatively',
'Or Get from URL:': 'Or Get from URL:',
'or import from csv file': 'oppure importa da file CSV',
'or provide app url:': "oppure fornisci url dell'applicazione:",
'Original/Translation': 'Originale/Traduzione',
'Overwrite installed app': 'sovrascrivi applicazione installata',
'Pack all': 'crea pacchetto',
'Pack compiled': 'crea pacchetto del codice compilato',
'Pack custom': 'Pack custom',
'pack plugin': 'crea pacchetto del plugin',
'PAM authenticated user, cannot change password here': 'utente autenticato tramite PAM, impossibile modificare password qui',
'password changed': 'password modificata',
@@ -212,14 +229,19 @@
'Plural-Forms:': 'Plural-Forms:',
'Powered by': 'Powered by',
'previous 100 rows': '100 righe precedenti',
'private files': 'private files',
'Private files': 'Private files',
'private files': 'private files',
'Query:': 'Richiesta (query):',
'Rapid Search': 'Rapid Search',
'record': 'record',
'record does not exist': 'il record non esiste',
'record id': 'ID del record',
'register': 'registrazione',
'reload': 'reload',
'Reload routes': 'Reload routes',
'Remove compiled': 'rimozione codice compilato',
'Replace': 'Replace',
'Replace All': 'Replace All',
'request': 'request',
'Resolve Conflict file': 'File di risoluzione conflitto',
'response': 'response',
@@ -231,42 +253,49 @@
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Running on %s': 'Running on %s',
'Save': 'Save',
'Save file:': 'Save file:',
'Save file: %s': 'Save file: %s',
'Save via Ajax': 'Save via Ajax',
'Saved file hash:': 'Hash del file salvato:',
'selected': 'selezionato',
'session': 'session',
'session expired': 'sessions scaduta',
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
'shell': 'shell',
'Site': 'sito',
'some files could not be removed': 'non è stato possibile rimuovere alcuni files',
'Start searching': 'Start searching',
'Start wizard': 'start wizard',
'state': 'stato',
'static': 'statico',
'Static': 'Static',
'Static files': 'Files statici',
'Stylesheet': 'Foglio di stile (stylesheet)',
'submit': 'invia',
'Submit': 'Submit',
'submit': 'invia',
'successful': 'successful',
'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
'table': 'tabella',
'test': 'test',
'Testing application': 'Test applicazione in corsg',
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La richiesta (query) è una condizione come ad esempio "db.tabella1.campo1==\'valore\'". Una condizione come "db.tabella1.campo1==db.tabella2.campo2" produce un "JOIN" SQL.',
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
'the application logic, each URL path is mapped in one exposed function in the controller': 'logica dell\'applicazione, ogni percorso "URL" corrisponde ad una funzione esposta da un controller',
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
'the data representation, define database tables and sets': 'rappresentazione dei dati, definizione di tabelle di database e di "set" ',
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
'the presentations layer, views are also known as templates': 'Presentazione dell\'applicazione, viste (views, chiamate anche "templates")',
'There are no controllers': 'Non ci sono controller',
'There are no models': 'Non ci sono modelli',
'There are no modules': 'Non ci sono moduli',
'There are no plugins': 'There are no plugins',
'There are no private files': 'There are no private files',
'There are no static files': 'Non ci sono file statici',
'There are no translators, only default language is supported': 'Non ci sono traduzioni, viene solo supportato il linguaggio di base',
'There are no views': 'Non ci sono viste ("view")',
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
'these files are served without processing, your images go here': 'questi files vengono serviti così come sono, le immagini vanno qui',
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
'these files are served without processing, your images go here': 'questi files vengono serviti così come sono, le immagini vanno qui',
'This is the %(filename)s template': 'Questo è il template %(filename)s',
'Ticket': 'Ticket',
'Ticket ID': 'Ticket ID',
@@ -280,6 +309,7 @@
'Translation strings for the application': 'Translation strings for the application',
'try': 'prova',
'try something like': 'prova qualcosa come',
'Try the mobile interface': 'Try the mobile interface',
'try view': 'try view',
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
'unable to create application "%s"': 'impossibile creare applicazione "%s"',
@@ -298,6 +328,7 @@
'Update:': 'Aggiorna:',
'upgrade web2py now': 'upgrade web2py now',
'upload': 'upload',
'Upload': 'Upload',
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
'Upload a package:': 'Upload a package:',
'Upload and install packed application': 'Upload and install packed application',
@@ -308,11 +339,12 @@
'Use an url:': 'Use an url:',
'variables': 'variables',
'Version': 'Versione',
'Version %s.%s.%s %s (%s)': 'Version %s.%s.%s %s (%s)',
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
'versioning': 'sistema di versioni',
'Versioning': 'Versioning',
'view': 'vista',
'View': 'Vista',
'view': 'vista',
'Views': 'viste',
'views': 'viste',
'Web Framework': 'Web Framework',

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env python
{
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
'останній': ['останні','останніх'],
'файл': ['файли','файлів'],
'твіт': ['твіти','твітів'],
}

View File

@@ -92,7 +92,7 @@
'Database': 'База данных',
'database': 'база данных',
'database %s select': 'Выбор базы данных %s ',
'database administration': 'администраторирование базы данных',
'database administration': 'администрирование базы данных',
'Date and Time': 'Дата и время',
'db': 'бд',
'DB Model': 'Модель БД',
@@ -134,7 +134,7 @@
'Editing Language file': 'Правка языкового файла',
'Editing Plural Forms File': 'Editing Plural Forms File',
'Enterprise Web Framework': 'Enterprise Web Framework',
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"',
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'Ошибка',

View File

@@ -0,0 +1,212 @@
# coding: utf8
{
'!langcode!': 'sr-cr',
'!langname!': 'Српски (Ћирилица)',
'%Y-%m-%d': '%d-%m-%Y',
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
'(requires internet access)': '(захтијева приступ интернету)',
'(something like "it-it")': '(нешто као "it-it")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(датотека **gluon/contrib/plural_rules/%s.py** није пронађена)',
'About': 'Информације',
'About application': 'О апликацији',
'Additional code for your application': 'Додатни код за апликацију',
'admin disabled because unable to access password file': 'администрација онемогућена јер не могу приступити датотеци са лозинком',
'Admin language': 'Језик администратора',
'administrative interface': 'административни интерфејс',
'Administrator Password:': 'Лозинка администратора:',
'and rename it:': 'и преименуј у:',
'Application name:': 'Назив апликације:',
'are not used': 'није кориштено',
'are not used yet': 'није још кориштено',
'Are you sure you want to delete this object?': 'Да ли сте сигурни да желите обрисати?',
'arguments': 'arguments',
'at char %s': 'код слова %s',
'at line %s': 'на линији %s',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
'back': 'назад',
'Basics': 'Основе',
'Begin': 'Почетак',
'cache, errors and sessions cleaned': 'кеш, грешке и сесије су обрисани',
'can be a git repo': 'може бити git repo',
'cannot upload file "%(filename)s"': 'не мофу отпремити датотеку "%(filename)s"',
'Change admin password': 'Промијени лзинку администратора',
'check all': 'check all',
'Check for upgrades': 'Провјери могућност надоградње',
'Checking for upgrades...': 'Провјеравам могућност надоградње...',
'Clean': 'Прочисти',
'Click row to expand traceback': 'Click row to expand traceback',
'code': 'код',
'collapse/expand all': 'сакрити/приказати све',
'Compile': 'Компајлирај',
'Controllers': 'Контролери',
'controllers': 'контролери',
'Count': 'Count',
'Create': 'Креирај',
'create file with filename:': 'Креирај датотеку под називом:',
'Create rules': 'Креирај правила',
'created by': 'израдио',
'crontab': 'crontab',
'currently running': 'тренутно покренут',
'currently saved or': 'тренутно сачувано или',
'database administration': 'администрација базе података',
'Debug': 'Debug',
'defines tables': 'дефинише табеле',
'delete': 'обриши',
'Delete': 'Обриши',
'delete all checked': 'delete all checked',
'Delete this file (you will be asked to confirm deletion)': 'Обриши ову даатотеку (бићете упитани за потврду брисања)',
'Deploy': 'Постави',
'Deploy on Google App Engine': 'Постави на Google App Engine',
'Deploy to OpenShift': 'Постави на OpenShift',
'Detailed traceback description': 'Detailed traceback description',
'direction: ltr': 'direction: ltr',
'Disable': 'Искључи',
'docs': 'документација',
'download layouts': 'преузми layouts',
'download plugins': 'преузми plugins',
'Edit': 'Уређивање',
'edit all': 'уреди све',
'Edit application': 'Уреди апликацију',
'edit controller': 'уреди контролер',
'edit views:': 'уреди views:',
'Editing file "%s"': 'Уређивање датотеке "%s"',
'Editing Language file': 'Уређивање језичке датотеке',
'Error': 'Грешка',
'Error logs for "%(app)s"': 'Преглед грешака за "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'Грешке',
'Exception instance attributes': 'Exception instance attributes',
'Expand Abbreviation': 'Expand Abbreviation',
'exposes': 'exposes',
'exposes:': 'exposes:',
'extends': 'проширује',
'failed to compile file because:': 'нисам могао да компајлирам због:',
'File': 'Датотека',
'file does not exist': 'датотека не постоји',
'file saved on %s': 'датотека сачувана на %s',
'filter': 'филтер',
'Find Next': 'Пронађи сљедећи',
'Find Previous': 'Пронађи претходни',
'Frames': 'Frames',
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
'Generate': 'Generate',
'Get from URL:': 'Преузми са странице:',
'Git Pull': 'Git Pull',
'Git Push': 'Git Push',
'Go to Matching Pair': 'Go to Matching Pair',
'go!': 'крени!',
'Help': 'Помоћ',
'Hide/Show Translated strings': 'Сакрити/Приказати преведене ријечи',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
'includes': 'укључује',
'inspect attributes': 'inspect attributes',
'Install': 'Инсталирај',
'Installed applications': 'Инсталиране апликације',
'invalid password.': 'погрешна лозинка.',
'Key bindings': 'Пречице',
'Key bindings for ZenCoding Plugin': 'Пречице за ZenCoding Plugin',
'Language files (static strings) updated': 'Језичке датотеке су ажуриране',
'languages': 'језици',
'Languages': 'Језици',
'Last saved on:': 'Посљедња измјена:',
'License for': 'Лиценца за',
'loading...': 'преузимам...',
'locals': 'locals',
'Login': 'Пријава',
'Login to the Administrative Interface': 'Пријава за административни интерфејс',
'Logout': 'Излаз',
'Match Pair': 'Match Pair',
'Merge Lines': 'Споји линије',
'models': 'models',
'Models': 'Models',
'Modules': 'Modules',
'modules': 'modules',
'New Application Wizard': 'Чаробњак за нове апликације',
'New application wizard': 'Чаробњак за нове апликације',
'New simple application': 'Нова једноставна апликација',
'Next Edit Point': 'Next Edit Point',
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
'online designer': 'онлајн дизајнер',
'Original/Translation': 'Оргинал/Превод',
'Overwrite installed app': 'Пребриши постојећу апликацију',
'Pack all': 'Запакуј све',
'Peeking at file': 'Peeking at file',
'Plugins': 'Plugins',
'plugins': 'plugins',
'Plural-Forms:': 'Plural-Forms:',
'Powered by': 'Омогућио',
'Previous Edit Point': 'Previous Edit Point',
'Private files': 'Private files',
'private files': 'private files',
'Project Progress': 'Напредак пројекта',
'Reload routes': 'Обнови преусмјерења',
'Removed Breakpoint on %s at line %s': 'Removed Breakpoint on %s at line %s',
'Replace': 'Замијени',
'Replace All': 'Замијени све',
'request': 'request',
'response': 'response',
'restart': 'restart',
'restore': 'restore',
'revert': 'revert',
'rules are not defined': 'правила нису дефинисана',
'rules:': 'правила:',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Running on %s': 'Покренути на %s',
'Save': 'Сачувај',
'Save via Ajax': 'сачувај via Ajax',
'Saved file hash:': 'Сачувано као хаш:',
'session': 'сесија',
'session expired': 'сесија истекла',
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
'shell': 'shell',
'Site': 'Сајт',
'skip to generate': 'skip to generate',
'Start a new app': 'Покрени нову апликацију',
'Start searching': 'Покрени претрагу',
'Start wizard': 'Покрени чаробњака',
'static': 'static',
'Static files': 'Static files',
'Step': 'Корак',
'Submit': 'Прихвати',
'successful': 'успјешан',
'test': 'тест',
'Testing application': 'Тестирање апликације',
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
'There are no models': 'There are no models',
'There are no plugins': 'There are no plugins',
'There are no private files': 'There are no private files',
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
'Ticket ID': 'Ticket ID',
'Ticket Missing': 'Ticket nedostaje',
'to previous version.': 'на претходну верзију.',
'To create a plugin, name a file/folder plugin_[name]': 'To create a plugin, name a file/folder plugin_[name]',
'toggle breakpoint': 'toggle breakpoint',
'Toggle Fullscreen': 'Toggle Fullscreen',
'Traceback': 'Traceback',
'Translation strings for the application': 'Ријечи у апликацији које треба превести',
'Try the mobile interface': 'Пробај мобилни интерфејс',
'try view': 'try view',
'uncheck all': 'uncheck all',
'Uninstall': 'Деинсталирај',
'update': 'ажурирај',
'update all languages': 'ажурирај све језике',
'upload': 'Отпреми',
'Upload a package:': 'Преузми пакет:',
'Upload and install packed application': 'Преузми и инсталирај запаковану апликацију',
'upload file:': 'преузми датотеку:',
'upload plugin file:': 'преузми плагин датотеку:',
'variables': 'variables',
'Version': 'Верзија',
'Version %s.%s.%s (%s) %s': 'Верзија %s.%s.%s (%s) %s',
'Versioning': 'Versioning',
'views': 'views',
'Views': 'Views',
'Web Framework': 'Web Framework',
'web2py is up to date': 'web2py је ажуран',
'web2py Recent Tweets': 'web2py Recent Tweets',
'Wrap with Abbreviation': 'Wrap with Abbreviation',
}

View File

@@ -0,0 +1,212 @@
# coding: utf8
{
'!langcode!': 'sr-lt',
'!langname!': 'Srpski (Latinica)',
'%Y-%m-%d': '%d-%m-%Y',
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
'(requires internet access)': '(zahtijeva pristup internetu)',
'(something like "it-it")': '(nešto kao "it-it")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(datoteka **gluon/contrib/plural_rules/%s.py** nije pronađena)',
'About': 'Informacije',
'About application': 'O aplikaciji',
'Additional code for your application': 'Dodatni kod za aplikaciju',
'admin disabled because unable to access password file': 'administracija onemogućena jer ne mogu pristupiti datoteci sa lozinkom',
'Admin language': 'Jezik administratora',
'administrative interface': 'administrativni interfejs',
'Administrator Password:': 'Lozinka administratora:',
'and rename it:': 'i preimenuj u:',
'Application name:': 'Naziv aplikacije:',
'are not used': 'nije korišteno',
'are not used yet': 'nije još korišteno',
'Are you sure you want to delete this object?': 'Da li ste sigurni da želite obrisati?',
'arguments': 'arguments',
'at char %s': 'kod slova %s',
'at line %s': 'na liniji %s',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
'back': 'nazad',
'Basics': 'Osnove',
'Begin': 'Početak',
'cache, errors and sessions cleaned': 'keš, greške i sesije su obrisani',
'can be a git repo': 'može biti git repo',
'cannot upload file "%(filename)s"': 'ne mogu otpremiti datoteku "%(filename)s"',
'Change admin password': 'Promijeni lozinku administratora',
'check all': 'check all',
'Check for upgrades': 'Provjeri mogućnost nadogradnje',
'Checking for upgrades...': 'Provjeravam mogućnost nadogradnje...',
'Clean': 'Pročisti',
'Click row to expand traceback': 'Click row to expand traceback',
'code': 'kod',
'collapse/expand all': 'sakriti/prikazati sve',
'Compile': 'Kompajliraj',
'Controllers': 'Kontroleri',
'controllers': 'kontroleri',
'Count': 'Count',
'Create': 'Kreiraj',
'create file with filename:': 'Kreiraj datoteku pod nazivom:',
'Create rules': 'Kreiraj pravila',
'created by': 'izradio',
'crontab': 'crontab',
'currently running': 'trenutno pokrenut',
'currently saved or': 'trenutno sačuvano ili',
'database administration': 'administracija baze podataka',
'Debug': 'Debug',
'defines tables': 'definiše tabele',
'delete': 'obriši',
'Delete': 'Obriši',
'delete all checked': 'delete all checked',
'Delete this file (you will be asked to confirm deletion)': 'Obriši ovu datoteku (bićete upitani za potvrdu brisanja)',
'Deploy': 'Postavi',
'Deploy on Google App Engine': 'Postavi na Google App Engine',
'Deploy to OpenShift': 'Postavi na OpenShift',
'Detailed traceback description': 'Detailed traceback description',
'direction: ltr': 'direction: ltr',
'Disable': 'Isključi',
'docs': 'dokumentacija',
'download layouts': 'preuzmi layouts',
'download plugins': 'preuzmi plugins',
'Edit': 'Uređivanje',
'edit all': 'uredi sve',
'Edit application': 'Uredi aplikaciju',
'edit controller': 'uredi controller',
'edit views:': 'uredi views:',
'Editing file "%s"': 'Uređivanje datoteke "%s"',
'Editing Language file': 'Uređivanje jezičke datoteke',
'Error': 'Greška',
'Error logs for "%(app)s"': 'Pregled grešaka za "%(app)s"',
'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket',
'Errors': 'Greške',
'Exception instance attributes': 'Exception instance attributes',
'Expand Abbreviation': 'Expand Abbreviation',
'exposes': 'exposes',
'exposes:': 'exposes:',
'extends': 'proširuje',
'failed to compile file because:': 'nisam mogao da kompajliram zbog:',
'File': 'Datoteka',
'file does not exist': 'datoteka ne postoji',
'file saved on %s': 'datoteka sačuvana na %s',
'filter': 'filter',
'Find Next': 'Pronađi sljedeći',
'Find Previous': 'Pronađi prethodni',
'Frames': 'Frames',
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
'Generate': 'Generate',
'Get from URL:': 'Preuzmi sa stranice:',
'Git Pull': 'Git Pull',
'Git Push': 'Git Push',
'Go to Matching Pair': 'Go to Matching Pair',
'go!': 'kreni!',
'Help': 'Pomoć',
'Hide/Show Translated strings': 'Sakriti/Prikazati prevedene riječi',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
'includes': 'uključuje',
'inspect attributes': 'inspect attributes',
'Install': 'Instaliraj',
'Installed applications': 'Instalirane aplikacije',
'invalid password.': 'pogrešna lozinka.',
'Key bindings': 'Prečice',
'Key bindings for ZenCoding Plugin': 'Prečice za for ZenCoding Plugin',
'Language files (static strings) updated': 'Jezičke datoteke su ažurirane',
'languages': 'jezici',
'Languages': 'Jezici',
'Last saved on:': 'Posljednja izmjena:',
'License for': 'Licenca za',
'loading...': 'preuzimam...',
'locals': 'locals',
'Login': 'Prijava',
'Login to the Administrative Interface': 'Prijava za administrativni interfejs',
'Logout': 'Izlaz',
'Match Pair': 'Match Pair',
'Merge Lines': 'Spoji linije',
'models': 'models',
'Models': 'Models',
'Modules': 'Modules',
'modules': 'modules',
'New Application Wizard': 'Čarobnjak za nove aplikacije',
'New application wizard': 'Čarobnjak za nove aplikacije',
'New simple application': 'Nova jednostavna aplikacija',
'Next Edit Point': 'Next Edit Point',
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
'online designer': 'onlajn dizajner',
'Original/Translation': 'Original/Prevod',
'Overwrite installed app': 'Prebriši postojeću aplikaciju',
'Pack all': 'Zapakuj sve',
'Peeking at file': 'Peeking at file',
'Plugins': 'Plugins',
'plugins': 'plugins',
'Plural-Forms:': 'Plural-Forms:',
'Powered by': 'Omogućio',
'Previous Edit Point': 'Previous Edit Point',
'Private files': 'Private files',
'private files': 'private files',
'Project Progress': 'Napredak projekta',
'Reload routes': 'Obnovi preusmjerenja',
'Removed Breakpoint on %s at line %s': 'Removed Breakpoint on %s at line %s',
'Replace': 'Zamijeni',
'Replace All': 'Zamijeni sve',
'request': 'request',
'response': 'response',
'restart': 'restart',
'restore': 'restore',
'revert': 'revert',
'rules are not defined': 'pravila nisu definisana',
'rules:': 'pravila:',
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
'Running on %s': 'Pokrenuto na %s',
'Save': 'Sačuvaj',
'Save via Ajax': 'Sačuvaj via Ajax',
'Saved file hash:': 'Sačuvano kao haš:',
'session': 'sesija',
'session expired': 'sesija istekla',
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
'shell': 'shell',
'Site': 'Sajt',
'skip to generate': 'skip to generate',
'Start a new app': 'Pokreni novu aplikaciju',
'Start searching': 'Pokreni pretragu',
'Start wizard': 'Pokreni čarobnjaka',
'static': 'static',
'Static files': 'Static files',
'Step': 'Korak',
'Submit': 'Prihvati',
'successful': 'uspješan',
'test': 'test',
'Testing application': 'Testing application',
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
'There are no models': 'There are no models',
'There are no plugins': 'There are no plugins',
'There are no private files': 'There are no private files',
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
'Ticket ID': 'Ticket ID',
'Ticket Missing': 'Ticket nedostaje',
'to previous version.': 'na prethodnu verziju.',
'To create a plugin, name a file/folder plugin_[name]': 'To create a plugin, name a file/folder plugin_[name]',
'toggle breakpoint': 'toggle breakpoint',
'Toggle Fullscreen': 'Toggle Fullscreen',
'Traceback': 'Traceback',
'Translation strings for the application': 'Riječi u aplikaciji koje treba prevesti',
'Try the mobile interface': 'Probaj mobilni interfejs',
'try view': 'try view',
'uncheck all': 'uncheck all',
'Uninstall': 'Deinstaliraj',
'update': 'ažuriraj',
'update all languages': 'ažuriraj sve jezike',
'upload': 'Otpremi',
'Upload a package:': 'Preuzmi paket:',
'Upload and install packed application': 'Preuzmi i instaliraj zapakovanu aplikaciju',
'upload file:': 'preuzmi datoteku:',
'upload plugin file:': 'preuzmi plugin datoteku:',
'variables': 'variables',
'Version': 'Verzija',
'Version %s.%s.%s (%s) %s': 'Verzija %s.%s.%s (%s) %s',
'Versioning': 'Versioning',
'views': 'views',
'Views': 'Views',
'Web Framework': 'Web Framework',
'web2py is up to date': 'web2py je ažuran',
'web2py Recent Tweets': 'web2py Recent Tweets',
'Wrap with Abbreviation': 'Wrap with Abbreviation',
}

View File

@@ -8,13 +8,16 @@
'%s': '%s',
'%s %%{row} deleted': 'Вилучено %s %%{рядок}',
'%s %%{row} updated': 'Вилучено %s %%{рядок}',
'%s Recent Tweets': '%s останніх твітів',
'%s Recent Tweets': '%s %%{останній} %%{твіт}',
'%s students registered': '%s студентів зареєстровано',
'%Y-%m-%d': '%Y/%m/%d',
'%Y-%m-%d %H:%M:%S': '%Y/%m/%d %H:%M:%S',
'(requires internet access)': '(потрібно мати доступ в інтернет)',
'(requires internet access, experimental)': '(потрібно мати доступ в інтернет, експериментально)',
'(something like "it-it")': '(щось схоже на "uk-ua")',
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(не існує файлу **gluon/contrib/plural_rules/%s.py**)',
'@markmin\x01An error occured, please [[reload %s]] the page': 'Сталась помилка, будь-ласка [[переватажте %s]] сторінку',
"@markmin\x01Mercurial Version Control System Interface[[NEWLINE]]for application '%s'": "Інтерфейс системи контролю версій Mercurial[[NEWLINE]]для додатку '%s'",
'@markmin\x01Searching: **%s** %%{file}': 'Знайдено: **%s** %%{файл}',
'Abort': 'Припинити',
'About': 'Про',
@@ -55,6 +58,7 @@
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "УВАГА: Вхід потребує надійного (HTTPS) з'єднання або запуску на локальному комп'ютері.",
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ОБЕРЕЖНО: ТЕСТУВАННЯ НЕ Є ПОТОКО-БЕЗПЕЧНИМ, ТОЖ НЕ ЗАПУСКАЙТЕ ДЕКІЛЬКА ТЕСТІВ ОДНОЧАСНО.',
'ATTENTION: you cannot edit the running application!': 'УВАГА: Ви не можете редагувати додаток, який зараз виконуєте!',
'Autocomplete Python Code': 'Автозавершення коду на Python',
'Available databases and tables': 'Доступні бази даних та таблиці',
'back': '<< назад',
'bad_resource': 'поганий_ресурс',
@@ -75,6 +79,7 @@
'cannot create file': 'не можу створити файл',
'cannot upload file "%(filename)s"': 'не можу завантажити файл "%(filename)s"',
'Change admin password': 'Змінити пароль адміністратора',
'change editor settings': 'змінити налаштування редактора',
'check all': 'відмітити всі',
'Check for upgrades': 'Перевірити оновлення',
'Check to delete': 'Помітити на вилучення',
@@ -89,7 +94,9 @@
'Code listing': 'Лістинг',
'collapse/expand all': 'згорнути/розгорнути все',
'Command': 'Команда',
'Comment:': 'Пояснення:',
'Commit': 'Комміт',
'Commit form': 'Commit form',
'Compile': 'Компілювати',
'compiled application removed': 'скомпільований додаток вилучено',
'Condition': 'Умова',
@@ -103,6 +110,7 @@
'create file with filename:': 'створити файл з назвою:',
'create plural-form': 'створити форму множини',
'Create rules': 'Створити правила',
'Create/Upload': 'Створити/Завантажити',
'created by': 'Автор:',
'Created On': 'Створено в',
'crontab': 'таблиця cron',
@@ -150,8 +158,10 @@
'edit all': 'редагувати всі',
'Edit application': 'Налаштування додатку',
'edit controller': 'редагувати контролер',
'edit controller:': 'редагувати контролер:',
'Edit current record': 'Редагувати поточний запис',
'edit views:': 'редагувати відображення (views):',
'Editing %s': 'Редагується %s',
'Editing file "%s"': 'Редагується файл "%s"',
'Editing Language file': 'Редагується файл перекладу',
'Editing Plural Forms File': 'Редагується файл форм множини',
@@ -166,6 +176,7 @@
'Exception %(extype)s: %(exvalue)s': 'Виключення %(extype)s: %(exvalue)s',
'Exception %s': 'Виключення %s',
'Exception instance attributes': 'Атрибути примірника класу Exception (виключення)',
'Exit Fullscreen': 'Вийти з повноекранного режиму',
'Expand Abbreviation': 'Розгорнути абревіатуру',
'export as csv file': 'експортувати як файл csv',
'exposes': 'обслуговує',
@@ -186,6 +197,8 @@
'file saved on %s': 'файл збережено в %s',
'Filename': "Ім'я файлу",
'filter': 'фільтр',
'Find Next': 'Шукати наступний',
'Find Previous': 'Шукати попередній',
'Frames': 'Стек викликів',
'Functions with no doctests will result in [passed] tests.': 'Функції, в яких відсутні док-тести відносяться до функцій, які успішно пройшли тести.',
'GAE Email': 'Ел.пошта GAE',
@@ -201,6 +214,7 @@
'Google App Engine Deployment Interface': 'Інтерфейс розгортання Google App Engine',
'Google Application Id': 'Ідентифікатор Google Application',
'Goto': 'Перейти до',
'graph model': 'графова модель',
'Help': 'Допомога',
'Hide/Show Translated strings': 'Сховати/показати ВЖЕ ПЕРЕКЛАДЕНІ рядки',
'Hits': 'Спрацьовувань',
@@ -208,7 +222,7 @@
'honored only if the expression evaluates to true': 'точка зупинки активується тільки за істинності умови',
'If start the downgrade, be patient, it may take a while to rollback': 'Запустивши повернення на попередню версію, будьте терплячими, це може зайняти трохи часу',
'If start the upgrade, be patient, it may take a while to download': 'Запустивши оновлення, будьте терплячими, потрібен час для завантаження необхідних даних',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Якщо в наданому вище звіті присутня позначка про помилку (ticket number), то це вказує на збій у виконанні контролера ще до початку запуску док-тестів. Це, зазвичай, сигналізує про помилку вирівнювання тексту програми (indention error) або помилку за межами функції (error outside function code). Зелений заголовок сигналізує, що всі тести (з наявних) пройшли успішно. В цьому випадку результат тестів показано не буде.',
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\n\t\tA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Якщо в наданому вище звіті присутня позначка про помилку (ticket number), то це вказує на збій у виконанні контролера ще до початку запуску док-тестів. Це, зазвичай, сигналізує про помилку вирівнювання тексту програми (indention error) або помилку за межами функції (error outside function code).\n\t\tЗелений заголовок сигналізує, що всі тести (з наявних) пройшли успішно. В цьому випадку результат тестів показано не буде.',
'Import/Export': 'Імпорт/Експорт',
'In development, use the default Rocket webserver that is currently supported by this debugger.': 'Під час розробки , використовуйте вбудований веб-сервер Rocket, він найкраще налаштований на спільну роботу з інтерактивним ладначем.',
'includes': 'включає',
@@ -245,6 +259,8 @@
'License for': 'Ліцензія додатку',
'Line number': '№ рядка',
'LineNo': '№ рядка',
'lists by exception': 'список виключень (exceptions)',
'lists by ticket': 'список позначок (tickets)',
'loading...': 'завантаження...',
'locals': 'локальні',
'Locals##debug': 'Локальні змінні',
@@ -253,6 +269,7 @@
'Login to the Administrative Interface': 'Вхід в адміністративний інтерфейс',
'Logout': 'Вихід',
'Main Menu': 'Основне меню',
'Manage': 'Керувати',
'Manage Admin Users/Students': 'Адміністратор керування користувачами/студентами',
'Manage Students': 'Керувати студентами',
'Match Pair': 'Знайти пару',
@@ -282,6 +299,7 @@
'No databases in this application': 'Даний додаток не використовує бази даних',
'No Interaction yet': 'Ладнач не активовано',
'no match': 'співпадань нема',
'no package selected': 'пакет не вибрано',
'no permission to uninstall "%s"': 'нема прав на вилучення (uninstall) "%s"',
'No ticket_storage.txt found under /private folder': 'В каталозі /private відсутній файл ticket_storage.txt',
'Not Authorized': 'Не дозволено',
@@ -290,11 +308,14 @@
'online designer': 'дизайнер БД',
'OpenShift Deployment Interface': 'OpenShift: Інтерфейс розгортання',
'OpenShift Output': 'Вивід OpenShift',
'or alternatively': 'або альтернативно',
'Or Get from URL:': 'Або Отримати з мережі (ч/з URL):',
'or import from csv file': 'або імпортувати через csv-файл',
'Original/Translation': 'Оригінал/переклад',
'Overwrite installed app': 'Перезаписати встановлений додаток',
'Pack all': 'Запак.все',
'Pack compiled': 'Запак.компл',
'Pack all': 'Пакувати все',
'Pack compiled': 'Пакувати зкомпільоване',
'Pack custom': 'Пакувати вибране',
'pack plugin': 'запакувати втулку',
'PAM authenticated user, cannot change password here': 'Ввімкнена система ідентифікації користувачів PAM. Для зміни паролю скористайтесь командами вашої ОС ',
'password changed': 'пароль змінено',
@@ -322,13 +343,17 @@
'Query:': 'Запит:',
'RAM Cache Keys': 'Ключ ОЗП-кешу (RAM Cache)',
'Ram Cleared': "Кеш в пам'яті очищено",
'Rapid Search': 'Миттєвий пошук',
'record': 'запис',
'record does not exist': 'запису не існує',
'record id': 'Ід.запису',
'refresh': 'оновіть',
'reload': 'перевантажити',
'Reload routes': 'Перезавантажити маршрути',
'Remove compiled': 'Вилуч.компл',
'Removed Breakpoint on %s at line %s': 'Вилучено точку зупинки у %s в рядку %s',
'Replace': 'Замінити',
'Replace All': 'Замінити все',
'request': 'запит',
'requires python-git, but not installed': 'Для розгортання необхідний пакет python-git, але він не встановлений',
'resolve': "розв'язати",
@@ -349,6 +374,8 @@
'Running on %s': 'Запущено на %s',
'runonce': 'одноразово',
'Save': 'Зберегти',
'Save file:': 'Зберегти файл:',
'Save file: %s': 'Зберегти файл: %s',
'Save via Ajax': 'зберегти через Ajax',
'Saved file hash:': 'Хеш збереженого файлу:',
'search': 'пошук',
@@ -366,8 +393,10 @@
'some files could not be removed': 'деякі файли не можна вилучити',
'Sorry, could not find mercurial installed': 'Не вдалось виявити встановлену систему контролю версій Mercurial',
'Start a new app': 'Створюється новий додаток',
'Start searching': 'Розпочати пошук',
'Start wizard': 'Активувати майстра',
'state': 'стан',
'Static': 'Статичні',
'static': 'статичні',
'Static files': 'Статичні файли',
'Step': 'Крок',
@@ -376,6 +405,7 @@
'submit': 'застосувати',
'Submit': 'Застосувати',
'successful': 'успішно',
'switch to : db': 'перемкнути на : БД',
'table': 'таблиця',
'tags': 'мітки (tags)',
'Temporary': 'Тимчасово',
@@ -450,8 +480,10 @@
'Update:': 'Поновити:',
'Upgrade': 'Оновити',
'upgrade now': 'оновитись зараз',
'upgrade now to %s': 'оновити зараз до %s',
'upgrade_web2py': 'оновити web2py',
'upload': 'завантажити',
'Upload': 'Завантажити',
'Upload a package:': 'Завантажити пакет:',
'Upload and install packed application': 'Завантажити та встановити запакований додаток',
'upload file:': 'завантажити файл:',

View File

@@ -9,7 +9,8 @@ WEB2PY_VERSION_URL = WEB2PY_URL + '/examples/default/version'
# browser.
## Default editor (to change editor you need web2py.admin.editors.zip)
TEXT_EDITOR = 'codemirror' or 'ace' or 'edit_area' or 'amy'
## old editors like 'ace' or 'edit_area' or 'amy' are no longer supported
TEXT_EDITOR = 'codemirror'
## Editor Color scheme (only for ace)
TEXT_EDITOR_THEME = (

View File

@@ -8,6 +8,7 @@ from gluon.fileutils import read_file
# ## make sure administrator is on localhost or https
# ###########################################################
http_host = request.env.http_host.split(':')[0]
if request.env.web2py_runtime_gae:
@@ -49,7 +50,7 @@ def verify_password(password):
session.pam_user = None
if DEMO_MODE:
return True
elif not 'password' in _config:
elif not _config.get('password'):
return False
elif _config['password'].startswith('pam_user:'):
session.pam_user = _config['password'][9:].strip()
@@ -145,6 +146,10 @@ elif session.is_mobile == 'false':
else:
is_mobile = request.user_agent().is_mobile
if DEMO_MODE:
session.authorized = True
session.forget()
if request.controller == "webservices":
basic = request.env.http_authorization
if not basic or not basic[:6].lower() == 'basic ':

View File

@@ -8,35 +8,33 @@ def A_button(*a, **b):
b['_data-inline'] = 'true'
return A(*a, **b)
def button(href, label):
if is_mobile:
ret = A_button(SPAN(label), _href=href)
else:
ret = A(SPAN(label), _class='button', _href=href)
ret = A(SPAN(label), _class='button btn', _href=href)
return ret
def button_enable(href, app):
if os.path.exists(os.path.join(apath(app, r=request), 'DISABLED')):
label = SPAN(T('Enable'), _style='color:red')
else:
label = SPAN(T('Disable'), _style='color:green')
id = 'enable_' + app
return A(label, _class='button', _id=id, callback=href, target=id)
return A(label, _class='button btn', _id=id, callback=href, target=id)
def sp_button(href, label):
if request.user_agent().is_mobile:
ret = A_button(SPAN(label), _href=href)
else:
ret = A(SPAN(label), _class='button special', _href=href)
ret = A(SPAN(label), _class='button special btn btn-inverse', _href=href)
return ret
def helpicon():
return IMG(_src=URL('static', 'images/help.png'), _alt='help')
def searchbox(elementid):
return TAG[''](LABEL(IMG(_id="search_start", _src=URL('static', 'images/search.png'), _alt=T('filter')), _class='icon', _for=elementid), ' ', INPUT(_id=elementid, _type='text', _size=12))
return SPAN(LABEL(IMG(_id="search_start", _src=URL('static', 'images/search.png'), _alt=T('filter')),
_class='icon', _for=elementid), ' ',
INPUT(_id=elementid, _type='text', _size=12, _class="input-medium"),
_class="searchbox")

View File

@@ -21,6 +21,12 @@ if request.vars.app or request.args:
_c == 'mercurial' and _f == 'commit',
URL(_a, 'mercurial', 'commit', args=_t)))
if os.path.exists('applications/examples'):
response.menu.append(
(T('Help'), False, URL('examples', 'default', 'documentation')))
else:
response.menu.append((T('Help'), False, 'http://web2py.com/examples/default/documentation'))
if not session.authorized:
response.menu = [(T('Login'), True, URL('site'))]
else:
@@ -29,8 +35,3 @@ else:
response.menu.append((T('Debug'), False,
URL(_a, 'debug', 'interact')))
if os.path.exists('applications/examples'):
response.menu.append(
(T('Help'), False, URL('examples', 'default', 'index')))
else:
response.menu.append((T('Help'), False, 'http://web2py.com/examples'))

View File

@@ -0,0 +1,6 @@
[DEFAULT]
theme = web2py
[editor]
theme = web2py

View File

@@ -0,0 +1,72 @@
# How to contribute
- [Getting help](#getting-help-)
- [Submitting bug reports](#submitting-bug-reports-)
- [Contributing code](#contributing-code-)
## Getting help
Community discussion, questions, and informal bug reporting is done on the
[CodeMirror Google group](http://groups.google.com/group/codemirror).
## Submitting bug reports
The preferred way to report bugs is to use the
[GitHub issue tracker](http://github.com/marijnh/CodeMirror/issues). Before
reporting a bug, read these pointers.
**Note:** The issue tracker is for *bugs*, not requests for help. Questions
should be asked on the
[CodeMirror Google group](http://groups.google.com/group/codemirror) instead.
### Reporting bugs effectively
- CodeMirror is maintained by volunteers. They don't owe you anything, so be
polite. Reports with an indignant or belligerent tone tend to be moved to the
bottom of the pile.
- Include information about **the browser in which the problem occurred**. Even
if you tested several browsers, and the problem occurred in all of them,
mention this fact in the bug report. Also include browser version numbers and
the operating system that you're on.
- Mention which release of CodeMirror you're using. Preferably, try also with
the current development snapshot, to ensure the problem has not already been
fixed.
- Mention very precisely what went wrong. "X is broken" is not a good bug
report. What did you expect to happen? What happened instead? Describe the
exact steps a maintainer has to take to make the problem occur. We can not
fix something that we can not observe.
- If the problem can not be reproduced in any of the demos included in the
CodeMirror distribution, please provide an HTML document that demonstrates
the problem. The best way to do this is to go to
[jsbin.com](http://jsbin.com/ihunin/edit), enter it there, press save, and
include the resulting link in your bug report.
## Contributing code
- Make sure you have a [GitHub Account](https://github.com/signup/free)
- Fork [CodeMirror](https://github.com/marijnh/CodeMirror/)
([how to fork a repo](https://help.github.com/articles/fork-a-repo))
- Make your changes
- If your changes are easy to test or likely to regress, add tests.
Tests for the core go into `test/test.js`, some modes have their own
test suite under `mode/XXX/test.js`. Feel free to add new test
suites to modes that don't have one yet (be sure to link the new
tests into `test/index.html`).
- Follow the general code style of the rest of the project (see
below). Run `bin/lint` to verify that the linter is happy.
- Make sure all tests pass. Visit `test/index.html` in your browser to
run them.
- Submit a pull request
([how to create a pull request](https://help.github.com/articles/fork-a-repo))
### Coding standards
- 2 spaces per indentation level, no tabs.
- Include semicolons after statements.
- Note that the linter (`bin/lint`) which is run after each commit
complains about unused variables and functions. Prefix their names
with an underscore to muffle it.

View File

@@ -1,4 +1,4 @@
Copyright (C) 2012 by Marijn Haverbeke <marijnh@gmail.com>
Copyright (C) 2013 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -17,7 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Please note that some subdirectories of the CodeMirror distribution
include their own LICENSE files, and are released under different
licences.

View File

@@ -1,8 +1,11 @@
# CodeMirror [![Build Status](https://secure.travis-ci.org/marijnh/CodeMirror.png?branch=master)](http://travis-ci.org/marijnh/CodeMirror)
# CodeMirror
[![Build Status](https://secure.travis-ci.org/marijnh/CodeMirror.png?branch=master)](http://travis-ci.org/marijnh/CodeMirror)
[![NPM version](https://badge.fury.io/js/codemirror.png)](http://badge.fury.io/js/codemirror)
CodeMirror is a JavaScript component that provides a code editor in
the browser. When a mode is available for the language you are coding
in, it will color your code, and optionally help with indentation.
The project page is http://codemirror.net
The manual is at http://codemirror.net/doc/manual.html
The project page is http://codemirror.net
The manual is at http://codemirror.net/doc/manual.html
The contributing guidelines are in [CONTRIBUTING.md](https://github.com/marijnh/CodeMirror/blob/master/CONTRIBUTING.md)

View File

@@ -0,0 +1,145 @@
(function() {
"use strict";
var noOptions = {};
var nonWS = /[^\s\u00a0]/;
var Pos = CodeMirror.Pos;
function firstNonWS(str) {
var found = str.search(nonWS);
return found == -1 ? 0 : found;
}
CodeMirror.commands.toggleComment = function(cm) {
var from = cm.getCursor("start"), to = cm.getCursor("end");
cm.uncomment(from, to) || cm.lineComment(from, to);
};
CodeMirror.defineExtension("lineComment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = self.getModeAt(from);
var commentString = options.lineComment || mode.lineComment;
if (!commentString) {
if (options.blockCommentStart || mode.blockCommentStart) {
options.fullLines = true;
self.blockComment(from, to, options);
}
return;
}
var firstLine = self.getLine(from.line);
if (firstLine == null) return;
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
var pad = options.padding == null ? " " : options.padding;
var blankLines = options.commentBlankLines || from.line == to.line;
self.operation(function() {
if (options.indent) {
var baseString = firstLine.slice(0, firstNonWS(firstLine));
for (var i = from.line; i < end; ++i) {
var line = self.getLine(i), cut = baseString.length;
if (!blankLines && !nonWS.test(line)) continue;
if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
}
} else {
for (var i = from.line; i < end; ++i) {
if (blankLines || nonWS.test(self.getLine(i)))
self.replaceRange(commentString + pad, Pos(i, 0));
}
}
});
});
CodeMirror.defineExtension("blockComment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = self.getModeAt(from);
var startString = options.blockCommentStart || mode.blockCommentStart;
var endString = options.blockCommentEnd || mode.blockCommentEnd;
if (!startString || !endString) {
if ((options.lineComment || mode.lineComment) && options.fullLines != false)
self.lineComment(from, to, options);
return;
}
var end = Math.min(to.line, self.lastLine());
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
var pad = options.padding == null ? " " : options.padding;
if (from.line > end) return;
self.operation(function() {
if (options.fullLines != false) {
var lastLineHasText = nonWS.test(self.getLine(end));
self.replaceRange(pad + endString, Pos(end));
self.replaceRange(startString + pad, Pos(from.line, 0));
var lead = options.blockCommentLead || mode.blockCommentLead;
if (lead != null) for (var i = from.line + 1; i <= end; ++i)
if (i != end || lastLineHasText)
self.replaceRange(lead + pad, Pos(i, 0));
} else {
self.replaceRange(endString, to);
self.replaceRange(startString, from);
}
});
});
CodeMirror.defineExtension("uncomment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = self.getModeAt(from);
var end = Math.min(to.line, self.lastLine()), start = Math.min(from.line, end);
// Try finding line comments
var lineString = options.lineComment || mode.lineComment, lines = [];
var pad = options.padding == null ? " " : options.padding, didSomething;
lineComment: {
if (!lineString) break lineComment;
for (var i = start; i <= end; ++i) {
var line = self.getLine(i);
var found = line.indexOf(lineString);
if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment;
if (i != start && found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
lines.push(line);
}
self.operation(function() {
for (var i = start; i <= end; ++i) {
var line = lines[i - start];
var pos = line.indexOf(lineString), endPos = pos + lineString.length;
if (pos < 0) continue;
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
didSomething = true;
self.replaceRange("", Pos(i, pos), Pos(i, endPos));
}
});
if (didSomething) return true;
}
// Try block comments
var startString = options.blockCommentStart || mode.blockCommentStart;
var endString = options.blockCommentEnd || mode.blockCommentEnd;
if (!startString || !endString) return false;
var lead = options.blockCommentLead || mode.blockCommentLead;
var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end);
var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString);
if (close == -1 && start != end) {
endLine = self.getLine(--end);
close = endLine.lastIndexOf(endString);
}
if (open == -1 || close == -1) return false;
self.operation(function() {
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
Pos(end, close + endString.length));
var openEnd = open + startString.length;
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
self.replaceRange("", Pos(start, open), Pos(start, openEnd));
if (lead) for (var i = start + 1; i <= end; ++i) {
var line = self.getLine(i), found = line.indexOf(lead);
if (found == -1 || nonWS.test(line.slice(0, found))) continue;
var foundEnd = found + lead.length;
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
}
});
return true;
});
})();

View File

@@ -1,18 +1,23 @@
.CodeMirror-dialog {
position: relative;
}
.CodeMirror-dialog > div {
position: absolute;
top: 0; left: 0; right: 0;
left: 0; right: 0;
background: white;
border-bottom: 1px solid #eee;
z-index: 15;
padding: .1em .8em;
overflow: hidden;
color: #333;
}
.CodeMirror-dialog-top {
border-bottom: 1px solid #eee;
top: 0;
}
.CodeMirror-dialog-bottom {
border-top: 1px solid #eee;
bottom: 0;
}
.CodeMirror-dialog input {
border: none;
outline: none;
@@ -24,4 +29,4 @@
.CodeMirror-dialog button {
font-size: 70%;
}
}

View File

@@ -1,16 +1,21 @@
// Open simple dialogs on top of an editor. Relies on dialog.css.
(function() {
function dialogDiv(cm, template) {
function dialogDiv(cm, template, bottom) {
var wrap = cm.getWrapperElement();
var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild);
dialog.className = "CodeMirror-dialog";
dialog.innerHTML = '<div>' + template + '</div>';
var dialog;
dialog = wrap.appendChild(document.createElement("div"));
if (bottom) {
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
} else {
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
}
dialog.innerHTML = template;
return dialog;
}
CodeMirror.defineExtension("openDialog", function(template, callback) {
var dialog = dialogDiv(this, template);
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
var dialog = dialogDiv(this, template, options && options.bottom);
var closed = false, me = this;
function close() {
if (closed) return;
@@ -19,7 +24,8 @@
}
var inp = dialog.getElementsByTagName("input")[0], button;
if (inp) {
CodeMirror.connect(inp, "keydown", function(e) {
CodeMirror.on(inp, "keydown", function(e) {
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
if (e.keyCode == 13 || e.keyCode == 27) {
CodeMirror.e_stop(e);
close();
@@ -27,21 +33,25 @@
if (e.keyCode == 13) callback(inp.value);
}
});
if (options && options.onKeyUp) {
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
}
if (options && options.value) inp.value = options.value;
inp.focus();
CodeMirror.connect(inp, "blur", close);
CodeMirror.on(inp, "blur", close);
} else if (button = dialog.getElementsByTagName("button")[0]) {
CodeMirror.connect(button, "click", function() {
CodeMirror.on(button, "click", function() {
close();
me.focus();
});
button.focus();
CodeMirror.connect(button, "blur", close);
CodeMirror.on(button, "blur", close);
}
return close;
});
CodeMirror.defineExtension("openConfirm", function(template, callbacks) {
var dialog = dialogDiv(this, template);
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
var dialog = dialogDiv(this, template, options && options.bottom);
var buttons = dialog.getElementsByTagName("button");
var closed = false, me = this, blurring = 1;
function close() {
@@ -54,17 +64,17 @@
for (var i = 0; i < buttons.length; ++i) {
var b = buttons[i];
(function(callback) {
CodeMirror.connect(b, "click", function(e) {
CodeMirror.on(b, "click", function(e) {
CodeMirror.e_preventDefault(e);
close();
if (callback) callback(me);
});
})(callbacks[i]);
CodeMirror.connect(b, "blur", function() {
CodeMirror.on(b, "blur", function() {
--blurring;
setTimeout(function() { if (blurring <= 0) close(); }, 200);
});
CodeMirror.connect(b, "focus", function() { ++blurring; });
CodeMirror.on(b, "focus", function() { ++blurring; });
}
});
})();
})();

View File

@@ -0,0 +1,6 @@
.CodeMirror-fullscreen {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
height: auto;
z-index: 9;
}

View File

@@ -0,0 +1,30 @@
(function() {
"use strict";
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
if (old == CodeMirror.Init) old = false;
if (!old == !val) return;
if (val) setFullscreen(cm);
else setNormal(cm);
});
function setFullscreen(cm) {
var wrap = cm.getWrapperElement();
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
width: wrap.style.width, height: wrap.style.height};
wrap.style.width = wrap.style.height = "";
wrap.className += " CodeMirror-fullscreen";
document.documentElement.style.overflow = "hidden";
cm.refresh();
}
function setNormal(cm) {
var wrap = cm.getWrapperElement();
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
document.documentElement.style.overflow = "";
var info = cm.state.fullScreenRestore;
wrap.style.width = info.width; wrap.style.height = info.height;
window.scrollTo(info.scrollLeft, info.scrollTop);
cm.refresh();
}
})();

View File

@@ -0,0 +1,54 @@
(function() {
CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
var prev = old && old != CodeMirror.Init;
if (val && !prev) {
cm.on("focus", onFocus);
cm.on("blur", onBlur);
cm.on("change", onChange);
onChange(cm);
} else if (!val && prev) {
cm.off("focus", onFocus);
cm.off("blur", onBlur);
cm.off("change", onChange);
clearPlaceholder(cm);
var wrapper = cm.getWrapperElement();
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
}
if (val && !cm.hasFocus()) onBlur(cm);
});
function clearPlaceholder(cm) {
if (cm.state.placeholder) {
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
cm.state.placeholder = null;
}
}
function setPlaceholder(cm) {
clearPlaceholder(cm);
var elt = cm.state.placeholder = document.createElement("pre");
elt.style.cssText = "height: 0; overflow: visible";
elt.className = "CodeMirror-placeholder";
elt.appendChild(document.createTextNode(cm.getOption("placeholder")));
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
}
function onFocus(cm) {
clearPlaceholder(cm);
}
function onBlur(cm) {
if (isEmpty(cm)) setPlaceholder(cm);
}
function onChange(cm) {
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
if (cm.hasFocus()) return;
if (empty) setPlaceholder(cm);
else clearPlaceholder(cm);
}
function isEmpty(cm) {
return (cm.lineCount() === 1) && (cm.getLine(0) === "");
}
})();

View File

@@ -0,0 +1,82 @@
(function() {
var DEFAULT_BRACKETS = "()[]{}''\"\"";
var DEFAULT_EXPLODE_ON_ENTER = "[]{}";
var SPACE_CHAR_REGEX = /\s/;
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
if (old != CodeMirror.Init && old)
cm.removeKeyMap("autoCloseBrackets");
if (!val) return;
var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER;
if (typeof val == "string") pairs = val;
else if (typeof val == "object") {
if (val.pairs != null) pairs = val.pairs;
if (val.explode != null) explode = val.explode;
}
var map = buildKeymap(pairs);
if (explode) map.Enter = buildExplodeHandler(explode);
cm.addKeyMap(map);
});
function charsAround(cm, pos) {
var str = cm.getRange(CodeMirror.Pos(pos.line, pos.ch - 1),
CodeMirror.Pos(pos.line, pos.ch + 1));
return str.length == 2 ? str : null;
}
function buildKeymap(pairs) {
var map = {
name : "autoCloseBrackets",
Backspace: function(cm) {
if (cm.somethingSelected()) return CodeMirror.Pass;
var cur = cm.getCursor(), around = charsAround(cm, cur);
if (around && pairs.indexOf(around) % 2 == 0)
cm.replaceRange("", CodeMirror.Pos(cur.line, cur.ch - 1), CodeMirror.Pos(cur.line, cur.ch + 1));
else
return CodeMirror.Pass;
}
};
var closingBrackets = "";
for (var i = 0; i < pairs.length; i += 2) (function(left, right) {
if (left != right) closingBrackets += right;
function surround(cm) {
var selection = cm.getSelection();
cm.replaceSelection(left + selection + right);
}
function maybeOverwrite(cm) {
var cur = cm.getCursor(), ahead = cm.getRange(cur, CodeMirror.Pos(cur.line, cur.ch + 1));
if (ahead != right || cm.somethingSelected()) return CodeMirror.Pass;
else cm.execCommand("goCharRight");
}
map["'" + left + "'"] = function(cm) {
if (left == "'" && cm.getTokenAt(cm.getCursor()).type == "comment")
return CodeMirror.Pass;
if (cm.somethingSelected()) return surround(cm);
if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return;
var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1);
var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch), curChar = cur.ch > 0 ? line.charAt(cur.ch - 1) : "";
if (left == right && CodeMirror.isWordChar(curChar))
return CodeMirror.Pass;
if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar))
cm.replaceSelection(left + right, {head: ahead, anchor: ahead});
else
return CodeMirror.Pass;
};
if (left != right) map["'" + right + "'"] = maybeOverwrite;
})(pairs.charAt(i), pairs.charAt(i + 1));
return map;
}
function buildExplodeHandler(pairs) {
return function(cm) {
var cur = cm.getCursor(), around = charsAround(cm, cur);
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
cm.operation(function() {
var newPos = CodeMirror.Pos(cur.line + 1, 0);
cm.replaceSelection("\n\n", {anchor: newPos, head: newPos}, "+input");
cm.indentLine(cur.line + 1, null, true);
cm.indentLine(cur.line + 2, null, true);
});
};
}
})();

View File

@@ -0,0 +1,87 @@
/**
* Tag-closer extension for CodeMirror.
*
* This extension adds an "autoCloseTags" option that can be set to
* either true to get the default behavior, or an object to further
* configure its behavior.
*
* These are supported options:
*
* `whenClosing` (default true)
* Whether to autoclose when the '/' of a closing tag is typed.
* `whenOpening` (default true)
* Whether to autoclose the tag when the final '>' of an opening
* tag is typed.
* `dontCloseTags` (default is empty tags for HTML, none for XML)
* An array of tag names that should not be autoclosed.
* `indentTags` (default is block tags for HTML, none for XML)
* An array of tag names that should, when opened, cause a
* blank line to be added inside the tag, and the blank line and
* closing line to be indented.
*
* See demos/closetag.html for a usage example.
*/
(function() {
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
if (val && (old == CodeMirror.Init || !old)) {
var map = {name: "autoCloseTags"};
if (typeof val != "object" || val.whenClosing)
map["'/'"] = function(cm) { return autoCloseSlash(cm); };
if (typeof val != "object" || val.whenOpening)
map["'>'"] = function(cm) { return autoCloseGT(cm); };
cm.addKeyMap(map);
} else if (!val && (old != CodeMirror.Init && old)) {
cm.removeKeyMap("autoCloseTags");
}
});
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
"source", "track", "wbr"];
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
function autoCloseGT(cm) {
var pos = cm.getCursor(), tok = cm.getTokenAt(pos);
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass;
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html";
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
var tagName = state.tagName;
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
var lowerTagName = tagName.toLowerCase();
// Don't process the '>' at the end of an end-tag or self-closing tag
if (tok.type == "tag" && state.type == "closeTag" ||
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1)
return CodeMirror.Pass;
var doIndent = indentTags && indexOf(indentTags, lowerTagName) > -1;
var curPos = doIndent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1);
cm.replaceSelection(">" + (doIndent ? "\n\n" : "") + "</" + tagName + ">",
{head: curPos, anchor: curPos});
if (doIndent) {
cm.indentLine(pos.line + 1);
cm.indentLine(pos.line + 2);
}
}
function autoCloseSlash(cm) {
var pos = cm.getCursor(), tok = cm.getTokenAt(pos);
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
if (tok.string.charAt(0) != "<" || inner.mode.name != "xml") return CodeMirror.Pass;
var tagName = state.context && state.context.tagName;
if (tagName) cm.replaceSelection("/" + tagName + ">", "end");
}
function indexOf(collection, elt) {
if (collection.indexOf) return collection.indexOf(elt);
for (var i = 0, e = collection.length; i < e; ++i)
if (collection[i] == elt) return i;
return -1;
}
})();

View File

@@ -0,0 +1,25 @@
(function() {
'use strict';
var listRE = /^(\s*)([*+-]|(\d+)\.)(\s*)/,
unorderedBullets = '*+-';
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
var pos = cm.getCursor(),
inList = cm.getStateAfter(pos.line).list,
match;
if (!inList || !(match = cm.getLine(pos.line).match(listRE))) {
cm.execCommand('newlineAndIndent');
return;
}
var indent = match[1], after = match[4];
var bullet = unorderedBullets.indexOf(match[2]) >= 0
? match[2]
: (parseInt(match[3], 10) + 1) + '.';
cm.replaceSelection('\n' + indent + bullet + after, 'end');
};
}());

View File

@@ -0,0 +1,86 @@
(function() {
var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
(document.documentMode == null || document.documentMode < 8);
var Pos = CodeMirror.Pos;
var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
function findMatchingBracket(cm, where, strict) {
var state = cm.state.matchBrackets;
var maxScanLen = (state && state.maxScanLineLength) || 10000;
var cur = where || cm.getCursor(), line = cm.getLineHandle(cur.line), pos = cur.ch - 1;
var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
if (!match) return null;
var forward = match.charAt(1) == ">", d = forward ? 1 : -1;
if (strict && forward != (pos == cur.ch)) return null;
var style = cm.getTokenTypeAt(Pos(cur.line, pos + 1));
var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
function scan(line, lineNo, start) {
if (!line.text) return;
var pos = forward ? 0 : line.text.length - 1, end = forward ? line.text.length : -1;
if (line.text.length > maxScanLen) return null;
if (start != null) pos = start + d;
for (; pos != end; pos += d) {
var ch = line.text.charAt(pos);
if (re.test(ch) && cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style) {
var match = matching[ch];
if (match.charAt(1) == ">" == forward) stack.push(ch);
else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
else if (!stack.length) return {pos: pos, match: true};
}
}
}
for (var i = cur.line, found, e = forward ? Math.min(i + 100, cm.lineCount()) : Math.max(-1, i - 100); i != e; i+=d) {
if (i == cur.line) found = scan(line, i, pos);
else found = scan(cm.getLineHandle(i), i);
if (found) break;
}
return {from: Pos(cur.line, pos), to: found && Pos(i, found.pos),
match: found && found.match, forward: forward};
}
function matchBrackets(cm, autoclear) {
// Disable brace matching in long lines, since it'll cause hugely slow updates
var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
var found = findMatchingBracket(cm);
if (!found || cm.getLine(found.from.line).length > maxHighlightLen ||
found.to && cm.getLine(found.to.line).length > maxHighlightLen)
return;
var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
var one = cm.markText(found.from, Pos(found.from.line, found.from.ch + 1), {className: style});
var two = found.to && cm.markText(found.to, Pos(found.to.line, found.to.ch + 1), {className: style});
// Kludge to work around the IE bug from issue #1193, where text
// input stops going to the textare whever this fires.
if (ie_lt8 && cm.state.focused) cm.display.input.focus();
var clear = function() {
cm.operation(function() { one.clear(); two && two.clear(); });
};
if (autoclear) setTimeout(clear, 800);
else return clear;
}
var currentlyHighlighted = null;
function doMatchBrackets(cm) {
cm.operation(function() {
if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}
if (!cm.somethingSelected()) currentlyHighlighted = matchBrackets(cm, false);
});
}
CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
if (old && old != CodeMirror.Init)
cm.off("cursorActivity", doMatchBrackets);
if (val) {
cm.state.matchBrackets = typeof val == "object" ? val : {};
cm.on("cursorActivity", doMatchBrackets);
}
});
CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
CodeMirror.defineExtension("findMatchingBracket", function(pos, strict){
return findMatchingBracket(this, pos, strict);
});
})();

View File

@@ -0,0 +1,15 @@
CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) {
if (prev == CodeMirror.Init) prev = false;
if (prev && !val)
cm.removeOverlay("trailingspace");
else if (!prev && val)
cm.addOverlay({
token: function(stream) {
for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {}
if (i > stream.pos) { stream.pos = i; return null; }
stream.pos = l;
return "trailingspace";
},
name: "trailingspace"
});
});

View File

@@ -0,0 +1,93 @@
CodeMirror.registerHelper("fold", "brace", function(cm, start) {
var line = start.line, lineText = cm.getLine(line);
var startCh, tokenType;
function findOpening(openCh) {
for (var at = start.ch, pass = 0;;) {
var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
if (found == -1) {
if (pass == 1) break;
pass = 1;
at = lineText.length;
continue;
}
if (pass == 1 && found < start.ch) break;
tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
if (!/^(comment|string)/.test(tokenType)) return found + 1;
at = found - 1;
}
}
var startToken = "{", endToken = "}", startCh = findOpening("{");
if (startCh == null) {
startToken = "[", endToken = "]";
startCh = findOpening("[");
}
if (startCh == null) return;
var count = 1, lastLine = cm.lastLine(), end, endCh;
outer: for (var i = line; i <= lastLine; ++i) {
var text = cm.getLine(i), pos = i == line ? startCh : 0;
for (;;) {
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
if (pos == nextOpen) ++count;
else if (!--count) { end = i; endCh = pos; break outer; }
}
++pos;
}
}
if (end == null || line == end && endCh == startCh) return;
return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)};
});
CodeMirror.braceRangeFinder = CodeMirror.fold.brace; // deprecated
CodeMirror.registerHelper("fold", "import", function(cm, start) {
function hasImport(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type != "keyword" || start.string != "import") return null;
// Now find closing semicolon, return its position
for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
var text = cm.getLine(i), semi = text.indexOf(";");
if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
}
}
var start = start.line, has = hasImport(start), prev;
if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1))
return null;
for (var end = has.end;;) {
var next = hasImport(end.line + 1);
if (next == null) break;
end = next.end;
}
return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end};
});
CodeMirror.importRangeFinder = CodeMirror.fold["import"]; // deprecated
CodeMirror.registerHelper("fold", "include", function(cm, start) {
function hasInclude(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
}
var start = start.line, has = hasInclude(start);
if (has == null || hasInclude(start - 1) != null) return null;
for (var end = start;;) {
var next = hasInclude(end + 1);
if (next == null) break;
++end;
}
return {from: CodeMirror.Pos(start, has + 1),
to: cm.clipPos(CodeMirror.Pos(end))};
});
CodeMirror.includeRangeFinder = CodeMirror.fold.include; // deprecated

View File

@@ -0,0 +1,73 @@
(function() {
"use strict";
function doFold(cm, pos, options) {
var finder = options && (options.call ? options : options.rangeFinder);
if (!finder) finder = cm.getHelper(pos, "fold");
if (!finder) return;
if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
var minSize = options && options.minFoldSize || 0;
function getRange(allowFolded) {
var range = finder(cm, pos);
if (!range || range.to.line - range.from.line < minSize) return null;
var marks = cm.findMarksAt(range.from);
for (var i = 0; i < marks.length; ++i) {
if (marks[i].__isFold) {
if (!allowFolded) return null;
range.cleared = true;
marks[i].clear();
}
}
return range;
}
var range = getRange(true);
if (options && options.scanUp) while (!range && pos.line > cm.firstLine()) {
pos = CodeMirror.Pos(pos.line - 1, 0);
range = getRange(false);
}
if (!range || range.cleared) return;
var myWidget = makeWidget(options);
CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); });
var myRange = cm.markText(range.from, range.to, {
replacedWith: myWidget,
clearOnEnter: true,
__isFold: true
});
myRange.on("clear", function(from, to) {
CodeMirror.signal(cm, "unfold", cm, from, to);
});
CodeMirror.signal(cm, "fold", cm, range.from, range.to);
}
function makeWidget(options) {
var widget = (options && options.widget) || "\u2194";
if (typeof widget == "string") {
var text = document.createTextNode(widget);
widget = document.createElement("span");
widget.appendChild(text);
widget.className = "CodeMirror-foldmarker";
}
return widget;
}
// Clumsy backwards-compatible interface
CodeMirror.newFoldFunction = function(rangeFinder, widget) {
return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
};
// New-style interface
CodeMirror.defineExtension("foldCode", function(pos, options) { doFold(this, pos, options); });
CodeMirror.registerHelper("fold", "combine", function() {
var funcs = Array.prototype.slice.call(arguments, 0);
return function(cm, start) {
for (var i = 0; i < funcs.length; ++i) {
var found = funcs[i](cm, start);
if (found) return found;
}
};
});
})();

View File

@@ -0,0 +1,12 @@
CodeMirror.registerHelper("fold", "indent", function(cm, start) {
var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line);
var myIndent = CodeMirror.countColumn(firstLine, null, tabSize);
for (var i = start.line + 1, end = cm.lineCount(); i < end; ++i) {
var curLine = cm.getLine(i);
if (CodeMirror.countColumn(curLine, null, tabSize) < myIndent &&
CodeMirror.countColumn(cm.getLine(i-1), null, tabSize) > myIndent)
return {from: CodeMirror.Pos(start.line, firstLine.length),
to: CodeMirror.Pos(i, curLine.length)};
}
});
CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated

View File

@@ -0,0 +1,167 @@
(function() {
"use strict";
var Pos = CodeMirror.Pos;
function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }
var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");
function Iter(cm, line, ch, range) {
this.line = line; this.ch = ch;
this.cm = cm; this.text = cm.getLine(line);
this.min = range ? range.from : cm.firstLine();
this.max = range ? range.to - 1 : cm.lastLine();
}
function tagAt(iter, ch) {
var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));
return type && /\btag\b/.test(type);
}
function nextLine(iter) {
if (iter.line >= iter.max) return;
iter.ch = 0;
iter.text = iter.cm.getLine(++iter.line);
return true;
}
function prevLine(iter) {
if (iter.line <= iter.min) return;
iter.text = iter.cm.getLine(--iter.line);
iter.ch = iter.text.length;
return true;
}
function toTagEnd(iter) {
for (;;) {
var gt = iter.text.indexOf(">", iter.ch);
if (gt == -1) { if (nextLine(iter)) continue; else return; }
if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }
var lastSlash = iter.text.lastIndexOf("/", gt);
var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
iter.ch = gt + 1;
return selfClose ? "selfClose" : "regular";
}
}
function toTagStart(iter) {
for (;;) {
var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
if (lt == -1) { if (prevLine(iter)) continue; else return; }
if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }
xmlTagStart.lastIndex = lt;
iter.ch = lt;
var match = xmlTagStart.exec(iter.text);
if (match && match.index == lt) return match;
}
}
function toNextTag(iter) {
for (;;) {
xmlTagStart.lastIndex = iter.ch;
var found = xmlTagStart.exec(iter.text);
if (!found) { if (nextLine(iter)) continue; else return; }
if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }
iter.ch = found.index + found[0].length;
return found;
}
}
function toPrevTag(iter) {
for (;;) {
var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
if (gt == -1) { if (prevLine(iter)) continue; else return; }
if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }
var lastSlash = iter.text.lastIndexOf("/", gt);
var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
iter.ch = gt + 1;
return selfClose ? "selfClose" : "regular";
}
}
function findMatchingClose(iter, tag) {
var stack = [];
for (;;) {
var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);
if (!next || !(end = toTagEnd(iter))) return;
if (end == "selfClose") continue;
if (next[1]) { // closing tag
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {
stack.length = i;
break;
}
if (i < 0 && (!tag || tag == next[2])) return {
tag: next[2],
from: Pos(startLine, startCh),
to: Pos(iter.line, iter.ch)
};
} else { // opening tag
stack.push(next[2]);
}
}
}
function findMatchingOpen(iter, tag) {
var stack = [];
for (;;) {
var prev = toPrevTag(iter);
if (!prev) return;
if (prev == "selfClose") { toTagStart(iter); continue; }
var endLine = iter.line, endCh = iter.ch;
var start = toTagStart(iter);
if (!start) return;
if (start[1]) { // closing tag
stack.push(start[2]);
} else { // opening tag
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {
stack.length = i;
break;
}
if (i < 0 && (!tag || tag == start[2])) return {
tag: start[2],
from: Pos(iter.line, iter.ch),
to: Pos(endLine, endCh)
};
}
}
}
CodeMirror.registerHelper("fold", "xml", function(cm, start) {
var iter = new Iter(cm, start.line, 0);
for (;;) {
var openTag = toNextTag(iter), end;
if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;
if (!openTag[1] && end != "selfClose") {
var start = Pos(iter.line, iter.ch);
var close = findMatchingClose(iter, openTag[2]);
return close && {from: start, to: close.from};
}
}
});
CodeMirror.tagRangeFinder = CodeMirror.fold.xml; // deprecated
CodeMirror.findMatchingTag = function(cm, pos, range) {
var iter = new Iter(cm, pos.line, pos.ch, range);
if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
var start = end && toTagStart(iter);
if (!end || end == "selfClose" || !start || cmp(iter, pos) > 0) return;
var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
if (start[1]) { // closing tag
return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
} else { // opening tag
iter = new Iter(cm, to.line, to.ch, range);
return {open: here, close: findMatchingClose(iter, start[2]), at: "open"};
}
};
CodeMirror.findEnclosingTag = function(cm, pos, range) {
var iter = new Iter(cm, pos.line, pos.ch, range);
for (;;) {
var open = findMatchingOpen(iter);
if (!open) break;
var forward = new Iter(cm, pos.line, pos.ch, range);
var close = findMatchingClose(forward, open.tag);
if (close) return {open: open, close: close};
}
};
})();

View File

@@ -0,0 +1,337 @@
(function () {
var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" ");
var targets = ["_blank", "_self", "_top", "_parent"];
var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"];
var methods = ["get", "post", "put", "delete"];
var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"];
var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech",
"3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait",
"orientation:landscape", "device-height: [X]", "device-width: [X]"];
var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags
var data = {
a: {
attrs: {
href: null, ping: null, type: null,
media: media,
target: targets,
hreflang: langs
}
},
abbr: s,
acronym: s,
address: s,
applet: s,
area: {
attrs: {
alt: null, coords: null, href: null, target: null, ping: null,
media: media, hreflang: langs, type: null,
shape: ["default", "rect", "circle", "poly"]
}
},
article: s,
aside: s,
audio: {
attrs: {
src: null, mediagroup: null,
crossorigin: ["anonymous", "use-credentials"],
preload: ["none", "metadata", "auto"],
autoplay: ["", "autoplay"],
loop: ["", "loop"],
controls: ["", "controls"]
}
},
b: s,
base: { attrs: { href: null, target: targets } },
basefont: s,
bdi: s,
bdo: s,
big: s,
blockquote: { attrs: { cite: null } },
body: s,
br: s,
button: {
attrs: {
form: null, formaction: null, name: null, value: null,
autofocus: ["", "autofocus"],
disabled: ["", "autofocus"],
formenctype: encs,
formmethod: methods,
formnovalidate: ["", "novalidate"],
formtarget: targets,
type: ["submit", "reset", "button"]
}
},
canvas: { attrs: { width: null, height: null } },
caption: s,
center: s,
cite: s,
code: s,
col: { attrs: { span: null } },
colgroup: { attrs: { span: null } },
command: {
attrs: {
type: ["command", "checkbox", "radio"],
label: null, icon: null, radiogroup: null, command: null, title: null,
disabled: ["", "disabled"],
checked: ["", "checked"]
}
},
data: { attrs: { value: null } },
datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } },
datalist: { attrs: { data: null } },
dd: s,
del: { attrs: { cite: null, datetime: null } },
details: { attrs: { open: ["", "open"] } },
dfn: s,
dir: s,
div: s,
dl: s,
dt: s,
em: s,
embed: { attrs: { src: null, type: null, width: null, height: null } },
eventsource: { attrs: { src: null } },
fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } },
figcaption: s,
figure: s,
font: s,
footer: s,
form: {
attrs: {
action: null, name: null,
"accept-charset": charsets,
autocomplete: ["on", "off"],
enctype: encs,
method: methods,
novalidate: ["", "novalidate"],
target: targets
}
},
frame: s,
frameset: s,
h1: s, h2: s, h3: s, h4: s, h5: s, h6: s,
head: {
attrs: {},
children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"]
},
header: s,
hgroup: s,
hr: s,
html: {
attrs: { manifest: null },
children: ["head", "body"]
},
i: s,
iframe: {
attrs: {
src: null, srcdoc: null, name: null, width: null, height: null,
sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"],
seamless: ["", "seamless"]
}
},
img: {
attrs: {
alt: null, src: null, ismap: null, usemap: null, width: null, height: null,
crossorigin: ["anonymous", "use-credentials"]
}
},
input: {
attrs: {
alt: null, dirname: null, form: null, formaction: null,
height: null, list: null, max: null, maxlength: null, min: null,
name: null, pattern: null, placeholder: null, size: null, src: null,
step: null, value: null, width: null,
accept: ["audio/*", "video/*", "image/*"],
autocomplete: ["on", "off"],
autofocus: ["", "autofocus"],
checked: ["", "checked"],
disabled: ["", "disabled"],
formenctype: encs,
formmethod: methods,
formnovalidate: ["", "novalidate"],
formtarget: targets,
multiple: ["", "multiple"],
readonly: ["", "readonly"],
required: ["", "required"],
type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month",
"week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio",
"file", "submit", "image", "reset", "button"]
}
},
ins: { attrs: { cite: null, datetime: null } },
kbd: s,
keygen: {
attrs: {
challenge: null, form: null, name: null,
autofocus: ["", "autofocus"],
disabled: ["", "disabled"],
keytype: ["RSA"]
}
},
label: { attrs: { "for": null, form: null } },
legend: s,
li: { attrs: { value: null } },
link: {
attrs: {
href: null, type: null,
hreflang: langs,
media: media,
sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"]
}
},
map: { attrs: { name: null } },
mark: s,
menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } },
meta: {
attrs: {
content: null,
charset: charsets,
name: ["viewport", "application-name", "author", "description", "generator", "keywords"],
"http-equiv": ["content-language", "content-type", "default-style", "refresh"]
}
},
meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } },
nav: s,
noframes: s,
noscript: s,
object: {
attrs: {
data: null, type: null, name: null, usemap: null, form: null, width: null, height: null,
typemustmatch: ["", "typemustmatch"]
}
},
ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } },
optgroup: { attrs: { disabled: ["", "disabled"], label: null } },
option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } },
output: { attrs: { "for": null, form: null, name: null } },
p: s,
param: { attrs: { name: null, value: null } },
pre: s,
progress: { attrs: { value: null, max: null } },
q: { attrs: { cite: null } },
rp: s,
rt: s,
ruby: s,
s: s,
samp: s,
script: {
attrs: {
type: ["text/javascript"],
src: null,
async: ["", "async"],
defer: ["", "defer"],
charset: charsets
}
},
section: s,
select: {
attrs: {
form: null, name: null, size: null,
autofocus: ["", "autofocus"],
disabled: ["", "disabled"],
multiple: ["", "multiple"]
}
},
small: s,
source: { attrs: { src: null, type: null, media: null } },
span: s,
strike: s,
strong: s,
style: {
attrs: {
type: ["text/css"],
media: media,
scoped: null
}
},
sub: s,
summary: s,
sup: s,
table: s,
tbody: s,
td: { attrs: { colspan: null, rowspan: null, headers: null } },
textarea: {
attrs: {
dirname: null, form: null, maxlength: null, name: null, placeholder: null,
rows: null, cols: null,
autofocus: ["", "autofocus"],
disabled: ["", "disabled"],
readonly: ["", "readonly"],
required: ["", "required"],
wrap: ["soft", "hard"]
}
},
tfoot: s,
th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } },
thead: s,
time: { attrs: { datetime: null } },
title: s,
tr: s,
track: {
attrs: {
src: null, label: null, "default": null,
kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"],
srclang: langs
}
},
tt: s,
u: s,
ul: s,
"var": s,
video: {
attrs: {
src: null, poster: null, width: null, height: null,
crossorigin: ["anonymous", "use-credentials"],
preload: ["auto", "metadata", "none"],
autoplay: ["", "autoplay"],
mediagroup: ["movie"],
muted: ["", "muted"],
controls: ["", "controls"]
}
},
wbr: s
};
var globalAttrs = {
accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
"class": null,
contenteditable: ["true", "false"],
contextmenu: null,
dir: ["ltr", "rtl", "auto"],
draggable: ["true", "false", "auto"],
dropzone: ["copy", "move", "link", "string:", "file:"],
hidden: ["hidden"],
id: null,
inert: ["inert"],
itemid: null,
itemprop: null,
itemref: null,
itemscope: ["itemscope"],
itemtype: null,
lang: ["en", "es"],
spellcheck: ["true", "false"],
style: null,
tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"],
title: null,
translate: ["yes", "no"],
onclick: null,
rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"]
};
function populate(obj) {
for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr))
obj.attrs[attr] = globalAttrs[attr];
}
populate(s);
for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s)
populate(data[tag]);
CodeMirror.htmlSchema = data;
function htmlHint(cm, options) {
var local = {schemaInfo: data};
if (options) for (var opt in options) local[opt] = options[opt];
return CodeMirror.hint.xml(cm, local);
}
CodeMirror.htmlHint = htmlHint; // deprecated
CodeMirror.registerHelper("hint", "html", htmlHint);
})();

View File

@@ -1,8 +1,10 @@
(function () {
var Pos = CodeMirror.Pos;
function forEach(arr, f) {
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
}
function arrayContains(arr, item) {
if (!Array.prototype.indexOf) {
var i = arr.length;
@@ -16,46 +18,51 @@
return arr.indexOf(item) != -1;
}
function scriptHint(editor, keywords, getToken) {
function scriptHint(editor, keywords, getToken, options) {
// Find the token at the cursor
var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;
// If it's not a 'word-style' token, ignore the token.
if (!/^[\w$_]*$/.test(token.string)) {
if (!/^[\w$_]*$/.test(token.string)) {
token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
className: token.string == "." ? "property" : null};
type: token.string == "." ? "property" : null};
}
// If it is a property, find out what it is a property of.
while (tprop.className == "property") {
tprop = getToken(editor, {line: cur.line, ch: tprop.start});
while (tprop.type == "property") {
tprop = getToken(editor, Pos(cur.line, tprop.start));
if (tprop.string != ".") return;
tprop = getToken(editor, {line: cur.line, ch: tprop.start});
tprop = getToken(editor, Pos(cur.line, tprop.start));
if (tprop.string == ')') {
var level = 1;
do {
tprop = getToken(editor, {line: cur.line, ch: tprop.start});
tprop = getToken(editor, Pos(cur.line, tprop.start));
switch (tprop.string) {
case ')': level++; break;
case '(': level--; break;
default: break;
}
} while (level > 0);
tprop = getToken(editor, {line: cur.line, ch: tprop.start});
if (tprop.className == 'variable')
tprop.className = 'function';
else return; // no clue
tprop = getToken(editor, Pos(cur.line, tprop.start));
if (tprop.type.indexOf("variable") === 0)
tprop.type = "function";
else return; // no clue
}
if (!context) var context = [];
context.push(tprop);
}
return {list: getCompletions(token, context, keywords),
from: {line: cur.line, ch: token.start},
to: {line: cur.line, ch: token.end}};
return {list: getCompletions(token, context, keywords, options),
from: Pos(cur.line, token.start),
to: Pos(cur.line, token.end)};
}
CodeMirror.javascriptHint = function(editor) {
function javascriptHint(editor, options) {
return scriptHint(editor, javascriptKeywords,
function (e, cur) {return e.getTokenAt(cur);});
function (e, cur) {return e.getTokenAt(cur);},
options);
};
CodeMirror.javascriptHint = javascriptHint; // deprecated
CodeMirror.registerHelper("hint", "javascript", javascriptHint);
function getCoffeeScriptToken(editor, cur) {
// This getToken, it is for coffeescript, imitates the behavior of
@@ -65,19 +72,21 @@
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
token.end = token.start;
token.string = '.';
token.className = "property";
token.type = "property";
}
else if (/^\.[\w$_]*$/.test(token.string)) {
token.className = "property";
token.type = "property";
token.start++;
token.string = token.string.replace(/\./, '');
}
return token;
}
CodeMirror.coffeescriptHint = function(editor) {
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken);
};
function coffeescriptHint(editor, options) {
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
}
CodeMirror.coffeescriptHint = coffeescriptHint; // deprecated
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
"toUpperCase toLowerCase split concat match replace search").split(" ");
@@ -89,7 +98,7 @@
var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
function getCompletions(token, context, keywords) {
function getCompletions(token, context, keywords, options) {
var found = [], start = token.string;
function maybeAdd(str) {
if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
@@ -105,13 +114,15 @@
// If this is a property, see if it belongs to some object we can
// find in the current environment.
var obj = context.pop(), base;
if (obj.className == "variable")
base = window[obj.string];
else if (obj.className == "string")
if (obj.type.indexOf("variable") === 0) {
if (options && options.additionalContext)
base = options.additionalContext[obj.string];
base = base || window[obj.string];
} else if (obj.type == "string") {
base = "";
else if (obj.className == "atom")
} else if (obj.type == "atom") {
base = 1;
else if (obj.className == "function") {
} else if (obj.type == "function") {
if (window.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
(typeof window.jQuery == 'function'))
base = window.jQuery();
@@ -124,8 +135,9 @@
}
else {
// If not, just look in the window object and any local scope
// (reading into JS mode internals to get at the local variables)
// (reading into JS mode internals to get at the local and global variables)
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
gatherCompletions(window);
forEach(keywords, maybeAdd);
}

View File

@@ -1,8 +1,10 @@
(function () {
"use strict";
function forEach(arr, f) {
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
}
function arrayContains(arr, item) {
if (!Array.prototype.indexOf) {
var i = arr.length;
@@ -16,7 +18,7 @@
return arr.indexOf(item) != -1;
}
function scriptHint(editor, keywords, getToken) {
function scriptHint(editor, _keywords, getToken) {
// Find the token at the cursor
var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
// If it's not a 'word-style' token, ignore the token.
@@ -25,11 +27,11 @@
token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
className: token.string == ":" ? "pig-type" : null};
}
if (!context) var context = [];
context.push(tprop);
var completionList = getCompletions(token, context);
var completionList = getCompletions(token, context);
completionList = completionList.sort();
//prevent autocomplete for last word, instead show dropdown with one word
if(completionList.length == 1) {
@@ -37,33 +39,29 @@
}
return {list: completionList,
from: {line: cur.line, ch: token.start},
to: {line: cur.line, ch: token.end}};
from: CodeMirror.Pos(cur.line, token.start),
to: CodeMirror.Pos(cur.line, token.end)};
}
CodeMirror.pigHint = function(editor) {
function pigHint(editor) {
return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
};
function toTitleCase(str) {
return str.replace(/(?:^|\s)\w/g, function(match) {
return match.toUpperCase();
});
}
}
CodeMirror.pigHint = pigHint; // deprecated
CodeMirror.registerHelper("hint", "pig", pigHint);
var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
+ "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
+ "NEQ MATCHES TRUE FALSE";
var pigKeywordsU = pigKeywords.split(" ");
var pigKeywordsL = pigKeywords.toLowerCase().split(" ");
var pigTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP";
var pigTypesU = pigTypes.split(" ");
var pigTypesL = pigTypes.toLowerCase().split(" ");
var pigBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
var pigBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
+ "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
+ "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
+ "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
@@ -72,9 +70,9 @@
+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA "
+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER";
var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" ");
var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" ");
+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER";
var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" ");
var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" ");
var pigBuiltinsC = ("BagSize BinStorage Bloom BuildBloom ConstantSize CubeDimensions DoubleAbs "
+ "DoubleAvg DoubleBase DoubleMax DoubleMin DoubleRound DoubleSum FloatAbs FloatAvg FloatMax "
+ "FloatMin FloatRound FloatSum GenericInvoker IntAbs IntAvg IntMax IntMin IntSum "
@@ -82,13 +80,13 @@
+ "IsEmpty JsonLoader JsonMetadata JsonStorage LongAbs LongAvg LongMax LongMin LongSum MapSize "
+ "MonitoredUDF Nondeterministic OutputSchema PigStorage PigStreaming StringConcat StringMax "
+ "StringMin StringSize TextLoader TupleSize Utf8StorageConverter").split(" ").join("() ").split(" ");
function getCompletions(token, context) {
var found = [], start = token.string;
function maybeAdd(str) {
if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
}
function gatherCompletions(obj) {
if(obj == ":") {
forEach(pigTypesL, maybeAdd);
@@ -109,11 +107,11 @@
// find in the current environment.
var obj = context.pop(), base;
if (obj.className == "pig-word")
if (obj.type == "variable")
base = obj.string;
else if(obj.className == "pig-type")
else if(obj.type == "variable-3")
base = ":" + obj.string;
while (base != null && context.length)
base = base[context.pop().string];
if (base != null) gatherCompletions(base);

View File

@@ -0,0 +1,95 @@
(function () {
function forEach(arr, f) {
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
}
function arrayContains(arr, item) {
if (!Array.prototype.indexOf) {
var i = arr.length;
while (i--) {
if (arr[i] === item) {
return true;
}
}
return false;
}
return arr.indexOf(item) != -1;
}
function scriptHint(editor, _keywords, getToken) {
// Find the token at the cursor
var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
// If it's not a 'word-style' token, ignore the token.
if (!/^[\w$_]*$/.test(token.string)) {
token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
className: token.string == ":" ? "python-type" : null};
}
if (!context) var context = [];
context.push(tprop);
var completionList = getCompletions(token, context);
completionList = completionList.sort();
//prevent autocomplete for last word, instead show dropdown with one word
if(completionList.length == 1) {
completionList.push(" ");
}
return {list: completionList,
from: CodeMirror.Pos(cur.line, token.start),
to: CodeMirror.Pos(cur.line, token.end)};
}
function pythonHint(editor) {
return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
}
CodeMirror.pythonHint = pythonHint; // deprecated
CodeMirror.registerHelper("hint", "python", pythonHint);
var pythonKeywords = "and del from not while as elif global or with assert else if pass yield"
+ "break except import print class exec in raise continue finally is return def for lambda try";
var pythonKeywordsL = pythonKeywords.split(" ");
var pythonKeywordsU = pythonKeywords.toUpperCase().split(" ");
var pythonBuiltins = "abs divmod input open staticmethod all enumerate int ord str "
+ "any eval isinstance pow sum basestring execfile issubclass print super"
+ "bin file iter property tuple bool filter len range type"
+ "bytearray float list raw_input unichr callable format locals reduce unicode"
+ "chr frozenset long reload vars classmethod getattr map repr xrange"
+ "cmp globals max reversed zip compile hasattr memoryview round __import__"
+ "complex hash min set apply delattr help next setattr buffer"
+ "dict hex object slice coerce dir id oct sorted intern ";
var pythonBuiltinsL = pythonBuiltins.split(" ").join("() ").split(" ");
var pythonBuiltinsU = pythonBuiltins.toUpperCase().split(" ").join("() ").split(" ");
function getCompletions(token, context) {
var found = [], start = token.string;
function maybeAdd(str) {
if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
}
function gatherCompletions(_obj) {
forEach(pythonBuiltinsL, maybeAdd);
forEach(pythonBuiltinsU, maybeAdd);
forEach(pythonKeywordsL, maybeAdd);
forEach(pythonKeywordsU, maybeAdd);
}
if (context) {
// If this is a property, see if it belongs to some object we can
// find in the current environment.
var obj = context.pop(), base;
if (obj.type == "variable")
base = obj.string;
else if(obj.type == "variable-3")
base = ":" + obj.string;
while (base != null && context.length)
base = base[context.pop().string];
if (base != null) gatherCompletions(base);
}
return found;
}
})();

View File

@@ -0,0 +1,38 @@
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
max-width: 19em;
overflow: hidden;
white-space: pre;
color: black;
cursor: pointer;
}
.CodeMirror-hint-active {
background: #08f;
color: white;
}

View File

@@ -0,0 +1,274 @@
(function() {
"use strict";
CodeMirror.showHint = function(cm, getHints, options) {
// We want a single cursor position.
if (cm.somethingSelected()) return;
if (getHints == null) getHints = cm.getHelper(cm.getCursor(), "hint");
if (getHints == null) return;
if (cm.state.completionActive) cm.state.completionActive.close();
var completion = cm.state.completionActive = new Completion(cm, getHints, options || {});
CodeMirror.signal(cm, "startCompletion", cm);
if (completion.options.async)
getHints(cm, function(hints) { completion.showHints(hints); }, completion.options);
else
return completion.showHints(getHints(cm, completion.options));
};
function Completion(cm, getHints, options) {
this.cm = cm;
this.getHints = getHints;
this.options = options;
this.widget = this.onClose = null;
}
Completion.prototype = {
close: function() {
if (!this.active()) return;
this.cm.state.completionActive = null;
if (this.widget) this.widget.close();
if (this.onClose) this.onClose();
CodeMirror.signal(this.cm, "endCompletion", this.cm);
},
active: function() {
return this.cm.state.completionActive == this;
},
pick: function(data, i) {
var completion = data.list[i];
if (completion.hint) completion.hint(this.cm, data, completion);
else this.cm.replaceRange(getText(completion), data.from, data.to);
this.close();
},
showHints: function(data) {
if (!data || !data.list.length || !this.active()) return this.close();
if (this.options.completeSingle != false && data.list.length == 1)
this.pick(data, 0);
else
this.showWidget(data);
},
showWidget: function(data) {
this.widget = new Widget(this, data);
CodeMirror.signal(data, "shown");
var debounce = null, completion = this, finished;
var closeOn = this.options.closeCharacters || /[\s()\[\]{};:>,]/;
var startPos = this.cm.getCursor(), startLen = this.cm.getLine(startPos.line).length;
function done() {
if (finished) return;
finished = true;
completion.close();
completion.cm.off("cursorActivity", activity);
if (data) CodeMirror.signal(data, "close");
}
function update() {
if (finished) return;
CodeMirror.signal(data, "update");
if (completion.options.async)
completion.getHints(completion.cm, finishUpdate, completion.options);
else
finishUpdate(completion.getHints(completion.cm, completion.options));
}
function finishUpdate(data_) {
data = data_;
if (finished) return;
if (!data || !data.list.length) return done();
completion.widget = new Widget(completion, data);
}
function activity() {
clearTimeout(debounce);
var pos = completion.cm.getCursor(), line = completion.cm.getLine(pos.line);
if (pos.line != startPos.line || line.length - pos.ch != startLen - startPos.ch ||
pos.ch < startPos.ch || completion.cm.somethingSelected() ||
(pos.ch && closeOn.test(line.charAt(pos.ch - 1)))) {
completion.close();
} else {
debounce = setTimeout(update, 170);
if (completion.widget) completion.widget.close();
}
}
this.cm.on("cursorActivity", activity);
this.onClose = done;
}
};
function getText(completion) {
if (typeof completion == "string") return completion;
else return completion.text;
}
function buildKeyMap(options, handle) {
var baseMap = {
Up: function() {handle.moveFocus(-1);},
Down: function() {handle.moveFocus(1);},
PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
Home: function() {handle.setFocus(0);},
End: function() {handle.setFocus(handle.length - 1);},
Enter: handle.pick,
Tab: handle.pick,
Esc: handle.close
};
var ourMap = options.customKeys ? {} : baseMap;
function addBinding(key, val) {
var bound;
if (typeof val != "string")
bound = function(cm) { return val(cm, handle); };
// This mechanism is deprecated
else if (baseMap.hasOwnProperty(val))
bound = baseMap[val];
else
bound = val;
ourMap[key] = bound;
}
if (options.customKeys)
for (var key in options.customKeys) if (options.customKeys.hasOwnProperty(key))
addBinding(key, options.customKeys[key]);
if (options.extraKeys)
for (var key in options.extraKeys) if (options.extraKeys.hasOwnProperty(key))
addBinding(key, options.extraKeys[key]);
return ourMap;
}
function Widget(completion, data) {
this.completion = completion;
this.data = data;
var widget = this, cm = completion.cm, options = completion.options;
var hints = this.hints = document.createElement("ul");
hints.className = "CodeMirror-hints";
this.selectedHint = 0;
var completions = data.list;
for (var i = 0; i < completions.length; ++i) {
var elt = hints.appendChild(document.createElement("li")), cur = completions[i];
var className = "CodeMirror-hint" + (i ? "" : " CodeMirror-hint-active");
if (cur.className != null) className = cur.className + " " + className;
elt.className = className;
if (cur.render) cur.render(elt, data, cur);
else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
elt.hintId = i;
}
var pos = cm.cursorCoords(options.alignWithWord !== false ? data.from : null);
var left = pos.left, top = pos.bottom, below = true;
hints.style.left = left + "px";
hints.style.top = top + "px";
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
(options.container || document.body).appendChild(hints);
var box = hints.getBoundingClientRect();
var overlapX = box.right - winW, overlapY = box.bottom - winH;
if (overlapX > 0) {
if (box.right - box.left > winW) {
hints.style.width = (winW - 5) + "px";
overlapX -= (box.right - box.left) - winW;
}
hints.style.left = (left = pos.left - overlapX) + "px";
}
if (overlapY > 0) {
var height = box.bottom - box.top;
if (box.top - (pos.bottom - pos.top) - height > 0) {
overlapY = height + (pos.bottom - pos.top);
below = false;
} else if (height > winH) {
hints.style.height = (winH - 5) + "px";
overlapY -= height - winH;
}
hints.style.top = (top = pos.bottom - overlapY) + "px";
}
cm.addKeyMap(this.keyMap = buildKeyMap(options, {
moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
setFocus: function(n) { widget.changeActive(n); },
menuSize: function() { return widget.screenAmount(); },
length: completions.length,
close: function() { completion.close(); },
pick: function() { widget.pick(); }
}));
if (options.closeOnUnfocus !== false) {
var closingOnBlur;
cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });
cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); });
}
var startScroll = cm.getScrollInfo();
cm.on("scroll", this.onScroll = function() {
var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
var newTop = top + startScroll.top - curScroll.top;
var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
if (!below) point += hints.offsetHeight;
if (point <= editor.top || point >= editor.bottom) return completion.close();
hints.style.top = newTop + "px";
hints.style.left = (left + startScroll.left - curScroll.left) + "px";
});
CodeMirror.on(hints, "dblclick", function(e) {
var t = e.target || e.srcElement;
if (t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}
});
CodeMirror.on(hints, "click", function(e) {
var t = e.target || e.srcElement;
if (t.hintId != null) widget.changeActive(t.hintId);
});
CodeMirror.on(hints, "mousedown", function() {
setTimeout(function(){cm.focus();}, 20);
});
CodeMirror.signal(data, "select", completions[0], hints.firstChild);
return true;
}
Widget.prototype = {
close: function() {
if (this.completion.widget != this) return;
this.completion.widget = null;
this.hints.parentNode.removeChild(this.hints);
this.completion.cm.removeKeyMap(this.keyMap);
var cm = this.completion.cm;
if (this.completion.options.closeOnUnfocus !== false) {
cm.off("blur", this.onBlur);
cm.off("focus", this.onFocus);
}
cm.off("scroll", this.onScroll);
},
pick: function() {
this.completion.pick(this.data, this.selectedHint);
},
changeActive: function(i, avoidWrap) {
if (i >= this.data.list.length)
i = avoidWrap ? this.data.list.length - 1 : 0;
else if (i < 0)
i = avoidWrap ? 0 : this.data.list.length - 1;
if (this.selectedHint == i) return;
var node = this.hints.childNodes[this.selectedHint];
node.className = node.className.replace(" CodeMirror-hint-active", "");
node = this.hints.childNodes[this.selectedHint = i];
node.className += " CodeMirror-hint-active";
if (node.offsetTop < this.hints.scrollTop)
this.hints.scrollTop = node.offsetTop - 3;
else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
},
screenAmount: function() {
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
}
};
})();

View File

@@ -0,0 +1,68 @@
(function() {
"use strict";
var Pos = CodeMirror.Pos;
function getHints(cm, options) {
var tags = options && options.schemaInfo;
var quote = (options && options.quoteChar) || '"';
if (!tags) return;
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
var inner = CodeMirror.innerMode(cm.getMode(), token.state);
if (inner.mode.name != "xml") return;
var result = [], replaceToken = false, prefix;
var isTag = token.string.charAt(0) == "<";
if (!inner.state.tagName || isTag) { // Tag completion
if (isTag) {
prefix = token.string.slice(1);
replaceToken = true;
}
var cx = inner.state.context, curTag = cx && tags[cx.tagName];
var childList = cx ? curTag && curTag.children : tags["!top"];
if (childList) {
for (var i = 0; i < childList.length; ++i) if (!prefix || childList[i].indexOf(prefix) == 0)
result.push("<" + childList[i]);
} else {
for (var name in tags) if (tags.hasOwnProperty(name) && name != "!top" && (!prefix || name.indexOf(prefix) == 0))
result.push("<" + name);
}
if (cx && (!prefix || ("/" + cx.tagName).indexOf(prefix) == 0))
result.push("</" + cx.tagName + ">");
} else {
// Attribute completion
var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs;
if (!attrs) return;
if (token.type == "string" || token.string == "=") { // A value
var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)),
Pos(cur.line, token.type == "string" ? token.start : token.end));
var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues;
if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;
if (token.type == "string") {
prefix = token.string;
if (/['"]/.test(token.string.charAt(0))) {
quote = token.string.charAt(0);
prefix = token.string.slice(1);
}
replaceToken = true;
}
for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].indexOf(prefix) == 0)
result.push(quote + atValues[i] + quote);
} else { // An attribute name
if (token.type == "attribute") {
prefix = token.string;
replaceToken = true;
}
for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.indexOf(prefix) == 0))
result.push(attr);
}
}
return {
list: result,
from: replaceToken ? Pos(cur.line, token.start) : cur,
to: replaceToken ? Pos(cur.line, token.end) : cur
};
}
CodeMirror.xmlHint = getHints; // deprecated
CodeMirror.registerHelper("hint", "xml", getHints);
})();

View File

@@ -0,0 +1,27 @@
// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js
// declare global: coffeelint
CodeMirror.registerHelper("lint", "coffeescript", function(text) {
var found = [];
var parseError = function(err) {
var loc = err.lineNumber;
found.push({from: CodeMirror.Pos(loc-1, 0),
to: CodeMirror.Pos(loc, 0),
severity: err.level,
message: err.message});
};
try {
var res = coffeelint.lint(text);
for(var i = 0; i < res.length; i++) {
parseError(res[i]);
}
} catch(e) {
found.push({from: CodeMirror.Pos(e.location.first_line, 0),
to: CodeMirror.Pos(e.location.last_line, e.location.last_column),
severity: 'error',
message: e.message});
}
return found;
});
CodeMirror.coffeeValidator = CodeMirror.lint.coffeescript; // deprecated

View File

@@ -0,0 +1,126 @@
(function() {
"use strict";
// declare global: JSHINT
var bogus = [ "Dangerous comment" ];
var warnings = [ [ "Expected '{'",
"Statement body should be inside '{ }' braces." ] ];
var errors = [ "Missing semicolon", "Extra comma", "Missing property name",
"Unmatched ", " and instead saw", " is not defined",
"Unclosed string", "Stopping, unable to continue" ];
function validator(text, options) {
JSHINT(text, options);
var errors = JSHINT.data().errors, result = [];
if (errors) parseErrors(errors, result);
return result;
}
CodeMirror.registerHelper("lint", "javascript", validator);
CodeMirror.javascriptValidator = CodeMirror.lint.javascript; // deprecated
function cleanup(error) {
// All problems are warnings by default
fixWith(error, warnings, "warning", true);
fixWith(error, errors, "error");
return isBogus(error) ? null : error;
}
function fixWith(error, fixes, severity, force) {
var description, fix, find, replace, found;
description = error.description;
for ( var i = 0; i < fixes.length; i++) {
fix = fixes[i];
find = (typeof fix === "string" ? fix : fix[0]);
replace = (typeof fix === "string" ? null : fix[1]);
found = description.indexOf(find) !== -1;
if (force || found) {
error.severity = severity;
}
if (found && replace) {
error.description = replace;
}
}
}
function isBogus(error) {
var description = error.description;
for ( var i = 0; i < bogus.length; i++) {
if (description.indexOf(bogus[i]) !== -1) {
return true;
}
}
return false;
}
function parseErrors(errors, output) {
for ( var i = 0; i < errors.length; i++) {
var error = errors[i];
if (error) {
var linetabpositions, index;
linetabpositions = [];
// This next block is to fix a problem in jshint. Jshint
// replaces
// all tabs with spaces then performs some checks. The error
// positions (character/space) are then reported incorrectly,
// not taking the replacement step into account. Here we look
// at the evidence line and try to adjust the character position
// to the correct value.
if (error.evidence) {
// Tab positions are computed once per line and cached
var tabpositions = linetabpositions[error.line];
if (!tabpositions) {
var evidence = error.evidence;
tabpositions = [];
// ugggh phantomjs does not like this
// forEachChar(evidence, function(item, index) {
Array.prototype.forEach.call(evidence, function(item,
index) {
if (item === '\t') {
// First col is 1 (not 0) to match error
// positions
tabpositions.push(index + 1);
}
});
linetabpositions[error.line] = tabpositions;
}
if (tabpositions.length > 0) {
var pos = error.character;
tabpositions.forEach(function(tabposition) {
if (pos > tabposition) pos -= 1;
});
error.character = pos;
}
}
var start = error.character - 1, end = start + 1;
if (error.evidence) {
index = error.evidence.substring(start).search(/.\b/);
if (index > -1) {
end += index;
}
}
// Convert to format expected by validation service
error.description = error.reason;// + "(jshint)";
error.start = error.character;
error.end = end;
error = cleanup(error);
if (error)
output.push({message: error.description,
severity: error.severity,
from: CodeMirror.Pos(error.line - 1, start),
to: CodeMirror.Pos(error.line - 1, end)});
}
}
}
})();

View File

@@ -0,0 +1,17 @@
// Depends on jsonlint.js from https://github.com/zaach/jsonlint
// declare global: jsonlint
CodeMirror.registerHelper("lint", "json", function(text) {
var found = [];
jsonlint.parseError = function(str, hash) {
var loc = hash.loc;
found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
message: str});
};
try { jsonlint.parse(text); }
catch(e) {}
return found;
});
CodeMirror.jsonValidator = CodeMirror.lint.json; // deprecated

View File

@@ -0,0 +1,72 @@
/* The lint marker gutter */
.CodeMirror-lint-markers {
width: 16px;
}
.CodeMirror-lint-tooltip {
background-color: infobackground;
border: 1px solid black;
border-radius: 4px 4px 4px 4px;
color: infotext;
font-family: monospace;
font-size: 10pt;
overflow: hidden;
padding: 2px 5px;
position: fixed;
white-space: pre;
z-index: 100;
max-width: 600px;
opacity: 0;
transition: opacity .4s;
-moz-transition: opacity .4s;
-webkit-transition: opacity .4s;
-o-transition: opacity .4s;
-ms-transition: opacity .4s;
}
.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
background-position: left bottom;
background-repeat: repeat-x;
}
.CodeMirror-lint-mark-error {
background-image:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")
;
}
.CodeMirror-lint-mark-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
}
.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
background-position: center center;
background-repeat: no-repeat;
cursor: pointer;
display: inline-block;
height: 16px;
width: 16px;
vertical-align: middle;
position: relative;
}
.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
padding-left: 18px;
background-position: top left;
background-repeat: no-repeat;
}
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
}
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
}
.CodeMirror-lint-marker-multiple {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: right bottom;
width: 100%; height: 100%;
}

View File

@@ -0,0 +1,203 @@
(function() {
"use strict";
var GUTTER_ID = "CodeMirror-lint-markers";
var SEVERITIES = /^(?:error|warning)$/;
function showTooltip(e, content) {
var tt = document.createElement("div");
tt.className = "CodeMirror-lint-tooltip";
tt.appendChild(content.cloneNode(true));
document.body.appendChild(tt);
function position(e) {
if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
tt.style.left = (e.clientX + 5) + "px";
}
CodeMirror.on(document, "mousemove", position);
position(e);
if (tt.style.opacity != null) tt.style.opacity = 1;
return tt;
}
function rm(elt) {
if (elt.parentNode) elt.parentNode.removeChild(elt);
}
function hideTooltip(tt) {
if (!tt.parentNode) return;
if (tt.style.opacity == null) rm(tt);
tt.style.opacity = 0;
setTimeout(function() { rm(tt); }, 600);
}
function showTooltipFor(e, content, node) {
var tooltip = showTooltip(e, content);
function hide() {
CodeMirror.off(node, "mouseout", hide);
if (tooltip) { hideTooltip(tooltip); tooltip = null; }
}
var poll = setInterval(function() {
if (tooltip) for (var n = node;; n = n.parentNode) {
if (n == document.body) return;
if (!n) { hide(); break; }
}
if (!tooltip) return clearInterval(poll);
}, 400);
CodeMirror.on(node, "mouseout", hide);
}
function LintState(cm, options, hasGutter) {
this.marked = [];
this.options = options;
this.timeout = null;
this.hasGutter = hasGutter;
this.onMouseOver = function(e) { onMouseOver(cm, e); };
}
function parseOptions(cm, options) {
if (options instanceof Function) return {getAnnotations: options};
if (!options || options === true) options = {};
if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");
if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
return options;
}
function clearMarks(cm) {
var state = cm.state.lint;
if (state.hasGutter) cm.clearGutter(GUTTER_ID);
for (var i = 0; i < state.marked.length; ++i)
state.marked[i].clear();
state.marked.length = 0;
}
function makeMarker(labels, severity, multiple, tooltips) {
var marker = document.createElement("div"), inner = marker;
marker.className = "CodeMirror-lint-marker-" + severity;
if (multiple) {
inner = marker.appendChild(document.createElement("div"));
inner.className = "CodeMirror-lint-marker-multiple";
}
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
showTooltipFor(e, labels, inner);
});
return marker;
}
function getMaxSeverity(a, b) {
if (a == "error") return a;
else return b;
}
function groupByLine(annotations) {
var lines = [];
for (var i = 0; i < annotations.length; ++i) {
var ann = annotations[i], line = ann.from.line;
(lines[line] || (lines[line] = [])).push(ann);
}
return lines;
}
function annotationTooltip(ann) {
var severity = ann.severity;
if (!SEVERITIES.test(severity)) severity = "error";
var tip = document.createElement("div");
tip.className = "CodeMirror-lint-message-" + severity;
tip.appendChild(document.createTextNode(ann.message));
return tip;
}
function startLinting(cm) {
var state = cm.state.lint, options = state.options;
if (options.async)
options.getAnnotations(cm, updateLinting, options);
else
updateLinting(cm, options.getAnnotations(cm.getValue(), options));
}
function updateLinting(cm, annotationsNotSorted) {
clearMarks(cm);
var state = cm.state.lint, options = state.options;
var annotations = groupByLine(annotationsNotSorted);
for (var line = 0; line < annotations.length; ++line) {
var anns = annotations[line];
if (!anns) continue;
var maxSeverity = null;
var tipLabel = state.hasGutter && document.createDocumentFragment();
for (var i = 0; i < anns.length; ++i) {
var ann = anns[i];
var severity = ann.severity;
if (!SEVERITIES.test(severity)) severity = "error";
maxSeverity = getMaxSeverity(maxSeverity, severity);
if (options.formatAnnotation) ann = options.formatAnnotation(ann);
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
className: "CodeMirror-lint-mark-" + severity,
__annotation: ann
}));
}
if (state.hasGutter)
cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,
state.options.tooltips));
}
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
}
function onChange(cm) {
var state = cm.state.lint;
clearTimeout(state.timeout);
state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);
}
function popupSpanTooltip(ann, e) {
var target = e.target || e.srcElement;
showTooltipFor(e, annotationTooltip(ann), target);
}
// When the mouseover fires, the cursor might not actually be over
// the character itself yet. These pairs of x,y offsets are used to
// probe a few nearby points when no suitable marked range is found.
var nearby = [0, 0, 0, 5, 0, -5, 5, 0, -5, 0];
function onMouseOver(cm, e) {
if (!/\bCodeMirror-lint-mark-/.test((e.target || e.srcElement).className)) return;
for (var i = 0; i < nearby.length; i += 2) {
var spans = cm.findMarksAt(cm.coordsChar({left: e.clientX + nearby[i],
top: e.clientY + nearby[i + 1]}));
for (var j = 0; j < spans.length; ++j) {
var span = spans[j], ann = span.__annotation;
if (ann) return popupSpanTooltip(ann, e);
}
}
}
function optionHandler(cm, val, old) {
if (old && old != CodeMirror.Init) {
clearMarks(cm);
cm.off("change", onChange);
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
delete cm.state.lint;
}
if (val) {
var gutters = cm.getOption("gutters"), hasLintGutter = false;
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
cm.on("change", onChange);
if (state.options.tooltips != false)
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
startLinting(cm);
}
}
CodeMirror.defineOption("lintWith", false, optionHandler); // deprecated
CodeMirror.defineOption("lint", false, optionHandler); // deprecated
})();

View File

@@ -0,0 +1,50 @@
// From https://code.google.com/p/google-diff-match-patch/ , licensed under the Apache License 2.0
(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32}
diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,
b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};
diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,
d):this.diff_bisect_(a,b,d)};
diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a};
diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,q=0!=k%2,r=0,t=0,p=0,w=0,v=0;v<f&&!((new Date).getTime()>c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var s=m-n;m<d&&s<e&&a.charAt(m)==b.charAt(s);)m++,s++;j[l]=m;if(m>d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var u=d-i[l];if(m>=
u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=u-n;u<d&&m<e&&a.charAt(d-u-1)==b.charAt(e-m-1);)u++,m++;i[l]=u;if(u>d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l<h&&-1!=j[l])&&(m=j[l],s=g+m-l,u=d-u,m>=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};
diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};
diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var r=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(r):void 0!==e[r])?b+=String.fromCharCode(e[r]):(b+=String.fromCharCode(g),e[r]=g,d[g++]=r)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};
diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};
diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),s=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<s+m&&(g=b.substring(e-s,e)+b.substring(e,e+m),h=a.substring(0,c-s),j=a.substring(c+m),n=b.substring(0,e-s),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;
var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};
diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&(e.length<=Math.max(g,h)&&e.length<=Math.max(j,i))&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1];
d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};
diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);
return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=
h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/;
diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)};
diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length-
g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,
a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};
diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&amp;").replace(d,"&lt;").replace(e,"&gt;").replace(f,"&para;<br>");switch(h){case 1:b[g]='<ins style="background:#e6ffe6;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffe6e6;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")};
diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};
diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")};
diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+
f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};
diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,q=b.length+a.length,r,t=0;t<b.length;t++){i=0;for(k=q;i<k;)d(t,c+
k)<=g?i=k:q=k,k=Math.floor((q-i)/2+i);q=k;i=Math.max(1,c-k+1);var p=Math.min(c+k,a.length)+b.length;k=Array(p+2);for(k[p+1]=(1<<t)-1;p>=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};
diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};
diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+=
c.length+d.length;a.length2+=c.length+d.length}};
diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make.");
if(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];!e&&0!==i&&(a.start1=f,a.start2=g);switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&&
e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};
diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);
if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var q=a[f].diffs[i];0!==q[0]&&(k=this.diff_xIndex(g,h));1===q[0]?b=b.substring(0,
j+k)+q[1]+b.substring(j+k):-1===q[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+q[1].length)));-1!==q[0]&&(h+=q[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};
diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,
c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};
diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;""!==g&&(h.length1=h.length2=g.length,h.diffs.push([0,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()),
j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&&
(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")};
diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split("\n");for(var c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2=
parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};
diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")};
this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})()

View File

@@ -0,0 +1,92 @@
.CodeMirror-merge {
position: relative;
border: 1px solid #ddd;
white-space: pre;
}
.CodeMirror-merge, .CodeMirror-merge .CodeMirror {
height: 350px;
}
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
.CodeMirror-merge-pane {
display: inline-block;
white-space: normal;
vertical-align: top;
}
.CodeMirror-merge-pane-rightmost {
position: absolute;
right: 0px;
z-index: 1;
}
.CodeMirror-merge-gap {
z-index: 2;
display: inline-block;
height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
position: relative;
background: #f8f8f8;
}
.CodeMirror-merge-scrolllock-wrap {
position: absolute;
bottom: 0; left: 50%;
}
.CodeMirror-merge-scrolllock {
position: relative;
left: -50%;
cursor: pointer;
color: #555;
line-height: 1;
}
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
position: absolute;
left: 0; top: 0;
right: 0; bottom: 0;
line-height: 1;
}
.CodeMirror-merge-copy {
position: absolute;
cursor: pointer;
color: #44c;
}
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
background-position: bottom left;
background-repeat: repeat-x;
}
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
background-position: bottom left;
background-repeat: repeat-x;
}
.CodeMirror-merge-r-chunk { background: #ffffe0; }
.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }
.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }
.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }
.CodeMirror-merge-l-chunk { background: #eef; }
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }

View File

@@ -0,0 +1,474 @@
(function() {
"use strict";
// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL
var Pos = CodeMirror.Pos;
var svgNS = "http://www.w3.org/2000/svg";
function DiffView(mv, type) {
this.mv = mv;
this.type = type;
this.classes = type == "left"
? {chunk: "CodeMirror-merge-l-chunk",
start: "CodeMirror-merge-l-chunk-start",
end: "CodeMirror-merge-l-chunk-end",
insert: "CodeMirror-merge-l-inserted",
del: "CodeMirror-merge-l-deleted",
connect: "CodeMirror-merge-l-connect"}
: {chunk: "CodeMirror-merge-r-chunk",
start: "CodeMirror-merge-r-chunk-start",
end: "CodeMirror-merge-r-chunk-end",
insert: "CodeMirror-merge-r-inserted",
del: "CodeMirror-merge-r-deleted",
connect: "CodeMirror-merge-r-connect"};
}
DiffView.prototype = {
constructor: DiffView,
init: function(pane, orig, options) {
this.edit = this.mv.edit;
this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: true}, copyObj(options)));
this.diff = getDiff(orig, options.value);
this.diffOutOfDate = false;
this.showDifferences = options.showDifferences !== false;
this.forceUpdate = registerUpdate(this);
setScrollLock(this, true, false);
registerScroll(this);
},
setShowDifferences: function(val) {
val = val !== false;
if (val != this.showDifferences) {
this.showDifferences = val;
this.forceUpdate("full");
}
}
};
function registerUpdate(dv) {
var edit = {from: 0, to: 0, marked: []};
var orig = {from: 0, to: 0, marked: []};
var debounceChange;
function update(mode) {
if (mode == "full") {
if (dv.svg) clear(dv.svg);
clear(dv.copyButtons);
clearMarks(dv.edit, edit.marked, dv.classes);
clearMarks(dv.orig, orig.marked, dv.classes);
edit.from = edit.to = orig.from = orig.to = 0;
}
if (dv.diffOutOfDate) {
dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue());
dv.diffOutOfDate = false;
CodeMirror.signal(dv.edit, "updateDiff", dv.diff);
}
if (dv.showDifferences) {
updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
}
drawConnectors(dv);
}
function set(slow) {
clearTimeout(debounceChange);
debounceChange = setTimeout(update, slow == true ? 250 : 100);
}
function change() {
if (!dv.diffOutOfDate) {
dv.diffOutOfDate = true;
edit.from = edit.to = orig.from = orig.to = 0;
}
set(true);
}
dv.edit.on("change", change);
dv.orig.on("change", change);
dv.edit.on("viewportChange", set);
dv.orig.on("viewportChange", set);
update();
return update;
}
function registerScroll(dv) {
dv.edit.on("scroll", function() {
syncScroll(dv, DIFF_INSERT) && drawConnectors(dv);
});
dv.orig.on("scroll", function() {
syncScroll(dv, DIFF_DELETE) && drawConnectors(dv);
});
}
function syncScroll(dv, type) {
// Change handler will do a refresh after a timeout when diff is out of date
if (dv.diffOutOfDate) return false;
if (!dv.lockScroll) return true;
var editor, other, now = +new Date;
if (type == DIFF_INSERT) { editor = dv.edit; other = dv.orig; }
else { editor = dv.orig; other = dv.edit; }
// Don't take action if the position of this editor was recently set
// (to prevent feedback loops)
if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 50 > now) return false;
var sInfo = editor.getScrollInfo(), halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen;
var mid = editor.lineAtHeight(midY, "local");
var around = chunkBoundariesAround(dv.diff, mid, type == DIFF_INSERT);
var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig);
var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit);
var ratio = (midY - off.top) / (off.bot - off.top);
var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
var botDist, mix;
// Some careful tweaking to make sure no space is left out of view
// when scrolling to top or bottom.
if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
targetPos = targetPos * mix + sInfo.top * (1 - mix);
} else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
var otherInfo = other.getScrollInfo();
var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
}
other.scrollTo(sInfo.left, targetPos);
other.state.scrollSetAt = now;
other.state.scrollSetBy = dv;
return true;
}
function getOffsets(editor, around) {
var bot = around.after;
if (bot == null) bot = editor.lastLine() + 1;
return {top: editor.heightAtLine(around.before || 0, "local"),
bot: editor.heightAtLine(bot, "local")};
}
function setScrollLock(dv, val, action) {
dv.lockScroll = val;
if (val && action != false) syncScroll(dv, DIFF_INSERT) && drawConnectors(dv);
dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db&nbsp;&nbsp;\u21da";
}
// Updating the marks for editor content
function clearMarks(editor, arr, classes) {
for (var i = 0; i < arr.length; ++i) {
var mark = arr[i];
if (mark instanceof CodeMirror.TextMarker) {
mark.clear();
} else {
editor.removeLineClass(mark, "background", classes.chunk);
editor.removeLineClass(mark, "background", classes.start);
editor.removeLineClass(mark, "background", classes.end);
}
}
arr.length = 0;
}
// FIXME maybe add a margin around viewport to prevent too many updates
function updateMarks(editor, diff, state, type, classes) {
var vp = editor.getViewport();
editor.operation(function() {
if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
clearMarks(editor, state.marked, classes);
markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);
state.from = vp.from; state.to = vp.to;
} else {
if (vp.from < state.from) {
markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);
state.from = vp.from;
}
if (vp.to > state.to) {
markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);
state.to = vp.to;
}
}
});
}
function markChanges(editor, diff, type, marks, from, to, classes) {
var pos = Pos(0, 0);
var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1));
var cls = type == DIFF_DELETE ? classes.del : classes.insert;
function markChunk(start, end) {
var bfrom = Math.max(from, start), bto = Math.min(to, end);
for (var i = bfrom; i < bto; ++i) {
var line = editor.addLineClass(i, "background", classes.chunk);
if (i == start) editor.addLineClass(line, "background", classes.start);
if (i == end - 1) editor.addLineClass(line, "background", classes.end);
marks.push(line);
}
// When the chunk is empty, make sure a horizontal line shows up
if (start == end && bfrom == end && bto == end) {
if (bfrom)
marks.push(editor.addLineClass(bfrom - 1, "background", classes.end));
else
marks.push(editor.addLineClass(bfrom, "background", classes.start));
}
}
var chunkStart = 0;
for (var i = 0; i < diff.length; ++i) {
var part = diff[i], tp = part[0], str = part[1];
if (tp == DIFF_EQUAL) {
var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);
moveOver(pos, str);
var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);
if (cleanTo > cleanFrom) {
if (i) markChunk(chunkStart, cleanFrom);
chunkStart = cleanTo;
}
} else {
if (tp == type) {
var end = moveOver(pos, str, true);
var a = posMax(top, pos), b = posMin(bot, end);
if (!posEq(a, b))
marks.push(editor.markText(a, b, {className: cls}));
pos = end;
}
}
}
if (chunkStart <= pos.line) markChunk(chunkStart, pos.line + 1);
}
// Updating the gap between editor and original
function drawConnectors(dv) {
if (!dv.showDifferences) return;
if (dv.svg) {
clear(dv.svg);
var w = dv.gap.offsetWidth;
attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight);
}
clear(dv.copyButtons);
var flip = dv.type == "left";
var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();
var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top;
iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) {
if (topEdit > vpEdit.to || botEdit < vpEdit.from ||
topOrig > vpOrig.to || botOrig < vpOrig.from)
return;
var topLpx = dv.orig.heightAtLine(topOrig, "local") - sTopOrig, top = topLpx;
if (dv.svg) {
var topRpx = dv.edit.heightAtLine(topEdit, "local") - sTopEdit;
if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; }
var botLpx = dv.orig.heightAtLine(botOrig, "local") - sTopOrig;
var botRpx = dv.edit.heightAtLine(botEdit, "local") - sTopEdit;
if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; }
var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx;
var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx;
attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")),
"d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z",
"class", dv.classes.connect);
}
var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc",
"CodeMirror-merge-copy"));
copy.title = "Revert chunk";
copy.chunk = {topEdit: topEdit, botEdit: botEdit, topOrig: topOrig, botOrig: botOrig};
copy.style.top = top + "px";
});
}
function copyChunk(dv, chunk) {
if (dv.diffOutOfDate) return;
dv.edit.replaceRange(dv.orig.getRange(Pos(chunk.topOrig, 0), Pos(chunk.botOrig, 0)),
Pos(chunk.topEdit, 0), Pos(chunk.botEdit, 0));
}
// Merge view, containing 0, 1, or 2 diff views.
var MergeView = CodeMirror.MergeView = function(node, options) {
if (!(this instanceof MergeView)) return new MergeView(node, options);
var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight;
var hasLeft = origLeft != null, hasRight = origRight != null;
var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);
var wrap = [], left = this.left = null, right = this.right = null;
if (hasLeft) {
left = this.left = new DiffView(this, "left");
var leftPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(leftPane);
wrap.push(buildGap(left));
}
var editPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(editPane);
if (hasRight) {
right = this.right = new DiffView(this, "right");
wrap.push(buildGap(right));
var rightPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(rightPane);
}
(hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
wrap.push(elt("div", null, null, "height: 0; clear: both;"));
var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
this.edit = CodeMirror(editPane, copyObj(options));
if (left) left.init(leftPane, origLeft, options);
if (right) right.init(rightPane, origRight, options);
var onResize = function() {
if (left) drawConnectors(left);
if (right) drawConnectors(right);
};
CodeMirror.on(window, "resize", onResize);
var resizeInterval = setInterval(function() {
for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}
if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); }
}, 5000);
};
function buildGap(dv) {
var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
lock.title = "Toggle locked scrolling";
var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); });
dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
CodeMirror.on(dv.copyButtons, "click", function(e) {
var node = e.target || e.srcElement;
if (node.chunk) copyChunk(dv, node.chunk);
});
var gapElts = [dv.copyButtons, lockWrap];
var svg = document.createElementNS && document.createElementNS(svgNS, "svg");
if (svg && !svg.createSVGRect) svg = null;
dv.svg = svg;
if (svg) gapElts.push(svg);
return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
}
MergeView.prototype = {
constuctor: MergeView,
editor: function() { return this.edit; },
rightOriginal: function() { return this.right && this.right.orig; },
leftOriginal: function() { return this.left && this.left.orig; },
setShowDifferences: function(val) {
if (this.right) this.right.setShowDifferences(val);
if (this.left) this.left.setShowDifferences(val);
}
};
// Operations on diffs
var dmp = new diff_match_patch();
function getDiff(a, b) {
var diff = dmp.diff_main(a, b);
dmp.diff_cleanupSemantic(diff);
// The library sometimes leaves in empty parts, which confuse the algorithm
for (var i = 0; i < diff.length; ++i) {
var part = diff[i];
if (!part[1]) {
diff.splice(i--, 1);
} else if (i && diff[i - 1][0] == part[0]) {
diff.splice(i--, 1);
diff[i][1] += part[1];
}
}
return diff;
}
function iterateChunks(diff, f) {
var startEdit = 0, startOrig = 0;
var edit = Pos(0, 0), orig = Pos(0, 0);
for (var i = 0; i < diff.length; ++i) {
var part = diff[i], tp = part[0];
if (tp == DIFF_EQUAL) {
var startOff = startOfLineClean(diff, i) ? 0 : 1;
var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff;
moveOver(edit, part[1], null, orig);
var endOff = endOfLineClean(diff, i) ? 1 : 0;
var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff;
if (cleanToEdit > cleanFromEdit) {
if (i) f(startOrig, cleanFromOrig, startEdit, cleanFromEdit);
startEdit = cleanToEdit; startOrig = cleanToOrig;
}
} else {
moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);
}
}
if (startEdit <= edit.line || startOrig <= orig.line)
f(startOrig, orig.line + 1, startEdit, edit.line + 1);
}
function endOfLineClean(diff, i) {
if (i == diff.length - 1) return true;
var next = diff[i + 1][1];
if (next.length == 1 || next.charCodeAt(0) != 10) return false;
if (i == diff.length - 2) return true;
next = diff[i + 2][1];
return next.length > 1 && next.charCodeAt(0) == 10;
}
function startOfLineClean(diff, i) {
if (i == 0) return true;
var last = diff[i - 1][1];
if (last.charCodeAt(last.length - 1) != 10) return false;
if (i == 1) return true;
last = diff[i - 2][1];
return last.charCodeAt(last.length - 1) == 10;
}
function chunkBoundariesAround(diff, n, nInEdit) {
var beforeE, afterE, beforeO, afterO;
iterateChunks(diff, function(fromOrig, toOrig, fromEdit, toEdit) {
var fromLocal = nInEdit ? fromEdit : fromOrig;
var toLocal = nInEdit ? toEdit : toOrig;
if (afterE == null) {
if (fromLocal > n) { afterE = fromEdit; afterO = fromOrig; }
else if (toLocal > n) { afterE = toEdit; afterO = toOrig; }
}
if (toLocal <= n) { beforeE = toEdit; beforeO = toOrig; }
else if (fromLocal <= n) { beforeE = fromEdit; beforeO = fromOrig; }
});
return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}};
}
// General utilities
function elt(tag, content, className, style) {
var e = document.createElement(tag);
if (className) e.className = className;
if (style) e.style.cssText = style;
if (typeof content == "string") e.appendChild(document.createTextNode(content));
else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
return e;
}
function clear(node) {
for (var count = node.childNodes.length; count > 0; --count)
node.removeChild(node.firstChild);
}
function attrs(elt) {
for (var i = 1; i < arguments.length; i += 2)
elt.setAttribute(arguments[i], arguments[i+1]);
}
function copyObj(obj, target) {
if (!target) target = {};
for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
return target;
}
function moveOver(pos, str, copy, other) {
var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0;
for (;;) {
var nl = str.indexOf("\n", at);
if (nl == -1) break;
++out.line;
if (other) ++other.line;
at = nl + 1;
}
out.ch = (at ? 0 : out.ch) + (str.length - at);
if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);
return out;
}
function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; }
function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; }
function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
})();

View File

@@ -1,5 +1,5 @@
CodeMirror.multiplexingMode = function(outer /*, others */) {
// Others should be {open, close, mode [, delimStyle]} objects
// Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects
var others = Array.prototype.slice.call(arguments, 1);
var n_others = others.length;
@@ -58,24 +58,44 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
if (found > -1) stream.string = oldContent;
var cur = stream.current(), found = cur.indexOf(curInner.close);
if (found > -1) stream.backUp(cur.length - found);
if (curInner.innerStyle) {
if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle;
else innerToken = curInner.innerStyle;
}
return innerToken;
}
},
indent: function(state, textAfter) {
var mode = state.innerActive ? state.innerActive.mode : outer;
if (!mode.indent) return CodeMirror.Pass;
return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
},
compareStates: function(a, b) {
if (a.innerActive != b.innerActive) return false;
var mode = a.innerActive || outer;
if (!mode.compareStates) return CodeMirror.Pass;
return mode.compareStates(a.innerActive ? a.inner : a.outer,
b.innerActive ? b.inner : b.outer);
blankLine: function(state) {
var mode = state.innerActive ? state.innerActive.mode : outer;
if (mode.blankLine) {
mode.blankLine(state.innerActive ? state.inner : state.outer);
}
if (!state.innerActive) {
for (var i = 0; i < n_others; ++i) {
var other = others[i];
if (other.open === "\n") {
state.innerActive = other;
state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);
}
}
} else if (state.innerActive.close === "\n") {
state.innerActive = state.inner = null;
}
},
electricChars: outer.electricChars
electricChars: outer.electricChars,
innerMode: function(state) {
return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};
}
};
};

View File

@@ -0,0 +1,30 @@
(function() {
CodeMirror.defineMode("markdown_with_stex", function(){
var inner = CodeMirror.getMode({}, "stex");
var outer = CodeMirror.getMode({}, "markdown");
var innerOptions = {
open: '$',
close: '$',
mode: inner,
delimStyle: 'delim',
innerStyle: 'inner'
};
return CodeMirror.multiplexingMode(outer, innerOptions);
});
var mode = CodeMirror.getMode({}, "markdown_with_stex");
function MT(name) {
test.mode(
name,
mode,
Array.prototype.slice.call(arguments, 1),
'multiplexing');
}
MT(
"stexInsideMarkdown",
"[strong **Equation:**] [delim $][inner&tag \\pi][delim $]");
})();

View File

@@ -43,10 +43,17 @@ CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, comb
if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur;
else return state.overlayCur;
},
indent: base.indent && function(state, textAfter) {
return base.indent(state.base, textAfter);
},
electricChars: base.electricChars
electricChars: base.electricChars,
innerMode: function(state) { return {state: state.base, mode: base}; },
blankLine: function(state) {
if (base.blankLine) base.blankLine(state.base);
if (overlay.blankLine) overlay.blankLine(state.overlay);
}
};
};

View File

@@ -0,0 +1,29 @@
CodeMirror.colorize = (function() {
var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/;
function textContent(node, out) {
if (node.nodeType == 3) return out.push(node.nodeValue);
for (var ch = node.firstChild; ch; ch = ch.nextSibling) {
textContent(ch, out);
if (isBlock.test(node.nodeType)) out.push("\n");
}
}
return function(collection, defaultMode) {
if (!collection) collection = document.body.getElementsByTagName("pre");
for (var i = 0; i < collection.length; ++i) {
var node = collection[i];
var mode = node.getAttribute("data-lang") || defaultMode;
if (!mode) continue;
var text = [];
textContent(node, text);
node.innerHTML = "";
CodeMirror.runMode(text.join(""), mode, node);
node.className += " cm-s-default";
}
};
})();

View File

@@ -0,0 +1,136 @@
/* Just enough of CodeMirror to run runMode under node.js */
window.CodeMirror = {};
(function() {
"use strict";
function splitLines(string){ return string.split(/\r?\n|\r/); };
function StringStream(string) {
this.pos = this.start = 0;
this.string = string;
}
StringStream.prototype = {
eol: function() {return this.pos >= this.string.length;},
sol: function() {return this.pos == 0;},
peek: function() {return this.string.charAt(this.pos) || null;},
next: function() {
if (this.pos < this.string.length)
return this.string.charAt(this.pos++);
},
eat: function(match) {
var ch = this.string.charAt(this.pos);
if (typeof match == "string") var ok = ch == match;
else var ok = ch && (match.test ? match.test(ch) : match(ch));
if (ok) {++this.pos; return ch;}
},
eatWhile: function(match) {
var start = this.pos;
while (this.eat(match)){}
return this.pos > start;
},
eatSpace: function() {
var start = this.pos;
while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
return this.pos > start;
},
skipToEnd: function() {this.pos = this.string.length;},
skipTo: function(ch) {
var found = this.string.indexOf(ch, this.pos);
if (found > -1) {this.pos = found; return true;}
},
backUp: function(n) {this.pos -= n;},
column: function() {return this.start;},
indentation: function() {return 0;},
match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") {
var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
var substr = this.string.substr(this.pos, pattern.length);
if (cased(substr) == cased(pattern)) {
if (consume !== false) this.pos += pattern.length;
return true;
}
} else {
var match = this.string.slice(this.pos).match(pattern);
if (match && match.index > 0) return null;
if (match && consume !== false) this.pos += match[0].length;
return match;
}
},
current: function(){return this.string.slice(this.start, this.pos);}
};
CodeMirror.StringStream = StringStream;
CodeMirror.startState = function (mode, a1, a2) {
return mode.startState ? mode.startState(a1, a2) : true;
};
var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
CodeMirror.defineMode = function (name, mode) { modes[name] = mode; };
CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; };
CodeMirror.getMode = function (options, spec) {
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
spec = mimeModes[spec];
if (typeof spec == "string")
var mname = spec, config = {};
else if (spec != null)
var mname = spec.name, config = spec;
var mfactory = modes[mname];
if (!mfactory) throw new Error("Unknown mode: " + spec);
return mfactory(options, config || {});
};
CodeMirror.runMode = function (string, modespec, callback, options) {
var mode = CodeMirror.getMode({ indentUnit: 2 }, modespec);
if (callback.nodeType == 1) {
var tabSize = (options && options.tabSize) || 4;
var node = callback, col = 0;
node.innerHTML = "";
callback = function (text, style) {
if (text == "\n") {
node.appendChild(document.createElement("br"));
col = 0;
return;
}
var content = "";
// replace tabs
for (var pos = 0; ;) {
var idx = text.indexOf("\t", pos);
if (idx == -1) {
content += text.slice(pos);
col += text.length - pos;
break;
} else {
col += idx - pos;
content += text.slice(pos, idx);
var size = tabSize - col % tabSize;
col += size;
for (var i = 0; i < size; ++i) content += " ";
pos = idx + 1;
}
}
if (style) {
var sp = node.appendChild(document.createElement("span"));
sp.className = "cm-" + style.replace(/ +/g, " cm-");
sp.appendChild(document.createTextNode(content));
} else {
node.appendChild(document.createTextNode(content));
}
};
}
var lines = splitLines(string), state = CodeMirror.startState(mode);
for (var i = 0, e = lines.length; i < e; ++i) {
if (i) callback("\n");
var stream = new CodeMirror.StringStream(lines[i]);
while (!stream.eol()) {
var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos;
}
}
};
})();

View File

@@ -0,0 +1,56 @@
CodeMirror.runMode = function(string, modespec, callback, options) {
var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);
var ie = /MSIE \d/.test(navigator.userAgent);
var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
if (callback.nodeType == 1) {
var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;
var node = callback, col = 0;
node.innerHTML = "";
callback = function(text, style) {
if (text == "\n") {
// Emitting LF or CRLF on IE8 or earlier results in an incorrect display.
// Emitting a carriage return makes everything ok.
node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text));
col = 0;
return;
}
var content = "";
// replace tabs
for (var pos = 0;;) {
var idx = text.indexOf("\t", pos);
if (idx == -1) {
content += text.slice(pos);
col += text.length - pos;
break;
} else {
col += idx - pos;
content += text.slice(pos, idx);
var size = tabSize - col % tabSize;
col += size;
for (var i = 0; i < size; ++i) content += " ";
pos = idx + 1;
}
}
if (style) {
var sp = node.appendChild(document.createElement("span"));
sp.className = "cm-" + style.replace(/ +/g, " cm-");
sp.appendChild(document.createTextNode(content));
} else {
node.appendChild(document.createTextNode(content));
}
};
}
var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode);
for (var i = 0, e = lines.length; i < e; ++i) {
if (i) callback("\n");
var stream = new CodeMirror.StringStream(lines[i]);
while (!stream.eol()) {
var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos;
}
}
};

View File

@@ -0,0 +1,103 @@
/* Just enough of CodeMirror to run runMode under node.js */
function splitLines(string){ return string.split(/\r?\n|\r/); };
function StringStream(string) {
this.pos = this.start = 0;
this.string = string;
}
StringStream.prototype = {
eol: function() {return this.pos >= this.string.length;},
sol: function() {return this.pos == 0;},
peek: function() {return this.string.charAt(this.pos) || null;},
next: function() {
if (this.pos < this.string.length)
return this.string.charAt(this.pos++);
},
eat: function(match) {
var ch = this.string.charAt(this.pos);
if (typeof match == "string") var ok = ch == match;
else var ok = ch && (match.test ? match.test(ch) : match(ch));
if (ok) {++this.pos; return ch;}
},
eatWhile: function(match) {
var start = this.pos;
while (this.eat(match)){}
return this.pos > start;
},
eatSpace: function() {
var start = this.pos;
while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
return this.pos > start;
},
skipToEnd: function() {this.pos = this.string.length;},
skipTo: function(ch) {
var found = this.string.indexOf(ch, this.pos);
if (found > -1) {this.pos = found; return true;}
},
backUp: function(n) {this.pos -= n;},
column: function() {return this.start;},
indentation: function() {return 0;},
match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") {
var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
var substr = this.string.substr(this.pos, pattern.length);
if (cased(substr) == cased(pattern)) {
if (consume !== false) this.pos += pattern.length;
return true;
}
} else {
var match = this.string.slice(this.pos).match(pattern);
if (match && match.index > 0) return null;
if (match && consume !== false) this.pos += match[0].length;
return match;
}
},
current: function(){return this.string.slice(this.start, this.pos);}
};
exports.StringStream = StringStream;
exports.startState = function(mode, a1, a2) {
return mode.startState ? mode.startState(a1, a2) : true;
};
var modes = exports.modes = {}, mimeModes = exports.mimeModes = {};
exports.defineMode = function(name, mode) {
if (arguments.length > 2) {
mode.dependencies = [];
for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
}
modes[name] = mode;
};
exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; };
exports.defineMode("null", function() {
return {token: function(stream) {stream.skipToEnd();}};
});
exports.defineMIME("text/plain", "null");
exports.getMode = function(options, spec) {
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
spec = mimeModes[spec];
if (typeof spec == "string")
var mname = spec, config = {};
else if (spec != null)
var mname = spec.name, config = spec;
var mfactory = modes[mname];
if (!mfactory) throw new Error("Unknown mode: " + spec);
return mfactory(options, config || {});
};
exports.runMode = function(string, modespec, callback) {
var mode = exports.getMode({indentUnit: 2}, modespec);
var lines = splitLines(string), state = exports.startState(mode);
for (var i = 0, e = lines.length; i < e; ++i) {
if (i) callback("\n");
var stream = new exports.StringStream(lines[i]);
while (!stream.eol()) {
var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos;
}
}
};

View File

@@ -0,0 +1,91 @@
// Highlighting text that matches the selection
//
// Defines an option highlightSelectionMatches, which, when enabled,
// will style strings that match the selection throughout the
// document.
//
// The option can be set to true to simply enable it, or to a
// {minChars, style, showToken} object to explicitly configure it.
// minChars is the minimum amount of characters that should be
// selected for the behavior to occur, and style is the token style to
// apply to the matches. This will be prefixed by "cm-" to create an
// actual CSS class name. showToken, when enabled, will cause the
// current token to be highlighted when nothing is selected.
(function() {
var DEFAULT_MIN_CHARS = 2;
var DEFAULT_TOKEN_STYLE = "matchhighlight";
var DEFAULT_DELAY = 100;
function State(options) {
if (typeof options == "object") {
this.minChars = options.minChars;
this.style = options.style;
this.showToken = options.showToken;
this.delay = options.delay;
}
if (this.style == null) this.style = DEFAULT_TOKEN_STYLE;
if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS;
if (this.delay == null) this.delay = DEFAULT_DELAY;
this.overlay = this.timeout = null;
}
CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) {
var over = cm.state.matchHighlighter.overlay;
if (over) cm.removeOverlay(over);
clearTimeout(cm.state.matchHighlighter.timeout);
cm.state.matchHighlighter = null;
cm.off("cursorActivity", cursorActivity);
}
if (val) {
cm.state.matchHighlighter = new State(val);
highlightMatches(cm);
cm.on("cursorActivity", cursorActivity);
}
});
function cursorActivity(cm) {
var state = cm.state.matchHighlighter;
clearTimeout(state.timeout);
state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay);
}
function highlightMatches(cm) {
cm.operation(function() {
var state = cm.state.matchHighlighter;
if (state.overlay) {
cm.removeOverlay(state.overlay);
state.overlay = null;
}
if (!cm.somethingSelected() && state.showToken) {
var re = state.showToken === true ? /[\w$]/ : state.showToken;
var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
while (start && re.test(line.charAt(start - 1))) --start;
while (end < line.length && re.test(line.charAt(end))) ++end;
if (start < end)
cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style));
return;
}
if (cm.getCursor("head").line != cm.getCursor("anchor").line) return;
var selection = cm.getSelection().replace(/^\s+|\s+$/g, "");
if (selection.length >= state.minChars)
cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style));
});
}
function boundariesAround(stream, re) {
return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
(stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
}
function makeOverlay(query, hasBoundary, style) {
return {token: function(stream) {
if (stream.match(query) &&
(!hasBoundary || boundariesAround(stream, hasBoundary)))
return style;
stream.next();
stream.skipTo(query.charAt(0)) || stream.skipToEnd();
}};
}
})();

View File

@@ -7,12 +7,27 @@
// Ctrl-G.
(function() {
function searchOverlay(query) {
if (typeof query == "string") return {token: function(stream) {
if (stream.match(query)) return "searching";
stream.next();
stream.skipTo(query.charAt(0)) || stream.skipToEnd();
}};
return {token: function(stream) {
if (stream.match(query)) return "searching";
while (!stream.eol()) {
stream.next();
if (stream.match(query, false)) break;
}
}};
}
function SearchState() {
this.posFrom = this.posTo = this.query = null;
this.marked = [];
this.overlay = null;
}
function getSearchState(cm) {
return cm._searchState || (cm._searchState = new SearchState());
return cm.state.search || (cm.state.search = new SearchState());
}
function getSearchCursor(cm, query, pos) {
// Heuristic: if the query string is all lowercase, do a case insensitive search.
@@ -39,10 +54,9 @@
cm.operation(function() {
if (!query || state.query) return;
state.query = parseQuery(query);
if (cm.lineCount() < 2000) { // This is too expensive on big documents.
for (var cursor = getSearchCursor(cm, state.query); cursor.findNext();)
state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching"));
}
cm.removeOverlay(state.overlay);
state.overlay = searchOverlay(state.query);
cm.addOverlay(state.overlay);
state.posFrom = state.posTo = cm.getCursor();
findNext(cm, rev);
});
@@ -52,7 +66,7 @@
var state = getSearchState(cm);
var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
if (!cursor.find(rev)) {
cursor = getSearchCursor(cm, state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0});
cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));
if (!cursor.find(rev)) return;
}
cm.setSelection(cursor.from(), cursor.to());
@@ -62,8 +76,7 @@
var state = getSearchState(cm);
if (!state.query) return;
state.query = null;
for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear();
state.marked.length = 0;
cm.removeOverlay(state.overlay);
});}
var replaceQueryDialog =
@@ -76,18 +89,18 @@
query = parseQuery(query);
dialog(cm, replacementQueryDialog, "Replace with:", function(text) {
if (all) {
cm.compoundChange(function() { cm.operation(function() {
cm.operation(function() {
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
if (typeof query != "string") {
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];}));
cursor.replace(text.replace(/\$(\d)/, function(_, i) {return match[i];}));
} else cursor.replace(text);
}
});});
});
} else {
clearSearch(cm);
var cursor = getSearchCursor(cm, query, cm.getCursor());
function advance() {
var advance = function() {
var start = cursor.from(), match;
if (!(match = cursor.findNext())) {
cursor = getSearchCursor(cm, query);
@@ -97,12 +110,12 @@
cm.setSelection(cursor.from(), cursor.to());
confirmDialog(cm, doReplaceConfirm, "Replace?",
[function() {doReplace(match);}, advance]);
}
function doReplace(match) {
};
var doReplace = function(match) {
cursor.replace(typeof query == "string" ? text :
text.replace(/\$(\d)/, function(w, i) {return match[i];}));
text.replace(/\$(\d)/, function(_, i) {return match[i];}));
advance();
}
};
advance();
}
});

View File

@@ -0,0 +1,143 @@
(function(){
var Pos = CodeMirror.Pos;
function SearchCursor(doc, query, pos, caseFold) {
this.atOccurrence = false; this.doc = doc;
if (caseFold == null && typeof query == "string") caseFold = false;
pos = pos ? doc.clipPos(pos) : Pos(0, 0);
this.pos = {from: pos, to: pos};
// The matches method is filled in based on the type of query.
// It takes a position and a direction, and returns an object
// describing the next occurrence of the query, or null if no
// more matches were found.
if (typeof query != "string") { // Regexp match
if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
this.matches = function(reverse, pos) {
if (reverse) {
query.lastIndex = 0;
var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start;
for (;;) {
query.lastIndex = cutOff;
var newMatch = query.exec(line);
if (!newMatch) break;
match = newMatch;
start = match.index;
cutOff = match.index + (match[0].length || 1);
if (cutOff == line.length) break;
}
var matchLen = (match && match[0].length) || 0;
if (!matchLen) {
if (start == 0 && line.length == 0) {match = undefined;}
else if (start != doc.getLine(pos.line).length) {
matchLen++;
}
}
} else {
query.lastIndex = pos.ch;
var line = doc.getLine(pos.line), match = query.exec(line);
var matchLen = (match && match[0].length) || 0;
var start = match && match.index;
if (start + matchLen != line.length && !matchLen) matchLen = 1;
}
if (match && matchLen)
return {from: Pos(pos.line, start),
to: Pos(pos.line, start + matchLen),
match: match};
};
} else { // String query
if (caseFold) query = query.toLowerCase();
var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
var target = query.split("\n");
// Different methods for single-line and multi-line queries
if (target.length == 1) {
if (!query.length) {
// Empty string would match anything and never progress, so
// we define it to match nothing instead.
this.matches = function() {};
} else {
this.matches = function(reverse, pos) {
var line = fold(doc.getLine(pos.line)), len = query.length, match;
if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
: (match = line.indexOf(query, pos.ch)) != -1)
return {from: Pos(pos.line, match),
to: Pos(pos.line, match + len)};
};
}
} else {
this.matches = function(reverse, pos) {
var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(doc.getLine(ln));
var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
if (reverse ? offsetA > pos.ch || offsetA != match.length
: offsetA < pos.ch || offsetA != line.length - match.length)
return;
for (;;) {
if (reverse ? !ln : ln == doc.lineCount() - 1) return;
line = fold(doc.getLine(ln += reverse ? -1 : 1));
match = target[reverse ? --idx : ++idx];
if (idx > 0 && idx < target.length - 1) {
if (line != match) return;
else continue;
}
var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
return;
var start = Pos(pos.line, offsetA), end = Pos(ln, offsetB);
return {from: reverse ? end : start, to: reverse ? start : end};
}
};
}
}
}
SearchCursor.prototype = {
findNext: function() {return this.find(false);},
findPrevious: function() {return this.find(true);},
find: function(reverse) {
var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);
function savePosAndFail(line) {
var pos = Pos(line, 0);
self.pos = {from: pos, to: pos};
self.atOccurrence = false;
return false;
}
for (;;) {
if (this.pos = this.matches(reverse, pos)) {
if (!this.pos.from || !this.pos.to) { console.log(this.matches, this.pos); }
this.atOccurrence = true;
return this.pos.match || true;
}
if (reverse) {
if (!pos.line) return savePosAndFail(0);
pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length);
}
else {
var maxLine = this.doc.lineCount();
if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
pos = Pos(pos.line + 1, 0);
}
}
},
from: function() {if (this.atOccurrence) return this.pos.from;},
to: function() {if (this.atOccurrence) return this.pos.to;},
replace: function(newText) {
if (!this.atOccurrence) return;
var lines = CodeMirror.splitLines(newText);
this.doc.replaceRange(lines, this.pos.from, this.pos.to);
this.pos.to = Pos(this.pos.from.line + lines.length - 1,
lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));
}
};
CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
return new SearchCursor(this.doc, query, pos, caseFold);
});
CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) {
return new SearchCursor(this, query, pos, caseFold);
});
})();

View File

@@ -0,0 +1,39 @@
// Because sometimes you need to style the cursor's line.
//
// Adds an option 'styleActiveLine' which, when enabled, gives the
// active line's wrapping <div> the CSS class "CodeMirror-activeline",
// and gives its background <div> the class "CodeMirror-activeline-background".
(function() {
"use strict";
var WRAP_CLASS = "CodeMirror-activeline";
var BACK_CLASS = "CodeMirror-activeline-background";
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
var prev = old && old != CodeMirror.Init;
if (val && !prev) {
updateActiveLine(cm);
cm.on("cursorActivity", updateActiveLine);
} else if (!val && prev) {
cm.off("cursorActivity", updateActiveLine);
clearActiveLine(cm);
delete cm.state.activeLine;
}
});
function clearActiveLine(cm) {
if ("activeLine" in cm.state) {
cm.removeLineClass(cm.state.activeLine, "wrap", WRAP_CLASS);
cm.removeLineClass(cm.state.activeLine, "background", BACK_CLASS);
}
}
function updateActiveLine(cm) {
var line = cm.getLineHandleVisualStart(cm.getCursor().line);
if (cm.state.activeLine == line) return;
clearActiveLine(cm);
cm.addLineClass(line, "wrap", WRAP_CLASS);
cm.addLineClass(line, "background", BACK_CLASS);
cm.state.activeLine = line;
}
})();

View File

@@ -0,0 +1,108 @@
// Because sometimes you need to mark the selected *text*.
//
// Adds an option 'styleSelectedText' which, when enabled, gives
// selected text the CSS class given as option value, or
// "CodeMirror-selectedtext" when the value is not a string.
(function() {
"use strict";
CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) {
var prev = old && old != CodeMirror.Init;
if (val && !prev) {
cm.state.markedSelection = [];
cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext";
reset(cm);
cm.on("cursorActivity", onCursorActivity);
cm.on("change", onChange);
} else if (!val && prev) {
cm.off("cursorActivity", onCursorActivity);
cm.off("change", onChange);
clear(cm);
cm.state.markedSelection = cm.state.markedSelectionStyle = null;
}
});
function onCursorActivity(cm) {
cm.operation(function() { update(cm); });
}
function onChange(cm) {
if (cm.state.markedSelection.length)
cm.operation(function() { clear(cm); });
}
var CHUNK_SIZE = 8;
var Pos = CodeMirror.Pos;
function cmp(pos1, pos2) {
return pos1.line - pos2.line || pos1.ch - pos2.ch;
}
function coverRange(cm, from, to, addAt) {
if (cmp(from, to) == 0) return;
var array = cm.state.markedSelection;
var cls = cm.state.markedSelectionStyle;
for (var line = from.line;;) {
var start = line == from.line ? from : Pos(line, 0);
var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line;
var end = atEnd ? to : Pos(endLine, 0);
var mark = cm.markText(start, end, {className: cls});
if (addAt == null) array.push(mark);
else array.splice(addAt++, 0, mark);
if (atEnd) break;
line = endLine;
}
}
function clear(cm) {
var array = cm.state.markedSelection;
for (var i = 0; i < array.length; ++i) array[i].clear();
array.length = 0;
}
function reset(cm) {
clear(cm);
var from = cm.getCursor("start"), to = cm.getCursor("end");
coverRange(cm, from, to);
}
function update(cm) {
var from = cm.getCursor("start"), to = cm.getCursor("end");
if (cmp(from, to) == 0) return clear(cm);
var array = cm.state.markedSelection;
if (!array.length) return coverRange(cm, from, to);
var coverStart = array[0].find(), coverEnd = array[array.length - 1].find();
if (!coverStart || !coverEnd || to.line - from.line < CHUNK_SIZE ||
cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)
return reset(cm);
while (cmp(from, coverStart.from) > 0) {
array.shift().clear();
coverStart = array[0].find();
}
if (cmp(from, coverStart.from) < 0) {
if (coverStart.to.line - from.line < CHUNK_SIZE) {
array.shift().clear();
coverRange(cm, from, coverStart.to, 0);
} else {
coverRange(cm, from, coverStart.from, 0);
}
}
while (cmp(to, coverEnd.to) < 0) {
array.pop().clear();
coverEnd = array[array.length - 1].find();
}
if (cmp(to, coverEnd.to) > 0) {
if (to.line - coverEnd.from.line < CHUNK_SIZE) {
array.pop().clear();
coverRange(cm, coverEnd.from, to);
} else {
coverRange(cm, coverEnd.to, to);
}
}
}
})();

View File

@@ -0,0 +1,92 @@
#!/usr/bin/env node
// Compression helper for CodeMirror
//
// Example:
//
// bin/compress codemirror runmode javascript xml
//
// Will take lib/codemirror.js, addon/runmode/runmode.js,
// mode/javascript/javascript.js, and mode/xml/xml.js, run them though
// the online minifier at http://marijnhaverbeke.nl/uglifyjs, and spit
// out the result.
//
// bin/compress codemirror --local /path/to/bin/UglifyJS
//
// Will use a local minifier instead of the online default one.
//
// Script files are specified without .js ending. Prefixing them with
// their full (local) path is optional. So you may say lib/codemirror
// or mode/xml/xml to be more precise. In fact, even the .js suffix
// may be speficied, if wanted.
"use strict";
var fs = require("fs");
function help(ok) {
console.log("usage: " + process.argv[1] + " [--local /path/to/uglifyjs] files...");
process.exit(ok ? 0 : 1);
}
var local = null, args = [], extraArgs = null, files = [], blob = "";
for (var i = 2; i < process.argv.length; ++i) {
var arg = process.argv[i];
if (arg == "--local" && i + 1 < process.argv.length) {
var parts = process.argv[++i].split(/\s+/);
local = parts[0];
extraArgs = parts.slice(1);
if (!extraArgs.length) extraArgs = ["-c", "-m"];
} else if (arg == "--help") {
help(true);
} else if (arg[0] != "-") {
files.push({name: arg, re: new RegExp("(?:\\/|^)" + arg + (/\.js$/.test(arg) ? "$" : "\\.js$"))});
} else help(false);
}
function walk(dir) {
fs.readdirSync(dir).forEach(function(fname) {
if (/^[_\.]/.test(fname)) return;
var file = dir + fname;
if (fs.statSync(file).isDirectory()) return walk(file + "/");
if (files.some(function(spec, i) {
var match = spec.re.test(file);
if (match) files.splice(i, 1);
return match;
})) {
if (local) args.push(file);
else blob += fs.readFileSync(file, "utf8");
}
});
}
walk("lib/");
walk("addon/");
walk("mode/");
if (!local && !blob) help(false);
if (files.length) {
console.log("Some speficied files were not found: " +
files.map(function(a){return a.name;}).join(", "));
process.exit(1);
}
if (local) {
require("child_process").spawn(local, args.concat(extraArgs), {stdio: ["ignore", process.stdout, process.stderr]});
} else {
var data = new Buffer("js_code=" + require("querystring").escape(blob), "utf8");
var req = require("http").request({
host: "marijnhaverbeke.nl",
port: 80,
method: "POST",
path: "/uglifyjs",
headers: {"content-type": "application/x-www-form-urlencoded",
"content-length": data.length}
});
req.on("response", function(resp) {
resp.on("data", function (chunk) { process.stdout.write(chunk); });
});
req.end(data);
}

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env node
var lint = require("../test/lint/lint"),
path = require("path");
if (process.argv.length > 2) {
lint.checkDir(process.argv[2]);
} else {
process.chdir(path.resolve(__dirname, ".."));
lint.checkDir("lib");
lint.checkDir("mode");
lint.checkDir("addon");
lint.checkDir("keymap");
}
process.exit(lint.success() ? 0 : 1);

View File

@@ -0,0 +1,61 @@
#!/usr/bin/env node
// Simple command-line code highlighting tool. Reads code from stdin,
// spits html to stdout. For example:
//
// echo 'function foo(a) { return a; }' | bin/source-highlight -s javascript
// bin/source-highlight -s
var fs = require("fs");
CodeMirror = require("../addon/runmode/runmode.node.js");
require("../mode/meta.js");
var sPos = process.argv.indexOf("-s");
if (sPos == -1 || sPos == process.argv.length - 1) {
console.error("Usage: source-highlight -s language");
process.exit(1);
}
var lang = process.argv[sPos + 1].toLowerCase(), modeName = lang;
CodeMirror.modeInfo.forEach(function(info) {
if (info.mime == lang) {
modeName = info.mode;
} else if (info.name.toLowerCase() == lang) {
modeName = info.mode;
lang = info.mime;
}
});
function ensureMode(name) {
if (CodeMirror.modes[name] || name == "null") return;
try {
require("../mode/" + name + "/" + name + ".js");
} catch(e) {
console.error("Could not load mode " + name + ".");
process.exit(1);
}
var obj = CodeMirror.modes[name];
if (obj.dependencies) obj.dependencies.forEach(ensureMode);
}
ensureMode(modeName);
function esc(str) {
return str.replace(/[<&]/, function(ch) { return ch == "&" ? "&amp;" : "&lt;"; });
}
var code = fs.readFileSync("/dev/stdin", "utf8");
var curStyle = null, accum = "";
function flush() {
if (curStyle) process.stdout.write("<span class=\"" + curStyle.replace(/(^|\s+)/g, "$1cm-") + "\">" + esc(accum) + "</span>");
else process.stdout.write(esc(accum));
}
CodeMirror.runMode(code, lang, function(text, style) {
if (style != curStyle) {
flush();
curStyle = style; accum = text;
} else {
accum += text;
}
});
flush();

View File

@@ -1,284 +1,304 @@
/* from http://code.google.com/p/zen-coding/ MIT license */
var _=function(){function h(a,b,d){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&k.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&k.isFunction(b.isEqual))return b.isEqual(a);var c=i.call(a);if(c!=i.call(b))return!1;switch(c){case "[object String]":return a==String(b);case "[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case "[object Date]":case "[object Boolean]":return+a==+b;case "[object RegExp]":return a.source==
b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return!1;for(var e=d.length;e--;)if(d[e]==a)return!0;d.push(a);var e=0,f=!0;if(c=="[object Array]"){if(e=a.length,f=e==b.length)for(;e--;)if(!(f=e in a==e in b&&h(a[e],b[e],d)))break}else{if("constructor"in a!="constructor"in b||a.constructor!=b.constructor)return!1;for(var j in a)if(k.has(a,j)&&(e++,!(f=k.has(b,j)&&h(a[j],b[j],d))))break;if(f){for(j in b)if(k.has(b,j)&&!e--)break;
f=!e}}d.pop();return f}var e=this,g=e._,f={},c=Array.prototype,b=Object.prototype,a=c.slice,d=c.unshift,i=b.toString,j=b.hasOwnProperty,l=c.forEach,n=c.map,m=c.reduce,o=c.reduceRight,q=c.filter,r=c.every,t=c.some,x=c.indexOf,u=c.lastIndexOf,b=Array.isArray,z=Object.keys,A=Function.prototype.bind,k=function(a){return new B(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=k;exports._=k}else e._=k;k.VERSION="1.3.3";var v=k.each=k.forEach=function(a,
b,d){if(a!=null)if(l&&a.forEach===l)a.forEach(b,d);else if(a.length===+a.length)for(var c=0,e=a.length;c<e;c++){if(c in a&&b.call(d,a[c],c,a)===f)break}else for(c in a)if(k.has(a,c)&&b.call(d,a[c],c,a)===f)break};k.map=k.collect=function(a,b,c){var d=[];if(a==null)return d;if(n&&a.map===n)return a.map(b,c);v(a,function(a,e,i){d[d.length]=b.call(c,a,e,i)});if(a.length===+a.length)d.length=a.length;return d};k.reduce=k.foldl=k.inject=function(a,b,d,c){var e=arguments.length>2;a==null&&(a=[]);if(m&&
a.reduce===m)return c&&(b=k.bind(b,c)),e?a.reduce(b,d):a.reduce(b);v(a,function(a,i,f){e?d=b.call(c,d,a,i,f):(d=a,e=!0)});if(!e)throw new TypeError("Reduce of empty array with no initial value");return d};k.reduceRight=k.foldr=function(a,b,d,c){var e=arguments.length>2;a==null&&(a=[]);if(o&&a.reduceRight===o)return c&&(b=k.bind(b,c)),e?a.reduceRight(b,d):a.reduceRight(b);var i=k.toArray(a).reverse();c&&!e&&(b=k.bind(b,c));return e?k.reduce(i,b,d,c):k.reduce(i,b)};k.find=k.detect=function(a,b,d){var c;
F(a,function(a,e,i){if(b.call(d,a,e,i))return c=a,!0});return c};k.filter=k.select=function(a,b,d){var c=[];if(a==null)return c;if(q&&a.filter===q)return a.filter(b,d);v(a,function(a,e,i){b.call(d,a,e,i)&&(c[c.length]=a)});return c};k.reject=function(a,b,c){var d=[];if(a==null)return d;v(a,function(a,e,i){b.call(c,a,e,i)||(d[d.length]=a)});return d};k.every=k.all=function(a,b,d){var c=!0;if(a==null)return c;if(r&&a.every===r)return a.every(b,d);v(a,function(a,e,i){if(!(c=c&&b.call(d,a,e,i)))return f});
return!!c};var F=k.some=k.any=function(a,b,c){b||(b=k.identity);var d=!1;if(a==null)return d;if(t&&a.some===t)return a.some(b,c);v(a,function(a,e,i){if(d||(d=b.call(c,a,e,i)))return f});return!!d};k.include=k.contains=function(a,b){var d=!1;return a==null?d:x&&a.indexOf===x?a.indexOf(b)!=-1:d=F(a,function(a){return a===b})};k.invoke=function(b,d){var c=a.call(arguments,2);return k.map(b,function(a){return(k.isFunction(d)?d||a:a[d]).apply(a,c)})};k.pluck=function(a,b){return k.map(a,function(a){return a[b]})};
k.max=function(a,b,d){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!b&&k.isEmpty(a))return-Infinity;var c={computed:-Infinity};v(a,function(a,e,i){e=b?b.call(d,a,e,i):a;e>=c.computed&&(c={value:a,computed:e})});return c.value};k.min=function(a,b,d){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!b&&k.isEmpty(a))return Infinity;var c={computed:Infinity};v(a,function(a,e,i){e=b?b.call(d,a,e,i):a;e<c.computed&&(c={value:a,computed:e})});return c.value};k.shuffle=
function(a){var b=[],d;v(a,function(a,c){d=Math.floor(Math.random()*(c+1));b[c]=b[d];b[d]=a});return b};k.sortBy=function(a,b,d){var c=k.isFunction(b)?b:function(a){return a[b]};return k.pluck(k.map(a,function(a,b,e){return{value:a,criteria:c.call(d,a,b,e)}}).sort(function(a,b){var d=a.criteria,c=b.criteria;return d===void 0?1:c===void 0?-1:d<c?-1:d>c?1:0}),"value")};k.groupBy=function(a,b){var d={},c=k.isFunction(b)?b:function(a){return a[b]};v(a,function(a,b){var e=c(a,b);(d[e]||(d[e]=[])).push(a)});
return d};k.sortedIndex=function(a,b,d){d||(d=k.identity);for(var c=0,e=a.length;c<e;){var i=c+e>>1;d(a[i])<d(b)?c=i+1:e=i}return c};k.toArray=function(b){return!b?[]:k.isArray(b)?a.call(b):k.isArguments(b)?a.call(b):b.toArray&&k.isFunction(b.toArray)?b.toArray():k.values(b)};k.size=function(a){return k.isArray(a)?a.length:k.keys(a).length};k.first=k.head=k.take=function(b,d,c){return d!=null&&!c?a.call(b,0,d):b[0]};k.initial=function(b,d,c){return a.call(b,0,b.length-(d==null||c?1:d))};k.last=function(b,
d,c){return d!=null&&!c?a.call(b,Math.max(b.length-d,0)):b[b.length-1]};k.rest=k.tail=function(b,d,c){return a.call(b,d==null||c?1:d)};k.compact=function(a){return k.filter(a,function(a){return!!a})};k.flatten=function(a,b){return k.reduce(a,function(a,d){if(k.isArray(d))return a.concat(b?d:k.flatten(d));a[a.length]=d;return a},[])};k.without=function(b){return k.difference(b,a.call(arguments,1))};k.uniq=k.unique=function(a,b,d){var d=d?k.map(a,d):a,c=[];a.length<3&&(b=!0);k.reduce(d,function(d,e,
i){if(b?k.last(d)!==e||!d.length:!k.include(d,e))d.push(e),c.push(a[i]);return d},[]);return c};k.union=function(){return k.uniq(k.flatten(arguments,!0))};k.intersection=k.intersect=function(b){var d=a.call(arguments,1);return k.filter(k.uniq(b),function(a){return k.every(d,function(b){return k.indexOf(b,a)>=0})})};k.difference=function(b){var d=k.flatten(a.call(arguments,1),!0);return k.filter(b,function(a){return!k.include(d,a)})};k.zip=function(){for(var b=a.call(arguments),d=k.max(k.pluck(b,"length")),
c=Array(d),e=0;e<d;e++)c[e]=k.pluck(b,""+e);return c};k.indexOf=function(a,b,d){if(a==null)return-1;var c;if(d)return d=k.sortedIndex(a,b),a[d]===b?d:-1;if(x&&a.indexOf===x)return a.indexOf(b);d=0;for(c=a.length;d<c;d++)if(d in a&&a[d]===b)return d;return-1};k.lastIndexOf=function(a,b){if(a==null)return-1;if(u&&a.lastIndexOf===u)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};k.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,
c=Math.max(Math.ceil((b-a)/d),0),e=0,i=Array(c);e<c;)i[e++]=a,a+=d;return i};var G=function(){};k.bind=function(b,d){var c,e;if(b.bind===A&&A)return A.apply(b,a.call(arguments,1));if(!k.isFunction(b))throw new TypeError;e=a.call(arguments,2);return c=function(){if(!(this instanceof c))return b.apply(d,e.concat(a.call(arguments)));G.prototype=b.prototype;var i=new G,f=b.apply(i,e.concat(a.call(arguments)));return Object(f)===f?f:i}};k.bindAll=function(b){var d=a.call(arguments,1);d.length==0&&(d=k.functions(b));
v(d,function(a){b[a]=k.bind(b[a],b)});return b};k.memoize=function(a,b){var d={};b||(b=k.identity);return function(){var c=b.apply(this,arguments);return k.has(d,c)?d[c]:d[c]=a.apply(this,arguments)}};k.delay=function(b,d){var c=a.call(arguments,2);return setTimeout(function(){return b.apply(null,c)},d)};k.defer=function(b){return k.delay.apply(k,[b,1].concat(a.call(arguments,1)))};k.throttle=function(a,b){var d,c,e,i,f,j,g=k.debounce(function(){f=i=!1},b);return function(){d=this;c=arguments;var k;
e||(e=setTimeout(function(){e=null;f&&a.apply(d,c);g()},b));i?f=!0:j=a.apply(d,c);g();i=!0;return j}};k.debounce=function(a,b,d){var c;return function(){var e=this,i=arguments;d&&!c&&a.apply(e,i);clearTimeout(c);c=setTimeout(function(){c=null;d||a.apply(e,i)},b)}};k.once=function(a){var b=!1,d;return function(){if(b)return d;b=!0;return d=a.apply(this,arguments)}};k.wrap=function(b,d){return function(){var c=[b].concat(a.call(arguments,0));return d.apply(this,c)}};k.compose=function(){var a=arguments;
return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};k.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};k.keys=z||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)k.has(a,d)&&(b[b.length]=d);return b};k.values=function(a){return k.map(a,k.identity)};k.functions=k.methods=function(a){var b=[],d;for(d in a)k.isFunction(a[d])&&b.push(d);return b.sort()};k.extend=function(b){v(a.call(arguments,
1),function(a){for(var d in a)b[d]=a[d]});return b};k.pick=function(b){var d={};v(k.flatten(a.call(arguments,1)),function(a){a in b&&(d[a]=b[a])});return d};k.defaults=function(b){v(a.call(arguments,1),function(a){for(var d in a)b[d]==null&&(b[d]=a[d])});return b};k.clone=function(a){return!k.isObject(a)?a:k.isArray(a)?a.slice():k.extend({},a)};k.tap=function(a,b){b(a);return a};k.isEqual=function(a,b){return h(a,b,[])};k.isEmpty=function(a){if(a==null)return!0;if(k.isArray(a)||k.isString(a))return a.length===
0;for(var b in a)if(k.has(a,b))return!1;return!0};k.isElement=function(a){return!!(a&&a.nodeType==1)};k.isArray=b||function(a){return i.call(a)=="[object Array]"};k.isObject=function(a){return a===Object(a)};k.isArguments=function(a){return i.call(a)=="[object Arguments]"};if(!k.isArguments(arguments))k.isArguments=function(a){return!(!a||!k.has(a,"callee"))};k.isFunction=function(a){return i.call(a)=="[object Function]"};k.isString=function(a){return i.call(a)=="[object String]"};k.isNumber=function(a){return i.call(a)==
"[object Number]"};k.isFinite=function(a){return k.isNumber(a)&&isFinite(a)};k.isNaN=function(a){return a!==a};k.isBoolean=function(a){return a===!0||a===!1||i.call(a)=="[object Boolean]"};k.isDate=function(a){return i.call(a)=="[object Date]"};k.isRegExp=function(a){return i.call(a)=="[object RegExp]"};k.isNull=function(a){return a===null};k.isUndefined=function(a){return a===void 0};k.has=function(a,b){return j.call(a,b)};k.noConflict=function(){e._=g;return this};k.identity=function(a){return a};
k.times=function(a,b,d){for(var c=0;c<a;c++)b.call(d,c)};k.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};k.result=function(a,b){if(a==null)return null;var d=a[b];return k.isFunction(d)?d.call(a):d};k.mixin=function(a){v(k.functions(a),function(b){H(b,k[b]=a[b])})};var s=0;k.uniqueId=function(a){var b=s++;return a?a+b:b};k.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,
escape:/<%-([\s\S]+?)%>/g};var w=/.^/,y={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},C;for(C in y)y[y[C]]=C;var I=/\\|'|\r|\n|\t|\u2028|\u2029/g,J=/\\(\\|'|r|n|t|u2028|u2029)/g,D=function(a){return a.replace(J,function(a,b){return y[b]})};k.template=function(a,b,d){d=k.defaults(d||{},k.templateSettings);a="__p+='"+a.replace(I,function(a){return"\\"+y[a]}).replace(d.escape||w,function(a,b){return"'+\n_.escape("+D(b)+")+\n'"}).replace(d.interpolate||w,function(a,b){return"'+\n("+
D(b)+")+\n'"}).replace(d.evaluate||w,function(a,b){return"';\n"+D(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",c=new Function(d.variable||"obj","_",a);if(b)return c(b,k);b=function(a){return c.call(this,a,k)};b.source="function("+(d.variable||"obj")+"){\n"+a+"}";return b};k.chain=function(a){return k(a).chain()};var B=function(a){this._wrapped=a};k.prototype=B.prototype;
var E=function(a,b){return b?k(a).chain():a},H=function(b,c){B.prototype[b]=function(){var b=a.call(arguments);d.call(b,this._wrapped);return E(c.apply(k,b),this._chain)}};k.mixin(k);v(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=c[a];B.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var c=d.length;(a=="shift"||a=="splice")&&c===0&&delete d[0];return E(d,this._chain)}});v(["concat","join","slice"],function(a){var b=c[a];B.prototype[a]=function(){return E(b.apply(this._wrapped,
arguments),this._chain)}});B.prototype.chain=function(){this._chain=!0;return this};B.prototype.value=function(){return this._wrapped};return k}.call({}),emmet=function(h,e){function g(a,b,i){var f;f=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};e.extend(f,a);c.prototype=a.prototype;f.prototype=new c;b&&e.extend(f.prototype,b);i&&e.extend(f,i);f.prototype.constructor=f;f.__super__=a.prototype;return f}var f={_:e},c=function(){},b=null;return{define:function(a,
b){a in f||(f[a]=e.isFunction(b)?this.exec(b):b)},require:function(a){!(a in f)&&b&&b(a);return f[a]},exec:function(a,b){return a.call(b||h,e.bind(this.require,this),e,this)},extend:function(a,b){var c=g(this,a,b);c.extend=this.extend;if(a.hasOwnProperty("toString"))c.prototype.toString=a.toString;return c},expandAbbreviation:function(a,b,c,e){if(!a)return"";var b=b||"html",c=c||"plain",f=this.require("filters"),g=this.require("utils"),h=this.require("abbreviationParser"),c=this.require("profile").get(c,
b);this.require("tabStops").resetTabstopIndex();a=f.extractFromAbbreviation(a);e=h.parse(a[0],{syntax:b,contextNode:e});b=f.composeList(b,c,a[1]);f.apply(e,b,c);return g.replaceVariables(e.toString())},defaultSyntax:function(){return"html"},defaultProfile:function(){return"plain"},log:function(){h.console&&h.console.log&&h.console.log.apply(h.console,arguments)},setModuleLoader:function(a){b=a}}}(this,_);
emmet.define("abbreviationParser",function(h,e){function g(){this.parent=null;this.children=[];this._attributes=[];this.abbreviation="";this.counter=1;this._name=null;this._text="";this.repeatCount=1;this.hasImplicitRepeat=!1;this._data={};this.padding=this.content=this.end=this.start=""}function f(a){return a.substring(1,a.length-1)}function c(a){for(var a=h("utils").trim(a),b=new g,d=b.addChild(),i,j=h("stringStream").create(a),a=1E3,m;!j.eol()&&--a>0;)switch(i=j.peek(),i){case "(":j.start=j.pos;
if(j.skipToPair("(",")"))i=c(f(j.current())),(m=j.match(/^\*(\d+)?/,!0))&&d._setRepeat(m[1]),e.each(i.children,function(a){d.addChild(a)});else throw'Invalid abbreviation: mo matching ")" found for character at '+j.pos;break;case ">":d=d.addChild();j.next();break;case "+":d=d.parent.addChild();j.next();break;case "^":i=d.parent||d;d=(i.parent||i).addChild();j.next();break;default:j.start=j.pos,j.eatWhile(function(a){if(a=="["||a=="{"){if(j.skipToPair(a,q[a]))return j.backUp(1),!0;throw'Invalid abbreviation: mo matching "'+
q[a]+'" found for character at '+j.pos;}return a=="+"?(j.next(),a=j.eol()||~"+>^*".indexOf(j.peek()),j.backUp(1),a):a!="("&&n(a)}),d.setAbbreviation(j.current()),j.start=j.pos}if(a<1)throw"Endless loop detected";return b}function b(a){var a=h("utils").trim(a),b=[],a=h("stringStream").create(a);for(a.eatSpace();!a.eol();)if(a.start=a.pos,a.eatWhile(o)){var d=a.current(),c="";if(a.peek()=="="){a.next();a.start=a.pos;var e=a.peek();if(e=='"'||e=="'"){a.next();a:{for(var c=a,i=void 0;i=c.next();)if(i===
e){c=!0;break a}c=!1}if(c)c=a.current(),c=c.substring(1,c.length-1);else throw"Invalid attribute value";}else if(a.eatWhile(/[^\s\]]/))c=a.current();else throw"Invalid attribute value";}b.push({name:d,value:c});a.eatSpace()}else break;return b}function a(a){for(var c=[],e={"#":"id",".":"class"},i=null,j=h("stringStream").create(a);!j.eol();)switch(j.peek()){case "#":case ".":if(i===null)i=j.pos;var g=e[j.peek()];j.next();j.start=j.pos;j.eatWhile(o);c.push({name:g,value:j.current()});break;case "[":if(i===
null)i=j.pos;j.start=j.pos;if(!j.skipToPair("[","]"))throw"Invalid attribute set definition";c=c.concat(b(f(j.current())));break;default:j.next()}return!c.length?null:{element:a.substring(0,i),attributes:d(c)}}function d(a){var a=e.map(a,function(a){return e.clone(a)}),b={};return e.filter(a,function(a){if(!(a.name in b))return b[a.name]=a;var d=b[a.name];a.name.toLowerCase()=="class"?d.value+=(d.value.length?" ":"")+a.value:d.value=a.value;return!1})}function i(a){if(!~a.indexOf("{"))return null;
for(var b=h("stringStream").create(a);!b.eol();)switch(b.peek()){case "[":case "(":b.skipToPair(b.peek(),q[b.peek()]);break;case "{":return b.start=b.pos,b.skipToPair("{","}"),{element:a.substring(0,b.start),text:f(b.current())};default:b.next()}}function j(a){for(var b=a.children.length-1,d,c;b>=0;b--)if(c=a.children[b],c.isRepeating()){d=c.repeatCount;c.repeatCount=1;for(c.updateProperty("counter",1);--d>0;)c.parent.addChild(c.clone(),b+1).updateProperty("counter",d+1)}e.each(a.children,j);return a}
function l(a){for(var b=a.children.length-1;b>=0;b--){var d=a.children[b];d.isGroup()?d.replace(l(d).children):d.isEmpty()&&d.remove()}e.each(a.children,l);return a}function n(a){var b=a.charCodeAt(0);return b>64&&b<91||b>96&&b<123||b>47&&b<58||"#.*:$-_!@|".indexOf(a)!=-1}var m=/^[\w\-\$\:@\!]+\+?$/i,o=/[\w\-:\$]/,q={"[":"]","(":")","{":"}"},r=Array.prototype.splice,t=[],x=[],u=[];g.prototype={addChild:function(a,b){a=a||new g;a.parent=this;e.isUndefined(b)?this.children.push(a):this.children.splice(b,
0,a);return a},clone:function(){var a=new g;e.each(["abbreviation","counter","_name","_text","repeatCount","hasImplicitRepeat","start","end","content","padding"],function(b){a[b]=this[b]},this);a._attributes=e.map(this._attributes,function(a){return e.clone(a)});a._data=e.clone(this._data);a.children=e.map(this.children,function(b){b=b.clone();b.parent=a;return b});return a},remove:function(){if(this.parent)this.parent.children=e.without(this.parent.children,this);return this},replace:function(){var a=
this.parent,b=e.indexOf(a.children,this),d=e.flatten(arguments);r.apply(a.children,[b,1].concat(d));e.each(d,function(b){b.parent=a})},updateProperty:function(a,b){this[a]=b;e.each(this.children,function(d){d.updateProperty(a,b)})},find:function(a){return this.findAll(a)[0]},findAll:function(a){if(!e.isFunction(a))var b=a.toLowerCase(),a=function(a){return a.name().toLowerCase()==b};var d=[];e.each(this.children,function(b){a(b)&&d.push(b);d=d.concat(b.findAll(a))});return e.compact(d)},data:function(a,
b){if(arguments.length==2&&(this._data[a]=b,a=="resource"&&h("elements").is(b,"snippet")&&(this.content=b.data,this._text)))this.content=h("abbreviationUtils").insertChildContent(b.data,this._text);return this._data[a]},name:function(){var a=this.matchedResource();return h("elements").is(a,"element")?a.name:this._name},attributeList:function(){var a=[],b=this.matchedResource();h("elements").is(b,"element")&&e.isArray(b.attributes)&&(a=a.concat(b.attributes));return d(a.concat(this._attributes))},
attribute:function(a,b){if(arguments.length==2){var d=e.indexOf(e.pluck(this._attributes,"name"),a.toLowerCase());if(~d)this._attributes[d].value=b}return(e.find(this.attributeList(),function(b){return b.name==a})||{}).value},matchedResource:function(){return this.data("resource")},index:function(){return this.parent?e.indexOf(this.parent.children,this):-1},_setRepeat:function(a){a?this.repeatCount=parseInt(a,10)||1:this.hasImplicitRepeat=!0},setAbbreviation:function(b){var d=this;this.abbreviation=
b=(b||"").replace(/\*(\d+)?$/,function(a,b){d._setRepeat(b);return""});var c=i(b);if(c)b=c.element,this.content=this._text=c.text;if(c=a(b))b=c.element,this._attributes=c.attributes;if((this._name=b)&&!m.test(this._name))throw"Invalid abbreviation";},toString:function(){var a=h("utils"),b=this.start,d=this.end,c=this.content,i=this;e.each(u,function(a){b=a(b,i,"start");c=a(c,i,"content");d=a(d,i,"end")});var j=e.map(this.children,function(a){return a.toString()}).join(""),c=h("abbreviationUtils").insertChildContent(c,
j,{keepVariable:!1});return b+a.padString(c,this.padding)+d},hasEmptyChildren:function(){return!!e.find(this.children,function(a){return a.isEmpty()})},hasImplicitName:function(){return!this._name&&!this.isTextNode()},isGroup:function(){return!this.abbreviation},isEmpty:function(){return!this.abbreviation&&!this.children.length},isRepeating:function(){return this.repeatCount>1||this.hasImplicitRepeat},isTextNode:function(){return!this.name()&&!this.attributeList().length},isElement:function(){return!this.isEmpty()&&
!this.isTextNode()},deepestChild:function(){if(!this.children.length)return null;for(var a=this;a.children.length;)a=e.last(a.children);return a}};u.push(function(a,b){return h("utils").replaceCounter(a,b.counter)});return{parse:function(a,b){var b=b||{},d=c(a);if(b.contextNode){d._name=b.contextNode.name;var i={};e.each(d._attributes,function(a){i[a.name]=a});e.each(b.contextNode.attributes,function(a){a.name in i?i[a.name].value=a.value:(a=e.clone(a),d._attributes.push(a),i[a.name]=a)})}e.each(t,
function(a){a(d,b)});d=l(j(d));e.each(x,function(a){a(d,b)});return d},AbbreviationNode:g,addPreprocessor:function(a){e.include(t,a)||t.push(a)},removeFilter:function(a){preprocessor=e.without(t,a)},addPostprocessor:function(a){e.include(x,a)||x.push(a)},removePostprocessor:function(a){x=e.without(x,a)},addOutputProcessor:function(a){e.include(u,a)||u.push(a)},removeOutputProcessor:function(a){u=e.without(u,a)},isAllowedChar:function(a){a=String(a);return n(a)||~">+^[](){}".indexOf(a)}}});
emmet.exec(function(h,e){function g(f,c){var b=h("resources"),a=h("elements"),d=h("abbreviationParser");e.each(e.clone(f.children),function(i){var j=b.getMatchedResource(i,c);if(e.isString(j))i.data("resource",a.create("snippet",j));else if(a.is(j,"reference")){j=d.parse(j.data,{syntax:c});if(i.repeatCount>1){var f=j.findAll(function(a){return a.hasImplicitRepeat});e.each(f,function(a){a.repeatCount=i.repeatCount;a.hasImplicitRepeat=!1})}var h=j.deepestChild();h&&e.each(i.children,function(a){h.addChild(a)});
i.replace(j.children)}else i.data("resource",j);g(i,c)})}h("abbreviationParser").addPreprocessor(function(e,c){var b=c.syntax||emmet.defaultSyntax();g(e,b)})});
emmet.exec(function(h,e){function g(a){for(var b=h("range"),c=[],a=h("stringStream").create(a);!a.eol();){if(a.peek()=="\\")a.next();else if(a.start=a.pos,a.match(d,!0)){c.push(b.create(a.start,d));continue}a.next()}return c}function f(a,b){var d=h("utils"),c=g(a);c.reverse();e.each(c,function(c){a=d.replaceSubstring(a,b,c)});return a}function c(a){return g(a.content).length?!0:!!e.find(a.attributeList(),function(a){return!!g(a.value).length})}function b(a,b){var d=a.findAll(function(a){return c(a)});
c(a)&&d.unshift(a);d.length?e.each(d,function(a){a.content=f(a.content,b);e.each(a._attributes,function(a){a.value=f(a.value,b)})}):(d=a.deepestChild()||a,d.content=h("abbreviationUtils").insertChildContent(d.content,b))}var a=h("abbreviationParser"),d="$#";a.addPreprocessor(function(a,b){if(b.pastedContent){var d=h("utils").splitByLines(b.pastedContent,!0);a.findAll(function(a){if(a.hasImplicitRepeat)return a.data("paste",d),a.repeatCount=d.length})}});a.addPostprocessor(function(a,d){!a.findAll(function(a){var d=
a.data("paste"),c="";e.isArray(d)?c=d[a.counter-1]:e.isFunction(d)?c=d(a.counter-1,a.content):d&&(c=d);c&&b(a,c);a.data("paste",null);return!e.isUndefined(d)}).length&&d.pastedContent&&b(a,d.pastedContent)})});emmet.exec(function(h,e){function g(f){var c=h("tagName");e.each(f.children,function(b){if(b.hasImplicitName()||b.data("forceNameResolving"))b._name=c.resolve(b.parent.name());g(b)});return f}h("abbreviationParser").addPostprocessor(g)});
emmet.define("cssParser",function(h,e){function g(a){return typeof a!=="undefined"}function f(){return{"char":i.chnum,line:i.linenum}}function c(a,b,d){var c=i,d=d||{};j.push({charstart:g(d["char"])?d["char"]:c.chnum,charend:g(d.charend)?d.charend:c.chnum,linestart:g(d.line)?d.line:c.linenum,lineend:g(d.lineend)?d.lineend:c.linenum,value:a,type:b||a})}function b(a,b){var d=i,c=b||{},e=g(c["char"])?c["char"]:d.chnum,c=g(c.line)?c.line:d.linenum;return{name:"ParseError",message:a+" at line "+(c+1)+
" char "+(e+1),walker:d,tokens:j}}function a(a){var b=i,d=b.ch,e=f(),j=a?a+d:d,d=b.nextChar();for(a&&(e["char"]-=a.length);n(d)||m(d);)j+=d,d=b.nextChar();c(j,"identifier",e)}function d(){var d=i.ch;if(d===" "||d==="\t"){for(var e=i.ch,j="",g=f();e===" "||e==="\t";)j+=e,e=i.nextChar();c(j,"white",g)}else{if(d==="/"){var e=i,d=g=e.ch,h,u=f();h=e.nextChar();if(h!=="*")u.charend=u["char"],u.lineend=u.line,j=c(d,d,u);else{for(;!(g==="*"&&h==="/");)d+=h,g=h,h=e.nextChar();d+=h;e.nextChar();c(d,"comment",
u)}return j}if(d==='"'||d==="'"){e=i;d=g=j=e.ch;u=f();for(j=e.nextChar();j!==g;){if(j==="\n")if(h=e.nextChar(),h==="\\")d+=j+h;else throw b("Unterminated string",u);else d+=j==="\\"?j+e.nextChar():j;j=e.nextChar()}d+=j;e.nextChar();c(d,"string",u)}else if(d==="("){e=i;j=e.ch;g=0;d=j;h=f();for(j=e.nextChar();j!==")"&&!g;){if(j==="(")g++;else if(j===")")g--;else if(j===!1)throw b("Unterminated brace",h);d+=j;j=e.nextChar()}d+=j;e.nextChar();c(d,"brace",h)}else{if(d==="-"||d==="."||m(d)){j=i;g=j.ch;
d=f();h=g;var u=h===".",z,g=j.nextChar();z=!m(g);if(u&&z)d.charend=d["char"],d.lineend=d.line,e=c(h,".",d);else if(h==="-"&&z)e=a("-");else{for(;g!==!1&&(m(g)||!u&&g===".");)g==="."&&(u=!0),h+=g,g=j.nextChar();c(h,"number",d)}return e}if(n(d))return a();if(l(d))return e=i,d=e.ch,j=f(),h=e.nextChar(),h==="="&&l(d,!0)?(d+=h,c(d,"match",j),e.nextChar(),g=void 0):(j.charend=j["char"]+1,j.lineend=j.line,c(d,d,j)),g;if(d==="\n")c("line"),i.nextChar();else throw b("Unrecognized character");}}}var i,j=[],
l,n,m;i={lines:null,total_lines:0,linenum:-1,line:"",ch:"",chnum:-1,init:function(a){var b=i;b.lines=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n");b.total_lines=b.lines.length;b.chnum=-1;b.linenum=-1;b.ch="";b.line="";b.nextLine();b.nextChar()},nextLine:function(){this.linenum+=1;this.line=this.total_lines<=this.linenum?!1:this.lines[this.linenum];if(this.chnum!==-1)this.chnum=0;return this.line},nextChar:function(){for(this.chnum+=1;this.line.charAt(this.chnum)==="";){if(this.nextLine()===
!1)return this.ch=!1;this.chnum=-1;return this.ch="\n"}return this.ch=this.line.charAt(this.chnum)},peek:function(){return this.line.charAt(this.chnum+1)}};n=function(a){return a==="_"||a==="-"||a>="a"&&a<="z"||a>="A"&&a<="Z"};m=function(a){return a!==!1&&a>="0"&&a<="9"};l=function(){for(var a="{}[]()+*=.,;:>~|\\%$#@^!".split(""),b="*^|$~".split(""),d={},c={},e=0;e<a.length;e+=1)d[a[e]]=!0;for(e=0;e<b.length;e+=1)c[b[e]]=!0;return function(a,b){return b?!!c[a]:!!d[a]}}();return{lex:function(a){i.init(a);
for(j=[];i.ch!==!1;)d();return j},parse:function(a){var b=0;return e.map(this.lex(a),function(d){if(d.type=="line")d.value=a.charAt(b)=="\r"&&a.charAt(b+1)=="\n"?"\r\n":a.charAt(b);return{type:d.type,start:b,end:b+=d.value.length}})},toSource:function(a){for(var b=0,d=a.length,c,e="";b<d;b+=1)c=a[b],e+=c.type==="line"?"\n":c.value;return e}}});
emmet.define("xmlParser",function(h){function e(a,d){function e(b){d.tokenize=b;return b(a,d)}var i=a.next();if(i=="<")if(a.eat("!"))return a.eat("[")?a.match("CDATA[")?e(c("atom","]]\>")):null:a.match("--")?e(c("comment","--\>")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),e(b(1))):null;else if(a.eat("?"))return a.eatWhile(/[\w\._\-]/),d.tokenize=c("meta","?>"),"meta";else{A=a.eat("/")?"closeTag":"openTag";a.eatSpace();for(z="";i=a.eat(/[^\s\u00a0=<>\"\'\/?]/);)z+=i;d.tokenize=g;return"tag"}else return i==
"&"?(a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"))?"atom":"error":(a.eatWhile(/[^&<]/),"text")}function g(a,b){var d=a.next();return d==">"||d=="/"&&a.eat(">")?(b.tokenize=e,A=d==">"?"endTag":"selfcloseTag","tag"):d=="="?(A="equals",null):/[\'\"]/.test(d)?(b.tokenize=f(d),b.tokenize(a,b)):(a.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function f(a){return function(b,d){for(;!b.eol();)if(b.next()==a){d.tokenize=g;break}return"string"}}
function c(a,b){return function(d,c){for(;!d.eol();){if(d.match(b)){c.tokenize=e;break}d.next()}return a}}function b(a){return function(d,c){for(var i;(i=d.next())!=null;)if(i=="<")return c.tokenize=b(a+1),c.tokenize(d,c);else if(i==">")if(a==1){c.tokenize=e;break}else return c.tokenize=b(a-1),c.tokenize(d,c);return"meta"}}function a(){for(var a=arguments.length-1;a>=0;a--)k.cc.push(arguments[a])}function d(){a.apply(null,arguments);return!0}function i(){if(k.context)k.context=k.context.prev}function j(a){if(a==
"openTag")return k.tagName=z,d(o,l(k.startOfLine));else if(a=="closeTag")return a=!1,k.context?k.context.tagName!=z&&(u.implicitlyClosed.hasOwnProperty(k.context.tagName.toLowerCase())&&i(),a=!k.context||k.context.tagName!=z):a=!0,a&&(v="error"),d(n(a));return d()}function l(a){return function(b){if(b=="selfcloseTag"||b=="endTag"&&u.autoSelfClosers.hasOwnProperty(k.tagName.toLowerCase()))return m(k.tagName.toLowerCase()),d();if(b=="endTag"){m(k.tagName.toLowerCase());var b=k.tagName,c=u.doNotIndent.hasOwnProperty(b)||
k.context&&k.context.noIndent;k.context={prev:k.context,tagName:b,indent:k.indented,startOfLine:a,noIndent:c}}return d()}}function n(a){return function(b){a&&(v="error");if(b=="endTag")return i(),d();v="error";return d(arguments.callee)}}function m(a){for(var b;;){if(!k.context)break;b=k.context.tagName.toLowerCase();if(!u.contextGrabbers.hasOwnProperty(b)||!u.contextGrabbers[b].hasOwnProperty(a))break;i()}}function o(b){if(b=="word")return v="attribute",d(q,o);if(b=="endTag"||b=="selfcloseTag")return a();
v="error";return d(o)}function q(b){if(b=="equals")return d(r,o);u.allowMissing||(v="error");return b=="endTag"||b=="selfcloseTag"?a():d()}function r(b){if(b=="string")return d(t);if(b=="word"&&u.allowUnquoted)return v="string",d();v="error";return b=="endTag"||b=="selfCloseTag"?a():d()}function t(b){return b=="string"?d(t):a()}function x(a,b){if(a.sol())b.startOfLine=!0,b.indented=0;if(a.eatSpace())return null;v=A=z=null;var d=b.tokenize(a,b);b.type=A;if((d||A)&&d!="comment")for(k=b;;)if((b.cc.pop()||
j)(A||d))break;b.startOfLine=!1;return v||d}var u={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!0,allowMissing:!0},z=null,A=null,k=null,v;return{parse:function(a,b){for(var b=b||0,d={tokenize:e,cc:[],indented:0,startOfLine:!0,tagName:null,context:null},c=h("stringStream").create(a),i=[];!c.eol();)i.push({type:x(c,d),start:c.start+b,end:c.pos+b}),c.start=c.pos;return i}}});
emmet.define("utils",function(h,e){function g(c){this._data=[];this.length=0;c&&this.append(c)}var f="${0}";g.prototype={append:function(c){this._data.push(c);this.length+=c.length},toString:function(){return this._data.join("")},valueOf:function(){return this.toString()}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(c){return this.reTag.test(c)},isNumeric:function(c){typeof c=="string"&&(c=c.charCodeAt(0));return c&&c>47&&
c<58},trim:function(c){return(c||"").replace(/^\s+|\s+$/g,"")},getNewline:function(){var c=h("resources");if(!c)return"\n";c=c.getVariable("newline");return e.isString(c)?c:"\n"},setNewline:function(c){var b=h("resources");b.setVariable("newline",c);b.setVariable("nl",c)},splitByLines:function(c,b){var a=this.getNewline(),a=(c||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,a).split(a);b&&(a=e.filter(a,function(a){return a.length&&!!this.trim(a)},this));return a},
normalizeNewline:function(c){return this.splitByLines(c).join(this.getNewline())},repeatString:function(c,b){for(var a=[],d=0;d<b;d++)a.push(c);return a.join("")},padString:function(c,b){var a=e.isNumber(b)?this.repeatString(h("resources").getVariable("indentation")||"\t",b):b,d=[],i=this.splitByLines(c),j=this.getNewline();d.push(i[0]);for(var f=1;f<i.length;f++)d.push(j+a+i[f]);return d.join("")},zeroPadString:function(c,b){for(var a="",d=c.length;b>d++;)a+="0";return a+c},unindentString:function(c,
b){for(var a=this.splitByLines(c),d=0;d<a.length;d++)a[d].search(b)==0&&(a[d]=a[d].substr(b.length));return a.join(this.getNewline())},replaceUnescapedSymbol:function(c,b,a){for(var d=0,i=c.length,j=b.length,f=0;d<i;)if(c.charAt(d)=="\\")d+=j+1;else if(c.substr(d,j)==b){var g=j;f++;var h=a;if(e.isFunction(a))(h=a(c,b,d,f))?(g=h[0].length,h=h[1]):h=!1;h===!1?d++:(c=c.substring(0,d)+h+c.substring(d+g),i=c.length,d+=h.length)}else d++;return c},replaceVariables:function(c,b){var b=b||{},a=e.isFunction(b)?
b:function(a,d){return d in b?b[d]:null},d=h("resources");return h("tabStops").processText(c,{variable:function(b){var c=a(b.token,b.name,b);c===null&&(c=d.getVariable(b.name));if(c===null||e.isUndefined(c))c=b.token;return c}})},replaceCounter:function(c,b){var b=String(b),a=this;return this.replaceUnescapedSymbol(String(c),"$",function(d,c,e){if(d.charAt(e+1)=="{"||a.isNumeric(d.charAt(e+1)))return!1;for(c=e+1;d.charAt(c)=="$"&&d.charAt(c+1)!="{";)c++;return[d.substring(e,c),a.zeroPadString(b,c-
e)]})},matchesTag:function(c){return this.reTag.test(c||"")},escapeText:function(c){return c.replace(/([\$\\])/g,"\\$1")},unescapeText:function(c){return c.replace(/\\(.)/g,"$1")},getCaretPlaceholder:function(){return e.isFunction(f)?f.apply(this,arguments):f},setCaretPlaceholder:function(c){f=c},getLinePadding:function(c){return(c.match(/^(\s+)/)||[""])[0]},getLinePaddingFromPosition:function(c,b){return this.getLinePadding(this.findNewlineBounds(c,b).substring(c))},escapeForRegexp:function(c){return c.replace(RegExp("[.*+?|()\\[\\]{}\\\\]",
"g"),"\\$&")},prettifyNumber:function(c,b){return c.toFixed(typeof b=="undefined"?2:b).replace(/\.?0+$/,"")},stringBuilder:function(c){return new g(c)},replaceSubstring:function(c,b,a,d){if(e.isObject(a)&&"end"in a)d=a.end,a=a.start;e.isString(d)&&(d=a+d.length);e.isUndefined(d)&&(d=a);return a<0||a>c.length?c:c.substring(0,a)+b+c.substring(d)},narrowToNonSpace:function(c,b,a){b=h("range").create(b,a);for(a=/[\s\n\r\u00a0]/;b.start<b.end;){if(!a.test(c.charAt(b.start)))break;b.start++}for(;b.end>
b.start;)if(b.end--,!a.test(c.charAt(b.end))){b.end++;break}return b},findNewlineBounds:function(c,b){for(var a=c.length,d=0,e=a-1,j=b-1;j>0;j--){var f=c.charAt(j);if(f=="\n"||f=="\r"){d=j+1;break}}for(j=b;j<a;j++)if(f=c.charAt(j),f=="\n"||f=="\r"){e=j;break}return h("range").create(d,e-d)},deepMerge:function(){var c,b,a,d,i,f=arguments[0]||{},g=1,h=arguments.length;for(!e.isObject(f)&&!e.isFunction(f)&&(f={});g<h;g++)if((c=arguments[g])!=null)for(b in c)a=f[b],d=c[b],f!==d&&(d&&(e.isObject(d)||(i=
e.isArray(d)))?(i?(i=!1,a=a&&e.isArray(a)?a:[]):a=a&&e.isObject(a)?a:{},f[b]=this.deepMerge(a,d)):d!==void 0&&(f[b]=d));return f}}});
emmet.define("range",function(h,e){function g(f,c){e.isObject(f)&&"start"in f?(this.start=Math.min(f.start,f.end),this.end=Math.max(f.start,f.end)):e.isArray(f)?(this.start=f[0],this.end=f[1]):(c=e.isString(c)?c.length:+c,this.start=f,this.end=f+c)}g.prototype={length:function(){return Math.abs(this.end-this.start)},equal:function(e){return this.start===e.start&&this.end===e.end},shift:function(e){this.start+=e;this.end+=e;return this},overlap:function(e){return e.start<=this.end&&e.end>=this.start},
intersection:function(e){if(this.overlap(e)){var c=Math.max(e.start,this.start);return new g(c,Math.min(e.end,this.end)-c)}return null},union:function(e){if(this.overlap(e)){var c=Math.min(e.start,this.start);return new g(c,Math.max(e.end,this.end)-c)}return null},inside:function(e){return this.start<=e&&this.end>e},include:function(e){return this.start<=e.start&&this.end>=e.end},substring:function(e){return this.length()>0?e.substring(this.start,this.end):""},clone:function(){return new g(this.start,
this.length())},toArray:function(){return[this.start,this.end]},toString:function(){return"{"+this.start+", "+this.length()+"}"}};return{create:function(f,c){return e.isUndefined(f)||f===null?null:f instanceof g?f:new g(f,c)},create2:function(f,c){e.isNumber(f)&&e.isNumber(c)&&(c-=f);return this.create(f,c)}}});
emmet.define("handlerList",function(h,e){function g(){this._list=[]}g.prototype={add:function(f,c){this._list.push(e.extend({order:0},c||{},{fn:f}))},remove:function(f){this._list=e.without(this._list,e.find(this._list,function(c){return c.fn===f}))},list:function(){return e.sortBy(this._list,"order").reverse()},listFn:function(){return e.pluck(this.list(),"fn")},exec:function(f,c){var c=c||[],b=null;e.find(this.list(),function(a){b=a.fn.apply(a,c);if(b!==f)return!0});return b}};return{create:function(){return new g}}});
emmet.define("tokenIterator",function(h,e){function g(e){this.tokens=e;this._position=0;this.reset()}g.prototype={next:function(){if(this.hasNext()){var e=this.tokens[++this._i];this._position=e.start;return e}return null},current:function(){return this.tokens[this._i]},position:function(){return this._position},hasNext:function(){return this._i<this._il-1},reset:function(){this._i=-1;this._il=this.tokens.length},item:function(){return this.tokens[this._i]},itemNext:function(){return this.tokens[this._i+
1]},itemPrev:function(){return this.tokens[this._i-1]},nextUntil:function(f,c){for(var b,a=e.isString(f)?function(a){return a.type==f}:f;b=this.next();)if(c&&c.call(this,b),a.call(this,b))break}};return{create:function(e){return new g(e)}}});
emmet.define("stringStream",function(){function h(e){this.pos=this.start=0;this.string=e}h.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(e){var g=this.string.charAt(this.pos);if(typeof e=="string"?g==e:g&&(e.test?e.test(g):e(g)))return++this.pos,g},eatWhile:function(e){for(var g=this.pos;this.eat(e););
return this.pos>g},eatSpace:function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){e=this.string.indexOf(e,this.pos);if(e>-1)return this.pos=e,!0},skipToPair:function(e,g){for(var f=0,c,b=this.pos,a=this.string.length;b<a;)if(c=this.string.charAt(b++),c==e)f++;else if(c==g&&(f--,f<1))return this.pos=b,!0;return!1},backUp:function(e){this.pos-=e},match:function(e,g,f){if(typeof e==
"string"){if(f=f?function(c){return c.toLowerCase()}:function(c){return c},f(this.string).indexOf(f(e),this.pos)==this.pos)return g!==!1&&(this.pos+=e.length),!0}else return(e=this.string.slice(this.pos).match(e))&&g!==!1&&(this.pos+=e[0].length),e},current:function(){return this.string.slice(this.start,this.pos)}};return{create:function(e){return new h(e)}}});
emmet.define("resources",function(h,e){function g(a){return a==b?i:j}function f(b,d,c){var e=g(b),j=[],f=null;e&&d in e&&(f=e[d],c in f&&j.push(f[c]));var l=null;f&&"extends"in f?l=f:b==a&&d in i&&"extends"in i[d]&&(l=i[d]);if(l){if(!l["extends"]||!l["extends"].__emmet_parsed__){d=l["extends"].split(",");f=h("utils");for(b=0;b<d.length;b++)d[b]=f.trim(d[b]);l["extends"]=d;l["extends"].__emmet_parsed__=!0}for(b=0;b<l["extends"].length;b++)d=l["extends"][b],e[d]&&e[d][c]&&j.push(e[d][c])}return j}function c(a,
b,c,e){for(var b=f(a,b,c),i=null,j=h("elements"),g=0,l=b.length;g<l;g++)if(a=b[g],e in a){if(!a[e]||!a[e].__emmet_parsed__){b=a[e];i=h("utils");b=i.replaceUnescapedSymbol(b,"|",i.getCaretPlaceholder());switch(c){case "abbreviations":c=a;g=j=e;i=b;h("utils").trim(g);l=h("elements");g=void 0;i=(g=d.exec(i))?l.create("element",g[1],g[2],g[4]=="/"):l.create("reference",i);c[j]=i;a[e].__ref=b;break;case "snippets":a[e]=j.create("snippet",b)}a[e].__emmet_parsed__=!0}i=a[e];break}return i}var b="system",
a="user",d=/^<(\w+\:?[\w\-]*)((?:\s+[\w\:\-]+\s*=\s*(['"]).*?\3)*)\s*(\/?)>/,i={},j={},l=h("handlerList").create();return{setVocabulary:function(a,d){d==b?i=a:j=a},getVocabulary:g,getResource:function(d,e,i){return c(a,d,e,i)||c(b,d,e,i)},getAbbreviation:function(a,b){b=b||"";return this.getResource(a,"abbreviations",b)||this.getResource(a,"abbreviations",b.replace(/\-/g,":"))},getSnippet:function(a,b){b=b||"";return this.getResource(a,"snippets",b)||this.getResource(a,"snippets",b.replace(/\-/g,
":"))},getMatchedResource:function(a,b){return l.exec(null,e.toArray(arguments))||this.getAbbreviation(b,a.name())||this.getSnippet(b,a.name())},getVariable:function(d){return f(a,"variables",d)[0]||f(b,"variables",d)[0]},setVariable:function(a,b){var d=g("user")||{};if(!("variables"in d))d.variables={};d.variables[a]=b;this.setVocabulary(d,"user")},getSubset:function(d,c){return f(a,d,c)[0]||f(b,d,c)[0]},hasSyntax:function(d){return d in g(a)||d in g(b)},addResolver:function(a,b){l.add(a,b)},removeResolver:function(a){l.remove(a)}}});
emmet.define("actions",function(h,e){function g(c){return h("utils").trim(c.charAt(0).toUpperCase()+c.substring(1).replace(/_[a-z]/g,function(b){return" "+b.charAt(1).toUpperCase()}))}var f={};return{add:function(c,b,a){c=c.toLowerCase();a=a||{};if(!a.label)a.label=g(c);f[c]={name:c,fn:b,options:a}},get:function(c){return f[c.toLowerCase()]},run:function(c,b){e.isArray(b)||(b=e.rest(arguments));var a=this.get(c);return a?a.fn.apply(emmet,b):(emmet.log('Action "%s" is not defined',c),!1)},getAll:function(){return f},
getList:function(){return e.values(this.getAll())},getMenu:function(c){var b=[],c=c||[];e.each(this.getList(),function(a){if(!a.options.hidden&&!e.include(c,a.name)){var d=g(a.name),i=b;if(a.options.label)for(var j=a.options.label.split("/"),d=j.pop(),f,h;f=j.shift();)h=e.find(i,function(a){return a.type=="submenu"&&a.name==f}),h||(h={name:f,type:"submenu",items:[]},i.push(h)),i=h.items;i.push({type:"action",name:a.name,label:d})}});return b},getActionNameForMenuTitle:function(c,b){var a=null;e.find(b||
this.getMenu(),function(b){if(b.type=="action"){if(b.label==c||b.name==c)return a=b.name}else return a=this.getActionNameForMenuTitle(c,b.items)},this);return a||null}}});
emmet.define("profile",function(h,e){function g(b){e.extend(this,a,b)}function f(a,b){switch(String(b||"").toLowerCase()){case "lower":return a.toLowerCase();case "upper":return a.toUpperCase()}return a}function c(a,c){return b[a.toLowerCase()]=new g(c)}var b={},a={tag_case:"asis",attr_case:"asis",attr_quotes:"double",tag_nl:"decide",tag_nl_leaf:!1,place_cursor:!0,indent:!0,inline_break:3,self_closing_tag:"xhtml",filters:""};g.prototype={tagName:function(a){return f(a,this.tag_case)},attributeName:function(a){return f(a,
this.attr_case)},attributeQuote:function(){return this.attr_quotes=="single"?"'":'"'},selfClosing:function(){return this.self_closing_tag=="xhtml"?" /":this.self_closing_tag===!0?"/":""},cursor:function(){return this.place_cursor?h("utils").getCaretPlaceholder():""}};c("xhtml");c("html",{self_closing_tag:!1});c("xml",{self_closing_tag:!0,tag_nl:!0});c("plain",{tag_nl:!1,indent:!1,place_cursor:!1});c("line",{tag_nl:!1,indent:!1});return{create:function(b,i){return arguments.length==2?c(b,i):new g(e.defaults(b||
{},a))},get:function(a,c){if(c&&e.isString(a)){var j=h("resources").getSubset(c,"profile");j&&(a=j)}return!a?b.plain:a instanceof g?a:e.isString(a)&&a.toLowerCase()in b?b[a.toLowerCase()]:this.create(a)},remove:function(a){a=(a||"").toLowerCase();a in b&&delete b[a]},stringCase:f}});
emmet.define("editorUtils",function(h){return{isInsideTag:function(e,g){for(var f=/^<\/?\w[\w\:\-]*.*?>/,c=g;c>-1;){if(e.charAt(c)=="<")break;c--}return c!=-1&&(f=f.exec(e.substring(c)))&&g>c&&g<c+f[0].length?!0:!1},outputInfo:function(e,g,f){return{syntax:String(g||e.getSyntax()),profile:String(f||e.getProfileName()),content:String(e.getContent())}},unindent:function(e,g){return h("utils").unindentString(g,this.getCurrentLinePadding(e))},getCurrentLinePadding:function(e){return h("utils").getLinePadding(e.getCurrentLine())}}});
emmet.define("actionUtils",function(h){return{mimeTypes:{gif:"image/gif",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",svg:"image/svg+xml",html:"text/html",htm:"text/html"},extractAbbreviation:function(e){for(var g=e.length,f=-1,c=0,b=0,a=0,d=h("utils"),i=h("abbreviationParser");;){g--;if(g<0){f=0;break}var j=e.charAt(g);if(j=="]")b++;else if(j=="["){if(!b){f=g+1;break}b--}else if(j=="}")a++;else if(j=="{"){if(!a){f=g+1;break}a--}else if(j==")")c++;else if(j=="("){if(!c){f=g+1;break}c--}else if(!b&&
!a&&(!i.isAllowedChar(j)||j==">"&&d.endsWithTag(e.substring(0,g+1)))){f=g+1;break}}return f!=-1&&!a&&!b&&!c?e.substring(f):""},getImageSize:function(e){var g=function(){return e.charCodeAt(f++)};if(e.substr(0,8)==="\u0089PNG\r\n\u001a\n"){var f=e.indexOf("IHDR")+4;return{width:g()<<24|g()<<16|g()<<8|g(),height:g()<<24|g()<<16|g()<<8|g()}}else if(e.substr(0,4)==="GIF8")return f=6,{width:g()|g()<<8,height:g()|g()<<8};else if(e.substr(0,2)==="\u00ff\u00d8")for(var f=2,c=e.length;f<c;){if(g()!=255)break;
var b=g();if(b==218)break;var a=g()<<8|g();if(b>=192&&b<=207&&!(b&4)&&!(b&8))return f+=1,{height:g()<<8|g(),width:g()<<8|g()};else f+=a-2}},captureContext:function(e){if(String(e.getSyntax())in{html:1,xml:1,xsl:1}){var g=h("html_matcher").getTags(String(e.getContent()),e.getCaretPos(),String(e.getProfileName()));if(g&&g[0]&&g[0].type=="tag"){for(var e=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,f=g[0],g=f.full_tag.replace(/^<[\w\-\:]+/,""),f={name:f.name,attributes:[]},
c;c=e.exec(g);)f.attributes.push({name:c[1],value:c[2]});return f}}return null},findExpressionBounds:function(e,g){for(var f=String(e.getContent()),c=f.length,b=e.getCaretPos()-1,a=b+1;b>=0&&g(f.charAt(b),b,f);)b--;for(;a<c&&g(f.charAt(a),a,f);)a++;if(a>b)return h("range").create([++b,a])},compoundUpdate:function(e,g){if(g){var f=e.getSelectionRange();e.replaceContent(g.data,g.start,g.end,!0);e.createSelection(g.caret,g.caret+f.end-f.start);return!0}return!1}}});
emmet.define("abbreviationUtils",function(h,e){return{isSnippet:function(e){return h("elements").is(e.matchedResource(),"snippet")},isUnary:function(e){var f=e.matchedResource();return e.children.length||this.isSnippet(e)?!1:f&&f.is_empty||h("tagName").isEmptyElement(e.name())},isInline:function(e){return e.isTextNode()||!e.name()||h("tagName").isInlineLevel(e.name())},isBlock:function(e){return h("elements").is(e.matchedResource(),"snippet")||!this.isInline(e)},hasTagsInContent:function(e){return h("utils").matchesTag(e.content)},
hasBlockChildren:function(h){return this.hasTagsInContent(h)&&this.isBlock(h)||e.any(h.children,function(e){return this.isBlock(e)},this)},insertChildContent:function(g,f,c){var c=e.extend({keepVariable:!0,appendIfNoChild:!0},c||{}),b=!1,a=h("utils"),g=a.replaceVariables(g,function(d,e,j){var h=d;e=="child"&&(h=a.padString(f,a.getLinePaddingFromPosition(g,j.start)),b=!0,c.keepVariable&&(h+=d));return h});!b&&c.appendIfNoChild&&(g+=f);return g}}});
emmet.define("base64",function(){return{encode:function(h){for(var e=[],g,f,c,b,a,d,i=0,j=h.length;i<j;)b=h.charCodeAt(i++),a=h.charCodeAt(i++),d=h.charCodeAt(i++),g=b&255,f=a&255,c=d&255,b=g>>2,g=(g&3)<<4|f>>4,f=(f&15)<<2|c>>6,c&=63,isNaN(a)?f=c=64:isNaN(d)&&(c=64),e.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(g)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c));return e.join("")},decode:function(h){var e,g,f,c,b,a=0,d=0,i=[],j=h.length;if(!h)return h;h+="";do e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),
f=e<<18|g<<12|c<<6|b,e=f>>16&255,g=f>>8&255,f&=255,c==64?i[d++]=String.fromCharCode(e):b==64?i[d++]=String.fromCharCode(e,g):i[d++]=String.fromCharCode(e,g,f);while(a<j);return i.join("")}}});
(function(){function h(a){if(!a||a!="html")a="xhtml";n=a}function e(a,b){var d=a[1].toLowerCase();return{name:d,full_tag:a[0],start:b,end:b+a[0].length,unary:Boolean(a[3])||d in j&&n=="html",has_close:Boolean(a[3]),type:"tag",close_self:d in l&&n=="html"}}function g(a,b){return{start:a,end:b,type:"comment"}}function f(a){for(var b={},a=a.split(","),d=0;d<a.length;d++)b[a[d]]=!0;return b}function c(a,b,d){var d=d||0,c=-1,e=-1;if(a&&!b)c=a.start,e=a.end;else if(a&&b)a.start<d&&a.end>d||b.start<=d&&
b.end>d?(c=a.start,e=b.end):(c=a.end,e=b.start);return[c,e]}function b(a,b,d){m.opening_tag=a;m.closing_tag=b;a=c(a,b,d||0);m.start_ix=a[0];m.end_ix=a[1];return m.start_ix!=-1?[m.start_ix,m.end_ix]:null}function a(a,b,j,f){function n(b,d){arguments.length==1&&(d=w);return a.substr(d,b.length)==b}function m(b){for(;b--;)if(a.charAt(b)=="<"&&n("<\!--",b))break;return b}f=f||c;h(j);var j=[],k=[],l=null,q=null,o=a.length,s,w;j.last=k.last=function(){return this[this.length-1]};for(w=b;w--&&w>=0;)if(s=
a.charAt(w),s=="<"){var y=a.substring(w,o);if(s=y.match(i))s=e(s,w),s.start<b&&s.end>b?q=s:k.push(s);else if(s=y.match(d))if(s=e(s,w),s.unary){if(s.start<b&&s.end>b)return f(s,null,b)}else if(k.last()&&k.last().name==s.name)k.pop();else{l=s;break}else if(y.indexOf("<\!--")==0&&(s=y.search("--\>")+w+3,w<b&&s>=b))return f(g(w,s))}else s=="-"&&n("--\>")&&(w=m(w));if(!l)return f(null);if(!q)for(w=b;w<o;w++)if(s=a.charAt(w),s=="<")if(y=a.substring(w,o),s=y.match(d))s=e(s,w),s.unary||j.push(s);else if(s=
y.match(i))if(s=e(s,w),j.last()&&j.last().name==s.name)j.pop();else{q=s;break}else n("<\!--")&&(w+=y.search("--\>")+2);else if(s=="-"&&n("--\>")&&(!j.last()||j.last().type!="comment"))return s=w+3,f(g(m(w),s));return f(l,q,b)}var d=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,i=/^<\/([\w\:\-]+)[^>]*>/,j=f("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");f("address,applet,blockquote,button,center,dd,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");
f("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");var l=f("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"),n="xhtml",m={opening_tag:null,closing_tag:null,start_ix:-1,end_ix:-1},o=function(d,c,e){return a(d,c,e,b)};o.start_tag=d;o.end_tag=i;o.find=function(b,d,c){return a(b,d,c)};o.getTags=function(b,d,c){return a(b,d,c,function(a,b){return[a,b]})};o.last_match=
m;try{emmet.define("html_matcher",function(){return o})}catch(q){}})();
emmet.define("tabStops",function(h,e){var g=100,f=0,c={replaceCarets:!1,escape:function(b){return"\\"+b},tabstop:function(b){return b.token},variable:function(b){return b.token}};h("abbreviationParser").addOutputProcessor(function(b,a){var d=0,c=h("tabStops"),e=h("utils"),b=c.processText(b,{tabstop:function(a){var b=parseInt(a.group);if(b==0)return"${0}";b>d&&(d=b);return a.placeholder?"${"+(b+f)+":"+a.placeholder+"}":"${"+(b+f)+"}"}}),b=e.replaceVariables(b,c.variablesResolver(a));f+=d+1;return b});
return{extract:function(b,a){var d=h("utils"),i={carets:""},j=[],a=e.extend({},c,a,{tabstop:function(a){var b=a.token,d="";if(a.placeholder=="cursor")j.push({start:a.start,end:a.start+b.length,group:"carets",value:""});else{if("placeholder"in a)i[a.group]=a.placeholder;a.group in i&&(d=i[a.group]);j.push({start:a.start,end:a.start+b.length,group:a.group,value:d})}return b}});a.replaceCarets&&(b=b.replace(RegExp(d.escapeForRegexp(d.getCaretPlaceholder()),"g"),"${0:cursor}"));var b=this.processText(b,
a),f=d.stringBuilder(),g=0,d=e.map(j,function(a){f.append(b.substring(g,a.start));var d=f.length,c=i[a.group]||"";f.append(c);g=a.end;return{group:a.group,start:d,end:d+c.length}});f.append(b.substring(g));return{text:f.toString(),tabstops:e.sortBy(d,"start")}},processText:function(b,a){for(var a=e.extend({},c,a),d=h("utils").stringBuilder(),i=h("stringStream").create(b),j,f;j=i.next();)if(j=="\\"&&!i.eol())d.append(a.escape(i.next()));else{f=j;if(j=="$")if(i.start=i.pos-1,i.match(/^[0-9]+/))f=a.tabstop({start:d.length,
group:i.current().substr(1),token:i.current()});else if(j=i.match(/^\{([a-z_\-][\w\-]*)\}/))f=a.variable({start:d.length,name:j[1],token:i.current()});else if(j=i.match(/^\{([0-9]+)(:.+?)?\}/)){f={start:d.length,group:j[1],token:i.current()};if(j[2])f.placeholder=j[2].substr(1);f=a.tabstop(f)}d.append(f)}return d.toString()},upgrade:function(b,a){var d=0,c={tabstop:function(b){var c=parseInt(b.group);c>d&&(d=c);return b.placeholder?"${"+(c+a)+":"+b.placeholder+"}":"${"+(c+a)+"}"}};e.each(["start",
"end","content"],function(a){b[a]=this.processText(b[a],c)},this);return d},variablesResolver:function(b){var a={},d=h("resources");return function(c,f){if(f=="child")return c;if(f=="cursor")return h("utils").getCaretPlaceholder();var l=b.attribute(f);if(!e.isUndefined(l))return l;if(l=d.getVariable(f))return l;a[f]||(a[f]=g++);return"${"+a[f]+":"+f+"}"}},resetPlaceholderCounter:function(){console.log("deprecated");g=100},resetTabstopIndex:function(){f=0;g=100}}});
emmet.define("preferences",function(h,e){var g={},f={},c=null,b=null;return{define:function(a,b,c){var j=a;e.isString(a)&&(j={},j[a]={value:b,description:c});e.each(j,function(a,b){f[b]=e.isObject(a)&&"value"in a&&e.keys(a).length<3?a:{value:a}})},set:function(a,b){var c=a;e.isString(a)&&(c={},c[a]=b);e.each(c,function(a,b){if(!(b in f))throw'Property "'+b+'" is not defined. You should define it first with `define` method of current module';if(a!==f[b].value){switch(typeof f[b].value){case "boolean":var d=
a;e.isString(d)?(d=d.toLowerCase(),a=d=="yes"||d=="true"||d=="1"):a=!!d;break;case "number":a=parseInt(a+"",10)||0;break;default:a+=""}g[b]=a}else b in g&&delete g[p]})},get:function(a){if(a in g)return g[a];if(a in f)return f[a].value},getArray:function(a){a=this.get(a);e.isUndefined(a)||(a=e.map(a.split(","),h("utils").trim),a.length||(a=null));return a},description:function(a){return a in f?f[a].description:void 0},remove:function(a){e.isArray(a)||(a=[a]);e.each(a,function(a){a in g&&delete g[a];
a in f&&delete f[a]})},list:function(){return e.map(e.keys(f).sort(),function(a){return{name:a,value:this.get(a),type:typeof f[a].value,description:f[a].description}},this)},load:function(a){e.each(a,function(a,b){this.set(b,a)},this)},exportModified:function(){return e.clone(g)},reset:function(){g={}},_startTest:function(){c=f;b=g;f={};g={}},_stopTest:function(){f=c;g=b}}});
emmet.define("filters",function(h,e){function g(c){return!c?[]:e.isString(c)?c.split(/[\|,]/g):c}var f={};return{add:function(c,b){f[c]=b},apply:function(c,b,a){var d=h("utils"),a=h("profile").get(a);e.each(g(b),function(b){(b=d.trim(b.toLowerCase()))&&b in f&&(c=f[b](c,a))});return c},composeList:function(c,b,a){b=h("profile").get(b);c=g(b.filters||h("resources").getSubset(c,"filters")||"html");a&&(c=c.concat(g(a)));if(!c||!c.length)c=g("html");return c},extractFromAbbreviation:function(c){var b=
"",c=c.replace(/\|([\w\|\-]+)$/,function(a,d){b=d;return""});return[c,g(b)]}}});
emmet.define("elements",function(h,e){function g(a){return{data:a}}var f={},c=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,b={add:function(a,b){var c=this;f[a]=function(){var e=b.apply(c,arguments);if(e)e.type=a;return e}},get:function(a){return f[a]},create:function(a){var b=[].slice.call(arguments,1),c=this.get(a);return c?c.apply(this,b):null},is:function(a,b){return a&&a.type===b}};b.add("element",function(a,b,f){var h={name:a,is_empty:!!f};if(b)if(h.attributes=[],e.isArray(b))h.attributes=b;else if(e.isString(b))for(;a=
c.exec(b);)h.attributes.push({name:a[1],value:a[3]});else e.each(b,function(a,b){h.attributes.push({name:b,value:a})});return h});b.add("snippet",g);b.add("reference",g);b.add("empty",function(){return{}});return b});
emmet.define("editTree",function(h,e,g){function f(a,b){this.options=e.extend({offset:0},b);this.source=a;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments)}function c(a,b,c){this.parent=a;this._name=b.value;this._value=c?c.value:"";this._positions={name:b.start,value:c?c.start:-1};this.initialize.apply(this,arguments)}var b=h("range").create;f.extend=g.extend;f.prototype={initialize:function(){},_updateSource:function(a,d,c){var f=b(d,e.isUndefined(c)?0:c-d),g=a.length-
f.length(),n=function(a){e.each(a,function(b,d){b>=f.end&&(a[d]+=g)})};n(this._positions);e.each(this.list(),function(a){n(a._positions)});this.source=h("utils").replaceSubstring(this.source,a,f)},add:function(a,b){var e=new c(a,b);this._children.push(e);return e},get:function(a){return e.isNumber(a)?this.list()[a]:e.isString(a)?e.find(this.list(),function(b){return b.name()===a}):a},getAll:function(a){e.isArray(a)||(a=[a]);var b=[],c=[];e.each(a,function(a){e.isString(a)?b.push(a):e.isNumber(a)&&
c.push(a)});return e.filter(this.list(),function(a,f){return e.include(c,f)||e.include(b,a.name())})},value:function(a,b,c){var f=this.get(a);if(f)return f.value(b);if(!e.isUndefined(b))return this.add(a,b,c)},values:function(a){return e.map(this.getAll(a),function(a){return a.value()})},remove:function(a){if(a=this.get(a))this._updateSource("",a.fullRange()),this._children=e.without(this._children,a)},list:function(){return this._children},indexOf:function(a){return e.indexOf(this.list(),this.get(a))},
name:function(a){if(!e.isUndefined(a)&&this._name!==(a=String(a)))this._updateSource(a,this._positions.name,this._positions.name+this._name.length),this._name=a;return this._name},nameRange:function(a){return b(this._positions.name+(a?this.options.offset:0),this.name())},range:function(a){return b(a?this.options.offset:0,this.toString())},itemFromPosition:function(a,b){return e.find(this.list(),function(c){return c.range(b).inside(a)})},toString:function(){return this.source}};c.extend=g.extend;c.prototype=
{initialize:function(){},_pos:function(a,b){return a+(b?this.parent.options.offset:0)},value:function(a){if(!e.isUndefined(a)&&this._value!==(a=String(a)))this.parent._updateSource(a,this.valueRange()),this._value=a;return this._value},name:function(a){if(!e.isUndefined(a)&&this._name!==(a=String(a)))this.parent._updateSource(a,this.nameRange()),this._name=a;return this._name},namePosition:function(a){return this._pos(this._positions.name,a)},valuePosition:function(a){return this._pos(this._positions.value,
a)},range:function(a){return b(this.namePosition(a),this.toString())},fullRange:function(a){return this.range(a)},nameRange:function(a){return b(this.namePosition(a),this.name())},valueRange:function(a){return b(this.valuePosition(a),this.value())},toString:function(){return this.name()+this.value()},valueOf:function(){return this.toString()}};return{EditContainer:f,EditElement:c,createToken:function(a,b,c){a={start:a||0,value:b||"",type:c};a.end=a.start+a.value.length;return a}}});
emmet.define("cssEditTree",function(h,e){function g(a,b){return h("range").create(a,b)}function f(a,b){var b=b||d|i,c=["white","line"];if((b&i)==i)for(;a.length&&e.include(c,e.last(a).type);)a.pop();if((b&d)==d)for(;a.length&&e.include(c,a[0].type);)a.shift();return a}function c(a){var b=["white","line",":"],c=[],h,j;a.nextUntil(function(){return!e.include(b,this.itemNext().type)});for(j=a.current().end;h=a.next();){if(h.type=="}"||h.type==";")return f(c,d|(h.type=="}"?i:0)),c.length?(j=c[0].start,
a=e.last(c).end):a=j,g(j,a-j);c.push(h)}if(c.length)return g(c[0].start,e.last(c).end-c[0].start)}function b(a){var b=h("stringStream").create(a),d=[],c=/[\s\u00a0,]/,f=function(){b.next();d.push(g(b.start,b.current()));b.start=b.pos};b.eatSpace();for(b.start=b.pos;a=b.next();)if(a=='"'||a=="'"){b.next();if(!b.skipTo(a))break;f()}else if(a=="("){b.backUp(1);if(!b.skipToPair("(",")"))break;b.backUp(1);f()}else if(c.test(a))d.push(g(b.start,b.current().length-1)),b.eatWhile(c),b.start=b.pos;f();return e.chain(d).filter(function(a){return!!a.length()}).uniq(!1,
function(a){return a.toString()}).value()}var a={styleBefore:"\n\t",styleSeparator:": ",offset:0},d=1,i=2,j=h("editTree").EditContainer.extend({initialize:function(b){e.defaults(this.options,a);var d=h("editTree"),i=h("tokenIterator").create(h("cssParser").parse(b)),j,r=[],t;for(j=i.position();t=i.next();){if(t.type=="{")break;r.push(t)}f(r);r.length?(j=r[0].start,r=e.last(r).end):r=j;j=g(j,r-j);this._positions.name=j.start;this._name=j.substring(b);if(!i.current()||i.current().type!="{")throw"Invalid CSS rule";
for(this._positions.contentStart=i.position()+1;j=i.next();){if(r=j.type=="identifier")a:{r=i.tokens;t=i._i+1;for(var x=r.length;t<x;t++){if(r[t].type==":"){r=!0;break a}if(r[t].type=="identifier"||r[t].type=="line"){r=!1;break a}}r=!1}r&&(j=g(j),r=c(i),t=i.current()&&i.current().type==";"?g(i.current()):g(r.end,0),this._children.push(new l(this,d.createToken(j.start,j.substring(b)),d.createToken(r.start,r.substring(b)),d.createToken(t.start,t.substring(b)))))}this._saveStyle()},_saveStyle:function(){var a=
this._positions.contentStart,b=this.source,d=h("utils");e.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());var f=d.splitByLines(c.styleBefore);if(f.length>1)c.styleBefore="\n"+e.last(f);c.styleSeparator=b.substring(c.nameRange().end,c.valuePosition());c.styleBefore=e.last(c.styleBefore.split("*/"));c.styleSeparator=c.styleSeparator.replace(/\/\*.*?\*\//g,"");a=c.range().end})},add:function(a,b,d){var c=this.list(),f=this._positions.contentStart,i=e.pick(this.options,"styleBefore",
"styleSeparator"),j=h("editTree");if(e.isUndefined(d))d=c.length;var g=c[d];if(g)f=g.fullRange().start;else if(g=c[d-1])g.end(";"),f=g.range().end;g&&(i=e.pick(g,"styleBefore","styleSeparator"));a=j.createToken(f+i.styleBefore.length,a);b=j.createToken(a.end+i.styleSeparator.length,b);j=new l(this,a,b,j.createToken(b.end,";"));e.extend(j,i);this._updateSource(j.styleBefore+j.toString(),f);this._children.splice(d,0,j);return j}}),l=h("editTree").EditElement.extend({initialize:function(a,b,d,c){this.styleBefore=
a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;this._end=c.value;this._positions.end=c.start},valueParts:function(a){var d=b(this.value());if(a){var c=this.valuePosition(!0);e.each(d,function(a){a.shift(c)})}return d},end:function(a){if(!e.isUndefined(a)&&this._end!==a)this.parent._updateSource(a,this._positions.end,this._positions.end+this._end.length),this._end=a;return this._end},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.value()+this.end()}});return{parse:function(a,b){return new j(a,b)},parseFromPosition:function(a,b,d){d=this.extractRule(a,b,d);return!d||!d.inside(b)?null:this.parse(d.substring(a),{offset:d.start})},extractRule:function(a,b,d){for(var c="",e=a.length,f=-1,i;b>=0;){i=a.charAt(b);if(i=="{"){f=b;break}else if(i=="}"&&!d){b++;break}b--}for(;b<e;){i=a.charAt(b);if(i=="{")f=b;else if(i=="}"){f!=-1&&(c=a.substring(f,b+1));break}b++}if(c){b=f-1;for(d="";b>=0;){i=a.charAt(b);if("{}/\\<>".indexOf(i)!=
-1)break;b--}d=a.substring(b+1,f).replace(/^[\s\n\r]+/m,"");return h("range").create(f-d.length,c.length+d.length)}return null},baseName:function(a){return a.replace(/^\s*\-\w+\-/,"")},findParts:b}});
emmet.define("xmlEditTree",function(h,e){var g={styleBefore:" ",styleSeparator:"=",styleQuote:'"',offset:0},f=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m,c=h("editTree").EditContainer.extend({initialize:function(a){e.defaults(this.options,g);this._positions.name=1;var d=null,c=h("xmlParser").parse(a),f=h("range");e.each(c,function(c){c.value=f.create(c).substring(a);switch(c.type){case "tag":if(/^<[^\/]+/.test(c.value))this._name=c.value.substring(1);
break;case "attribute":d&&this._children.push(new b(this,d));d=c;break;case "string":this._children.push(new b(this,d,c)),d=null}},this);d&&this._children.push(new b(this,d));this._saveStyle()},_saveStyle:function(){var a=this.nameRange().end,b=this.source;e.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());if(c.valuePosition()!==-1)c.styleSeparator=b.substring(c.namePosition()+c.name().length,c.valuePosition()-c.styleQuote.length);a=c.range().end})},add:function(a,d,c){var f=
this.list(),g=this.nameRange().end,n=h("editTree"),m=e.pick(this.options,"styleBefore","styleSeparator","styleQuote");if(e.isUndefined(c))c=f.length;var o=f[c];if(o)g=o.fullRange().start;else if(o=f[c-1])g=o.range().end;o&&(m=e.pick(o,"styleBefore","styleSeparator","styleQuote"));d=m.styleQuote+d+m.styleQuote;a=new b(this,n.createToken(g+m.styleBefore.length,a),n.createToken(g+m.styleBefore.length+a.length+m.styleSeparator.length,d));e.extend(a,m);this._updateSource(a.styleBefore+a.toString(),g);
this._children.splice(c,0,a);return a}}),b=h("editTree").EditElement.extend({initialize:function(a,b,c){this.styleBefore=a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;b="";a=a.options.styleQuote;if(c)b=c.value,a=b.charAt(0),a=='"'||a=="'"?b=b.substring(1):a="",a&&b.charAt(b.length-1)==a&&(b=b.substring(0,b.length-1));this.styleQuote=a;this._value=b;this._positions.value=c?c.start+a.length:-1},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.styleQuote+this.value()+this.styleQuote}});return{parse:function(a,b){return new c(a,b)},parseFromPosition:function(a,b,c){c=this.extractTag(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractTag:function(a,b,c){var e=a.length,g,n=h("range"),m=Math.min(2E3,e),o=null,q=function(b){var c;if(a.charAt(b)=="<"&&(c=a.substr(b,m).match(f)))return n.create(b,c[0])};for(g=b;g>=0;g--)if(o=q(g))break;if(o&&(o.inside(b)||c))return o;if(!o&&c)return null;
for(g=b;g<e;g++)if(o=q(g))return o}}});
emmet.define("expandAbbreviation",function(h,e){var g=h("handlerList").create(),f=null,c=h("actions");c.add("expand_abbreviation",function(b,a,c){var f=e.toArray(arguments),j=h("editorUtils").outputInfo(b,a,c);f[1]=j.syntax;f[2]=j.profile;return g.exec(!1,f)});c.add("expand_abbreviation_with_tab",function(b,a,d){c.run("expand_abbreviation",b,a,d)||b.replaceContent(h("resources").getVariable("indentation"),b.getCaretPos())},{hidden:!0});g.add(function(b,a,c){var e=b.getSelectionRange().end,g=f.findAbbreviation(b);
return g&&(a=emmet.expandAbbreviation(g,a,c,h("actionUtils").captureContext(b)))?(b.replaceContent(a,e-g.length,e),!0):!1},{order:-1});return f={addHandler:function(b,a){g.add(b,a)},removeHandler:function(b){g.remove(b,options)},findAbbreviation:function(b){var a=h("range").create(b.getSelectionRange()),c=String(b.getContent());if(a.length())return a.substring(c);b=b.getCurrentLineRange();return h("actionUtils").extractAbbreviation(c.substring(b.start,a.start))}}});
emmet.define("wrapWithAbbreviation",function(h){h("actions").add("wrap_with_abbreviation",function(e,g,f,c){var c=h("editorUtils").outputInfo(e,f,c),b=h("utils"),a=h("editorUtils"),d=h("html_matcher"),g=g||e.prompt("Enter abbreviation");if(!g)return null;var g=String(g),i=e.getSelectionRange(),f=i.start,i=i.end;if(f==i){i=d(c.content,f,c.profile);if(!i||i[0]==-1)return!1;i=b.narrowToNonSpace(c.content,i[0],i[1]-i[0]);f=i.start;i=i.end}b=b.escapeText(c.content.substring(f,i));return(g=h("wrapWithAbbreviation").wrap(g,
a.unindent(e,b),c.syntax,c.profile))?(e.replaceContent(g,f,i),!0):!1});return{wrap:function(e,g,f,c){var b=h("filters"),a=h("utils"),f=f||emmet.defaultSyntax(),c=c||emmet.defaultProfile();h("tabStops").resetTabstopIndex();e=b.extractFromAbbreviation(e);return(g=h("abbreviationParser").parse(e[0],{syntax:f,pastedContent:g}))?(f=b.composeList(f,c,e[1]),b.apply(g,f,c),a.replaceVariables(g.toString())):null}}});
emmet.exec(function(h,e){function g(b,a){var c=a-(b.options.offset||0),f=/^[\s\n\r]/;return e.find(b.list(),function(a){return a.range().end===c?f.test(b.source.charAt(c)):a.range().inside(c)})}function f(b,a,c,e){for(var f=-1,g=-1;a--;)if(b.substr(a,c.length)==c){f=a;break}if(f!=-1){a=f;for(c=b.length;c>=a++;)if(b.substr(a,e.length)==e){g=a+e.length;break}}return f!=-1&&g!=-1?h("range").create(f,g-f):null}function c(b,a,c,e){function g(b){return b.replace(RegExp("^"+q.escapeForRegexp(a)+"\\s*"),
function(a){m-=a.length;return""}).replace(RegExp("\\s*"+q.escapeForRegexp(c)+"$"),"")}var l=h("editorUtils"),n=l.outputInfo(b).content,m=b.getCaretPos(),o=null,q=h("utils");(o=f(n,m,a,c))&&o.overlap(e)?(e=o,o=g(e.substring(n))):(o=a+" "+e.substring(n).replace(RegExp(q.escapeForRegexp(a)+"\\s*|\\s*"+q.escapeForRegexp(c),"g"),"")+" "+c,m+=a.length+1);return o!==null?(b.setCaretPos(e.start),b.replaceContent(l.unindent(b,o),e.start,e.end),b.setCaretPos(m),!0):!1}h("actions").add("toggle_comment",function(b){var a=
h("editorUtils").outputInfo(b);if(a.syntax=="css"){var d=b.getCaretPos(),e=h("html_matcher").getTags(a.content,d);if(e&&e[0]&&e[0].type=="tag"&&e[0].start<=d&&e[0].end>=d)a.syntax="html"}if(a.syntax=="css"){e=h("range").create(b.getSelectionRange());a=h("editorUtils").outputInfo(b);if(!e.length()&&(d=h("cssEditTree").parseFromPosition(a.content,b.getCaretPos())))e=(e=g(d,b.getCaretPos()))?e.range(!0):h("range").create(d.nameRange(!0).start,d.source);e.length()||(e=h("range").create(b.getCurrentLineRange()),
h("utils").narrowToNonSpace(a.content,e));b=c(b,"/*","*/",e)}else{a=h("range").create(b.getSelectionRange());d=h("editorUtils").outputInfo(b);if(!a.length()&&(d=h("html_matcher").getTags(d.content,b.getCaretPos(),d.profile))&&d[0])a.start=d[0].start,a.end=d[1]?d[1].end:d[0].end;b=c(b,"<\!--","--\>",a)}return b})});
emmet.exec(function(h){function e(e,f,c){function b(b){for(var c=b;c>=0;){var d=a.charAt(c);if(d=="\n"||d=="\r")break;c--}return a.substring(c,b)}for(var f=f||1,c=e.getCaretPos()+(c||0),a=String(e.getContent()),e=a.length,d=-1,h=/^\s+$/;c<=e&&c>=0;){c+=f;var j=a.charAt(c),l=a.charAt(c+1),n=a.charAt(c-1);switch(j){case '"':case "'":l==j&&n=="="&&(d=c+1);break;case ">":l=="<"&&(d=c+1);break;case "\n":case "\r":h.test(b(c-1))&&(d=c)}if(d!=-1)break}return d}h=h("actions");h.add("prev_edit_point",function(g){var f=
g.getCaretPos(),c=e(g,-1);c==f&&(c=e(g,-1,-2));return c!=-1?(g.setCaretPos(c),!0):!1},{label:"Previous Edit Point"});h.add("next_edit_point",function(g){var f=e(g,1);f!=-1&&g.setCaretPos(f)})});
emmet.exec(function(h,e){function g(a,b,c,d){var e=h("range"),f=h("editorUtils").outputInfo(a).content,g=f.length,j,i=e.create(-1,0),l=e.create(a.getSelectionRange());j=l.start;for(var n=1E5;j>=0&&j<g&&--n>0;){if(e=c(f,j,b)){if(i.equal(e))break;i=e.clone();if(j=d(e.substring(f),e.start,l.clone()))return a.createSelection(j.start,j.end),!0;else j=b?e.start:e.end-1}j+=b?-1:1}return!1}function f(a){var b=!0;return g(a,!1,function(a,c){if(b){b=!1;var d;a:{d=c;for(var e;d>=0;){if(e=i(a,d)){d=e;break a}d--}d=
null}return d}else return i(a,c)},function(a,b,c){return d(a,b,c,!1)})}function c(a){return g(a,!0,i,function(a,b,c){return d(a,b,c,!0)})}function b(b,c,d){var d=d||0,f=h("range"),g=[],i=-1,l="",n="",q,m;e.each(c,function(c){switch(c.type){case "tag":m=b.substring(c.start,c.end);/^<[\w\:\-]/.test(m)&&g.push(f.create({start:c.start+1,end:c.end}));break;case "attribute":i=c.start;l=b.substring(c.start,c.end);break;case "string":g.push(f.create(i,c.end-i)),q=f.create(c),n=q.substring(b),j(n.charAt(0))&&
q.start++,j(n.charAt(n.length-1))&&q.end--,g.push(q),l=="class"&&(g=g.concat(a(q.substring(b),q.start)))}});e.each(g,function(a){a.shift(d)});return e.chain(g).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}function a(a,b){var b=b||0,c=[],d=h("stringStream").create(a),e=h("range");d.eatSpace();d.start=d.pos;for(var f;f=d.next();)if(/[\s\u00a0]/.test(f))c.push(e.create(d.start+b,d.pos-d.start-1)),d.eatSpace(),d.start=d.pos;c.push(e.create(d.start+b,d.pos-
d.start));return c}function d(a,c,d,f){a=b(a,h("xmlParser").parse(a),c);f&&a.reverse();return(c=e.find(a,function(a){return a.equal(d)}))?(f=e.indexOf(a,c),f<a.length-1?a[f+1]:null):f?e.find(a,function(a){return a.start<d.start}):!c&&(f=e.filter(a,function(a){return a.inside(d.end)}),f.length>1)?f[1]:e.find(a,function(a){return a.end>d.end})}function i(a,b){var c;if(a.charAt(b)=="<"&&(c=a.substring(b,a.length).match(q)))return h("range").create(b,c[0])}function j(a){return a=='"'||a=="'"}function l(a){var b=
a.valueRange(!0),c=[a.range(!0),b],d=h("stringStream"),f=h("cssEditTree"),g=h("range"),j=a.value();e.each(a.valueParts(),function(a){var h=a.clone();c.push(h.shift(b.start));var i=d.create(a.substring(j));if(i.match(/^[\w\-]+\(/,!0)){i.start=i.pos;i.skipToPair("(",")");var n=i.current();c.push(g.create(h.start+i.start,n));e.each(f.findParts(n),function(a){c.push(g.create(h.start+i.start+a.start,a.substring(n)))})}});return e.chain(c).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}
function n(a,b,c){var d=null,f=null,g=a.list(),h,j;c?(g.reverse(),h=function(a){return a.range(!0).start<=b.start},j=function(a){return a.start<b.start}):(h=function(a){return a.range(!0).end>=b.end},j=function(a){return a.end>b.start});for(;d=e.find(g,h);){a=l(d);c&&a.reverse();if(f=e.find(a,function(a){return a.equal(b)})){if(f=e.indexOf(a,f),f!=a.length-1){f=a[f+1];break}}else{f=e.filter(a,function(a){return a.inside(b.end)});if(f.length>1){f=f[1];break}if(f=e.find(a,j))break}f=null;b.start=b.end=
c?d.range(!0).start-1:d.range(!0).end+1}return f}function m(a,b,c){a=h("cssEditTree").parse(a,{offset:b});b=a.nameRange(!0);return c.end<b.end?b:n(a,c,!1)}function o(a,b,c){b=h("cssEditTree").parse(a,{offset:b});a=n(b,c,!0);return!a&&(b=b.nameRange(!0),c.start>b.start)?b:a}var q=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,r=h("actions");r.add("select_next_item",function(a){return a.getSyntax()=="css"?g(a,!1,h("cssEditTree").extractRule,m):f(a)});r.add("select_previous_item",
function(a){return a.getSyntax()=="css"?g(a,!0,h("cssEditTree").extractRule,o):c(a)})});
emmet.exec(function(h){function e(c,b,a){var b=String((b||"out").toLowerCase()),d=h("editorUtils").outputInfo(c,a),a=d.syntax,e=h("range"),g=e.create(c.getSelectionRange()),d=d.content,l=null,l=f.last_match.opening_tag,n=f.last_match.closing_tag;if(b=="in"&&l&&g.length())if(n)l.start==g.start?d.charAt(l.end)=="<"?(b=e.create(f.find(d,l.end+1,a)),l=b.start==l.end&&b.end==n.start?e.create(f(d,l.end+1,a)):e.create(l.end,n.start-l.end)):l=e.create(l.end,n.start-l.end):(b=d.substring(0,n.start).indexOf("<",
l.end),l=e.create(f(d,b!=-1?b+1:l.end,a)));else return!1;else l=e.create(f(d,g.end,a));return l&&l.start!=-1?(c.createSelection(l.start,l.end),!0):!1}var g=h("actions"),f=h("html_matcher");g.add("match_pair",e,{hidden:!0});g.add("match_pair_inward",function(c){return e(c,"in")},{label:"HTML/Match Pair Tag (inward)"});g.add("match_pair_outward",function(c){return e(c,"out")},{label:"HTML/Match Pair Tag (outward)"});g.add("matching_pair",function(c){var b=String(c.getContent()),a=c.getCaretPos();b.charAt(a)==
"<"&&a++;var d=f.getTags(b,a,String(c.getProfileName()));if(d&&d[0]&&(b=d[0],d=d[1]))if(b.start<=a&&b.end>=a)return c.setCaretPos(d.start),!0;else if(d.start<=a&&d.end>=a)return c.setCaretPos(b.start),!0;return!1},{label:"HTML/Go To Matching Tag Pair"})});
emmet.exec(function(h){h("actions").add("remove_tag",function(e){var g=h("utils"),f=h("editorUtils").outputInfo(e),c=h("html_matcher").getTags(f.content,e.getCaretPos(),f.profile);if(c&&c[0]){if(c[1]){var b=g.narrowToNonSpace(f.content,c[0].end,c[1].start-c[0].end),a=g.findNewlineBounds(f.content,b.start),a=g.getLinePadding(a.substring(f.content)),f=b.substring(f.content),f=g.unindentString(f,a);e.replaceContent(g.getCaretPlaceholder()+g.escapeText(f),c[0].start,c[1].end)}else e.replaceContent(g.getCaretPlaceholder(),
c[0].start,c[0].end);return!0}return!1},{label:"HTML/Remove Tag"})});
emmet.exec(function(h){h("actions").add("split_join_tag",function(e,g){var f=h("html_matcher"),c=h("editorUtils").outputInfo(e,null,g),b=h("profile").get(c.profile);if((f=f.getTags(c.content,e.getCaretPos(),c.profile))&&f[0]){if(f[1]){c=h("utils");b=f[0].full_tag.replace(/\s*>$/,(b.self_closing_tag===!0?"/":" /")+">");if(b.length+f[0].start<e.getCaretPos())b+=c.getCaretPlaceholder();else var a=e.getCaretPos()-f[0].start,b=c.replaceSubstring(b,c.getCaretPlaceholder(),a);e.replaceContent(b,f[0].start,
f[1].end)}else{var d=h("utils"),c=d.getNewline(),a=h("resources").getVariable("indentation"),d=d.getCaretPlaceholder(),b=b.tag_nl===!0?c+a+d+c:d,b=f[0].full_tag.replace(/\s*\/>$/,">")+b+"</"+f[0].name+">";e.replaceContent(b,f[0].start,f[0].end)}f=!0}else f=!1;return f},{label:"HTML/Split\\Join Tag Declaration"})});
emmet.define("reflectCSSValue",function(h,e){function g(b){var a=h("cssEditTree"),d=h("editorUtils").outputInfo(b),b=b.getCaretPos();if(a=a.parseFromPosition(d.content,b))if(d=a.itemFromPosition(b,!0)){var e=a.source,f=a.options.offset,b=b-f-d.range().start;c.exec(!1,[d]);if(e!==a.source)return{data:a.source,start:f,end:f+e.length,caret:f+d.range().start+b}}}function f(b){var b=h("cssEditTree").baseName(b),a;if(b=="opacity"||b=="filter")return/^(?:\-\w+\-)?(?:opacity|filter)$/;else if(a=b.match(/^border-radius-(top|bottom)(left|right)/))return RegExp("^(?:\\-\\w+\\-)?(?:"+
b+"|border-"+a[1]+"-"+a[2]+"-radius)$");else if(a=b.match(/^border-(top|bottom)-(left|right)-radius/))return RegExp("^(?:\\-\\w+\\-)?(?:"+b+"|border-radius-"+a[1]+a[2]+")$");return RegExp("^(?:\\-\\w+\\-)?"+b+"$")}var c=h("handlerList").create();h("actions").add("reflect_css_value",function(b){return b.getSyntax()!="css"?!1:h("actionUtils").compoundUpdate(b,g(b))},{label:"CSS/Reflect Value"});c.add(function(b){var a=f(b.name());e.each(b.parent.list(),function(c){if(a.test(c.name())){var e;var f=b.name(),
g=b.value(),n=c.name();e=c.value();var m=h("cssEditTree"),o=h("utils"),f=m.baseName(f),n=m.baseName(n);e=f=="opacity"&&n=="filter"?e.replace(/opacity=[^)]*/i,"opacity="+Math.floor(parseFloat(g)*100)):f=="filter"&&n=="opacity"?(f=g.match(/opacity=([^)]*)/i))?o.prettifyNumber(parseInt(f[1])/100):e:g;c.value(e)}})},{order:-1});return{addHandler:function(b,a){c.add(b,a)},removeHandler:function(b){c.remove(b,options)}}});
emmet.exec(function(h){h("actions").add("evaluate_math_expression",function(e){var g=h("actionUtils"),f=h("utils"),c=String(e.getContent()),b=h("range").create(e.getSelectionRange());b.length()||(b=g.findExpressionBounds(e,function(a){return f.isNumeric(a)||".+-*/\\".indexOf(a)!=-1}));if(b&&b.length()){g=b.substring(c);g=g.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var a=f.prettifyNumber((new Function("return "+g))());e.replaceContent(a,b.start,b.end);e.setCaretPos(b.start+a.length);
return!0}catch(d){}}return!1},{label:"Numbers/Evaluate Math Expression"})});
emmet.exec(function(h,e){function g(b,a){var c=h("utils"),g=!1,j=!1,l=h("actionUtils").findExpressionBounds(b,function(a,b,e){return c.isNumeric(a)?!0:a=="."?!c.isNumeric(e.charAt(b+1))?!1:j?!1:j=!0:a=="-"?g?!1:g=!0:!1});if(l&&l.length()){var n=l.substring(String(b.getContent())),m=parseFloat(n);if(!e.isNaN(m)){m=c.prettifyNumber(m+a);if(/^(\-?)0+[1-9]/.test(n)){var o="";RegExp.$1&&(o="-",m=m.substring(1));m=m.split(".");m[0]=c.zeroPadString(m[0],f(n));m=o+m.join(".")}b.replaceContent(m,l.start,l.end);
b.createSelection(l.start,l.start+m.length);return!0}}return!1}function f(b){b=b.replace(/^\-/,"");return~b.indexOf(".")?b.split(".")[0].length:b.length}var c=h("actions");e.each([1,-1,10,-10,0.1,-0.1],function(b){var a=b>0?"increment":"decrement";c.add(a+"_number_by_"+String(Math.abs(b)).replace(".","").substring(0,2),function(a){return g(a,b)},{label:"Numbers/"+a.charAt(0).toUpperCase()+a.substring(1)+" number by "+Math.abs(b)})})});
emmet.exec(function(h,e){var g=h("actions"),f=h("preferences");f.define("css.closeBraceIndentation","\n","Indentation before closing brace of CSS rule. Some users prefereindented closing brace of CSS rule for better readability. This preference\u2019s value will be automatically inserted before closing brace when user adds newline in newly created CSS rule (e.g. when \u201cInsert formatted linebreak\u201d action will be performed in CSS file). If you\u2019re such user, you may want to write put a value like <code>\\n\\t</code> in this preference.");
g.add("insert_formatted_line_break_only",function(c){var b=h("utils"),a=h("resources"),d=h("editorUtils").outputInfo(c),g=c.getCaretPos(),j=b.getNewline();if(e.include(["html","xml","xsl"],d.syntax)){if(a=a.getVariable("indentation"),d=h("html_matcher").getTags(d.content,g,d.profile),d[0]&&d[1]&&d[0].type=="tag"&&d[0].end==g&&d[1].start==g)return c.replaceContent(j+a+b.getCaretPlaceholder()+j,g),!0}else if(d.syntax=="css"&&(d=d.content,g&&d.charAt(g-1)=="{")){var l=f.get("css.closeBraceIndentation"),
a=a.getVariable("indentation"),n=d.charAt(g)=="}";if(!n)for(var m=g,o=d.length,q;m<o;m++){q=d.charAt(m);if(q=="{")break;if(q=="}"){l="";n=!0;break}}n||(l+="}");b=j+a+b.getCaretPlaceholder()+l;c.replaceContent(b,g);return!0}return!1},{hidden:!0});g.add("insert_formatted_line_break",function(c){if(!g.run("insert_formatted_line_break_only",c)){for(var b=h("utils"),a=h("editorUtils").getCurrentLinePadding(c),d=String(c.getContent()),e=c.getCaretPos(),f=d.length,b=b.getNewline(),l="",n=c.getCurrentLineRange().end+
1,m;n<f;n++)if(m=d.charAt(n),m==" "||m=="\t")l+=m;else break;l.length>a.length?c.replaceContent(b+l,e,e,!0):c.replaceContent(b,e)}return!0},{hidden:!0})});
emmet.exec(function(h){h("actions").add("merge_lines",function(e){var g=h("html_matcher"),f=h("utils"),c=h("editorUtils").outputInfo(e),b=h("range").create(e.getSelectionRange());if(!b.length()&&(g=g(c.content,e.getCaretPos(),c.profile)))b.start=g[0],b.end=g[1];if(b.length()){c=b.substring(c.content);f=f.splitByLines(c);for(c=1;c<f.length;c++)f[c]=f[c].replace(/^\s+/,"");c=f.join("").replace(/\s{2,}/," ");e.replaceContent(c,b.start,b.end);e.createSelection(b.start,b.start+c.length);return!0}return!1})});
emmet.exec(function(h){function e(e,f,c){c=c||0;return f.charAt(c)==e.charAt(0)&&f.substr(c,e.length)==e}h("actions").add("encode_decode_data_url",function(g){var f=String(g.getSelection()),c=g.getCaretPos();if(!f)for(var b=String(g.getContent());c-- >=0;)if(e("src=",b,c)){if(b=b.substr(c).match(/^(src=(["'])?)([^'"<>\s]+)\1?/))f=b[3],c+=b[1].length;break}else if(e("url(",b,c)){if(b=b.substr(c).match(/^(url\((['"])?)([^'"\)\s]+)\1?/))f=b[3],c+=b[1].length;break}if(f)if(e("data:",f))if(b=String(g.prompt("Enter path to file (absolute or relative)"))){var a=
h("file"),d=a.createPath(g.getFilePath(),b);if(!d)throw"Can't save file";a.save(d,h("base64").decode(f.replace(/^data\:.+?;.+?,/,"")));g.replaceContent("$0"+b,c,c+f.length);g=!0}else g=!1;else{b=h("file");a=h("actionUtils");d=g.getFilePath();if(d===null)throw"You should save your file before using this action";d=b.locateFile(d,f);if(d===null)throw"Can't find "+f+" file";var i=h("base64").encode(String(b.read(d)));if(!i)throw"Can't encode file content to base64";i="data:"+(a.mimeTypes[String(b.getExt(d))]||
"application/octet-stream")+";base64,"+i;g.replaceContent("$0"+i,c,c+f.length);g=!0}else g=!1;return g},{label:"Encode\\Decode data:URL image"})});
emmet.exec(function(h,e){function g(e,c){var b;if(c){if(/^data:/.test(c))b=h("base64").decode(c.replace(/^data\:.+?;.+?,/,""));else{b=h("file");var a=b.locateFile(e.getFilePath(),c);if(a===null)throw"Can't find "+c+" file";b=String(b.read(a))}return h("actionUtils").getImageSize(b)}}h("actions").add("update_image_size",function(f){var c;if(String(f.getSyntax())=="css")a:{c=f.getCaretPos();var b=h("editorUtils").outputInfo(f);if(b=h("cssEditTree").parseFromPosition(b.content,c,!0)){var a=b.itemFromPosition(c,
!0),d;if(a&&(d=/url\((["']?)(.+?)\1\)/i.exec(a.value()||"")))if(d=g(f,d[2])){a=b.range(!0);b.value("width",d.width+"px");b.value("height",d.height+"px",b.indexOf("width")+1);c=e.extend(a,{data:b.toString(),caret:c});break a}}c=null}else a:{c=f.getCaretPos();b=h("editorUtils").outputInfo(f);if((b=h("xmlEditTree").parseFromPosition(b.content,c,!0))&&b.name().toLowerCase()=="img")if(d=g(f,b.value("src"))){a=b.range(!0);b.value("width",d.width);b.value("height",d.height,b.indexOf("width")+1);c=e.extend(a,
{data:b.toString(),caret:c});break a}c=null}return h("actionUtils").compoundUpdate(f,c)})});
emmet.define("cssResolver",function(h,e){function g(a){var b=a&&a.charCodeAt(0);return a&&a=="."||b>47&&b<58}function f(a){a=h("utils").trim(a);if(~a.indexOf("/*"))return!1;a=h("tabStops").processText(a,{replaceCarets:!0,tabstop:function(){return"value"}});return a.split(":").length==2}function c(a){var b=h("utils"),a=b.trim(a);if(a.indexOf(":")==-1)return{name:a,value:o};a=a.split(":");return{name:b.trim(a.shift()),value:b.trim(a.join(":")).replace(/^(\$\{0\}|\$0)(\s*;?)$/,"${1}$2")}}function b(a,
b){var c=n[b];c||(c=e.find(n,function(a){return a.prefix==b}));return c&&c.supports&&e.include(c.supports,a)}function a(a,c){var d=[];e.each(n,function(c,e){b(a,e)&&d.push(e)});!d.length&&!c&&e.each(n,function(a,b){a.obsolete||d.push(b)});return d}function d(a,b){e.isString(b)&&(b={prefix:b});n[a]=e.extend({},l,b)}function i(a,b){if(!e.isString(a))a=a.data;if(!f(a))return a;b&&(~a.indexOf(";")?a=a.split(";").join(" !important;"):a+=" !important");var c=a.indexOf(":");return a=a.substring(0,c).replace(/\s+$/,
"")+q.get("css.valueSeparator")+h("utils").trim(a.substring(c+1))}var j=null,l={prefix:"emmet",obsolete:!1,transformName:function(a){return"-"+this.prefix+"-"+a},supports:null},n={},m={p:"%",e:"em",x:"ex"},o="${1};",q=h("preferences");q.define("css.valueSeparator",": ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations.");q.define("css.autoInsertVendorPrefixes",!0,"Automatically generate vendor-prefixed copies of expanded CSS property. By default, Emmet will generate vendor-prefixed NaN(e.g. <code>-bxsh</code>). With this option enabled, you don\u2019t need dashes before abbreviations: Emmet will produce vendor-prefixed properties for you.");
var r=e.template("A comma-separated list of CSS properties that may have <code><%= vendor %></code> vendor prefix. This list is used to generate a list of prefixed properties when expanding <code>-property</code> abbreviations. Empty list means that all possible CSS values may have <code><%= vendor %></code> prefix.");e.each({webkit:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow",
moz:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow",
ms:"accelerator, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, overflow-x, overflow-y, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode, zoom",
var _=function(){function h(a,b,c){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&k.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&k.isFunction(b.isEqual))return b.isEqual(a);var e=g.call(a);if(e!=g.call(b))return!1;switch(e){case "[object String]":return a==String(b);case "[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case "[object Date]":case "[object Boolean]":return+a==+b;case "[object RegExp]":return a.source==
b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return!1;for(var d=c.length;d--;)if(c[d]==a)return!0;c.push(a);var d=0,j=!0;if(e=="[object Array]"){if(d=a.length,j=d==b.length)for(;d--;)if(!(j=d in a==d in b&&h(a[d],b[d],c)))break}else{if("constructor"in a!="constructor"in b||a.constructor!=b.constructor)return!1;for(var f in a)if(k.has(a,f)&&(d++,!(j=k.has(b,f)&&h(a[f],b[f],c))))break;if(j){for(f in b)if(k.has(b,f)&&!d--)break;
j=!d}}c.pop();return j}var d=this,f=d._,i={},b=Array.prototype,c=Object.prototype,a=b.slice,e=b.unshift,g=c.toString,j=c.hasOwnProperty,l=b.forEach,m=b.map,n=b.reduce,o=b.reduceRight,q=b.filter,s=b.every,r=b.some,u=b.indexOf,p=b.lastIndexOf,c=Array.isArray,v=Object.keys,w=Function.prototype.bind,k=function(a){return new y(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=k;exports._=k}else d._=k;k.VERSION="1.3.3";var t=k.each=k.forEach=function(a,
b,c){if(a!=null)if(l&&a.forEach===l)a.forEach(b,c);else if(a.length===+a.length)for(var g=0,e=a.length;g<e;g++){if(g in a&&b.call(c,a[g],g,a)===i)break}else for(g in a)if(k.has(a,g)&&b.call(c,a[g],g,a)===i)break};k.map=k.collect=function(a,b,c){var g=[];if(a==null)return g;if(m&&a.map===m)return a.map(b,c);t(a,function(a,e,d){g[g.length]=b.call(c,a,e,d)});if(a.length===+a.length)g.length=a.length;return g};k.reduce=k.foldl=k.inject=function(a,b,c,g){var e=arguments.length>2;a==null&&(a=[]);if(n&&
a.reduce===n)return g&&(b=k.bind(b,g)),e?a.reduce(b,c):a.reduce(b);t(a,function(a,d,j){e?c=b.call(g,c,a,d,j):(c=a,e=!0)});if(!e)throw new TypeError("Reduce of empty array with no initial value");return c};k.reduceRight=k.foldr=function(a,b,c,g){var e=arguments.length>2;a==null&&(a=[]);if(o&&a.reduceRight===o)return g&&(b=k.bind(b,g)),e?a.reduceRight(b,c):a.reduceRight(b);var d=k.toArray(a).reverse();g&&!e&&(b=k.bind(b,g));return e?k.reduce(d,b,c,g):k.reduce(d,b)};k.find=k.detect=function(a,b,c){var g;
z(a,function(a,e,d){if(b.call(c,a,e,d))return g=a,!0});return g};k.filter=k.select=function(a,b,c){var g=[];if(a==null)return g;if(q&&a.filter===q)return a.filter(b,c);t(a,function(a,e,d){b.call(c,a,e,d)&&(g[g.length]=a)});return g};k.reject=function(a,b,c){var g=[];if(a==null)return g;t(a,function(a,e,d){b.call(c,a,e,d)||(g[g.length]=a)});return g};k.every=k.all=function(a,b,c){var g=!0;if(a==null)return g;if(s&&a.every===s)return a.every(b,c);t(a,function(a,e,d){if(!(g=g&&b.call(c,a,e,d)))return i});
return!!g};var z=k.some=k.any=function(a,b,c){b||(b=k.identity);var g=!1;if(a==null)return g;if(r&&a.some===r)return a.some(b,c);t(a,function(a,e,d){if(g||(g=b.call(c,a,e,d)))return i});return!!g};k.include=k.contains=function(a,b){var c=!1;return a==null?c:u&&a.indexOf===u?a.indexOf(b)!=-1:c=z(a,function(a){return a===b})};k.invoke=function(b,c){var g=a.call(arguments,2);return k.map(b,function(a){return(k.isFunction(c)?c||a:a[c]).apply(a,g)})};k.pluck=function(a,b){return k.map(a,function(a){return a[b]})};
k.max=function(a,b,c){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!b&&k.isEmpty(a))return-Infinity;var g={computed:-Infinity};t(a,function(a,e,d){e=b?b.call(c,a,e,d):a;e>=g.computed&&(g={value:a,computed:e})});return g.value};k.min=function(a,b,c){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!b&&k.isEmpty(a))return Infinity;var g={computed:Infinity};t(a,function(a,e,d){e=b?b.call(c,a,e,d):a;e<g.computed&&(g={value:a,computed:e})});return g.value};k.shuffle=
function(a){var b=[],c;t(a,function(a,g){c=Math.floor(Math.random()*(g+1));b[g]=b[c];b[c]=a});return b};k.sortBy=function(a,b,c){var g=k.isFunction(b)?b:function(a){return a[b]};return k.pluck(k.map(a,function(a,b,e){return{value:a,criteria:g.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,g=b.criteria;return c===void 0?1:g===void 0?-1:c<g?-1:c>g?1:0}),"value")};k.groupBy=function(a,b){var c={},g=k.isFunction(b)?b:function(a){return a[b]};t(a,function(a,b){var e=g(a,b);(c[e]||(c[e]=[])).push(a)});
return c};k.sortedIndex=function(a,b,c){c||(c=k.identity);for(var g=0,e=a.length;g<e;){var d=g+e>>1;c(a[d])<c(b)?g=d+1:e=d}return g};k.toArray=function(b){return!b?[]:k.isArray(b)?a.call(b):k.isArguments(b)?a.call(b):b.toArray&&k.isFunction(b.toArray)?b.toArray():k.values(b)};k.size=function(a){return k.isArray(a)?a.length:k.keys(a).length};k.first=k.head=k.take=function(b,c,g){return c!=null&&!g?a.call(b,0,c):b[0]};k.initial=function(b,c,g){return a.call(b,0,b.length-(c==null||g?1:c))};k.last=function(b,
c,g){return c!=null&&!g?a.call(b,Math.max(b.length-c,0)):b[b.length-1]};k.rest=k.tail=function(b,c,g){return a.call(b,c==null||g?1:c)};k.compact=function(a){return k.filter(a,function(a){return!!a})};k.flatten=function(a,b){return k.reduce(a,function(a,c){if(k.isArray(c))return a.concat(b?c:k.flatten(c));a[a.length]=c;return a},[])};k.without=function(b){return k.difference(b,a.call(arguments,1))};k.uniq=k.unique=function(a,b,c){var c=c?k.map(a,c):a,g=[];a.length<3&&(b=!0);k.reduce(c,function(c,e,
d){if(b?k.last(c)!==e||!c.length:!k.include(c,e))c.push(e),g.push(a[d]);return c},[]);return g};k.union=function(){return k.uniq(k.flatten(arguments,!0))};k.intersection=k.intersect=function(b){var c=a.call(arguments,1);return k.filter(k.uniq(b),function(a){return k.every(c,function(b){return k.indexOf(b,a)>=0})})};k.difference=function(b){var c=k.flatten(a.call(arguments,1),!0);return k.filter(b,function(a){return!k.include(c,a)})};k.zip=function(){for(var b=a.call(arguments),c=k.max(k.pluck(b,"length")),
g=Array(c),e=0;e<c;e++)g[e]=k.pluck(b,""+e);return g};k.indexOf=function(a,b,c){if(a==null)return-1;var g;if(c)return c=k.sortedIndex(a,b),a[c]===b?c:-1;if(u&&a.indexOf===u)return a.indexOf(b);c=0;for(g=a.length;c<g;c++)if(c in a&&a[c]===b)return c;return-1};k.lastIndexOf=function(a,b){if(a==null)return-1;if(p&&a.lastIndexOf===p)return a.lastIndexOf(b);for(var c=a.length;c--;)if(c in a&&a[c]===b)return c;return-1};k.range=function(a,b,c){arguments.length<=1&&(b=a||0,a=0);for(var c=arguments[2]||1,
g=Math.max(Math.ceil((b-a)/c),0),e=0,d=Array(g);e<g;)d[e++]=a,a+=c;return d};var x=function(){};k.bind=function(b,c){var g,e;if(b.bind===w&&w)return w.apply(b,a.call(arguments,1));if(!k.isFunction(b))throw new TypeError;e=a.call(arguments,2);return g=function(){if(!(this instanceof g))return b.apply(c,e.concat(a.call(arguments)));x.prototype=b.prototype;var d=new x,j=b.apply(d,e.concat(a.call(arguments)));return Object(j)===j?j:d}};k.bindAll=function(b){var c=a.call(arguments,1);c.length==0&&(c=k.functions(b));
t(c,function(a){b[a]=k.bind(b[a],b)});return b};k.memoize=function(a,b){var c={};b||(b=k.identity);return function(){var g=b.apply(this,arguments);return k.has(c,g)?c[g]:c[g]=a.apply(this,arguments)}};k.delay=function(b,c){var g=a.call(arguments,2);return setTimeout(function(){return b.apply(null,g)},c)};k.defer=function(b){return k.delay.apply(k,[b,1].concat(a.call(arguments,1)))};k.throttle=function(a,b){var c,g,e,d,j,f,h=k.debounce(function(){j=d=!1},b);return function(){c=this;g=arguments;var k;
e||(e=setTimeout(function(){e=null;j&&a.apply(c,g);h()},b));d?j=!0:f=a.apply(c,g);h();d=!0;return f}};k.debounce=function(a,b,c){var g;return function(){var e=this,d=arguments;c&&!g&&a.apply(e,d);clearTimeout(g);g=setTimeout(function(){g=null;c||a.apply(e,d)},b)}};k.once=function(a){var b=!1,c;return function(){if(b)return c;b=!0;return c=a.apply(this,arguments)}};k.wrap=function(b,c){return function(){var g=[b].concat(a.call(arguments,0));return c.apply(this,g)}};k.compose=function(){var a=arguments;
return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}};k.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};k.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],c;for(c in a)k.has(a,c)&&(b[b.length]=c);return b};k.values=function(a){return k.map(a,k.identity)};k.functions=k.methods=function(a){var b=[],c;for(c in a)k.isFunction(a[c])&&b.push(c);return b.sort()};k.extend=function(b){t(a.call(arguments,
1),function(a){for(var c in a)b[c]=a[c]});return b};k.pick=function(b){var c={};t(k.flatten(a.call(arguments,1)),function(a){a in b&&(c[a]=b[a])});return c};k.defaults=function(b){t(a.call(arguments,1),function(a){for(var c in a)b[c]==null&&(b[c]=a[c])});return b};k.clone=function(a){return!k.isObject(a)?a:k.isArray(a)?a.slice():k.extend({},a)};k.tap=function(a,b){b(a);return a};k.isEqual=function(a,b){return h(a,b,[])};k.isEmpty=function(a){if(a==null)return!0;if(k.isArray(a)||k.isString(a))return a.length===
0;for(var b in a)if(k.has(a,b))return!1;return!0};k.isElement=function(a){return!!(a&&a.nodeType==1)};k.isArray=c||function(a){return g.call(a)=="[object Array]"};k.isObject=function(a){return a===Object(a)};k.isArguments=function(a){return g.call(a)=="[object Arguments]"};if(!k.isArguments(arguments))k.isArguments=function(a){return!(!a||!k.has(a,"callee"))};k.isFunction=function(a){return g.call(a)=="[object Function]"};k.isString=function(a){return g.call(a)=="[object String]"};k.isNumber=function(a){return g.call(a)==
"[object Number]"};k.isFinite=function(a){return k.isNumber(a)&&isFinite(a)};k.isNaN=function(a){return a!==a};k.isBoolean=function(a){return a===!0||a===!1||g.call(a)=="[object Boolean]"};k.isDate=function(a){return g.call(a)=="[object Date]"};k.isRegExp=function(a){return g.call(a)=="[object RegExp]"};k.isNull=function(a){return a===null};k.isUndefined=function(a){return a===void 0};k.has=function(a,b){return j.call(a,b)};k.noConflict=function(){d._=f;return this};k.identity=function(a){return a};
k.times=function(a,b,c){for(var g=0;g<a;g++)b.call(c,g)};k.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};k.result=function(a,b){if(a==null)return null;var c=a[b];return k.isFunction(c)?c.call(a):c};k.mixin=function(a){t(k.functions(a),function(b){F(b,k[b]=a[b])})};var G=0;k.uniqueId=function(a){var b=G++;return a?a+b:b};k.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,
escape:/<%-([\s\S]+?)%>/g};var B=/.^/,A={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},C;for(C in A)A[A[C]]=C;var H=/\\|'|\r|\n|\t|\u2028|\u2029/g,I=/\\(\\|'|r|n|t|u2028|u2029)/g,D=function(a){return a.replace(I,function(a,b){return A[b]})};k.template=function(a,b,c){c=k.defaults(c||{},k.templateSettings);a="__p+='"+a.replace(H,function(a){return"\\"+A[a]}).replace(c.escape||B,function(a,b){return"'+\n_.escape("+D(b)+")+\n'"}).replace(c.interpolate||B,function(a,b){return"'+\n("+
D(b)+")+\n'"}).replace(c.evaluate||B,function(a,b){return"';\n"+D(b)+"\n;__p+='"})+"';\n";c.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",g=new Function(c.variable||"obj","_",a);if(b)return g(b,k);b=function(a){return g.call(this,a,k)};b.source="function("+(c.variable||"obj")+"){\n"+a+"}";return b};k.chain=function(a){return k(a).chain()};var y=function(a){this._wrapped=a};k.prototype=y.prototype;
var E=function(a,b){return b?k(a).chain():a},F=function(b,c){y.prototype[b]=function(){var b=a.call(arguments);e.call(b,this._wrapped);return E(c.apply(k,b),this._chain)}};k.mixin(k);t(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=b[a];y.prototype[a]=function(){var b=this._wrapped;c.apply(b,arguments);var g=b.length;(a=="shift"||a=="splice")&&g===0&&delete b[0];return E(b,this._chain)}});t(["concat","join","slice"],function(a){var c=b[a];y.prototype[a]=function(){return E(c.apply(this._wrapped,
arguments),this._chain)}});y.prototype.chain=function(){this._chain=!0;return this};y.prototype.value=function(){return this._wrapped};return k}.call({}),emmet=function(h){function d(a,b,d){var f;f=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};_.extend(f,a);c.prototype=a.prototype;f.prototype=new c;b&&_.extend(f.prototype,b);d&&_.extend(f,d);f.prototype.constructor=f;f.__super__=a.prototype;return f}function f(c){!(c in b)&&a&&a(c);return b[c]}if(typeof _=="undefined")try{_=
h.require("underscore")}catch(i){}if(typeof _=="undefined")throw"Cannot access to Underscore.js lib";var b={_:_},c=function(){},a=null;return{define:function(a,c){a in b||(b[a]=_.isFunction(c)?this.exec(c):c)},require:f,exec:function(a,b){return a.call(b||h,_.bind(f,this),_,this)},extend:function(a,b){var c=d(this,a,b);c.extend=this.extend;if(a.hasOwnProperty("toString"))c.prototype.toString=a.toString;return c},expandAbbreviation:function(a,b,c,d){if(!a)return"";var b=b||"html",h=f("filters"),i=
f("abbreviationParser"),c=f("profile").get(c,b);f("tabStops").resetTabstopIndex();a=h.extractFromAbbreviation(a);d=i.parse(a[0],{syntax:b,contextNode:d});b=h.composeList(b,c,a[1]);h.apply(d,b,c);return d.toString()},defaultSyntax:function(){return"html"},defaultProfile:function(){return"plain"},log:function(){h.console&&h.console.log&&h.console.log.apply(h.console,arguments)},setModuleLoader:function(b){a=b}}}(this);
if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=emmet;exports.emmet=emmet}
emmet.define("abbreviationParser",function(h,d){function f(){this.parent=null;this.children=[];this._attributes=[];this.abbreviation="";this.counter=1;this._name=null;this._text="";this.repeatCount=1;this.hasImplicitRepeat=!1;this._data={};this.padding=this.content=this.end=this.start=""}function i(a){return a.substring(1,a.length-1)}function b(a){for(var a=h("utils").trim(a),c=new f,g=c.addChild(),e,j=h("stringStream").create(a),a=1E3,l;!j.eol()&&--a>0;)switch(e=j.peek(),e){case "(":j.start=j.pos;
if(j.skipToPair("(",")"))e=b(i(j.current())),(l=j.match(/^\*(\d+)?/,!0))&&g._setRepeat(l[1]),d.each(e.children,function(a){g.addChild(a)});else throw'Invalid abbreviation: mo matching ")" found for character at '+j.pos;break;case ">":g=g.addChild();j.next();break;case "+":g=g.parent.addChild();j.next();break;case "^":e=g.parent||g;g=(e.parent||e).addChild();j.next();break;default:j.start=j.pos,j.eatWhile(function(a){if(a=="["||a=="{"){if(j.skipToPair(a,q[a]))return j.backUp(1),!0;throw'Invalid abbreviation: mo matching "'+
q[a]+'" found for character at '+j.pos;}return a=="+"?(j.next(),a=j.eol()||~"+>^*".indexOf(j.peek()),j.backUp(1),a):a!="("&&m(a)}),g.setAbbreviation(j.current()),j.start=j.pos}if(a<1)throw"Endless loop detected";return c}function c(a){var a=h("utils").trim(a),b=[],a=h("stringStream").create(a);for(a.eatSpace();!a.eol();)if(a.start=a.pos,a.eatWhile(o)){var c=a.current(),g="";if(a.peek()=="="){a.next();a.start=a.pos;var e=a.peek();if(e=='"'||e=="'"){a.next();a:{for(var g=a,d=void 0;d=g.next();)if(d===
e){g=!0;break a}g=!1}if(g)g=a.current(),g=g.substring(1,g.length-1);else throw"Invalid attribute value";}else if(a.eatWhile(/[^\s\]]/))g=a.current();else throw"Invalid attribute value";}b.push({name:c,value:g});a.eatSpace()}else break;return b}function a(a){for(var b=[],g={"#":"id",".":"class"},d=null,j=h("stringStream").create(a);!j.eol();)switch(j.peek()){case "#":case ".":if(d===null)d=j.pos;var f=g[j.peek()];j.next();j.start=j.pos;j.eatWhile(o);b.push({name:f,value:j.current()});break;case "[":if(d===
null)d=j.pos;j.start=j.pos;if(!j.skipToPair("[","]"))throw"Invalid attribute set definition";b=b.concat(c(i(j.current())));break;default:j.next()}return!b.length?null:{element:a.substring(0,d),attributes:e(b)}}function e(a){var a=d.map(a,function(a){return d.clone(a)}),b={};return d.filter(a,function(a){if(!(a.name in b))return b[a.name]=a;var c=b[a.name];a.name.toLowerCase()=="class"?c.value+=(c.value.length?" ":"")+a.value:c.value=a.value;return!1})}function g(a){if(!~a.indexOf("{"))return null;
for(var b=h("stringStream").create(a);!b.eol();)switch(b.peek()){case "[":case "(":b.skipToPair(b.peek(),q[b.peek()]);break;case "{":return b.start=b.pos,b.skipToPair("{","}"),{element:a.substring(0,b.start),text:i(b.current())};default:b.next()}}function j(a){for(var b=a.children.length-1,c,g;b>=0;b--)if(g=a.children[b],g.isRepeating()){c=g.repeatCount;g.repeatCount=1;for(g.updateProperty("counter",1);--c>0;)g.parent.addChild(g.clone(),b+1).updateProperty("counter",c+1)}d.each(a.children,j);return a}
function l(a){for(var b=a.children.length-1;b>=0;b--){var c=a.children[b];c.isGroup()?c.replace(l(c).children):c.isEmpty()&&c.remove()}d.each(a.children,l);return a}function m(a){var b=a.charCodeAt(0);return b>64&&b<91||b>96&&b<123||b>47&&b<58||"#.*:$-_!@|%".indexOf(a)!=-1}var n=/^[\w\-\$\:@\!%]+\+?$/i,o=/[\w\-:\$]/,q={"[":"]","(":")","{":"}"},s=Array.prototype.splice,r=[],u=[],p=[];f.prototype={addChild:function(a,b){a=a||new f;a.parent=this;d.isUndefined(b)?this.children.push(a):this.children.splice(b,
0,a);return a},clone:function(){var a=new f;d.each(["abbreviation","counter","_name","_text","repeatCount","hasImplicitRepeat","start","end","content","padding"],function(b){a[b]=this[b]},this);a._attributes=d.map(this._attributes,function(a){return d.clone(a)});a._data=d.clone(this._data);a.children=d.map(this.children,function(b){b=b.clone();b.parent=a;return b});return a},remove:function(){if(this.parent)this.parent.children=d.without(this.parent.children,this);return this},replace:function(){var a=
this.parent,b=d.indexOf(a.children,this),c=d.flatten(arguments);s.apply(a.children,[b,1].concat(c));d.each(c,function(b){b.parent=a})},updateProperty:function(a,b){this[a]=b;d.each(this.children,function(c){c.updateProperty(a,b)})},find:function(a){return this.findAll(a)[0]},findAll:function(a){if(!d.isFunction(a))var b=a.toLowerCase(),a=function(a){return a.name().toLowerCase()==b};var c=[];d.each(this.children,function(b){a(b)&&c.push(b);c=c.concat(b.findAll(a))});return d.compact(c)},data:function(a,
b){if(arguments.length==2&&(this._data[a]=b,a=="resource"&&h("elements").is(b,"snippet")&&(this.content=b.data,this._text)))this.content=h("abbreviationUtils").insertChildContent(b.data,this._text);return this._data[a]},name:function(){var a=this.matchedResource();return h("elements").is(a,"element")?a.name:this._name},attributeList:function(){var a=[],b=this.matchedResource();h("elements").is(b,"element")&&d.isArray(b.attributes)&&(a=a.concat(b.attributes));return e(a.concat(this._attributes))},
attribute:function(a,b){if(arguments.length==2){var c=d.indexOf(d.pluck(this._attributes,"name"),a.toLowerCase());~c?this._attributes[c].value=b:this._attributes.push({name:a,value:b})}return(d.find(this.attributeList(),function(b){return b.name==a})||{}).value},matchedResource:function(){return this.data("resource")},index:function(){return this.parent?d.indexOf(this.parent.children,this):-1},_setRepeat:function(a){a?this.repeatCount=parseInt(a,10)||1:this.hasImplicitRepeat=!0},setAbbreviation:function(b){var c=
this;this.abbreviation=b=(b||"").replace(/\*(\d+)?$/,function(a,b){c._setRepeat(b);return""});var e=g(b);if(e)b=e.element,this.content=this._text=e.text;if(e=a(b))b=e.element,this._attributes=e.attributes;if((this._name=b)&&!n.test(this._name))throw"Invalid abbreviation";},toString:function(){var a=h("utils"),b=this.start,c=this.end,g=this.content,e=this;d.each(p,function(a){b=a(b,e,"start");g=a(g,e,"content");c=a(c,e,"end")});var j=d.map(this.children,function(a){return a.toString()}).join(""),g=
h("abbreviationUtils").insertChildContent(g,j,{keepVariable:!1});return b+a.padString(g,this.padding)+c},hasEmptyChildren:function(){return!!d.find(this.children,function(a){return a.isEmpty()})},hasImplicitName:function(){return!this._name&&!this.isTextNode()},isGroup:function(){return!this.abbreviation},isEmpty:function(){return!this.abbreviation&&!this.children.length},isRepeating:function(){return this.repeatCount>1||this.hasImplicitRepeat},isTextNode:function(){return!this.name()&&!this.attributeList().length},
isElement:function(){return!this.isEmpty()&&!this.isTextNode()},deepestChild:function(){if(!this.children.length)return null;for(var a=this;a.children.length;)a=d.last(a.children);return a}};p.push(function(a,b){return h("utils").replaceCounter(a,b.counter)});return{parse:function(a,c){var c=c||{},g=b(a);if(c.contextNode){g._name=c.contextNode.name;var e={};d.each(g._attributes,function(a){e[a.name]=a});d.each(c.contextNode.attributes,function(a){a.name in e?e[a.name].value=a.value:(a=d.clone(a),
g._attributes.push(a),e[a.name]=a)})}d.each(r,function(a){a(g,c)});g=l(j(g));d.each(u,function(a){a(g,c)});return g},AbbreviationNode:f,addPreprocessor:function(a){d.include(r,a)||r.push(a)},removeFilter:function(a){preprocessor=d.without(r,a)},addPostprocessor:function(a){d.include(u,a)||u.push(a)},removePostprocessor:function(a){u=d.without(u,a)},addOutputProcessor:function(a){d.include(p,a)||p.push(a)},removeOutputProcessor:function(a){p=d.without(p,a)},isAllowedChar:function(a){a=String(a);return m(a)||
~">+^[](){}".indexOf(a)}}});
emmet.exec(function(h,d){function f(i,b){var c=h("resources"),a=h("elements"),e=h("abbreviationParser");d.each(d.clone(i.children),function(g){var j=c.getMatchedResource(g,b);if(d.isString(j))g.data("resource",a.create("snippet",j));else if(a.is(j,"reference")){j=e.parse(j.data,{syntax:b});if(g.repeatCount>1){var h=j.findAll(function(a){return a.hasImplicitRepeat});d.each(h,function(a){a.repeatCount=g.repeatCount;a.hasImplicitRepeat=!1})}var i=j.deepestChild();i&&d.each(g.children,function(a){i.addChild(a)});
d.each(j.children,function(a){d.each(g.attributeList(),function(b){a.attribute(b.name,b.value)})});g.replace(j.children)}else g.data("resource",j);f(g,b)})}h("abbreviationParser").addPreprocessor(function(d,b){var c=b.syntax||emmet.defaultSyntax();f(d,c)})});
emmet.exec(function(h,d){function f(a){for(var b=h("range"),c=[],a=h("stringStream").create(a);!a.eol();){if(a.peek()=="\\")a.next();else if(a.start=a.pos,a.match(e,!0)){c.push(b.create(a.start,e));continue}a.next()}return c}function i(a,b){var c=h("utils"),e=f(a);e.reverse();d.each(e,function(e){a=c.replaceSubstring(a,b,e)});return a}function b(a){return f(a.content).length?!0:!!d.find(a.attributeList(),function(a){return!!f(a.value).length})}function c(a,c,e){var f=a.findAll(function(a){return b(a)});
b(a)&&f.unshift(a);f.length?d.each(f,function(a){a.content=i(a.content,c);d.each(a._attributes,function(a){a.value=i(a.value,c)})}):(a=a.deepestChild()||a,a.content=e?c:h("abbreviationUtils").insertChildContent(a.content,c))}var a=h("abbreviationParser"),e="$#";a.addPreprocessor(function(a,b){if(b.pastedContent){var c=h("utils"),e=d.map(c.splitByLines(b.pastedContent,!0),c.trim);a.findAll(function(a){if(a.hasImplicitRepeat)return a.data("paste",e),a.repeatCount=e.length})}});a.addPostprocessor(function(a,
b){!a.findAll(function(a){var b=a.data("paste"),g="";d.isArray(b)?g=b[a.counter-1]:d.isFunction(b)?g=b(a.counter-1,a.content):b&&(g=b);g&&c(a,g,!!a.data("pasteOverwrites"));a.data("paste",null);return!!b}).length&&b.pastedContent&&c(a,b.pastedContent)})});emmet.exec(function(h,d){function f(i){var b=h("tagName");d.each(i.children,function(c){if(c.hasImplicitName()||c.data("forceNameResolving"))c._name=b.resolve(c.parent.name());f(c)});return i}h("abbreviationParser").addPostprocessor(f)});
emmet.define("cssParser",function(h,d){function f(a){return typeof a!=="undefined"}function i(){return{"char":g.chnum,line:g.linenum}}function b(a,b,c){var e=g,c=c||{};j.push({charstart:f(c["char"])?c["char"]:e.chnum,charend:f(c.charend)?c.charend:e.chnum,linestart:f(c.line)?c.line:e.linenum,lineend:f(c.lineend)?c.lineend:e.linenum,value:a,type:b||a})}function c(a,b){var c=g,e=b||{},d=f(e["char"])?e["char"]:c.chnum,e=f(e.line)?e.line:c.linenum;return{name:"ParseError",message:a+" at line "+(e+1)+
" char "+(d+1),walker:c,tokens:j}}function a(a){var c=g,e=c.ch,d=i(),j=a?a+e:e,e=c.nextChar();for(a&&(d["char"]-=a.length);m(e)||n(e);)j+=e,e=c.nextChar();b(j,"identifier",d)}function e(){var e=g.ch;if(e===" "||e==="\t"){for(var d=g.ch,j="",f=i();d===" "||d==="\t";)j+=d,d=g.nextChar();b(j,"white",f)}else{if(e==="/"){var d=g,e=f=d.ch,h,p=i();h=d.nextChar();if(h!=="*")p.charend=p["char"],p.lineend=p.line,j=b(e,e,p);else{for(;!(f==="*"&&h==="/");)e+=h,f=h,h=d.nextChar();e+=h;d.nextChar();b(e,"comment",
p)}return j}if(e==='"'||e==="'"){d=g;e=f=j=d.ch;p=i();for(j=d.nextChar();j!==f;){if(j==="\n")if(h=d.nextChar(),h==="\\")e+=j+h;else throw c("Unterminated string",p);else e+=j==="\\"?j+d.nextChar():j;j=d.nextChar()}e+=j;d.nextChar();b(e,"string",p)}else if(e==="("){d=g;j=d.ch;f=0;e=j;h=i();for(j=d.nextChar();j!==")"&&!f;){if(j==="(")f++;else if(j===")")f--;else if(j===!1)throw c("Unterminated brace",h);e+=j;j=d.nextChar()}e+=j;d.nextChar();b(e,"brace",h)}else{if(e==="-"||e==="."||n(e)){j=g;f=j.ch;
e=i();h=f;var p=h===".",v,f=j.nextChar();v=!n(f);if(p&&v)e.charend=e["char"],e.lineend=e.line,d=b(h,".",e);else if(h==="-"&&v)d=a("-");else{for(;f!==!1&&(n(f)||!p&&f===".");)f==="."&&(p=!0),h+=f,f=j.nextChar();b(h,"number",e)}return d}if(m(e))return a();if(l(e))return d=g,e=d.ch,j=i(),h=d.nextChar(),h==="="&&l(e,!0)?(e+=h,b(e,"match",j),d.nextChar(),f=void 0):(j.charend=j["char"]+1,j.lineend=j.line,b(e,e,j)),f;if(e==="\n")b("line"),g.nextChar();else throw c("Unrecognized character");}}}var g,j=[],
l,m,n;g={lines:null,total_lines:0,linenum:-1,line:"",ch:"",chnum:-1,init:function(a){var b=g;b.lines=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n");b.total_lines=b.lines.length;b.chnum=-1;b.linenum=-1;b.ch="";b.line="";b.nextLine();b.nextChar()},nextLine:function(){this.linenum+=1;this.line=this.total_lines<=this.linenum?!1:this.lines[this.linenum];if(this.chnum!==-1)this.chnum=0;return this.line},nextChar:function(){for(this.chnum+=1;this.line.charAt(this.chnum)==="";){if(this.nextLine()===
!1)return this.ch=!1;this.chnum=-1;return this.ch="\n"}return this.ch=this.line.charAt(this.chnum)},peek:function(){return this.line.charAt(this.chnum+1)}};m=function(a){return a=="&"||a==="_"||a==="-"||a>="a"&&a<="z"||a>="A"&&a<="Z"};n=function(a){return a!==!1&&a>="0"&&a<="9"};l=function(){for(var a="{}[]()+*=.,;:>~|\\%$#@^!".split(""),b="*^|$~".split(""),c={},e={},g=0;g<a.length;g+=1)c[a[g]]=!0;for(g=0;g<b.length;g+=1)e[b[g]]=!0;return function(a,b){return b?!!e[a]:!!c[a]}}();return{lex:function(a){g.init(a);
for(j=[];g.ch!==!1;)e();return j},parse:function(a){var b=0;return d.map(this.lex(a),function(c){if(c.type=="line")c.value=a.charAt(b)=="\r"&&a.charAt(b+1)=="\n"?"\r\n":a.charAt(b);return{type:c.type,start:b,end:b+=c.value.length}})},toSource:function(a){for(var b=0,c=a.length,e,g="";b<c;b+=1)e=a[b],g+=e.type==="line"?"\n":e.value;return g}}});
emmet.define("xmlParser",function(h){function d(a,e){function g(b){e.tokenize=b;return b(a,e)}var d=a.next();if(d=="<")if(a.eat("!"))return a.eat("[")?a.match("CDATA[")?g(b("atom","]]\>")):null:a.match("--")?g(b("comment","--\>")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),g(c(1))):null;else if(a.eat("?"))return a.eatWhile(/[\w\._\-]/),e.tokenize=b("meta","?>"),"meta";else{w=a.eat("/")?"closeTag":"openTag";a.eatSpace();for(v="";d=a.eat(/[^\s\u00a0=<>\"\'\/?]/);)v+=d;e.tokenize=f;return"tag"}else return d==
"&"?(a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"))?"atom":"error":(a.eatWhile(/[^&<]/),"text")}function f(a,b){var c=a.next();return c==">"||c=="/"&&a.eat(">")?(b.tokenize=d,w=c==">"?"endTag":"selfcloseTag","tag"):c=="="?(w="equals",null):/[\'\"]/.test(c)?(b.tokenize=i(c),b.tokenize(a,b)):(a.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function i(a){return function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=f;break}return"string"}}
function b(a,b){return function(c,e){for(;!c.eol();){if(c.match(b)){e.tokenize=d;break}c.next()}return a}}function c(a){return function(b,e){for(var g;(g=b.next())!=null;)if(g=="<")return e.tokenize=c(a+1),e.tokenize(b,e);else if(g==">")if(a==1){e.tokenize=d;break}else return e.tokenize=c(a-1),e.tokenize(b,e);return"meta"}}function a(){for(var a=arguments.length-1;a>=0;a--)k.cc.push(arguments[a])}function e(){a.apply(null,arguments);return!0}function g(){if(k.context)k.context=k.context.prev}function j(a){if(a==
"openTag")return k.tagName=v,e(o,l(k.startOfLine));else if(a=="closeTag")return a=!1,k.context?k.context.tagName!=v&&(p.implicitlyClosed.hasOwnProperty(k.context.tagName.toLowerCase())&&g(),a=!k.context||k.context.tagName!=v):a=!0,a&&(t="error"),e(m(a));return e()}function l(a){return function(b){if(b=="selfcloseTag"||b=="endTag"&&p.autoSelfClosers.hasOwnProperty(k.tagName.toLowerCase()))return n(k.tagName.toLowerCase()),e();if(b=="endTag"){n(k.tagName.toLowerCase());var b=k.tagName,c=p.doNotIndent.hasOwnProperty(b)||
k.context&&k.context.noIndent;k.context={prev:k.context,tagName:b,indent:k.indented,startOfLine:a,noIndent:c}}return e()}}function m(a){return function(b){a&&(t="error");if(b=="endTag")return g(),e();t="error";return e(arguments.callee)}}function n(a){for(var b;;){if(!k.context)break;b=k.context.tagName.toLowerCase();if(!p.contextGrabbers.hasOwnProperty(b)||!p.contextGrabbers[b].hasOwnProperty(a))break;g()}}function o(b){if(b=="word")return t="attribute",e(q,o);if(b=="endTag"||b=="selfcloseTag")return a();
t="error";return e(o)}function q(b){if(b=="equals")return e(s,o);p.allowMissing||(t="error");return b=="endTag"||b=="selfcloseTag"?a():e()}function s(b){if(b=="string")return e(r);if(b=="word"&&p.allowUnquoted)return t="string",e();t="error";return b=="endTag"||b=="selfCloseTag"?a():e()}function r(b){return b=="string"?e(r):a()}function u(a,b){if(a.sol())b.startOfLine=!0,b.indented=0;if(a.eatSpace())return null;t=w=v=null;var c=b.tokenize(a,b);b.type=w;if((c||w)&&c!="comment")for(k=b;;)if((b.cc.pop()||
j)(w||c))break;b.startOfLine=!1;return t||c}var p={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!0,allowMissing:!0},v=null,w=null,k=null,t;return{parse:function(a,b){for(var b=b||0,c={tokenize:d,cc:[],indented:0,startOfLine:!0,tagName:null,context:null},e=h("stringStream").create(a),g=[];!e.eol();)g.push({type:u(e,c),start:e.start+b,end:e.pos+b}),e.start=e.pos;return g}}});
emmet.define("string-score",function(){return{score:function(h,d,f){if(h==d)return 1;if(d=="")return 0;for(var i=0,b=d.length,c=h.length,a,e=1,g=0,j,l,m,n;g<b;++g){m=d.charAt(g);j=h.indexOf(m.toLowerCase());l=h.indexOf(m.toUpperCase());n=Math.min(j,l);l=n>-1?n:Math.max(j,l);if(l===-1)if(f){e+=1-f;continue}else return 0;else j=0.1;h[l]===m&&(j+=0.1);l===0?(j+=0.6,g===0&&(a=1)):h.charAt(l-1)===" "&&(j+=0.8);h=h.substring(l+1,c);i+=j}h=i/b;b=(h*(b/c)+h)/2;b/=e;a&&b+0.15<1&&(b+=0.15);return b}}});
emmet.define("utils",function(h,d){function f(b){this._data=[];this.length=0;b&&this.append(b)}var i="${0}";f.prototype={append:function(b){this._data.push(b);this.length+=b.length},toString:function(){return this._data.join("")},valueOf:function(){return this.toString()}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(b){return this.reTag.test(b)},isNumeric:function(b){typeof b=="string"&&(b=b.charCodeAt(0));return b&&b>47&&
b<58},trim:function(b){return(b||"").replace(/^\s+|\s+$/g,"")},getNewline:function(){var b=h("resources");if(!b)return"\n";b=b.getVariable("newline");return d.isString(b)?b:"\n"},setNewline:function(b){var c=h("resources");c.setVariable("newline",b);c.setVariable("nl",b)},splitByLines:function(b,c){var a=this.getNewline(),a=(b||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,a).split(a);c&&(a=d.filter(a,function(a){return a.length&&!!this.trim(a)},this));return a},
normalizeNewline:function(b){return this.splitByLines(b).join(this.getNewline())},repeatString:function(b,c){for(var a=[],e=0;e<c;e++)a.push(b);return a.join("")},padString:function(b,c){var a=d.isNumber(c)?this.repeatString(h("resources").getVariable("indentation")||"\t",c):c,e=[],g=this.splitByLines(b),j=this.getNewline();e.push(g[0]);for(var f=1;f<g.length;f++)e.push(j+a+g[f]);return e.join("")},zeroPadString:function(b,c){for(var a="",e=b.length;c>e++;)a+="0";return a+b},unindentString:function(b,
c){for(var a=this.splitByLines(b),e=0;e<a.length;e++)a[e].search(c)==0&&(a[e]=a[e].substr(c.length));return a.join(this.getNewline())},replaceUnescapedSymbol:function(b,c,a){for(var e=0,g=b.length,j=c.length,f=0;e<g;)if(b.charAt(e)=="\\")e+=j+1;else if(b.substr(e,j)==c){var h=j;f++;var i=a;if(d.isFunction(a))(i=a(b,c,e,f))?(h=i[0].length,i=i[1]):i=!1;i===!1?e++:(b=b.substring(0,e)+i+b.substring(e+h),g=b.length,e+=i.length)}else e++;return b},replaceVariables:function(b,c){var c=c||{},a=d.isFunction(c)?
c:function(a,b){return b in c?c[b]:null},e=h("resources");return h("tabStops").processText(b,{variable:function(b){var c=a(b.token,b.name,b);c===null&&(c=e.getVariable(b.name));if(c===null||d.isUndefined(c))c=b.token;return c}})},replaceCounter:function(b,c){var c=String(c),a=this;return this.replaceUnescapedSymbol(String(b),"$",function(b,g,d){if(b.charAt(d+1)=="{"||a.isNumeric(b.charAt(d+1)))return!1;for(g=d+1;b.charAt(g)=="$"&&b.charAt(g+1)!="{";)g++;return[b.substring(d,g),a.zeroPadString(c,g-
d)]})},matchesTag:function(b){return this.reTag.test(b||"")},escapeText:function(b){return b.replace(/([\$\\])/g,"\\$1")},unescapeText:function(b){return b.replace(/\\(.)/g,"$1")},getCaretPlaceholder:function(){return d.isFunction(i)?i.apply(this,arguments):i},setCaretPlaceholder:function(b){i=b},getLinePadding:function(b){return(b.match(/^(\s+)/)||[""])[0]},getLinePaddingFromPosition:function(b,c){return this.getLinePadding(this.findNewlineBounds(b,c).substring(b))},escapeForRegexp:function(b){return b.replace(RegExp("[.*+?|()\\[\\]{}\\\\]",
"g"),"\\$&")},prettifyNumber:function(b,c){return b.toFixed(typeof c=="undefined"?2:c).replace(/\.?0+$/,"")},stringBuilder:function(b){return new f(b)},replaceSubstring:function(b,c,a,e){if(d.isObject(a)&&"end"in a)e=a.end,a=a.start;d.isString(e)&&(e=a+e.length);d.isUndefined(e)&&(e=a);return a<0||a>b.length?b:b.substring(0,a)+c+b.substring(e)},narrowToNonSpace:function(b,c,a){c=h("range").create(c,a);for(a=/[\s\n\r\u00a0]/;c.start<c.end;){if(!a.test(b.charAt(c.start)))break;c.start++}for(;c.end>
c.start;)if(c.end--,!a.test(b.charAt(c.end))){c.end++;break}return c},findNewlineBounds:function(b,c){for(var a=b.length,e=0,g=a-1,d=c-1;d>0;d--){var f=b.charAt(d);if(f=="\n"||f=="\r"){e=d+1;break}}for(d=c;d<a;d++)if(f=b.charAt(d),f=="\n"||f=="\r"){g=d;break}return h("range").create(e,g-e)},deepMerge:function(){var b,c,a,e,g,j=arguments[0]||{},f=1,h=arguments.length;for(!d.isObject(j)&&!d.isFunction(j)&&(j={});f<h;f++)if((b=arguments[f])!=null)for(c in b)a=j[c],e=b[c],j!==e&&(e&&(d.isObject(e)||(g=
d.isArray(e)))?(g?(g=!1,a=a&&d.isArray(a)?a:[]):a=a&&d.isObject(a)?a:{},j[c]=this.deepMerge(a,e)):e!==void 0&&(j[c]=e));return j}}});
emmet.define("range",function(h,d){function f(b,c,a){switch(a){case "eq":case "==":return b===c;case "lt":case "<":return b<c;case "lte":case "<=":return b<=c;case "gt":case ">":return b>c;case "gte":case ">=":return b>=c}}function i(b,c){d.isObject(b)&&"start"in b?(this.start=Math.min(b.start,b.end),this.end=Math.max(b.start,b.end)):d.isArray(b)?(this.start=b[0],this.end=b[1]):(c=d.isString(c)?c.length:+c,this.start=b,this.end=b+c)}i.prototype={length:function(){return Math.abs(this.end-this.start)},
equal:function(b){return this.cmp(b,"eq","eq")},shift:function(b){this.start+=b;this.end+=b;return this},overlap:function(b){return b.start<=this.end&&b.end>=this.start},intersection:function(b){if(this.overlap(b)){var c=Math.max(b.start,this.start);return new i(c,Math.min(b.end,this.end)-c)}return null},union:function(b){if(this.overlap(b)){var c=Math.min(b.start,this.start);return new i(c,Math.max(b.end,this.end)-c)}return null},inside:function(b){return this.cmp(b,"lte","gt")},contains:function(b){return this.cmp(b,
"lt","gt")},include:function(){return this.cmp(loc,"lte","gte")},cmp:function(b,c,a){var e;b instanceof i?(e=b.start,b=b.end):e=b;return f(this.start,e,c||"<=")&&f(this.end,b,a||">")},substring:function(b){return this.length()>0?b.substring(this.start,this.end):""},clone:function(){return new i(this.start,this.length())},toArray:function(){return[this.start,this.end]},toString:function(){return"{"+this.start+", "+this.length()+"}"}};return{create:function(b,c){if(d.isUndefined(b)||b===null)return null;
if(b instanceof i)return b;if(d.isObject(b)&&"start"in b&&"end"in b)c=b.end-b.start,b=b.start;return new i(b,c)},create2:function(b,c){d.isNumber(b)&&d.isNumber(c)&&(c-=b);return this.create(b,c)}}});
emmet.define("handlerList",function(h,d){function f(){this._list=[]}f.prototype={add:function(f,b){this._list.push(d.extend({order:0},b||{},{fn:f}))},remove:function(f){this._list=d.without(this._list,d.find(this._list,function(b){return b.fn===f}))},list:function(){return d.sortBy(this._list,"order").reverse()},listFn:function(){return d.pluck(this.list(),"fn")},exec:function(f,b){var b=b||[],c=null;d.find(this.list(),function(a){c=a.fn.apply(a,b);if(c!==f)return!0});return c}};return{create:function(){return new f}}});
emmet.define("tokenIterator",function(h,d){function f(d){this.tokens=d;this._position=0;this.reset()}f.prototype={next:function(){if(this.hasNext()){var d=this.tokens[++this._i];this._position=d.start;return d}return null},current:function(){return this.tokens[this._i]},position:function(){return this._position},hasNext:function(){return this._i<this._il-1},reset:function(){this._i=-1;this._il=this.tokens.length},item:function(){return this.tokens[this._i]},itemNext:function(){return this.tokens[this._i+
1]},itemPrev:function(){return this.tokens[this._i-1]},nextUntil:function(f,b){for(var c,a=d.isString(f)?function(a){return a.type==f}:f;c=this.next();)if(b&&b.call(this,c),a.call(this,c))break}};return{create:function(d){return new f(d)}}});
emmet.define("stringStream",function(){function h(d){this.pos=this.start=0;this.string=d}h.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(d){var f=this.string.charAt(this.pos);if(typeof d=="string"?f==d:f&&(d.test?d.test(f):d(f)))return++this.pos,f},eatWhile:function(d){for(var f=this.pos;this.eat(d););
return this.pos>f},eatSpace:function(){for(var d=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>d},skipToEnd:function(){this.pos=this.string.length},skipTo:function(d){d=this.string.indexOf(d,this.pos);if(d>-1)return this.pos=d,!0},skipToPair:function(d,f){for(var h=0,b,c=this.pos,a=this.string.length;c<a;)if(b=this.string.charAt(c++),b==d)h++;else if(b==f&&(h--,h<1))return this.pos=c,!0;return!1},backUp:function(d){this.pos-=d},match:function(d,f,h){if(typeof d==
"string"){if(h=h?function(b){return b.toLowerCase()}:function(b){return b},h(this.string).indexOf(h(d),this.pos)==this.pos)return f!==!1&&(this.pos+=d.length),!0}else return(d=this.string.slice(this.pos).match(d))&&f!==!1&&(this.pos+=d[0].length),d},current:function(){return this.string.slice(this.start,this.pos)}};return{create:function(d){return new h(d)}}});
emmet.define("resources",function(h,d){function f(a,c,e){var d=h("utils"),c=d.replaceUnescapedSymbol(c,"|",d.getCaretPlaceholder());if(e=="snippets")return h("elements").create("snippet",c);if(e=="abbreviations"){e=c;h("utils").trim(a);var a=h("elements"),f;return(f=b.exec(e))?a.create("element",f[1],f[2],f[4]=="/"):a.create("reference",e)}}var i={},b=/^<(\w+\:?[\w\-]*)((?:\s+[\w\:\-]+\s*=\s*(['"]).*?\3)*)\s*(\/?)>/,c={},a={},e=h("handlerList").create();return{setVocabulary:function(b,e){i={};e==
"system"?c=b:a=b},getVocabulary:function(b){return b=="system"?c:a},getMatchedResource:function(a,b){return e.exec(null,d.toArray(arguments))||this.findSnippet(b,a.name())},getVariable:function(a){return(this.getSection("variables")||{})[a]},setVariable:function(a,b){var c=this.getVocabulary("user")||{};if(!("variables"in c))c.variables={};c.variables[a]=b;this.setVocabulary(c,"user")},hasSyntax:function(a){return a in this.getVocabulary("user")||a in this.getVocabulary("system")},addResolver:function(a,
b){e.add(a,b)},removeResolver:function(a){e.remove(a)},getSection:function(b){if(!b)return null;b in i||(i[b]=h("utils").deepMerge({},c[b],a[b]));for(var e=i[b],f=d.rest(arguments),m;e&&(m=f.shift());)if(m in e)e=e[m];else return null;return e},findItem:function(a,b){for(var c=this.getSection(a);c;){if(b in c)return c[b];c=this.getSection(c["extends"])}},findSnippet:function(a,b,c){if(!a||!b)return null;var c=c||[],e=[b];~b.indexOf("-")&&e.push(b.replace(/\-/g,":"));var h=this.getSection(a),i=null;
d.find(["snippets","abbreviations"],function(b){var c=this.getSection(a,b);if(c)return d.find(e,function(a){if(c[a])return i=f(a,c[a],b)})},this);c.push(a);return!i&&h["extends"]&&!d.include(c,h["extends"])?this.findSnippet(h["extends"],b,c):i},fuzzyFindSnippet:function(a,b,c){var c=c||0.3,a=this.getAllSnippets(a),e=h("string-score"),b=b.replace(/:$/,"").replace(/:/g,"-"),f=d.map(a,function(a,c){return{key:c,score:e.score(a.nk,b,0.1)}});if((f=d.last(d.sortBy(f,"score")))&&f.score>=c)return a[f.key].parsedValue},
getAllSnippets:function(a){var b="all-"+a;if(!i[b]){var c=[],e=[];do{var h=this.getSection(a);if(!h)break;d.each(["snippets","abbreviations"],function(a){var b={};d.each(h[a]||null,function(c,e){b[e]={nk:e.replace(/:$/,"").replace(/:/g,"-"),value:c,parsedValue:f(e,c,a),type:a}});c.push(b)});e.push(a);a=h["extends"]}while(a&&!d.include(e,a));i[b]=d.extend.apply(d,c.reverse())}return i[b]}}});
emmet.define("actions",function(h,d){function f(b){return h("utils").trim(b.charAt(0).toUpperCase()+b.substring(1).replace(/_[a-z]/g,function(b){return" "+b.charAt(1).toUpperCase()}))}var i={};return{add:function(b,c,a){b=b.toLowerCase();a=a||{};if(!a.label)a.label=f(b);i[b]={name:b,fn:c,options:a}},get:function(b){return i[b.toLowerCase()]},run:function(b,c){d.isArray(c)||(c=d.rest(arguments));var a=this.get(b);return a?a.fn.apply(emmet,c):(emmet.log('Action "%s" is not defined',b),!1)},getAll:function(){return i},
getList:function(){return d.values(this.getAll())},getMenu:function(b){var c=[],b=b||[];d.each(this.getList(),function(a){if(!a.options.hidden&&!d.include(b,a.name)){var e=f(a.name),g=c;if(a.options.label)for(var j=a.options.label.split("/"),e=j.pop(),h,i;h=j.shift();)i=d.find(g,function(a){return a.type=="submenu"&&a.name==h}),i||(i={name:h,type:"submenu",items:[]},g.push(i)),g=i.items;g.push({type:"action",name:a.name,label:e})}});return c},getActionNameForMenuTitle:function(b,c){var a=null;d.find(c||
this.getMenu(),function(c){if(c.type=="action"){if(c.label==b||c.name==b)return a=c.name}else return a=this.getActionNameForMenuTitle(b,c.items)},this);return a||null}}});
emmet.define("profile",function(h,d){function f(a){d.extend(this,e,a)}function i(a,b){switch(String(b||"").toLowerCase()){case "lower":return a.toLowerCase();case "upper":return a.toUpperCase()}return a}function b(b,c){return a[b.toLowerCase()]=new f(c)}function c(){b("xhtml");b("html",{self_closing_tag:!1});b("xml",{self_closing_tag:!0,tag_nl:!0});b("plain",{tag_nl:!1,indent:!1,place_cursor:!1});b("line",{tag_nl:!1,indent:!1,extraFilters:"s"})}var a={},e={tag_case:"asis",attr_case:"asis",attr_quotes:"double",
tag_nl:"decide",tag_nl_leaf:!1,place_cursor:!0,indent:!0,inline_break:3,self_closing_tag:"xhtml",filters:"",extraFilters:""};f.prototype={tagName:function(a){return i(a,this.tag_case)},attributeName:function(a){return i(a,this.attr_case)},attributeQuote:function(){return this.attr_quotes=="single"?"'":'"'},selfClosing:function(){return this.self_closing_tag=="xhtml"?" /":this.self_closing_tag===!0?"/":""},cursor:function(){return this.place_cursor?h("utils").getCaretPlaceholder():""}};c();return{create:function(a,
c){return arguments.length==2?b(a,c):new f(d.defaults(a||{},e))},get:function(b,c){if(!b&&c){var e=h("resources").findItem(c,"profile");e&&(b=e)}return!b?a.plain:b instanceof f?b:d.isString(b)&&b.toLowerCase()in a?a[b.toLowerCase()]:this.create(b)},remove:function(b){b=(b||"").toLowerCase();b in a&&delete a[b]},reset:function(){a={};c()},stringCase:i}});
emmet.define("editorUtils",function(h){return{isInsideTag:function(d,f){for(var h=/^<\/?\w[\w\:\-]*.*?>/,b=f;b>-1;){if(d.charAt(b)=="<")break;b--}return b!=-1&&(h=h.exec(d.substring(b)))&&f>b&&f<b+h[0].length?!0:!1},outputInfo:function(d,f,h){h=h||d.getProfileName();return{syntax:String(f||d.getSyntax()),profile:h?String(h):null,content:String(d.getContent())}},unindent:function(d,f){return h("utils").unindentString(f,this.getCurrentLinePadding(d))},getCurrentLinePadding:function(d){return h("utils").getLinePadding(d.getCurrentLine())}}});
emmet.define("actionUtils",function(h){return{mimeTypes:{gif:"image/gif",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",svg:"image/svg+xml",html:"text/html",htm:"text/html"},extractAbbreviation:function(d){for(var f=d.length,i=-1,b=0,c=0,a=0,e=h("utils"),g=h("abbreviationParser");;){f--;if(f<0){i=0;break}var j=d.charAt(f);if(j=="]")c++;else if(j=="["){if(!c){i=f+1;break}c--}else if(j=="}")a++;else if(j=="{"){if(!a){i=f+1;break}a--}else if(j==")")b++;else if(j=="("){if(!b){i=f+1;break}b--}else if(!c&&
!a&&(!g.isAllowedChar(j)||j==">"&&e.endsWithTag(d.substring(0,f+1)))){i=f+1;break}}return i!=-1&&!a&&!c&&!b?d.substring(i).replace(/^[\*\+\>\^]+/,""):""},getImageSize:function(d){var f=function(){return d.charCodeAt(h++)};if(d.substr(0,8)==="\u0089PNG\r\n\u001a\n"){var h=d.indexOf("IHDR")+4;return{width:f()<<24|f()<<16|f()<<8|f(),height:f()<<24|f()<<16|f()<<8|f()}}else if(d.substr(0,4)==="GIF8")return h=6,{width:f()|f()<<8,height:f()|f()<<8};else if(d.substr(0,2)==="\u00ff\u00d8")for(var h=2,b=d.length;h<
b;){if(f()!=255)break;var c=f();if(c==218)break;var a=f()<<8|f();if(c>=192&&c<=207&&!(c&4)&&!(c&8))return h+=1,{height:f()<<8|f(),width:f()<<8|f()};else h+=a-2}},captureContext:function(d){if(String(d.getSyntax())in{html:1,xml:1,xsl:1}){var f=String(d.getContent()),i=h("htmlMatcher").find(f,d.getCaretPos());if(i&&i.type=="tag"){for(var d=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,i=i.open,f=i.range.substring(f).replace(/^<[\w\-\:]+/,""),i={name:i.name,attributes:[]},
b;b=d.exec(f);)i.attributes.push({name:b[1],value:b[2]});return i}}return null},findExpressionBounds:function(d,f){for(var i=String(d.getContent()),b=i.length,c=d.getCaretPos()-1,a=c+1;c>=0&&f(i.charAt(c),c,i);)c--;for(;a<b&&f(i.charAt(a),a,i);)a++;if(a>c)return h("range").create([++c,a])},compoundUpdate:function(d,f){if(f){var h=d.getSelectionRange();d.replaceContent(f.data,f.start,f.end,!0);d.createSelection(f.caret,f.caret+h.end-h.start);return!0}return!1},detectSyntax:function(d,f){var i=f||"html";
h("resources").hasSyntax(i)||(i="html");if(i=="html"&&(this.isStyle(d)||this.isInlineCSS(d)))i="css";return i},detectProfile:function(d){var f=d.getSyntax(),i=h("resources").findItem(f,"profile");if(i)return i;switch(f){case "xml":case "xsl":return"xml";case "css":if(this.isInlineCSS(d))return"line";break;case "html":return(i=h("resources").getVariable("profile"))||(i=this.isXHTML(d)?"xhtml":"html"),i}return"xhtml"},isXHTML:function(d){return d.getContent().search(/<!DOCTYPE[^>]+XHTML/i)!=-1},isStyle:function(d){var f=
String(d.getContent()),d=d.getCaretPos();return(f=h("htmlMatcher").tag(f,d))&&f.open.name.toLowerCase()=="style"&&f.innerRange.cmp(d,"lte","gte")},isInlineCSS:function(d){var f=String(d.getContent()),d=d.getCaretPos();return(f=h("xmlEditTree").parseFromPosition(f,d,!0))?(f=f.itemFromPosition(d,!0))&&f.name().toLowerCase()=="style"&&f.valueRange(!0).cmp(d,"lte","gte"):!1}}});
emmet.define("abbreviationUtils",function(h,d){return{isSnippet:function(d){return h("elements").is(d.matchedResource(),"snippet")},isUnary:function(d){var i=d.matchedResource();return d.children.length||this.isSnippet(d)?!1:i&&i.is_empty||h("tagName").isEmptyElement(d.name())},isInline:function(d){return d.isTextNode()||!d.name()||h("tagName").isInlineLevel(d.name())},isBlock:function(d){return this.isSnippet(d)||!this.isInline(d)},isSnippet:function(d){return h("elements").is(d.matchedResource(),
"snippet")},hasTagsInContent:function(d){return h("utils").matchesTag(d.content)},hasBlockChildren:function(h){return this.hasTagsInContent(h)&&this.isBlock(h)||d.any(h.children,function(d){return this.isBlock(d)},this)},insertChildContent:function(f,i,b){var b=d.extend({keepVariable:!0,appendIfNoChild:!0},b||{}),c=!1,a=h("utils"),f=a.replaceVariables(f,function(e,d,h){var l=e;d=="child"&&(l=a.padString(i,a.getLinePaddingFromPosition(f,h.start)),c=!0,b.keepVariable&&(l+=e));return l});!c&&b.appendIfNoChild&&
(f+=i);return f}}});
emmet.define("base64",function(){return{encode:function(h){for(var d=[],f,i,b,c,a,e,g=0,j=h.length;g<j;)c=h.charCodeAt(g++),a=h.charCodeAt(g++),e=h.charCodeAt(g++),f=c&255,i=a&255,b=e&255,c=f>>2,f=(f&3)<<4|i>>4,i=(i&15)<<2|b>>6,b&=63,isNaN(a)?i=b=64:isNaN(e)&&(b=64),d.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(i)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b));
return d.join("")},decode:function(h){var d,f,i,b,c,a=0,e=0,g=[],j=h.length;if(!h)return h;h+="";do d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),i=d<<18|f<<12|b<<6|c,d=i>>16&
255,f=i>>8&255,i&=255,b==64?g[e++]=String.fromCharCode(d):c==64?g[e++]=String.fromCharCode(d,f):g[e++]=String.fromCharCode(d,f,i);while(a<j);return g.join("")}}});
emmet.define("htmlMatcher",function(h,d){function f(b){var d={},j;return{open:function(a){return(a=this.matches(a))&&a.type=="open"?a:null},close:function(a){return(a=this.matches(a))&&a.type=="close"?a:null},matches:function(f){var i="p"+f;if(!(i in d)&&b.charAt(f)=="<"){var n=b.slice(f);d[i]=(j=n.match(c))?{name:j[1],selfClose:!!j[3],range:h("range").create(f,j[0]),type:"open"}:(j=n.match(a))?{name:j[1],range:h("range").create(f,j[0]),type:"close"}:!1}return d[i]},text:function(){return b}}}function i(a,
b,c){return a.substring(b,b+c.length)==c}function b(a,b){for(var c=[],h=null,f=b.text(),n=a.range.end,o=f.length;n<o;n++){if(i(f,n,"<\!--"))for(h=n;h<o;h++)if(i(f,h,"--\>")){n=h+3;break}if(h=b.matches(n))if(h.type=="open"&&!h.selfClose)c.push(h.name);else if(h.type=="close"){if(!c.length)return h.name==a.name?h:null;if(d.last(c)==h.name)c.pop();else{for(var q=!1;c.length&&!q;)c.pop()==h.name&&(q=!0);if(!c.length&&!q)return h.name==a.name?h:null}}}}var c=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
a=/^<\/([\w\:\-]+)[^>]*>/;return{find:function(a,c){for(var j=h("range"),l=f(a),m=null,n=null,o=c;o>=0;o--)if(m=l.open(o)){if(m.selfClose&&m.range.cmp(c,"lt","gt"))break;if(n=b(m,l)){if(j.create2(m.range.start,n.range.end).contains(c))break}else if(m.range.contains(c))break;m=null}else if(i(a,o,"--\>"))for(var q=o-1;q>=0;q--)if(i(a,q,"--\>"))break;else{if(i(a,q,"<\!--")){o=q;break}}else if(i(a,o,"<\!--")){q=o+4;for(m=a.length;q<m;q++)if(i(a,q,"--\>")){q+=3;break}m={range:h("range").create(o,d.isNumber(q)?
q-o:q[0]),type:"comment"};break}if(m)return q=o=null,n?(o=j.create2(m.range.start,n.range.end),q=j.create2(m.range.end,n.range.start)):o=q=j.create2(m.range.start,m.range.end),m.type=="comment"&&(j=o.substring(a),q.start+=j.length-j.replace(/^<\!--\s*/,"").length,q.end-=j.length-j.replace(/\s*--\>$/,"").length),{open:m,close:n,type:m.type=="comment"?"comment":"tag",innerRange:q,innerContent:function(){return this.innerRange.substring(a)},outerRange:o,outerContent:function(){return this.outerRange.substring(a)},
range:!q.length()||!q.cmp(c,"lte","gte")?o:q,content:function(){return this.range.substring(a)},source:a}},tag:function(a,b){var c=this.find(a,b);if(c&&c.type=="tag")return c}}});
emmet.define("tabStops",function(h,d){var f=100,i=0,b={replaceCarets:!1,escape:function(b){return"\\"+b},tabstop:function(b){return b.token},variable:function(b){return b.token}};h("abbreviationParser").addOutputProcessor(function(b,a){var e=0,d=h("tabStops"),f=h("utils"),l={tabstop:function(a){var b=parseInt(a.group);if(b==0)return"${0}";b>e&&(e=b);return a.placeholder?(b+=i,a=d.processText(a.placeholder,l),"${"+b+":"+a+"}"):"${"+(b+i)+"}"}},b=d.processText(b,l),b=f.replaceVariables(b,d.variablesResolver(a));
i+=e+1;return b});return{extract:function(c,a){var e=h("utils"),g={carets:""},f=[],a=d.extend({},b,a,{tabstop:function(a){var b=a.token,c="";if(a.placeholder=="cursor")f.push({start:a.start,end:a.start+b.length,group:"carets",value:""});else{if("placeholder"in a)g[a.group]=a.placeholder;a.group in g&&(c=g[a.group]);f.push({start:a.start,end:a.start+b.length,group:a.group,value:c})}return b}});a.replaceCarets&&(c=c.replace(RegExp(e.escapeForRegexp(e.getCaretPlaceholder()),"g"),"${0:cursor}"));var c=
this.processText(c,a),i=e.stringBuilder(),m=0,e=d.map(f,function(a){i.append(c.substring(m,a.start));var b=i.length,e=g[a.group]||"";i.append(e);m=a.end;return{group:a.group,start:b,end:b+e.length}});i.append(c.substring(m));return{text:i.toString(),tabstops:d.sortBy(e,"start")}},processText:function(c,a){for(var a=d.extend({},b,a),e=h("utils").stringBuilder(),g=h("stringStream").create(c),f,i;f=g.next();)if(f=="\\"&&!g.eol())e.append(a.escape(g.next()));else{i=f;if(f=="$")if(g.start=g.pos-1,g.match(/^[0-9]+/))i=
a.tabstop({start:e.length,group:g.current().substr(1),token:g.current()});else if(f=g.match(/^\{([a-z_\-][\w\-]*)\}/))i=a.variable({start:e.length,name:f[1],token:g.current()});else if(f=g.match(/^\{([0-9]+)(:.+?)?\}/,!1)){g.skipToPair("{","}");i={start:e.length,group:f[1],token:g.current()};if(f=i.token.substring(i.group.length+2,i.token.length-1))i.placeholder=f.substr(1);i=a.tabstop(i)}e.append(i)}return e.toString()},upgrade:function(b,a){var e=0,g={tabstop:function(b){var c=parseInt(b.group);
c>e&&(e=c);return b.placeholder?"${"+(c+a)+":"+b.placeholder+"}":"${"+(c+a)+"}"}};d.each(["start","end","content"],function(a){b[a]=this.processText(b[a],g)},this);return e},variablesResolver:function(b){var a={},e=h("resources");return function(g,j){if(j=="child")return g;if(j=="cursor")return h("utils").getCaretPlaceholder();var i=b.attribute(j);if(!d.isUndefined(i))return i;if(i=e.getVariable(j))return i;a[j]||(a[j]=f++);return"${"+a[j]+":"+j+"}"}},resetPlaceholderCounter:function(){console.log("deprecated");
f=100},resetTabstopIndex:function(){i=0;f=100}}});
emmet.define("preferences",function(h,d){var f={},i={},b=null,c=null;return{define:function(a,b,c){var h=a;d.isString(a)&&(h={},h[a]={value:b,description:c});d.each(h,function(a,b){i[b]=d.isObject(a)&&"value"in a&&d.keys(a).length<3?a:{value:a}})},set:function(a,b){var c=a;d.isString(a)&&(c={},c[a]=b);d.each(c,function(a,b){if(!(b in i))throw'Property "'+b+'" is not defined. You should define it first with `define` method of current module';if(a!==i[b].value){switch(typeof i[b].value){case "boolean":var c=
a;d.isString(c)?(c=c.toLowerCase(),a=c=="yes"||c=="true"||c=="1"):a=!!c;break;case "number":a=parseInt(a+"",10)||0;break;default:a+=""}f[b]=a}else b in f&&delete f[b]})},get:function(a){if(a in f)return f[a];if(a in i)return i[a].value},getArray:function(a){a=this.get(a);d.isUndefined(a)||(a=d.map(a.split(","),h("utils").trim),a.length||(a=null));return a},getDict:function(a){var b={};d.each(this.getArray(a),function(a){a=a.split(":");b[a[0]]=a[1]});return b},description:function(a){return a in i?
i[a].description:void 0},remove:function(a){d.isArray(a)||(a=[a]);d.each(a,function(a){a in f&&delete f[a];a in i&&delete i[a]})},list:function(){return d.map(d.keys(i).sort(),function(a){return{name:a,value:this.get(a),type:typeof i[a].value,description:i[a].description}},this)},load:function(a){d.each(a,function(a,b){this.set(b,a)},this)},exportModified:function(){return d.clone(f)},reset:function(){f={}},_startTest:function(){b=i;c=f;i={};f={}},_stopTest:function(){i=b;f=c}}});
emmet.define("filters",function(h,d){function f(b){return!b?[]:d.isString(b)?b.split(/[\|,]/g):b}var i={};return{add:function(b,c){i[b]=c},apply:function(b,c,a){var e=h("utils"),a=h("profile").get(a);d.each(f(c),function(c){(c=e.trim(c.toLowerCase()))&&c in i&&(b=i[c](b,a))});return b},composeList:function(b,c,a){c=h("profile").get(c);b=f(c.filters||h("resources").findItem(b,"filters")||"html");c.extraFilters&&(b=b.concat(f(c.extraFilters)));a&&(b=b.concat(f(a)));if(!b||!b.length)b=f("html");return b},
extractFromAbbreviation:function(b){var c="",b=b.replace(/\|([\w\|\-]+)$/,function(a,b){c=b;return""});return[b,f(c)]}}});
emmet.define("elements",function(h,d){function f(a){return{data:a}}var i={},b=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,c={add:function(a,b){var c=this;i[a]=function(){var d=b.apply(c,arguments);if(d)d.type=a;return d}},get:function(a){return i[a]},create:function(a){var b=[].slice.call(arguments,1),c=this.get(a);return c?c.apply(this,b):null},is:function(a,b){return a&&a.type===b}};c.add("element",function(a,c,g){var h={name:a,is_empty:!!g};if(c)if(h.attributes=[],d.isArray(c))h.attributes=c;else if(d.isString(c))for(;a=
b.exec(c);)h.attributes.push({name:a[1],value:a[3]});else d.each(c,function(a,b){h.attributes.push({name:b,value:a})});return h});c.add("snippet",f);c.add("reference",f);c.add("empty",function(){return{}});return c});
emmet.define("editTree",function(h,d,f){function i(a,b){this.options=d.extend({offset:0},b);this.source=a;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments)}function b(a,b,c){this.parent=a;this._name=b.value;this._value=c?c.value:"";this._positions={name:b.start,value:c?c.start:-1};this.initialize.apply(this,arguments)}var c=h("range").create;i.extend=f.extend;i.prototype={initialize:function(){},_updateSource:function(a,b,g){var f=c(b,d.isUndefined(g)?0:g-b),i=a.length-
f.length(),m=function(a){d.each(a,function(b,c){b>=f.end&&(a[c]+=i)})};m(this._positions);d.each(this.list(),function(a){m(a._positions)});this.source=h("utils").replaceSubstring(this.source,a,f)},add:function(a,c){var d=new b(a,c);this._children.push(d);return d},get:function(a){return d.isNumber(a)?this.list()[a]:d.isString(a)?d.find(this.list(),function(b){return b.name()===a}):a},getAll:function(a){d.isArray(a)||(a=[a]);var b=[],c=[];d.each(a,function(a){d.isString(a)?b.push(a):d.isNumber(a)&&
c.push(a)});return d.filter(this.list(),function(a,h){return d.include(c,h)||d.include(b,a.name())})},value:function(a,b,c){var h=this.get(a);if(h)return h.value(b);if(!d.isUndefined(b))return this.add(a,b,c)},values:function(a){return d.map(this.getAll(a),function(a){return a.value()})},remove:function(a){if(a=this.get(a))this._updateSource("",a.fullRange()),this._children=d.without(this._children,a)},list:function(){return this._children},indexOf:function(a){return d.indexOf(this.list(),this.get(a))},
name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this._updateSource(a,this._positions.name,this._positions.name+this._name.length),this._name=a;return this._name},nameRange:function(a){return c(this._positions.name+(a?this.options.offset:0),this.name())},range:function(a){return c(a?this.options.offset:0,this.toString())},itemFromPosition:function(a,b){return d.find(this.list(),function(c){return c.range(b).inside(a)})},toString:function(){return this.source}};b.extend=f.extend;b.prototype=
{initialize:function(){},_pos:function(a,b){return a+(b?this.parent.options.offset:0)},value:function(a){if(!d.isUndefined(a)&&this._value!==(a=String(a)))this.parent._updateSource(a,this.valueRange()),this._value=a;return this._value},name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this.parent._updateSource(a,this.nameRange()),this._name=a;return this._name},namePosition:function(a){return this._pos(this._positions.name,a)},valuePosition:function(a){return this._pos(this._positions.value,
a)},range:function(a){return c(this.namePosition(a),this.toString())},fullRange:function(a){return this.range(a)},nameRange:function(a){return c(this.namePosition(a),this.name())},valueRange:function(a){return c(this.valuePosition(a),this.value())},toString:function(){return this.name()+this.value()},valueOf:function(){return this.toString()}};return{EditContainer:i,EditElement:b,createToken:function(a,b,c){a={start:a||0,value:b||"",type:c};a.end=a.start+a.value.length;return a}}});
emmet.define("cssEditTree",function(h,d){function f(a,b){return h("range").create(a,b)}function i(a,b){var b=b||e|g,c=["white","line"];if((b&g)==g)for(;a.length&&d.include(c,d.last(a).type);)a.pop();if((b&e)==e)for(;a.length&&d.include(c,a[0].type);)a.shift();return a}function b(a){var b=["white","line",":"],c=[],h,j;a.nextUntil(function(){return!d.include(b,this.itemNext().type)});for(j=a.current().end;h=a.next();){if(h.type=="}"||h.type==";")return i(c,e|(h.type=="}"?g:0)),c.length?(j=c[0].start,
a=d.last(c).end):a=j,f(j,a-j);c.push(h)}if(c.length)return f(c[0].start,d.last(c).end-c[0].start)}function c(a){var b=h("stringStream").create(a),c=[],e=/[\s\u00a0,]/,g=function(){b.next();c.push(f(b.start,b.current()));b.start=b.pos};b.eatSpace();for(b.start=b.pos;a=b.next();)if(a=='"'||a=="'"){b.next();if(!b.skipTo(a))break;g()}else if(a=="("){b.backUp(1);if(!b.skipToPair("(",")"))break;b.backUp(1);g()}else if(e.test(a))c.push(f(b.start,b.current().length-1)),b.eatWhile(e),b.start=b.pos;g();return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,
function(a){return a.toString()}).value()}var a={styleBefore:"\n\t",styleSeparator:": ",offset:0},e=1,g=2,j=h("editTree").EditContainer.extend({initialize:function(c){d.defaults(this.options,a);var e=h("editTree"),g=h("tokenIterator").create(h("cssParser").parse(c)),j,s=[],r;for(j=g.position();r=g.next();){if(r.type=="{")break;s.push(r)}i(s);s.length?(j=s[0].start,s=d.last(s).end):s=j;j=f(j,s-j);this._positions.name=j.start;this._name=j.substring(c);if(!g.current()||g.current().type!="{")throw"Invalid CSS rule";
for(this._positions.contentStart=g.position()+1;j=g.next();){if(s=j.type=="identifier")a:{s=g.tokens;r=g._i+1;for(var u=s.length;r<u;r++){if(s[r].type==":"){s=!0;break a}if(s[r].type=="identifier"||s[r].type=="line"){s=!1;break a}}s=!1}s&&(j=f(j),s=b(g),r=g.current()&&g.current().type==";"?f(g.current()):f(s.end,0),this._children.push(new l(this,e.createToken(j.start,j.substring(c)),e.createToken(s.start,s.substring(c)),e.createToken(r.start,r.substring(c)))))}this._saveStyle()},_saveStyle:function(){var a=
this._positions.contentStart,b=this.source,c=h("utils");d.each(this.list(),function(e){e.styleBefore=b.substring(a,e.namePosition());var g=c.splitByLines(e.styleBefore);if(g.length>1)e.styleBefore="\n"+d.last(g);e.styleSeparator=b.substring(e.nameRange().end,e.valuePosition());e.styleBefore=d.last(e.styleBefore.split("*/"));e.styleSeparator=e.styleSeparator.replace(/\/\*.*?\*\//g,"");a=e.range().end})},add:function(a,b,c){var e=this.list(),g=this._positions.contentStart,f=d.pick(this.options,"styleBefore",
"styleSeparator"),j=h("editTree");if(d.isUndefined(c))c=e.length;var i=e[c];if(i)g=i.fullRange().start;else if(i=e[c-1])i.end(";"),g=i.range().end;i&&(f=d.pick(i,"styleBefore","styleSeparator"));a=j.createToken(g+f.styleBefore.length,a);b=j.createToken(a.end+f.styleSeparator.length,b);j=new l(this,a,b,j.createToken(b.end,";"));d.extend(j,f);this._updateSource(j.styleBefore+j.toString(),g);this._children.splice(c,0,j);return j}}),l=h("editTree").EditElement.extend({initialize:function(a,b,c,d){this.styleBefore=
a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;this._end=d.value;this._positions.end=d.start},valueParts:function(a){var b=c(this.value());if(a){var e=this.valuePosition(!0);d.each(b,function(a){a.shift(e)})}return b},end:function(a){if(!d.isUndefined(a)&&this._end!==a)this.parent._updateSource(a,this._positions.end,this._positions.end+this._end.length),this._end=a;return this._end},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.value()+this.end()}});return{parse:function(a,b){return new j(a,b)},parseFromPosition:function(a,b,c){c=this.extractRule(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractRule:function(a,b,c){for(var d="",e=a.length,g=-1,f;b>=0;){f=a.charAt(b);if(f=="{"){g=b;break}else if(f=="}"&&!c){b++;break}b--}for(;b<e;){f=a.charAt(b);if(f=="{")g=b;else if(f=="}"){g!=-1&&(d=a.substring(g,b+1));break}b++}if(d){b=g-1;for(c="";b>=0;){f=a.charAt(b);if("{}/\\<>\n\r".indexOf(f)!=
-1)break;b--}c=a.substring(b+1,g).replace(/^[\s\n\r]+/m,"");return h("range").create(g-c.length,d.length+c.length)}return null},baseName:function(a){return a.replace(/^\s*\-\w+\-/,"")},findParts:c}});
emmet.define("xmlEditTree",function(h,d){var f={styleBefore:" ",styleSeparator:"=",styleQuote:'"',offset:0},i=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m,b=h("editTree").EditContainer.extend({initialize:function(a){d.defaults(this.options,f);this._positions.name=1;var b=null,g=h("xmlParser").parse(a),j=h("range");d.each(g,function(d){d.value=j.create(d).substring(a);switch(d.type){case "tag":if(/^<[^\/]+/.test(d.value))this._name=d.value.substring(1);
break;case "attribute":b&&this._children.push(new c(this,b));b=d;break;case "string":this._children.push(new c(this,b,d)),b=null}},this);b&&this._children.push(new c(this,b));this._saveStyle()},_saveStyle:function(){var a=this.nameRange().end,b=this.source;d.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());if(c.valuePosition()!==-1)c.styleSeparator=b.substring(c.namePosition()+c.name().length,c.valuePosition()-c.styleQuote.length);a=c.range().end})},add:function(a,b,g){var f=
this.list(),i=this.nameRange().end,m=h("editTree"),n=d.pick(this.options,"styleBefore","styleSeparator","styleQuote");if(d.isUndefined(g))g=f.length;var o=f[g];if(o)i=o.fullRange().start;else if(o=f[g-1])i=o.range().end;o&&(n=d.pick(o,"styleBefore","styleSeparator","styleQuote"));b=n.styleQuote+b+n.styleQuote;a=new c(this,m.createToken(i+n.styleBefore.length,a),m.createToken(i+n.styleBefore.length+a.length+n.styleSeparator.length,b));d.extend(a,n);this._updateSource(a.styleBefore+a.toString(),i);
this._children.splice(g,0,a);return a}}),c=h("editTree").EditElement.extend({initialize:function(a,b,c){this.styleBefore=a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;b="";a=a.options.styleQuote;if(c)b=c.value,a=b.charAt(0),a=='"'||a=="'"?b=b.substring(1):a="",a&&b.charAt(b.length-1)==a&&(b=b.substring(0,b.length-1));this.styleQuote=a;this._value=b;this._positions.value=c?c.start+a.length:-1},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.styleQuote+this.value()+this.styleQuote}});return{parse:function(a,c){return new b(a,c)},parseFromPosition:function(a,b,c){c=this.extractTag(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractTag:function(a,b,c){var d=a.length,f,m=h("range"),n=Math.min(2E3,d),o=null,q=function(b){var c;if(a.charAt(b)=="<"&&(c=a.substr(b,n).match(i)))return m.create(b,c[0])};for(f=b;f>=0;f--)if(o=q(f))break;if(o&&(o.inside(b)||c))return o;if(!o&&c)return null;
for(f=b;f<d;f++)if(o=q(f))return o}}});
emmet.define("expandAbbreviation",function(h,d){var f=h("handlerList").create(),i=null,b=h("actions");b.add("expand_abbreviation",function(b,a,e){var g=d.toArray(arguments),j=h("editorUtils").outputInfo(b,a,e);g[1]=j.syntax;g[2]=j.profile;return f.exec(!1,g)});b.add("expand_abbreviation_with_tab",function(c,a,d){var g=c.getSelection(),f=h("resources").getVariable("indentation");if(g)return d=h("utils"),a=h("range").create(c.getSelectionRange()),g=d.padString(g,f),c.replaceContent(f+"${0}",c.getCaretPos()),
f=h("range").create(c.getCaretPos(),a.length()),c.replaceContent(g,f.start,f.end,!0),c.createSelection(f.start,f.start+g.length),!0;b.run("expand_abbreviation",c,a,d)||c.replaceContent(f,c.getCaretPos());return!0},{hidden:!0});f.add(function(b,a,d){var g=b.getSelectionRange().end,f=i.findAbbreviation(b);return f&&(a=emmet.expandAbbreviation(f,a,d,h("actionUtils").captureContext(b)))?(b.replaceContent(a,g-f.length,g),!0):!1},{order:-1});return i={addHandler:function(b,a){f.add(b,a)},removeHandler:function(b){f.remove(b,
options)},findAbbreviation:function(b){var a=h("range").create(b.getSelectionRange()),d=String(b.getContent());if(a.length())return a.substring(d);b=b.getCurrentLineRange();return h("actionUtils").extractAbbreviation(d.substring(b.start,a.start))}}});
emmet.define("wrapWithAbbreviation",function(h){var d=null;h("actions").add("wrap_with_abbreviation",function(f,i,b,c){var b=h("editorUtils").outputInfo(f,b,c),a=h("utils"),c=h("editorUtils"),i=i||f.prompt("Enter abbreviation");if(!i)return null;var i=String(i),e=h("range").create(f.getSelectionRange());if(!e.length()){e=h("htmlMatcher").tag(b.content,e.start);if(!e)return!1;e=a.narrowToNonSpace(b.content,e.range)}a=a.escapeText(e.substring(b.content));return(i=d.wrap(i,c.unindent(f,a),b.syntax,b.profile,
h("actionUtils").captureContext(f)))?(f.replaceContent(i,e.start,e.end),!0):!1});return d={wrap:function(d,i,b,c,a){var e=h("filters"),g=h("utils"),b=b||emmet.defaultSyntax(),c=h("profile").get(c,b);h("tabStops").resetTabstopIndex();d=e.extractFromAbbreviation(d);return(i=h("abbreviationParser").parse(d[0],{syntax:b,pastedContent:i,contextNode:a}))?(b=e.composeList(b,c,d[1]),e.apply(i,b,c),g.replaceVariables(i.toString())):null}}});
emmet.exec(function(h,d){function f(b,a){var e=a-(b.options.offset||0),g=/^[\s\n\r]/;return d.find(b.list(),function(a){return a.range().end===e?g.test(b.source.charAt(e)):a.range().inside(e)})}function i(b,a,d,g){for(var f=-1,i=-1;a--;)if(b.substr(a,d.length)==d){f=a;break}if(f!=-1){a=f;for(d=b.length;d>=a++;)if(b.substr(a,g.length)==g){i=a+g.length;break}}return f!=-1&&i!=-1?h("range").create(f,i-f):null}function b(b,a,d,g){function f(b){return b.replace(RegExp("^"+q.escapeForRegexp(a)+"\\s*"),
function(a){n-=a.length;return""}).replace(RegExp("\\s*"+q.escapeForRegexp(d)+"$"),"")}var l=h("editorUtils"),m=l.outputInfo(b).content,n=b.getCaretPos(),o=null,q=h("utils");(o=i(m,n,a,d))&&o.overlap(g)?(g=o,o=f(g.substring(m))):(o=a+" "+g.substring(m).replace(RegExp(q.escapeForRegexp(a)+"\\s*|\\s*"+q.escapeForRegexp(d),"g"),"")+" "+d,n+=a.length+1);return o!==null?(o=q.escapeText(o),b.setCaretPos(g.start),b.replaceContent(l.unindent(b,o),g.start,g.end),b.setCaretPos(n),!0):!1}h("actions").add("toggle_comment",
function(c){var a=h("editorUtils").outputInfo(c);if(a.syntax=="css"){var d=c.getCaretPos(),g=h("htmlMatcher").tag(a.content,d);if(g&&g.open.range.inside(d))a.syntax="html"}if(a.syntax=="css"){g=h("range").create(c.getSelectionRange());a=h("editorUtils").outputInfo(c);if(!g.length()&&(d=h("cssEditTree").parseFromPosition(a.content,c.getCaretPos())))g=(g=f(d,c.getCaretPos()))?g.range(!0):h("range").create(d.nameRange(!0).start,d.source);g.length()||(g=h("range").create(c.getCurrentLineRange()),h("utils").narrowToNonSpace(a.content,
g));c=b(c,"/*","*/",g)}else{a=h("range").create(c.getSelectionRange());d=h("editorUtils").outputInfo(c);if(!a.length()&&(d=h("htmlMatcher").tag(d.content,c.getCaretPos())))a=d.outerRange;c=b(c,"<\!--","--\>",a)}return c})});
emmet.exec(function(h){function d(d,h,b){function c(b){for(var c=b;c>=0;){var d=a.charAt(c);if(d=="\n"||d=="\r")break;c--}return a.substring(c,b)}for(var h=h||1,b=d.getCaretPos()+(b||0),a=String(d.getContent()),d=a.length,e=-1,g=/^\s+$/;b<=d&&b>=0;){b+=h;var j=a.charAt(b),l=a.charAt(b+1),m=a.charAt(b-1);switch(j){case '"':case "'":l==j&&m=="="&&(e=b+1);break;case ">":l=="<"&&(e=b+1);break;case "\n":case "\r":g.test(c(b-1))&&(e=b)}if(e!=-1)break}return e}h=h("actions");h.add("prev_edit_point",function(f){var h=
f.getCaretPos(),b=d(f,-1);b==h&&(b=d(f,-1,-2));return b!=-1?(f.setCaretPos(b),!0):!1},{label:"Previous Edit Point"});h.add("next_edit_point",function(f){var h=d(f,1);return h!=-1?(f.setCaretPos(h),!0):!1})});
emmet.exec(function(h,d){function f(a,b,c,d){var e=h("range"),g=h("editorUtils").outputInfo(a).content,f=g.length,j,i=e.create(-1,0),l=e.create(a.getSelectionRange());j=l.start;for(var o=1E5;j>=0&&j<f&&--o>0;){if(e=c(g,j,b)){if(i.equal(e))break;i=e.clone();if(j=d(e.substring(g),e.start,l.clone()))return a.createSelection(j.start,j.end),!0;else j=b?e.start:e.end-1}j+=b?-1:1}return!1}function i(a){var b=!0;return f(a,!1,function(a,c){if(b){b=!1;var d;a:{d=c;for(var e;d>=0;){if(e=g(a,d)){d=e;break a}d--}d=
null}return d}else return g(a,c)},function(a,b,c){return e(a,b,c,!1)})}function b(a){return f(a,!0,g,function(a,b,c){return e(a,b,c,!0)})}function c(b,c,e){var e=e||0,g=h("range"),f=[],i=-1,l="",z="",x,o;d.each(c,function(c){switch(c.type){case "tag":o=b.substring(c.start,c.end);/^<[\w\:\-]/.test(o)&&f.push(g.create({start:c.start+1,end:c.end}));break;case "attribute":i=c.start;l=b.substring(c.start,c.end);break;case "string":f.push(g.create(i,c.end-i)),x=g.create(c),z=x.substring(b),j(z.charAt(0))&&
x.start++,j(z.charAt(z.length-1))&&x.end--,f.push(x),l=="class"&&(f=f.concat(a(x.substring(b),x.start)))}});d.each(f,function(a){a.shift(e)});return d.chain(f).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}function a(a,b){var b=b||0,c=[],d=h("stringStream").create(a),e=h("range");d.eatSpace();d.start=d.pos;for(var g;g=d.next();)if(/[\s\u00a0]/.test(g))c.push(e.create(d.start+b,d.pos-d.start-1)),d.eatSpace(),d.start=d.pos;c.push(e.create(d.start+b,d.pos-
d.start));return c}function e(a,b,e,g){a=c(a,h("xmlParser").parse(a),b);g&&a.reverse();return(b=d.find(a,function(a){return a.equal(e)}))?(g=d.indexOf(a,b),g<a.length-1?a[g+1]:null):g?d.find(a,function(a){return a.start<e.start}):!b&&(g=d.filter(a,function(a){return a.inside(e.end)}),g.length>1)?g[1]:d.find(a,function(a){return a.end>e.end})}function g(a,b){var c;if(a.charAt(b)=="<"&&(c=a.substring(b,a.length).match(q)))return h("range").create(b,c[0])}function j(a){return a=='"'||a=="'"}function l(a){var b=
a.valueRange(!0),c=[a.range(!0),b],e=h("stringStream"),g=h("cssEditTree"),f=h("range"),j=a.value();d.each(a.valueParts(),function(a){var h=a.clone();c.push(h.shift(b.start));var i=e.create(a.substring(j));if(i.match(/^[\w\-]+\(/,!0)){i.start=i.pos;i.skipToPair("(",")");var l=i.current();c.push(f.create(h.start+i.start,l));d.each(g.findParts(l),function(a){c.push(f.create(h.start+i.start+a.start,a.substring(l)))})}});return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}
function m(a,b,c){var e=null,g=null,f=a.list(),h,j;c?(f.reverse(),h=function(a){return a.range(!0).start<=b.start},j=function(a){return a.start<b.start}):(h=function(a){return a.range(!0).end>=b.end},j=function(a){return a.end>b.start});for(;e=d.find(f,h);){a=l(e);c&&a.reverse();if(g=d.find(a,function(a){return a.equal(b)})){if(g=d.indexOf(a,g),g!=a.length-1){g=a[g+1];break}}else{g=d.filter(a,function(a){return a.inside(b.end)});if(g.length>1){g=g[1];break}if(g=d.find(a,j))break}g=null;b.start=b.end=
c?e.range(!0).start-1:e.range(!0).end+1}return g}function n(a,b,c){a=h("cssEditTree").parse(a,{offset:b});b=a.nameRange(!0);return c.end<b.end?b:m(a,c,!1)}function o(a,b,c){b=h("cssEditTree").parse(a,{offset:b});a=m(b,c,!0);return!a&&(b=b.nameRange(!0),c.start>b.start)?b:a}var q=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,s=h("actions");s.add("select_next_item",function(a){return a.getSyntax()=="css"?f(a,!1,h("cssEditTree").extractRule,n):i(a)});s.add("select_previous_item",
function(a){return a.getSyntax()=="css"?f(a,!0,h("cssEditTree").extractRule,o):b(a)})});
emmet.exec(function(h){function d(c,a){var a=String((a||"out").toLowerCase()),d=h("editorUtils").outputInfo(c),g=h("range").create(c.getSelectionRange()),d=d.content;b&&!b.range.equal(g)&&(b=null);if(b&&g.length())if(a=="in")if(b.type=="tag"&&!b.close)return!1;else if(b.range.equal(b.outerRange))b.range=b.innerRange;else{var f=h("utils").narrowToNonSpace(d,b.innerRange);if((b=i.find(d,f.start+1))&&b.range.equal(g)&&b.outerRange.equal(g))b.range=b.innerRange}else if(!b.innerRange.equal(b.outerRange)&&
b.range.equal(b.innerRange)&&g.equal(b.range))b.range=b.outerRange;else{if((b=i.find(d,g.start))&&b.range.equal(g)&&b.innerRange.equal(g))b.range=b.outerRange}else b=i.find(d,g.start);if(b&&!b.range.equal(g))return c.createSelection(b.range.start,b.range.end),!0;b=null;return!1}var f=h("actions"),i=h("htmlMatcher"),b=null;f.add("match_pair",d,{hidden:!0});f.add("match_pair_inward",function(b){return d(b,"in")},{label:"HTML/Match Pair Tag (inward)"});f.add("match_pair_outward",function(b){return d(b,
"out")},{label:"HTML/Match Pair Tag (outward)"});f.add("matching_pair",function(b){var a=String(b.getContent()),d=b.getCaretPos();a.charAt(d)=="<"&&d++;return(a=i.tag(a,d))&&a.close?(a.open.range.inside(d)?b.setCaretPos(a.close.range.start):b.setCaretPos(a.open.range.start),!0):!1},{label:"HTML/Go To Matching Tag Pair"})});
emmet.exec(function(h){h("actions").add("remove_tag",function(d){var f=h("utils"),i=h("editorUtils").outputInfo(d),b=h("htmlMatcher").tag(i.content,d.getCaretPos());if(b){if(b.close){var c=f.narrowToNonSpace(i.content,b.innerRange),a=f.findNewlineBounds(i.content,c.start),a=f.getLinePadding(a.substring(i.content)),i=c.substring(i.content),i=f.unindentString(i,a);d.replaceContent(f.getCaretPlaceholder()+f.escapeText(i),b.outerRange.start,b.outerRange.end)}else d.replaceContent(f.getCaretPlaceholder(),
b.range.start,b.range.end);return!0}return!1},{label:"HTML/Remove Tag"})});
emmet.exec(function(h){h("actions").add("split_join_tag",function(d,f){var i=h("htmlMatcher"),b=h("editorUtils").outputInfo(d,null,f),c=h("profile").get(b.profile);if(i=i.tag(b.content,d.getCaretPos())){if(i.close){var b=h("utils"),c=c.selfClosing()||" /",c=i.open.range.substring(i.source).replace(/\s*>$/,c+">"),a=d.getCaretPos();c.length+i.outerRange.start<a&&(a=c.length+i.outerRange.start);c=b.escapeText(c);d.replaceContent(c,i.outerRange.start,i.outerRange.end)}else{var b=h("utils"),e=b.getNewline(),
g=h("resources").getVariable("indentation"),a=d.getCaretPos(),c=c.tag_nl===!0?e+g+e:"",e=i.outerContent().replace(/\s*\/>$/,">"),a=i.outerRange.start+e.length;e+=c+"</"+i.open.name+">";e=b.escapeText(e);d.replaceContent(e,i.outerRange.start,i.outerRange.end)}d.setCaretPos(a);i=!0}else i=!1;return i},{label:"HTML/Split\\Join Tag Declaration"})});
emmet.define("reflectCSSValue",function(h,d){function f(c){var a=h("cssEditTree"),d=h("editorUtils").outputInfo(c),c=c.getCaretPos();if(a=a.parseFromPosition(d.content,c))if(d=a.itemFromPosition(c,!0)){var g=a.source,f=a.options.offset,c=c-f-d.range().start;b.exec(!1,[d]);if(g!==a.source)return{data:a.source,start:f,end:f+g.length,caret:f+d.range().start+c}}}function i(b){var b=h("cssEditTree").baseName(b),a;if(b=="opacity"||b=="filter")return/^(?:\-\w+\-)?(?:opacity|filter)$/;else if(a=b.match(/^border-radius-(top|bottom)(left|right)/))return RegExp("^(?:\\-\\w+\\-)?(?:"+
b+"|border-"+a[1]+"-"+a[2]+"-radius)$");else if(a=b.match(/^border-(top|bottom)-(left|right)-radius/))return RegExp("^(?:\\-\\w+\\-)?(?:"+b+"|border-radius-"+a[1]+a[2]+")$");return RegExp("^(?:\\-\\w+\\-)?"+b+"$")}var b=h("handlerList").create();h("actions").add("reflect_css_value",function(b){return b.getSyntax()!="css"?!1:h("actionUtils").compoundUpdate(b,f(b))},{label:"CSS/Reflect Value"});b.add(function(b){var a=i(b.name());d.each(b.parent.list(),function(d){if(a.test(d.name())){var g;var f=b.name(),
i=b.value(),m=d.name();g=d.value();var n=h("cssEditTree"),o=h("utils"),f=n.baseName(f),m=n.baseName(m);g=f=="opacity"&&m=="filter"?g.replace(/opacity=[^)]*/i,"opacity="+Math.floor(parseFloat(i)*100)):f=="filter"&&m=="opacity"?(f=i.match(/opacity=([^)]*)/i))?o.prettifyNumber(parseInt(f[1])/100):g:i;d.value(g)}})},{order:-1});return{addHandler:function(c,a){b.add(c,a)},removeHandler:function(c){b.remove(c,options)}}});
emmet.exec(function(h){h("actions").add("evaluate_math_expression",function(d){var f=h("actionUtils"),i=h("utils"),b=String(d.getContent()),c=h("range").create(d.getSelectionRange());c.length()||(c=f.findExpressionBounds(d,function(a){return i.isNumeric(a)||".+-*/\\".indexOf(a)!=-1}));if(c&&c.length()){f=c.substring(b);f=f.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var a=i.prettifyNumber((new Function("return "+f))());d.replaceContent(a,c.start,c.end);d.setCaretPos(c.start+a.length);
return!0}catch(e){}}return!1},{label:"Numbers/Evaluate Math Expression"})});
emmet.exec(function(h,d){function f(b,a){var e=h("utils"),g=!1,f=!1,l=h("actionUtils").findExpressionBounds(b,function(a,b,c){return e.isNumeric(a)?!0:a=="."?!e.isNumeric(c.charAt(b+1))?!1:f?!1:f=!0:a=="-"?g?!1:g=!0:!1});if(l&&l.length()){var m=l.substring(String(b.getContent())),n=parseFloat(m);if(!d.isNaN(n)){n=e.prettifyNumber(n+a);if(/^(\-?)0+[1-9]/.test(m)){var o="";RegExp.$1&&(o="-",n=n.substring(1));n=n.split(".");n[0]=e.zeroPadString(n[0],i(m));n=o+n.join(".")}b.replaceContent(n,l.start,l.end);
b.createSelection(l.start,l.start+n.length);return!0}}return!1}function i(b){b=b.replace(/^\-/,"");return~b.indexOf(".")?b.split(".")[0].length:b.length}var b=h("actions");d.each([1,-1,10,-10,0.1,-0.1],function(c){var a=c>0?"increment":"decrement";b.add(a+"_number_by_"+String(Math.abs(c)).replace(".","").substring(0,2),function(a){return f(a,c)},{label:"Numbers/"+a.charAt(0).toUpperCase()+a.substring(1)+" number by "+Math.abs(c)})})});
emmet.exec(function(h,d){var f=h("actions"),i=h("preferences");i.define("css.closeBraceIndentation","\n","Indentation before closing brace of CSS rule. Some users prefere indented closing brace of CSS rule for better readability. This preference\u2019s value will be automatically inserted before closing brace when user adds newline in newly created CSS rule (e.g. when \u201cInsert formatted linebreak\u201d action will be performed in CSS file). If you\u2019re such user, you may want to write put a value like <code>\\n\\t</code> in this preference.");
f.add("insert_formatted_line_break_only",function(b){var c=h("utils"),a=h("resources"),e=h("editorUtils").outputInfo(b),g=b.getCaretPos(),f=c.getNewline();if(d.include(["html","xml","xsl"],e.syntax)){if(a=a.getVariable("indentation"),(e=h("htmlMatcher").tag(e.content,g))&&!e.innerRange.length())return b.replaceContent(f+a+c.getCaretPlaceholder()+f,g),!0}else if(e.syntax=="css"&&(e=e.content,g&&e.charAt(g-1)=="{")){var l=i.get("css.closeBraceIndentation"),a=a.getVariable("indentation"),m=e.charAt(g)==
"}";if(!m)for(var n=g,o=e.length,q;n<o;n++){q=e.charAt(n);if(q=="{")break;if(q=="}"){l="";m=!0;break}}m||(l+="}");c=f+a+c.getCaretPlaceholder()+l;b.replaceContent(c,g);return!0}return!1},{hidden:!0});f.add("insert_formatted_line_break",function(b){if(!f.run("insert_formatted_line_break_only",b)){for(var c=h("utils"),a=h("editorUtils").getCurrentLinePadding(b),d=String(b.getContent()),g=b.getCaretPos(),i=d.length,c=c.getNewline(),l="",m=b.getCurrentLineRange().end+1,n;m<i;m++)if(n=d.charAt(m),n==" "||
n=="\t")l+=n;else break;l.length>a.length?b.replaceContent(c+l,g,g,!0):b.replaceContent(c,g)}return!0},{hidden:!0})});
emmet.exec(function(h){h("actions").add("merge_lines",function(d){var f=h("htmlMatcher"),i=h("utils"),b=h("editorUtils").outputInfo(d),c=h("range").create(d.getSelectionRange());if(!c.length()&&(f=f.find(b.content,d.getCaretPos())))c=f.outerRange;if(c.length()){b=c.substring(b.content);b=i.splitByLines(b);for(f=1;f<b.length;f++)b[f]=b[f].replace(/^\s+/,"");b=b.join("").replace(/\s{2,}/," ");f=b.length;b=i.escapeText(b);d.replaceContent(b,c.start,c.end);d.createSelection(c.start,c.start+f);return!0}return!1})});
emmet.exec(function(h){function d(d,h,b){b=b||0;return h.charAt(b)==d.charAt(0)&&h.substr(b,d.length)==d}h("actions").add("encode_decode_data_url",function(f){var i=String(f.getSelection()),b=f.getCaretPos();if(!i)for(var c=String(f.getContent());b-- >=0;)if(d("src=",c,b)){if(c=c.substr(b).match(/^(src=(["'])?)([^'"<>\s]+)\1?/))i=c[3],b+=c[1].length;break}else if(d("url(",c,b)){if(c=c.substr(b).match(/^(url\((['"])?)([^'"\)\s]+)\1?/))i=c[3],b+=c[1].length;break}if(i)if(d("data:",i))if(c=String(f.prompt("Enter path to file (absolute or relative)"))){var a=
h("file"),e=a.createPath(f.getFilePath(),c);if(!e)throw"Can't save file";a.save(e,h("base64").decode(i.replace(/^data\:.+?;.+?,/,"")));f.replaceContent("$0"+c,b,b+i.length);f=!0}else f=!1;else{c=h("file");a=h("actionUtils");e=f.getFilePath();if(e===null)throw"You should save your file before using this action";e=c.locateFile(e,i);if(e===null)throw"Can't find "+i+" file";var g=h("base64").encode(String(c.read(e)));if(!g)throw"Can't encode file content to base64";g="data:"+(a.mimeTypes[String(c.getExt(e))]||
"application/octet-stream")+";base64,"+g;f.replaceContent("$0"+g,b,b+i.length);f=!0}else f=!1;return f},{label:"Encode\\Decode data:URL image"})});
emmet.exec(function(h,d){function f(d,b){var c;if(b){if(/^data:/.test(b))c=h("base64").decode(b.replace(/^data\:.+?;.+?,/,""));else{c=h("file");var a=c.locateFile(d.getFilePath(),b);if(a===null)throw"Can't find "+b+" file";c=String(c.read(a))}return h("actionUtils").getImageSize(c)}}h("actions").add("update_image_size",function(i){var b;if(String(i.getSyntax())=="css")a:{b=i.getCaretPos();var c=h("editorUtils").outputInfo(i);if(c=h("cssEditTree").parseFromPosition(c.content,b,!0)){var a=c.itemFromPosition(b,
!0),e;if(a&&(e=/url\((["']?)(.+?)\1\)/i.exec(a.value()||"")))if(e=f(i,e[2])){a=c.range(!0);c.value("width",e.width+"px");c.value("height",e.height+"px",c.indexOf("width")+1);b=d.extend(a,{data:c.toString(),caret:b});break a}}b=null}else a:{b=i.getCaretPos();c=h("editorUtils").outputInfo(i);if((c=h("xmlEditTree").parseFromPosition(c.content,b,!0))&&(c.name()||"").toLowerCase()=="img")if(e=f(i,c.value("src"))){a=c.range(!0);c.value("width",e.width);c.value("height",e.height,c.indexOf("width")+1);b=
d.extend(a,{data:c.toString(),caret:b});break a}b=null}return h("actionUtils").compoundUpdate(i,b)})});
emmet.define("cssResolver",function(h,d){function f(a){var b=a&&a.charCodeAt(0);return a&&a=="."||b>47&&b<58}function i(a){a=h("utils").trim(a);if(~a.indexOf("/*")||/[\n\r]/.test(a))return!1;if(!/^[a-z0-9\-]+\s*\:/i.test(a))return!1;a=h("tabStops").processText(a,{replaceCarets:!0,tabstop:function(){return"value"}});return a.split(":").length==2}function b(a){a.charAt(0);if(a.charAt(0)=="#"){var b=a.replace(/^#+/,"")||"0",d=h("utils").repeatString,a=null;switch(b.length){case 1:a=d(b,6);break;case 2:a=
d(b,3);break;case 3:a=b.charAt(0)+b.charAt(0)+b.charAt(1)+b.charAt(1)+b.charAt(2)+b.charAt(2);break;case 4:a=b+b.substr(0,2);break;case 5:a=b+b.charAt(0);break;default:a=b.substr(0,6)}p.get("css.color.short")&&(b=a.split(""),b[0]==b[1]&&b[2]==b[3]&&b[4]==b[5]&&(a=b[0]+b[2]+b[4]));switch(p.get("css.color.case")){case "upper":a=a.toUpperCase();break;case "lower":a=a.toLowerCase()}a="#"+a}else a=c(a);return a}function c(a){var b=p.getDict("css.keywordAliases");return a in b?b[a]:a}function a(a){return d.include(p.getArray("css.keywords"),
c(a))}function e(a){var b=h("utils"),a=b.trim(a);if(a.indexOf(":")==-1)return{name:a,value:u};a=a.split(":");return{name:b.trim(a.shift()),value:b.trim(a.join(":")).replace(/^(\$\{0\}|\$0)(\s*;?)$/,"${1}$2")}}function g(a,b){var c=r[b];c||(c=d.find(r,function(a){return a.prefix==b}));return c&&c.supports(a)}function j(a,b){var c=[];d.each(r,function(b,d){g(a,d)&&c.push(d)});!c.length&&!b&&d.each(r,function(a,b){a.obsolete||c.push(b)});return c}function l(a,b){d.isString(b)&&(b={prefix:b});r[a]=d.extend({},
s,b)}function m(a,b){if(b){var c=p.get(b+"."+a);if(!d.isUndefined(c))return c}return p.get("css."+a)}function n(a,b,c){if(!d.isString(a))a=a.data;if(!i(a))return a;b&&(~a.indexOf(";")?a=a.split(";").join(" !important;"):a+=" !important");b=a.indexOf(":");a=a.substring(0,b).replace(/\s+$/,"")+m("valueSeparator",c)+h("utils").trim(a.substring(b+1));return a.replace(/\s*;\s*$/,m("propertyEnd",c))}function o(a){var b=p.getArray(a);d.each(p.getArray(a+"Addon"),function(a){a.charAt(0)=="-"?b=d.without(b,
a.substr(1)):(a.charAt(0)=="+"&&(a=a.substr(1)),b.push(a))});return b}var q=null,s={prefix:"emmet",obsolete:!1,transformName:function(a){return"-"+this.prefix+"-"+a},properties:function(){return o("css."+this.prefix+"Properties")||[]},supports:function(a){return d.include(this.properties(),a)}},r={},u="${1};",p=h("preferences");p.define("css.valueSeparator",": ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations.");p.define("css.propertyEnd",";",
"Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations.");p.define("stylus.valueSeparator"," ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations in Stylus dialect.");p.define("stylus.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in Stylus dialect.");p.define("sass.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in SASS dialect.");
p.define("css.autoInsertVendorPrefixes",!0,"Automatically generate vendor-prefixed copies of expanded CSS property. By default, Emmet will generate vendor-prefixed properties only when you put dash before abbreviation (e.g. <code>-bxsh</code>). With this option enabled, you don\u2019t need dashes before abbreviations: Emmet will produce vendor-prefixed properties for you.");var v=d.template("A comma-separated list of CSS properties that may have <code><%= vendor %></code> vendor prefix. This list is used to generate a list of prefixed properties when expanding <code>-property</code> abbreviations. Empty list means that all possible CSS values may have <code><%= vendor %></code> prefix."),
w=d.template("A comma-separated list of <em>additional</em> CSS properties for <code>css.<%= vendor %>Preperties</code> preference. You should use this list if you want to add or remove a few CSS properties to original set. To add a new property, simply write its name, to remove it, precede property with hyphen.<br>For example, to add <em>foo</em> property and remove <em>border-radius</em> one, the preference value will look like this: <code>foo, -border-radius</code>.");d.each({webkit:"animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow, box-sizing, border-radius",
moz:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow, background-clip, border-radius",
ms:"accelerator, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode",
o:"dashboard-region, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, border-image, link, link-source, object-fit, object-position, tab-size, table-baseline, transform, transform-origin, transition, transition-delay, transition-duration, transition-property, transition-timing-function, accesskey, input-format, input-required, marquee-dir, marquee-loop, marquee-speed, marquee-style"},
function(a,b){q.define("css."+b+"Properties",a,r({vendor:b}))});q.define("css.unitlessProperties","z-index, line-height, opacity, font-weight","The list of properties whose values \u200b\u200bmust not contain units.");d("w",{prefix:"webkit",supports:q.getArray("css.webkitProperties")});d("m",{prefix:"moz",supports:q.getArray("css.mozProperties")});d("s",{prefix:"ms",supports:q.getArray("css.msProperties")});d("o",{prefix:"o",supports:q.getArray("css.oProperties")});var t=q.getArray("css.unitlessProperties"),
x=["css","less","sass","scss"];h("resources").addResolver(function(a,b){return e.include(x,b)&&a.isElement()?j.expandToSnippet(a.abbreviation):null});var u=h("expandAbbreviation");u.addHandler(function(a,b,c){if(!e.include(x,b))return!1;var d=a.getSelectionRange().end,f=u.findAbbreviation(a);return f&&(b=emmet.expandAbbreviation(f,b,c))?(f=d-f.length,c=d,a.getContent().charAt(d)==";"&&c++,a.replaceContent(b,f,c),!0):!1});return j={addPrefix:d,supportsPrefix:b,prefixed:function(a,c){return b(a,c)?
"-"+c+"-"+a:a},listPrefixes:function(){return e.map(n,function(a){return a.prefix})},getPrefix:function(a){return n[a]},removePrefix:function(a){a in n&&delete n[a]},addUnitAlias:function(a,b){m[a]=b},getUnitAlias:function(a){return m[a]},removeUnitAlias:function(a){a in m&&delete m[a]},extractPrefixes:function(a){if(a.charAt(0)!="-")return{property:a,prefixes:null};for(var b=1,c=a.length,d,e=[];b<c;){d=a.charAt(b);if(d=="-"){b++;break}if(d in n)e.push(d);else{e.length=0;b=1;break}b++}if(b==c-1)b=
1,e.length=1;return{property:a.substring(b),prefixes:e.length?e:"all"}},findValuesInAbbreviation:function(a){for(var b=0,c=a.length,d;b<c;){d=a.charAt(b);if(g(d)||d=="-"&&g(a.charAt(b+1)))return a.substring(b);b++}return""},parseValues:function(a){for(var b="",c=[],d=0,e=a.length,f,h;d<e;)if(f=a.charAt(d),f=="-"&&b)c.push(b),b="",d++;else if(b+=f,d++,h=a.charAt(d),f!="-"&&!g(f)&&(g(h)||h=="-"))c.push(b),b="";b&&c.push(b);return c},extractValues:function(a){var b=this.findValuesInAbbreviation(a);return!b?
{property:a,values:null}:{property:a.substring(0,a.length-b.length),values:this.parseValues(b)}},normalizeValue:function(a,b){b=(b||"").toLowerCase();return a.replace(/^(\-?[0-9\.]+)([a-z]*)$/,function(a,c,d){return!d&&(c=="0"||e.include(t,b))?c:!d?c+(~c.indexOf(".")?"em":"px"):c+(d in m?m[d]:d)})},expand:function(b,d){var g=h("resources"),j=q.get("css.autoInsertVendorPrefixes"),l;if(l=/^(.+)\!$/.test(b))b=RegExp.$1;var m=g.getSnippet("css",b);if(m&&!j)return i(m,l);var m=this.extractPrefixes(b),
r=this.extractValues(m.property),r=e.extend(m,r);if(m=g.getSnippet("css",r.property)){if(!e.isString(m))m=m.data}else m=r.property+":"+o;if(!f(m))return m;var t=c(m),u=[];!d&&r.values&&(d=e.map(r.values,function(a){return this.normalizeValue(a,t.name)},this).join(" ")+";");t.value=d||t.value;g=r.prefixes=="all"||j?a(t.name,j&&r.prefixes!="all"):r.prefixes;e.each(g,function(a){a in n&&u.push(i(n[a].transformName(t.name)+":"+t.value,l))});u.push(i(t.name+":"+t.value,l));return u},expandToSnippet:function(a,
b){var c=this.expand(a,b);return e.isArray(c)?c.join("\n"):!e.isString(c)?c.data:String(c)}}});
emmet.define("cssGradient",function(h,e){function g(a){return h("utils").trim(a).replace(/\s+/g," ")}function f(a){var a=g(a),b=null,a=a.replace(/^(\w+\(.+?\))\s*/,function(a,c){b=c;return""});b||(a=a.split(" "),b=a[0],a=a[1]||"");var c={color:b};a&&a.replace(/^(\-?[\d\.]+)([a-z%]+)?$/,function(a,b,d){c.position=b;~b.indexOf(".")?d="":d||(d="%");if(d)c.unit=d});return c}function c(a){var b=0;e.each(a,function(c,d){if(!d)return c.position=c.position||0;if(d==a.length-1&&!("position"in c))c.position=
1;if("position"in c){var f=a[b].position||0,g=(c.position-f)/(d-b);e.each(a.slice(b,d),function(a,b){a.position=f+g*b});b=d}})}function b(a){var b=parseFloat(a);if(!e.isNaN(b))switch(b%360){case 0:return"left";case 90:return"bottom";case 180:return"right";case 240:return"top"}return a}function a(a){a=b(a);if(n.test(a))throw"The direction is an angle that can\u2019t be converted.";var c=function(b){return~a.indexOf(b)?"100%":"0"};return c("right")+" "+c("bottom")+", "+c("left")+" "+c("top")}function d(a){var b=
o.getArray("css.gradient.prefixes"),b=e.map(b,function(b){return"-"+b+"-"+a});b.push(a);return b}function i(a,b,c){var f=a.parent,g=h("utils"),j=h("cssResolver"),i=o.getArray("css.gradient.prefixes");e.each(f.getAll(d(a.name())),function(b){b!=a&&/gradient/i.test(b.value())&&f.remove(b)});var k=a.value();c||(c=h("range").create(0,a.value()));var n=function(a){return g.replaceSubstring(k,a,c)},l=h("cssGradient");a.value(n(l.toString(b)));var m=[];e.each(i,function(c){var d=j.prefixed(a.name(),c);if(c==
"webkit"&&o.get("css.gradient.oldWebkit"))try{m.push({name:d,value:n(l.oldWebkitLinearGradient(b))})}catch(e){}m.push({name:d,value:n(l.toString(b,c))})});m=m.sort(function(a,b){return b.name.length-a.name.length});e.each(m,function(b){f.add(b.name,b.value,f.indexOf(a))})}function j(a){var b=a.value(),c=h("cssGradient"),d=null;return(a=e.find(a.valueParts(),function(a){return d=c.parse(a.substring(b))}))&&d?{gradient:d,valueRange:a}:null}var l=["top","to bottom","0deg"],n=/\d+deg/i,m=/top|bottom|left|right/i,
o=h("preferences");o.define("css.gradient.prefixes","webkit, moz, ms, o","A comma-separated list of vendor-prefixes for which values should be generated.");o.define("css.gradient.oldWebkit",!0,"Generate gradient definition for old Webkit implementations");o.define("css.gradient.omitDefaultDirection",!0,"Do not output default direction definition in generated gradients.");h("expandAbbreviation").addHandler(function(a,b,c){b=h("editorUtils").outputInfo(a,b,c);if(b.syntax!="css")return!1;var d=a.getCaretPos();
if(b=h("cssEditTree").parseFromPosition(b.content,d,!0))if((c=b.itemFromPosition(d,!0))||(c=e.find(b.list(),function(a){return a.range(!0).end==d})),c){var f=j(c);if(f){c.end(";");var g=b.options.offset||0,n=g+b.toString().length;i(c,f.gradient,f.valueRange);a.replaceContent(b.toString(),g,n,!0);a.setCaretPos(c.valueRange(!0).end);return!0}}return!1});h("reflectCSSValue").addHandler(function(a){var b=h("cssGradient"),c=h("utils"),f=j(a);if(!f)return!1;var g=a.value(),i=function(a){return c.replaceSubstring(g,
a,f.valueRange)};e.each(a.parent.getAll(d(a.name())),function(c){if(c!==a){var d=c.value().match(/^\s*(\-([a-z]+)\-)?linear\-gradient/);d?c.value(i(b.toString(f.gradient,d[2]||""))):c.value().match(/\s*\-webkit\-gradient/)&&c.value(i(b.oldWebkitLinearGradient(f.gradient)))}});return!0});return{parse:function(a){var b=null,a=h("utils").trim(a).replace(/^([\w\-]+)\((.+?)\)$/,function(a,c,d){c=c.toLowerCase().replace(/^\-[a-z]+\-/,"");if(c=="linear-gradient"||c=="lg"){for(var a=l[0],d=h("stringStream").create(h("utils").trim(d)),
c=[],j;j=d.next();)d.peek()==","?(c.push(d.current()),d.next(),d.eatSpace(),d.start=d.pos):j=="("&&d.skipTo(")");c.push(d.current());c=e.compact(e.map(c,g));if(c.length){if(n.test(c[0])||m.test(c[0]))a=c.shift();b={type:"linear",direction:a,colorStops:e.map(c,f)}}else b=null;return""}return a});return b},oldWebkitLinearGradient:function(b){e.isString(b)&&(b=this.parse(b));if(!b)return null;var d=e.map(b.colorStops,e.clone);e.each(d,function(a){if("position"in a)if(~a.position.indexOf(".")||a.unit==
"%")a.position=parseFloat(a.position)/(a.unit=="%"?100:1);else throw"Can't convert color stop '"+(a.position+(a.unit||""))+"'";});c(d);d=e.map(d,function(a,b){return!a.position&&!b?"from("+a.color+")":a.position==1&&b==d.length-1?"to("+a.color+")":"color-stop("+a.position.toFixed(2).replace(/\.?0+$/,"")+", "+a.color+")"});return"-webkit-gradient(linear, "+a(b.direction)+", "+d.join(", ")+")"},toString:function(a,b){if(a.type=="linear"){var c=(b?"-"+b+"-":"")+"linear-gradient",d=e.map(a.colorStops,
function(a){return a.color+("position"in a?" "+a.position+(a.unit||""):"")});a.direction&&(!o.get("css.gradient.omitDefaultDirection")||!e.include(l,a.direction))&&d.unshift(a.direction);return c+"("+d.join(", ")+")"}}}});emmet.exec(function(h,e){var g=h("handlerList").create(),f=h("resources");e.extend(f,{addGenerator:function(c,b,a){e.isString(c)&&(c=RegExp(c));g.add(function(a,e){var f;return(f=c.exec(a.name()))?b(f,a,e):null},a)}});f.addResolver(function(c,b){return g.exec(null,e.toArray(arguments))})});
emmet.define("tagName",function(h,e){var g={empty:"area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command".split(","),blockLevel:"address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6".split(","),inlineLevel:"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var".split(",")},
f={ul:"li",ol:"li",table:"tr",tr:"td",tbody:"tr",thead:"tr",tfoot:"tr",colgroup:"col",select:"option",optgroup:"option",audio:"source",video:"source",object:"param",map:"area"};return{resolve:function(c){c=(c||"").toLowerCase();return c in f?this.getMapping(c):this.isInlineLevel(c)?"span":"div"},getMapping:function(c){return f[c.toLowerCase()]},isInlineLevel:function(c){return this.isTypeOf(c,"inlineLevel")},isBlockLevel:function(c){return this.isTypeOf(c,"blockLevel")},isEmptyElement:function(c){return this.isTypeOf(c,
"empty")},isTypeOf:function(c,b){return e.include(g[b],c)},addMapping:function(c,b){f[c]=b},removeMapping:function(c){c in f&&delete f[c]},addElementToCollection:function(c,b){g[b]||(g[b]=[]);var a=this.getCollection(b);e.include(a,c)||a.push(c)},removeElementFromCollection:function(c,b){b in g&&(g[b]=e.without(this.getCollection(b),c))},getCollection:function(c){return g[c]}}});
emmet.exec(function(h,e){function g(){return{element:d.get("bem.elementSeparator"),modifier:d.get("bem.modifierSeparator")}}function f(a){if(h("abbreviationUtils").isSnippet(a))return a;a.__bem={block:"",element:"",modifier:""};var d=c(a.attribute("class")).split(" "),f=/^[a-z]\-/i;a.__bem.block=e.find(d,function(a){return f.test(a)});if(!a.__bem.block)f=/^[a-z]/i,a.__bem.block=e.find(d,function(a){return f.test(a)})||"";d=e.chain(d).map(function(c){var d;d=b(c,a,"element");d=b(d,a,"modifier");var e=
"",f="",h="",c=g();~d.indexOf(c.element)?(e=d.split(c.element),h=e[1].split(c.modifier),e=e[0],f=h.shift(),h=h.join(c.modifier)):~d.indexOf(c.modifier)&&(h=d.split(c.modifier),e=h.shift(),h=h.join(c.modifier));if(e||f||h){if(!e)e=a.__bem.block;d=e;var i=[];f&&(d+=c.element+f);i.push(d);h&&i.push(d+c.modifier+h);a.__bem.block=e;a.__bem.element=f;a.__bem.modifier=h;c=i}else c=d;return c}).flatten().uniq().value();a.attribute("class",d.join(" "));return a}function c(a){var b=h("utils"),a=(" "+(a||"")+
" ").replace(/\s+/g," "),c=d.get("bem.shortElementPrefix");c&&(c=RegExp("\\s("+b.escapeForRegexp(c)+"+)","g"),a=a.replace(c,function(a,c){return" "+b.repeatString(g().element,c.length)}));return b.trim(a)}function b(a,b,c){var d=g(),e=RegExp("^("+d[c]+")+","g");if(e.test(a)){for(var f=0,e=a.replace(e,function(a){f=a.length/d[c].length;return""}),h=b;h.parent&&f--;)h=h.parent;if(!h||!h.__bem)h=b;if(h&&h.__bem)return a=h.__bem.block,c=="modifier"&&h.__bem.element&&(a+=d.element+h.__bem.element),a+d[c]+
e}return a}function a(b,c){b.name&&f(b,c);var d=h("abbreviationUtils");e.each(b.children,function(b){a(b,c);!d.isSnippet(b)&&b.start&&(i=!0)});return b}var d=h("preferences");d.define("bem.elementSeparator","__","Class name\u2019s element separator.");d.define("bem.modifierSeparator","_","Class name\u2019s modifier separator.");d.define("bem.shortElementPrefix","-","Symbol for describing short \u201cblock-element\u201d notation. Class names prefixed with this symbol will be treated as element name for parent\u2018s block name. Each symbol instance traverses one level up in parsed tree for block name lookup. Empty value will disable short notation.");
var i=!1;h("filters").add("bem",function(b,c){i=!1;b=a(b,c);i&&(b=h("filters").apply(b,"html",c));return b})});
emmet.exec(function(h,e){function g(b,a,d){var f=h("utils"),g=c.get("filter.commentTrigger");if(g=="*"||e.find(g.split(","),function(a){return!!b.attribute(f.trim(a))}))g={node:b,name:b.name(),padding:b.parent?b.parent.padding:"",attr:function(a,c,d){return(a=b.attribute(a))?(c||"")+a+(d||""):""}},a=f.normalizeNewline(a?a(g):""),d=f.normalizeNewline(d?d(g):""),b.start=b.start.replace(/</,a+"<"),b.end=b.end.replace(/>/,">"+d)}function f(b,a,c){var i=h("abbreviationUtils");e.each(b.children,function(b){i.isBlock(b)&&
g(b,a,c);f(b,a,c)});return b}var c=h("preferences");c.define("filter.commentAfter",'\n<\!-- /<%= attr("id", "#") %><%= attr("class", ".") %> --\>',"A definition of comment that should be placed <i>after</i> matched element when <code>comment</code> filter is applied. This definition is an ERB-style template passed to <code>_.template()</code> function (see Underscore.js docs for details). In template context, the following properties and functions are availabe:\n<ul><li><code>attr(name, before, after)</code> \u2013 a function that outputsspecified attribute value concatenated with <code>before</code> and <code>after</code> strings. If attribute doesn't exists, the empty string will be returned.</li><li><code>node</code> \u2013 current node (instance of <code>AbbreviationNode</code>)</li><li><code>name</code> \u2013 name of current tag</li><li><code>padding</code> \u2013 current string padding, can be used for formatting</li></ul>");
c.define("filter.commentBefore","","A definition of comment that should be placed <i>before</i> matched element when <code>comment</code> filter is applied. For more info, read description of <code>filter.commentAfter</code> property");c.define("filter.commentTrigger","id, class","A comma-separated list of attribute names that should exist in abbreviatoin where comment should be added. If you wish to add comment for every element, set this option to <code>*</code>");h("filters").add("c",function(b){var a=
e.template(c.get("filter.commentBefore")),d=e.template(c.get("filter.commentAfter"));return f(b,a,d)})});emmet.exec(function(h,e){function g(c){return c.replace(/([<>&])/g,function(b,a){return f[a]})}var f={"<":"&lt;",">":"&gt;","&":"&amp;"};h("filters").add("e",function b(a){e.each(a.children,function(a){a.start=g(a.start);a.end=g(a.end);a.content=g(a.content);b(a)});return a})});
emmet.exec(function(h,e){function g(){return h("resources").getVariable("indentation")}function f(b){return b.parent&&!b.parent.parent&&!b.index()}function c(b,a){var c=h("abbreviationUtils");if(a.tag_nl===!0||c.isBlock(b))return!0;if(!b.parent||!a.inline_break)return!1;var f=0;return!!e.find(b.parent.children,function(b){b.isTextNode()||!c.isInline(b)?f=0:c.isInline(b)&&f++;if(f>=a.inline_break)return!0})}h("filters").add("_format",function a(d,i,j){var j=j||0,l=h("abbreviationUtils");e.each(d.children,
function(d){if(l.isSnippet(d)){if(!f(d))d.start=h("utils").getNewline()+d.start}else{d.start=d.end="%s";var e=h("utils"),o=h("abbreviationUtils"),q=o.isUnary(d),e=e.getNewline();if(i.tag_nl!==!1){var r=i.tag_nl===!0&&(i.tag_nl_leaf||d.children.length);if(!d.isTextNode()){if(c(d,i)){if(!f(d)&&(!o.isSnippet(d.parent)||d.index()))d.start=e+d.start;if(o.hasBlockChildren(d)||d.children.length&&c(d.children[0],i)||r&&!q)d.end=e+d.end;if(o.hasTagsInContent(d)||r&&!d.children.length&&!q)d.start+=e+g()}else if(o.isInline(d)&&
d.parent&&h("abbreviationUtils").hasBlockChildren(d.parent)&&!f(d))d.start=e+d.start;else if(o.isInline(d)&&o.hasBlockChildren(d))d.end=e+d.end;d.padding=g()}}}a(d,i,j+1)});return d})});
emmet.exec(function(h,e){function g(f,c){var b="",a=[],d=c.attributeQuote(),g=c.cursor();e.each(f.attributeList(),function(e){var f=c.attributeName(e.name);switch(f.toLowerCase()){case "id":b+="#"+(e.value||g);break;case "class":b+="."+h("utils").trim(e.value||g).replace(/\s+/g,".");break;default:a.push(":"+f+" => "+d+(e.value||g)+d)}});a.length&&(b+="{"+a.join(", ")+"}");return b}h("filters").add("haml",function c(b,a,d){var d=d||0,i=h("abbreviationUtils");d||(b=h("filters").apply(b,"_format",a));
e.each(b.children,function(b){if(!i.isSnippet(b)&&b.parent){var e=h("abbreviationUtils"),n=h("utils"),m=g(b,a),o=a.cursor(),e=e.isUnary(b),q=a.self_closing_tag&&e?"/":"",r="",r="%"+a.tagName(b.name());r.toLowerCase()=="%div"&&m&&m.indexOf("{")==-1&&(r="");b.end="";b.start=n.replaceSubstring(b.start,r+m+q+" ",b.start.indexOf("%s"),"%s");!b.children.length&&!e&&(b.start+=o)}c(b,a,d+1)});return b})});
emmet.exec(function(h,e){function g(f,c){var b=c.attributeQuote(),a=c.cursor();return e.map(f.attributeList(),function(d){return" "+c.attributeName(d.name)+"="+b+(d.value||a)+b}).join("")}h("filters").add("html",function c(b,a,d){var d=d||0,i=h("abbreviationUtils");d||(b=h("filters").apply(b,"_format",a));e.each(b.children,function(b){if(!i.isSnippet(b)&&b.parent){var e=h("abbreviationUtils"),n=h("utils"),m=g(b,a),o=a.cursor(),e=e.isUnary(b),q="",r="";if(!b.isTextNode()){var t=a.tagName(b.name());
e?(q="<"+t+m+a.selfClosing()+">",b.end=""):(q="<"+t+m+">",r="</"+t+">")}b.start=n.replaceSubstring(b.start,q,b.start.indexOf("%s"),"%s");b.end=n.replaceSubstring(b.end,r,b.end.indexOf("%s"),"%s");!b.children.length&&!e&&b.content.indexOf(o)==-1&&(b.start+=o)}c(b,a,d+1)});return b})});
emmet.exec(function(h,e){var g=/^\s+/,f=/[\n\r]/g;h("filters").add("s",function b(a){var d=h("abbreviationUtils");e.each(a.children,function(a){if(!d.isSnippet(a))a.start=a.start.replace(g,""),a.end=a.end.replace(g,"");a.start=a.start.replace(f,"");a.end=a.end.replace(f,"");a.content=a.content.replace(f,"");b(a)});return a})});
emmet.exec(function(h,e){function g(f,c){e.each(f.children,function(b){if(b.content)b.content=b.content.replace(c,"");g(b,c)});return f}h("preferences").define("filter.trimRegexp","[\\s|\\u00a0]*[\\d|#|\\-|*|\\u2022]+\\.?\\s*","Regular expression used to remove list markers (numbers, dashes, bullets, etc.) in <code>t</code> (trim) filter. The trim filter is useful for wrapping with abbreviation lists, pased from other documents (for example, Word documents).");h("filters").add("t",function(e){var c=
RegExp(h("preferences").get("filter.trimRegexp"));return g(e,c)})});emmet.exec(function(h,e){var g={"xsl:variable":1,"xsl:with-param":1};h("filters").add("xsl",function c(b){var a=h("abbreviationUtils");e.each(b.children,function(b){if(!a.isSnippet(b)&&(b.name()||"").toLowerCase()in g&&b.children.length)b.start=b.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");c(b)});return b})});
emmet.exec(function(h,e){function g(a,b){return Math.round(Math.random()*(b-a)+a)}function f(a,b){for(var c=a.length,d=Math.min(c,b),f=[];f.length<d;){var h=g(0,c-1);e.include(f,h)||f.push(h)}return e.map(f,function(b){return a[b]})}function c(a,b){a.length&&(a[0]=a[0].charAt(0).toUpperCase()+a[0].substring(1));return a.join(" ")+(b||(e.isString("?!...")?"?!...".charAt(g(0,4)):"?!..."[g(0,4)]))}function b(a){var b=a.length,c=0,c=b>3&&b<=6?g(0,1):b>6&&b<=12?g(0,2):g(1,4);e.each(f(e.range(c)),function(b){a[b]+=
","})}h("abbreviationParser").addPreprocessor(function(e){var h=/^(?:lorem|lipsum)(\d*)$/i,l;e.findAll(function(e){if(e._name&&(l=e._name.match(h))){var i=l[1]||30;e._name="";e.data("forceNameResolving",e.isRepeating()||e.attributeList().length);e.data("paste",function(e){var h=[],j=0;e||(e=a.slice(0,i+1),e.length>5&&(e[4]+=","),j+=e.length,h.push(c(e,".")));for(;j<i;)e=f(d,Math.min(g(3,12)*g(1,5),i-j)),j+=e.length,b(e),h.push(c(e));return h.join(" ")})}})});var a="lorem ipsum dolor sit amet consectetur adipisicing elit".split(" "),
d=["exercitationem","perferendis","perspiciatis","laborum","eveniet","sunt","iure","nam","nobis","eum","cum","officiis","excepturi","odio","consectetur","quasi","aut","quisquam","vel","eligendi","itaque","non","odit","tempore","quaerat","dignissimos","facilis","neque","nihil","expedita","vitae","vero","ipsum","nisi","animi","cumque","pariatur","velit","modi","natus","iusto","eaque","sequi","illo","sed","ex","et","voluptatibus","tempora","veritatis","ratione","assumenda","incidunt","nostrum","placeat",
"aliquid","fuga","provident","praesentium","rem","necessitatibus","suscipit","adipisci","quidem","possimus","voluptas","debitis","sint","accusantium","unde","sapiente","voluptate","qui","aspernatur","laudantium","soluta","amet","quo","aliquam","saepe","culpa","libero","ipsa","dicta","reiciendis","nesciunt","doloribus","autem","impedit","minima","maiores","repudiandae","ipsam","obcaecati","ullam","enim","totam","delectus","ducimus","quis","voluptates","dolores","molestiae","harum","dolorem","quia",
"voluptatem","molestias","magni","distinctio","omnis","illum","dolorum","voluptatum","ea","quas","quam","corporis","quae","blanditiis","atque","deserunt","laboriosam","earum","consequuntur","hic","cupiditate","quibusdam","accusamus","ut","rerum","error","minus","eius","ab","ad","nemo","fugit","officia","at","in","id","quos","reprehenderit","numquam","iste","fugiat","sit","inventore","beatae","repellendus","magnam","recusandae","quod","explicabo","doloremque","aperiam","consequatur","asperiores","commodi",
"optio","dolor","labore","temporibus","repellat","veniam","architecto","est","esse","mollitia","nulla","a","similique","eos","alias","dolore","tenetur","deleniti","porro","facere","maxime","corrupti"]});emmet.require("actions").add("select_line",function(h){var e=h.getCurrentLineRange();h.createSelection(e.start,e.end);return!0});
emmet.require("resources").setVocabulary({variables:{lang:"en",locale:"en-US",charset:"UTF-8",indentation:"\t",newline:"\n"},css:{filters:"html",snippets:{"@i":"@import url(|);","@m":"@media print {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","!":"!important",pos:"position:|;","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;",t:"top:|;","t:a":"top:auto;",r:"right:|;","r:a":"right:auto;",b:"bottom:|;","b:a":"bottom:auto;",
brad:"-webkit-border-radius: ${1:radius};\n-moz-border-radius: $1;\nborder-radius: $1;",bsha:"-webkit-box-shadow: ${1:hoff} ${2:voff} ${3:blur} ${4:rgba(0,0,0,0.5)};\n-moz-box-shadow: $1 $2 $3 $4;\nbox-shadow: $1 $2 $3 $4;",l:"left:|;","l:a":"left:auto;",z:"z-index:|;","z:a":"z-index:auto;",fl:"float:|;","fl:n":"float:none;","fl:l":"float:left;","fl:r":"float:right;",cl:"clear:|;","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;",d:"display:|;","d:n":"display:none;",
"d:b":"display:block;","d:i":"display:inline;","d:ib":"display:inline-block;","d:li":"display:list-item;","d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;","d:rb":"display:ruby;",
"d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;","d:rbtg":"display:ruby-text-group;",v:"visibility:|;","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;",ov:"overflow:|;","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;",ovx:"overflow-x:|;","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;",ovy:"overflow-y:|;",
"ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;","ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;",ovs:"overflow-style:|;","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;",zoo:"zoom:1;",cp:"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(|);",bxz:"box-sizing:|;","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;",bxsh:"box-shadow:${1:hoff} ${2:voff} ${3:radius} ${4:color};",
function(a,b){p.define("css."+b+"Properties",a,v({vendor:b}));p.define("css."+b+"PropertiesAddon","",w({vendor:b}))});p.define("css.unitlessProperties","z-index, line-height, opacity, font-weight, zoom","The list of properties whose values \u200b\u200bmust not contain units.");p.define("css.intUnit","px","Default unit for integer values");p.define("css.floatUnit","em","Default unit for float values");p.define("css.keywords","auto, inherit","A comma-separated list of valid keywords that can be used in CSS abbreviations.");
p.define("css.keywordAliases","a:auto, i:inherit, s:solid, da:dashed, do:dotted","A comma-separated list of keyword aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:keyword_name</code>.");p.define("css.unitAliases","e:em, p:%, x:ex, r:rem","A comma-separated list of unit aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:unit_value</code>.");p.define("css.color.short",!0,"Should color values like <code>#ffffff</code> be shortened to <code>#fff</code> after abbreviation with color was expanded.");
p.define("css.color.case","keep","Letter case of color values generated by abbreviations with color (like <code>c#0</code>). Possible values are <code>upper</code>, <code>lower</code> and <code>keep</code>.");p.define("css.fuzzySearch",!0,"Enable fuzzy search among CSS snippet names. When enabled, every <em>unknown</em> snippet will be scored against available snippet names (not values or CSS properties!). The match with best score will be used to resolve snippet value. For example, with this preference enabled, the following abbreviations are equal: <code>ov:h</code> == <code>ov-h</code> == <code>o-h</code> == <code>oh</code>");
p.define("css.fuzzySearchMinScore",0.3,"The minium score (from 0 to 1) that fuzzy-matched abbreviation should achive. Lower values may produce many false-positive matches, higher values may reduce possible matches.");l("w",{prefix:"webkit"});l("m",{prefix:"moz"});l("s",{prefix:"ms"});l("o",{prefix:"o"});var k=["css","less","sass","scss","stylus"];h("resources").addResolver(function(a,b){return d.include(k,b)&&a.isElement()?q.expandToSnippet(a.abbreviation,b):null});var t=h("expandAbbreviation");t.addHandler(function(a,
b,c){if(!d.include(k,b))return!1;var e=a.getSelectionRange().end,g=t.findAbbreviation(a);return g&&(b=emmet.expandAbbreviation(g,b,c))?(g=e-g.length,c=e,a.getContent().charAt(e)==";"&&b.charAt(b.length-1)==";"&&c++,a.replaceContent(b,g,c),!0):!1});return q={addPrefix:l,supportsPrefix:g,prefixed:function(a,b){return g(a,b)?"-"+b+"-"+a:a},listPrefixes:function(){return d.map(r,function(a){return a.prefix})},getPrefix:function(a){return r[a]},removePrefix:function(a){a in r&&delete r[a]},extractPrefixes:function(a){if(a.charAt(0)!=
"-")return{property:a,prefixes:null};for(var b=1,c=a.length,d,e=[];b<c;){d=a.charAt(b);if(d=="-"){b++;break}if(d in r)e.push(d);else{e.length=0;b=1;break}b++}if(b==c-1)b=1,e.length=1;return{property:a.substring(b),prefixes:e.length?e:"all"}},findValuesInAbbreviation:function(b,c){for(var c=c||"css",d=0,e=b.length,g="",i;d<e;){i=b.charAt(d);if(f(i)||i=="#"||i=="-"&&f(b.charAt(d+1))){g=b.substring(d);break}d++}i=b.substring(0,b.length-g.length);d=h("resources");for(e=[];~i.indexOf("-")&&!d.findSnippet(c,
i);){i=i.split("-");var j=i.pop();if(!a(j))break;e.unshift(j);i=i.join("-")}return e.join("-")+g},parseValues:function(c){for(var e=h("stringStream").create(c),g=[],i=null;i=e.next();){if(i=="#")e.match(/^[0-9a-f]+/,!0);else if(i=="-"){if(a(d.last(g))||e.start&&f(c.charAt(e.start-1)))e.start=e.pos;e.match(/^\-?[0-9]*(\.[0-9]+)?[a-z%\.]*/,!0)}else e.match(/^[0-9]*(\.[0-9]*)?[a-z%]*/,!0);g.push(e.current());e.start=e.pos}return d.map(d.compact(g),b)},extractValues:function(a){var b=this.findValuesInAbbreviation(a);
return!b?{property:a,values:null}:{property:a.substring(0,a.length-b.length).replace(/-$/,""),values:this.parseValues(b)}},normalizeValue:function(a,b){var b=(b||"").toLowerCase(),c=p.getArray("css.unitlessProperties");return a.replace(/^(\-?[0-9\.]+)([a-z]*)$/,function(a,e,g){if(!g&&(e=="0"||d.include(c,b)))return e;g?(a=p.getDict("css.unitAliases"),e+=g in a?a[g]:g):e=e.replace(/\.$/,"")+p.get(~e.indexOf(".")?"css.floatUnit":"css.intUnit");return e})},expand:function(a,b,c){var c=c||"css",g=h("resources"),
f=p.get("css.autoInsertVendorPrefixes"),k;if(k=/^(.+)\!$/.test(a))a=RegExp.$1;var l=g.findSnippet(c,a);if(l&&!f)return n(l,k,c);l=this.extractPrefixes(a);a=this.extractValues(l.property);a=d.extend(l,a);l=g.findSnippet(c,a.property);!l&&p.get("css.fuzzySearch")&&(l=g.fuzzyFindSnippet(c,a.property,parseFloat(p.get("css.fuzzySearchMinScore"))));if(l){if(!d.isString(l))l=l.data}else l=a.property+":"+u;if(!i(l))return l;var o=e(l),m=[];!b&&a.values&&(b=d.map(a.values,function(a){return this.normalizeValue(a,
o.name)},this).join(" ")+";");o.value=b||o.value;b=a.prefixes=="all"||!a.prefixes&&f?j(o.name,f&&a.prefixes!="all"):a.prefixes;d.each(b,function(a){a in r&&m.push(n(r[a].transformName(o.name)+":"+o.value,k,c))});m.push(n(o.name+":"+o.value,k,c));return m},expandToSnippet:function(a,b){var c=this.expand(a,null,b);return d.isArray(c)?c.join("\n"):!d.isString(c)?c.data:String(c)},getSyntaxPreference:m,transformSnippet:n}});
emmet.define("cssGradient",function(h,d){function f(a){return h("utils").trim(a).replace(/\s+/g," ")}function i(a){var a=f(a),b=null,a=a.replace(/^(\w+\(.+?\))\s*/,function(a,c){b=c;return""});b||(a=a.split(" "),b=a[0],a=a[1]||"");var c={color:b};a&&a.replace(/^(\-?[\d\.]+)([a-z%]+)?$/,function(a,b,d){c.position=b;~b.indexOf(".")?d="":d||(d="%");if(d)c.unit=d});return c}function b(a){var b=0;d.each(a,function(c,e){if(!e)return c.position=c.position||0;if(e==a.length-1&&!("position"in c))c.position=
1;if("position"in c){var g=a[b].position||0,f=(c.position-g)/(e-b);d.each(a.slice(b,e),function(a,b){a.position=g+f*b});b=e}})}function c(a){var b=parseFloat(a);if(!d.isNaN(b))switch(b%360){case 0:return"left";case 90:return"bottom";case 180:return"right";case 240:return"top"}return a}function a(a){a=c(a);if(r.test(a))throw"The direction is an angle that can\u2019t be converted.";var b=function(b){return~a.indexOf(b)?"100%":"0"};return b("right")+" "+b("bottom")+", "+b("left")+" "+b("top")}function e(a){var b=
p.getArray("css.gradient.prefixes"),b=d.map(b,function(b){return"-"+b+"-"+a});b.push(a);return b}function g(a,b){var c=[],e=h("cssResolver");p.get("css.gradient.fallback")&&~b.toLowerCase().indexOf("background")&&c.push({name:"background-color",value:"${1:"+a.colorStops[0].color+"}"});d.each(p.getArray("css.gradient.prefixes"),function(d){var g=e.prefixed(b,d);if(d=="webkit"&&p.get("css.gradient.oldWebkit"))try{c.push({name:g,value:q.oldWebkitLinearGradient(a)})}catch(f){}c.push({name:g,value:q.toString(a,
d)})});return c.sort(function(a,b){return b.name.length-a.name.length})}function j(a,b,c){var f=a.parent,i=h("utils");d.each(f.getAll(e(a.name())),function(b){b!=a&&/gradient/i.test(b.value())&&f.remove(b)});var j=a.value();c||(c=h("range").create(0,a.value()));a.value(function(a){return i.replaceSubstring(j,a,c)}(q.toString(b))+"${2}");b=g(b,a.name());d.each(b,function(b){f.add(b.name,b.value,f.indexOf(a))})}function l(a){var b=a.value(),c=null;return(a=d.find(a.valueParts(),function(a){return c=
q.parse(a.substring(b))}))&&c?{gradient:c,valueRange:a}:null}function m(a,b){var c=p.get("css.gradient.defaultProperty");if(!c)return!1;var e=String(a.getContent()),f=h("range").create(a.getCurrentLineRange()),i=f.substring(e).replace(/^\s+/,function(a){f.start+=a.length;return""}).replace(/\s+$/,function(a){f.end-=a.length;return""}),e=h("cssResolver");if(i=q.parse(i)){var j=g(i,c);j.push({name:c,value:q.toString(i)+"${2}"});var l=e.getSyntaxPreference("valueSeparator",b),o=e.getSyntaxPreference("propertyEnd",
b),j=d.map(j,function(a){return a.name+l+a.value+o});a.replaceContent(j.join("\n"),f.start,f.end);return!0}return!1}function n(a,b){var c=null,e=h("cssEditTree").parseFromPosition(a,b,!0);e&&((c=e.itemFromPosition(b,!0))||(c=d.find(e.list(),function(a){return a.range(!0).end==b})));return{rule:e,property:c}}var o=["top","to bottom","0deg"],q=null,s=["css","less","sass","scss","stylus","styl"],r=/\d+deg/i,u=/top|bottom|left|right/i,p=h("preferences");p.define("css.gradient.prefixes","webkit, moz, o",
"A comma-separated list of vendor-prefixes for which values should be generated.");p.define("css.gradient.oldWebkit",!0,"Generate gradient definition for old Webkit implementations");p.define("css.gradient.omitDefaultDirection",!0,"Do not output default direction definition in generated gradients.");p.define("css.gradient.defaultProperty","background-image","When gradient expanded outside CSS value context, it will produce properties with this name.");p.define("css.gradient.fallback",!1,"With this option enabled, CSS gradient generator will produce <code>background-color</code> property with gradient first color as fallback for old browsers.");
h("expandAbbreviation").addHandler(function(a,b,c){var e=h("editorUtils").outputInfo(a,b,c);if(!d.include(s,e.syntax))return!1;var c=a.getCaretPos(),g=e.content,e=n(g,c);if(e.property){var f=l(e.property);if(f){var b=e.rule.options.offset||0,i=b+e.rule.toString().length;if(/[\n\r]/.test(e.property.value())){var o=e.property.valueRange(!0).start+f.valueRange.end,g=h("utils").replaceSubstring(g,";",o),c=n(g,c);c.property&&(f=l(c.property),e=c)}e.property.end(";");j(e.property,f.gradient,f.valueRange);
a.replaceContent(e.rule.toString(),b,i,!0);return!0}}return m(a,b)});h("reflectCSSValue").addHandler(function(a){var b=h("utils"),c=l(a);if(!c)return!1;var g=a.value(),f=function(a){return b.replaceSubstring(g,a,c.valueRange)};d.each(a.parent.getAll(e(a.name())),function(b){if(b!==a){var d=b.value().match(/^\s*(\-([a-z]+)\-)?linear\-gradient/);d?b.value(f(q.toString(c.gradient,d[2]||""))):b.value().match(/\s*\-webkit\-gradient/)&&b.value(f(q.oldWebkitLinearGradient(c.gradient)))}});return!0});return q=
{parse:function(a){var b=null;h("utils").trim(a).replace(/^([\w\-]+)\((.+?)\)$/,function(a,c,e){c=c.toLowerCase().replace(/^\-[a-z]+\-/,"");if(c=="linear-gradient"||c=="lg"){for(var a=o[0],e=h("stringStream").create(h("utils").trim(e)),c=[],g;g=e.next();)e.peek()==","?(c.push(e.current()),e.next(),e.eatSpace(),e.start=e.pos):g=="("&&e.skipTo(")");c.push(e.current());c=d.compact(d.map(c,f));if(c.length){if(r.test(c[0])||u.test(c[0]))a=c.shift();b={type:"linear",direction:a,colorStops:d.map(c,i)}}else b=
null;return""}return a});return b},oldWebkitLinearGradient:function(c){d.isString(c)&&(c=this.parse(c));if(!c)return null;var e=d.map(c.colorStops,d.clone);d.each(e,function(a){if("position"in a)if(~a.position.indexOf(".")||a.unit=="%")a.position=parseFloat(a.position)/(a.unit=="%"?100:1);else throw"Can't convert color stop '"+(a.position+(a.unit||""))+"'";});b(e);e=d.map(e,function(a,b){return!a.position&&!b?"from("+a.color+")":a.position==1&&b==e.length-1?"to("+a.color+")":"color-stop("+a.position.toFixed(2).replace(/\.?0+$/,
"")+", "+a.color+")"});return"-webkit-gradient(linear, "+a(c.direction)+", "+e.join(", ")+")"},toString:function(a,b){if(a.type=="linear"){var c=(b?"-"+b+"-":"")+"linear-gradient",e=d.map(a.colorStops,function(a){return a.color+("position"in a?" "+a.position+(a.unit||""):"")});a.direction&&(!p.get("css.gradient.omitDefaultDirection")||!d.include(o,a.direction))&&e.unshift(a.direction);return c+"("+e.join(", ")+")"}}}});
emmet.exec(function(h,d){var f=h("handlerList").create(),i=h("resources");d.extend(i,{addGenerator:function(b,c,a){d.isString(b)&&(b=RegExp(b));f.add(function(a,d){var f;return(f=b.exec(a.name()))?c(f,a,d):null},a)}});i.addResolver(function(b,c){return f.exec(null,d.toArray(arguments))})});
emmet.define("tagName",function(h,d){var f={empty:"area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command".split(","),blockLevel:"address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6".split(","),inlineLevel:"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var".split(",")},
i={p:"span",ul:"li",ol:"li",table:"tr",tr:"td",tbody:"tr",thead:"tr",tfoot:"tr",colgroup:"col",select:"option",optgroup:"option",audio:"source",video:"source",object:"param",map:"area"};return{resolve:function(b){b=(b||"").toLowerCase();return b in i?this.getMapping(b):this.isInlineLevel(b)?"span":"div"},getMapping:function(b){return i[b.toLowerCase()]},isInlineLevel:function(b){return this.isTypeOf(b,"inlineLevel")},isBlockLevel:function(b){return this.isTypeOf(b,"blockLevel")},isEmptyElement:function(b){return this.isTypeOf(b,
"empty")},isTypeOf:function(b,c){return d.include(f[c],b)},addMapping:function(b,c){i[b]=c},removeMapping:function(b){b in i&&delete i[b]},addElementToCollection:function(b,c){f[c]||(f[c]=[]);var a=this.getCollection(c);d.include(a,b)||a.push(b)},removeElementFromCollection:function(b,c){c in f&&(f[c]=d.without(this.getCollection(c),b))},getCollection:function(b){return f[b]}}});
emmet.exec(function(h,d){function f(){return{element:e.get("bem.elementSeparator"),modifier:e.get("bem.modifierSeparator")}}function i(a){if(h("abbreviationUtils").isSnippet(a))return a;a.__bem={block:"",element:"",modifier:""};var e=b(a.attribute("class")).split(" "),g=/^[a-z]\-/i;a.__bem.block=d.find(e,function(a){return g.test(a)});if(!a.__bem.block)g=/^[a-z]/i,a.__bem.block=d.find(e,function(a){return g.test(a)})||"";(e=d.chain(e).map(function(b){var d;d=c(b,a,"element");d=c(d,a,"modifier");var e=
"",g="",h="",b=f();~d.indexOf(b.element)?(e=d.split(b.element),h=e[1].split(b.modifier),e=e[0],g=h.shift(),h=h.join(b.modifier)):~d.indexOf(b.modifier)&&(h=d.split(b.modifier),e=h.shift(),h=h.join(b.modifier));if(e||g||h){if(!e)e=a.__bem.block;d=e;var i=[];g&&(d+=b.element+g);i.push(d);h&&i.push(d+b.modifier+h);a.__bem.block=e;a.__bem.element=g;a.__bem.modifier=h;b=i}else b=d;return b}).flatten().uniq().value().join(" "))&&a.attribute("class",e);return a}function b(a){var b=h("utils"),a=(" "+(a||
"")+" ").replace(/\s+/g," "),c=e.get("bem.shortElementPrefix");c&&(c=RegExp("\\s("+b.escapeForRegexp(c)+"+)","g"),a=a.replace(c,function(a,c){return" "+b.repeatString(f().element,c.length)}));return b.trim(a)}function c(a,b,c){var d=f(),e=RegExp("^("+d[c]+")+","g");if(e.test(a)){for(var g=0,e=a.replace(e,function(a){g=a.length/d[c].length;return""}),h=b;h.parent&&g--;)h=h.parent;if(!h||!h.__bem)h=b;if(h&&h.__bem)return a=h.__bem.block,c=="modifier"&&h.__bem.element&&(a+=d.element+h.__bem.element),
a+d[c]+e}return a}function a(b,c){b.name&&i(b,c);var e=h("abbreviationUtils");d.each(b.children,function(b){a(b,c);!e.isSnippet(b)&&b.start&&(g=!0)});return b}var e=h("preferences");e.define("bem.elementSeparator","__","Class name\u2019s element separator.");e.define("bem.modifierSeparator","_","Class name\u2019s modifier separator.");e.define("bem.shortElementPrefix","-","Symbol for describing short \u201cblock-element\u201d notation. Class names prefixed with this symbol will be treated as element name for parent\u2018s block name. Each symbol instance traverses one level up in parsed tree for block name lookup. Empty value will disable short notation.");
var g=!1;h("filters").add("bem",function(b,c){g=!1;b=a(b,c);g&&(b=h("filters").apply(b,"html",c));return b})});
emmet.exec(function(h,d){function f(c,a,e){var g=h("utils"),f=b.get("filter.commentTrigger");if(f=="*"||d.find(f.split(","),function(a){return!!c.attribute(g.trim(a))}))f={node:c,name:c.name(),padding:c.parent?c.parent.padding:"",attr:function(a,b,d){return(a=c.attribute(a))?(b||"")+a+(d||""):""}},a=g.normalizeNewline(a?a(f):""),e=g.normalizeNewline(e?e(f):""),c.start=c.start.replace(/</,a+"<"),c.end=c.end.replace(/>/,">"+e)}function i(b,a,e){var g=h("abbreviationUtils");d.each(b.children,function(b){g.isBlock(b)&&
f(b,a,e);i(b,a,e)});return b}var b=h("preferences");b.define("filter.commentAfter",'\n<\!-- /<%= attr("id", "#") %><%= attr("class", ".") %> --\>',"A definition of comment that should be placed <i>after</i> matched element when <code>comment</code> filter is applied. This definition is an ERB-style template passed to <code>_.template()</code> function (see Underscore.js docs for details). In template context, the following properties and functions are availabe:\n<ul><li><code>attr(name, before, after)</code> \u2013 a function that outputsspecified attribute value concatenated with <code>before</code> and <code>after</code> strings. If attribute doesn't exists, the empty string will be returned.</li><li><code>node</code> \u2013 current node (instance of <code>AbbreviationNode</code>)</li><li><code>name</code> \u2013 name of current tag</li><li><code>padding</code> \u2013 current string padding, can be used for formatting</li></ul>");
b.define("filter.commentBefore","","A definition of comment that should be placed <i>before</i> matched element when <code>comment</code> filter is applied. For more info, read description of <code>filter.commentAfter</code> property");b.define("filter.commentTrigger","id, class","A comma-separated list of attribute names that should exist in abbreviatoin where comment should be added. If you wish to add comment for every element, set this option to <code>*</code>");h("filters").add("c",function(c){var a=
d.template(b.get("filter.commentBefore")),e=d.template(b.get("filter.commentAfter"));return i(c,a,e)})});emmet.exec(function(h,d){function f(b){return b.replace(/([<>&])/g,function(b,a){return i[a]})}var i={"<":"&lt;",">":"&gt;","&":"&amp;"};h("filters").add("e",function c(a){d.each(a.children,function(a){a.start=f(a.start);a.end=f(a.end);a.content=f(a.content);c(a)});return a})});
emmet.exec(function(h,d){function f(){return h("resources").getVariable("indentation")}function i(a){return a.parent&&!a.parent.parent&&!a.index()}function b(a,b){var d=h("abbreviationUtils");return b.tag_nl===!0||d.isBlock(a)?!0:!a.parent||!b.inline_break?!1:c(a.parent,b)}function c(a,b){var c=0,f=h("abbreviationUtils");return!!d.find(a.children,function(a){a.isTextNode()||!f.isInline(a)?c=0:f.isInline(a)&&c++;if(c>=b.inline_break)return!0})}function a(a,b){var f=h("abbreviationUtils");return!d.any(a.children,
function(a){return f.isSnippet(a)?!1:!f.isInline(a)})?c(a,b):!0}h("filters").add("_format",function g(c,l,m){var m=m||0,n=h("abbreviationUtils");d.each(c.children,function(c){if(n.isSnippet(c)){if(c.start=c.end="",!i(c)&&l.tag_nl!==!1&&b(c,l)&&!h("abbreviationUtils").isInline(c.parent))c.start=h("utils").getNewline()+c.start}else{c.start=c.end="%s";var d=h("utils"),j=h("abbreviationUtils"),r=j.isUnary(c),d=d.getNewline();if(l.tag_nl!==!1){var u=l.tag_nl===!0&&(l.tag_nl_leaf||c.children.length);if(!c.isTextNode()){if(b(c,
l)){if(!i(c)&&(!j.isSnippet(c.parent)||c.index()))c.start=d+c.start;if(j.hasBlockChildren(c)||c.children.length&&b(c.children[0],l)||u&&!r)c.end=d+c.end;if(j.hasTagsInContent(c)||u&&!c.children.length&&!r)c.start+=d+f()}else if(j.isInline(c)&&c.parent&&h("abbreviationUtils").hasBlockChildren(c.parent)&&!i(c))c.start=d+c.start;else if(j.isInline(c)&&a(c,l))c.end=d+c.end;c.padding=f()}}}g(c,l,m+1)});return c})});
emmet.exec(function(h,d){function f(f,b){var c="",a=[],e=b.attributeQuote(),g=b.cursor();d.each(f.attributeList(),function(d){var f=b.attributeName(d.name);switch(f.toLowerCase()){case "id":c+="#"+(d.value||g);break;case "class":c+="."+h("utils").trim(d.value||g).replace(/\s+/g,".");break;default:a.push(":"+f+" => "+e+(d.value||g)+e)}});a.length&&(c+="{"+a.join(", ")+"}");return c}h("filters").add("haml",function b(c,a,e){var e=e||0,g=h("abbreviationUtils");e||(c=h("filters").apply(c,"_format",a));
d.each(c.children,function(c){if(!g.isSnippet(c)&&c.parent){var d=h("abbreviationUtils"),m=h("utils"),n=f(c,a),o=a.cursor(),d=d.isUnary(c),q=a.self_closing_tag&&d?"/":"",s="",s="%"+a.tagName(c.name());s.toLowerCase()=="%div"&&n&&n.indexOf("{")==-1&&(s="");c.end="";c.start=m.replaceSubstring(c.start,s+n+q+" ",c.start.indexOf("%s"),"%s");!c.children.length&&!d&&(c.start+=o)}b(c,a,e+1)});return c})});
emmet.exec(function(h,d){function f(f,b){var c=b.attributeQuote(),a=b.cursor();return d.map(f.attributeList(),function(d){return" "+b.attributeName(d.name)+"="+c+(d.value||a)+c}).join("")}h("filters").add("html",function b(c,a,e){var e=e||0,g=h("abbreviationUtils");e||(c=h("filters").apply(c,"_format",a));d.each(c.children,function(c){if(!g.isSnippet(c)&&c.parent){var d=h("abbreviationUtils"),m=h("utils"),n=f(c,a),o=a.cursor(),d=d.isUnary(c),q="",s="";if(!c.isTextNode()){var r=a.tagName(c.name());
d?(q="<"+r+n+a.selfClosing()+">",c.end=""):(q="<"+r+n+">",s="</"+r+">")}c.start=m.replaceSubstring(c.start,q,c.start.indexOf("%s"),"%s");c.end=m.replaceSubstring(c.end,s,c.end.indexOf("%s"),"%s");!c.children.length&&!d&&c.content.indexOf(o)==-1&&(c.start+=o)}b(c,a,e+1)});return c})});
emmet.exec(function(h,d){var f=/^\s+/,i=/[\n\r]/g;h("filters").add("s",function c(a){var e=h("abbreviationUtils");d.each(a.children,function(a){if(!e.isSnippet(a))a.start=a.start.replace(f,""),a.end=a.end.replace(f,"");a.start=a.start.replace(i,"");a.end=a.end.replace(i,"");a.content=a.content.replace(i,"");c(a)});return a})});
emmet.exec(function(h,d){function f(h,b){d.each(h.children,function(c){if(c.content)c.content=c.content.replace(b,"");f(c,b)});return h}h("preferences").define("filter.trimRegexp","[\\s|\\u00a0]*[\\d|#|\\-|*|\\u2022]+\\.?\\s*","Regular expression used to remove list markers (numbers, dashes, bullets, etc.) in <code>t</code> (trim) filter. The trim filter is useful for wrapping with abbreviation lists, pased from other documents (for example, Word documents).");h("filters").add("t",function(d){var b=
RegExp(h("preferences").get("filter.trimRegexp"));return f(d,b)})});emmet.exec(function(h,d){var f={"xsl:variable":1,"xsl:with-param":1};h("filters").add("xsl",function b(c){var a=h("abbreviationUtils");d.each(c.children,function(c){if(!a.isSnippet(c)&&(c.name()||"").toLowerCase()in f&&c.children.length)c.start=c.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");b(c)});return c})});
emmet.exec(function(h,d){function f(a,b){return Math.round(Math.random()*(b-a)+a)}function i(a,b){for(var c=a.length,e=Math.min(c,b),h=[];h.length<e;){var i=f(0,c-1);d.include(h,i)||h.push(i)}return d.map(h,function(b){return a[b]})}function b(a,b){a.length&&(a[0]=a[0].charAt(0).toUpperCase()+a[0].substring(1));return a.join(" ")+(b||(d.isString("?!...")?"?!...".charAt(f(0,4)):"?!..."[f(0,4)]))}function c(a){var b=a.length,c=0,c=b>3&&b<=6?f(0,1):b>6&&b<=12?f(0,2):f(1,4);d.each(i(d.range(c)),function(b){a[b]+=
","})}h("abbreviationParser").addPreprocessor(function(d){var h=/^(?:lorem|lipsum)(\d*)$/i,l;d.findAll(function(d){if(d._name&&(l=d._name.match(h))){var g=l[1]||30;d._name="";d.data("forceNameResolving",d.isRepeating()||d.attributeList().length);d.data("pasteOverwrites",!0);d.data("paste",function(d){var h=g,j=!d,d=[],l=0,h=parseInt(h,10);j&&(j=a.slice(0,h),j.length>5&&(j[4]+=","),l+=j.length,d.push(b(j,".")));for(;l<h;)j=i(e,Math.min(f(3,12)*f(1,5),h-l)),l+=j.length,c(j),d.push(b(j));return d.join(" ")})}})});
var a="lorem ipsum dolor sit amet consectetur adipisicing elit".split(" "),e=["exercitationem","perferendis","perspiciatis","laborum","eveniet","sunt","iure","nam","nobis","eum","cum","officiis","excepturi","odio","consectetur","quasi","aut","quisquam","vel","eligendi","itaque","non","odit","tempore","quaerat","dignissimos","facilis","neque","nihil","expedita","vitae","vero","ipsum","nisi","animi","cumque","pariatur","velit","modi","natus","iusto","eaque","sequi","illo","sed","ex","et","voluptatibus",
"tempora","veritatis","ratione","assumenda","incidunt","nostrum","placeat","aliquid","fuga","provident","praesentium","rem","necessitatibus","suscipit","adipisci","quidem","possimus","voluptas","debitis","sint","accusantium","unde","sapiente","voluptate","qui","aspernatur","laudantium","soluta","amet","quo","aliquam","saepe","culpa","libero","ipsa","dicta","reiciendis","nesciunt","doloribus","autem","impedit","minima","maiores","repudiandae","ipsam","obcaecati","ullam","enim","totam","delectus","ducimus",
"quis","voluptates","dolores","molestiae","harum","dolorem","quia","voluptatem","molestias","magni","distinctio","omnis","illum","dolorum","voluptatum","ea","quas","quam","corporis","quae","blanditiis","atque","deserunt","laboriosam","earum","consequuntur","hic","cupiditate","quibusdam","accusamus","ut","rerum","error","minus","eius","ab","ad","nemo","fugit","officia","at","in","id","quos","reprehenderit","numquam","iste","fugiat","sit","inventore","beatae","repellendus","magnam","recusandae","quod",
"explicabo","doloremque","aperiam","consequatur","asperiores","commodi","optio","dolor","labore","temporibus","repellat","veniam","architecto","est","esse","mollitia","nulla","a","similique","eos","alias","dolore","tenetur","deleniti","porro","facere","maxime","corrupti"]});emmet.exec(function(h){h("actions").add("select_line",function(d){var f=d.getCurrentLineRange();d.createSelection(f.start,f.end);return!0})});
emmet.exec(function(h){h("resources").setVocabulary({variables:{lang:"en",locale:"en-US",charset:"UTF-8",indentation:"\t",newline:"\n"},css:{filters:"html",snippets:{"@i":"@import url(|);","@m":"@media print {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","@f+":"@font-face {\n\tfont-family: '${1:FontName}';\n\tsrc: url('${2:FileName}.eot');\n\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\n\t\t url('${2:FileName}.woff') format('woff'),\n\t\t url('${2:FileName}.ttf') format('truetype'),\n\t\t url('${2:FileName}.svg#${1:FontName}') format('svg');\n\tfont-style: ${3:normal};\n\tfont-weight: ${4:normal};\n}",
"!":"!important",pos:"position:|;","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;",t:"top:|;","t:a":"top:auto;",r:"right:|;","r:a":"right:auto;",b:"bottom:|;","b:a":"bottom:auto;",l:"left:|;","l:a":"left:auto;",z:"z-index:|;","z:a":"z-index:auto;",fl:"float:|;","fl:n":"float:none;","fl:l":"float:left;","fl:r":"float:right;",cl:"clear:|;","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;",d:"display:|;",
"d:n":"display:none;","d:b":"display:block;","d:i":"display:inline;","d:ib":"display:inline-block;","d:li":"display:list-item;","d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;",
"d:rb":"display:ruby;","d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;","d:rbtg":"display:ruby-text-group;",v:"visibility:|;","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;",ov:"overflow:|;","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;",ovx:"overflow-x:|;","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;",
ovy:"overflow-y:|;","ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;","ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;",ovs:"overflow-style:|;","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;",zoo:"zoom:1;",cp:"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(|);",bxz:"box-sizing:|;","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;",bxsh:"box-shadow:${1:hoff} ${2:voff} ${3:radius} ${4:color};",
"bxsh:n":"box-shadow:none;",m:"margin:|;","m:a":"margin:auto;",mt:"margin-top:|;","mt:a":"margin-top:auto;",mr:"margin-right:|;","mr:a":"margin-right:auto;",mb:"margin-bottom:|;","mb:a":"margin-bottom:auto;",ml:"margin-left:|;","ml:a":"margin-left:auto;",p:"padding:|;",pt:"padding-top:|;",pr:"padding-right:|;",pb:"padding-bottom:|;",pl:"padding-left:|;",w:"width:|;","w:a":"width:auto;",h:"height:|;","h:a":"height:auto;",maw:"max-width:|;","maw:n":"max-width:none;",mah:"max-height:|;","mah:n":"max-height:none;",
miw:"min-width:|;",mih:"min-height:|;",o:"outline:|;","o:n":"outline:none;",oo:"outline-offset:|;",ow:"outline-width:|;",os:"outline-style:|;",oc:"outline-color:${1:#000};","oc:i":"outline-color:invert;",bd:"border:|;","bd+":"border:${1:1px} ${2:solid} ${3:#000};","bd:n":"border:none;",bdbk:"border-break:|;","bdbk:c":"border-break:close;",bdcl:"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;",bdc:"border-color:${1:#000};",bdi:"border-image:url(|);","bdi:n":"border-image:none;",
miw:"min-width:|;",mih:"min-height:|;",o:"outline:|;","o:n":"outline:none;",oo:"outline-offset:|;",ow:"outline-width:|;",os:"outline-style:|;",oc:"outline-color:#${1:000};","oc:i":"outline-color:invert;",bd:"border:|;","bd+":"border:${1:1px} ${2:solid} ${3:#000};","bd:n":"border:none;",bdbk:"border-break:|;","bdbk:c":"border-break:close;",bdcl:"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;",bdc:"border-color:#${1:000};",bdi:"border-image:url(|);","bdi:n":"border-image:none;",
bdti:"border-top-image:url(|);","bdti:n":"border-top-image:none;",bdri:"border-right-image:url(|);","bdri:n":"border-right-image:none;",bdbi:"border-bottom-image:url(|);","bdbi:n":"border-bottom-image:none;",bdli:"border-left-image:url(|);","bdli:n":"border-left-image:none;",bdci:"border-corner-image:url(|);","bdci:n":"border-corner-image:none;","bdci:c":"border-corner-image:continue;",bdtli:"border-top-left-image:url(|);","bdtli:n":"border-top-left-image:none;","bdtli:c":"border-top-left-image:continue;",
bdtri:"border-top-right-image:url(|);","bdtri:n":"border-top-right-image:none;","bdtri:c":"border-top-right-image:continue;",bdbri:"border-bottom-right-image:url(|);","bdbri:n":"border-bottom-right-image:none;","bdbri:c":"border-bottom-right-image:continue;",bdbli:"border-bottom-left-image:url(|);","bdbli:n":"border-bottom-left-image:none;","bdbli:c":"border-bottom-left-image:continue;",bdf:"border-fit:|;","bdf:c":"border-fit:clip;","bdf:r":"border-fit:repeat;","bdf:sc":"border-fit:scale;","bdf:st":"border-fit:stretch;",
"bdf:ow":"border-fit:overwrite;","bdf:of":"border-fit:overflow;","bdf:sp":"border-fit:space;",bdl:"border-length:|;","bdl:a":"border-length:auto;",bdsp:"border-spacing:|;",bds:"border-style:|;","bds:n":"border-style:none;","bds:h":"border-style:hidden;","bds:dt":"border-style:dotted;","bds:ds":"border-style:dashed;","bds:s":"border-style:solid;","bds:db":"border-style:double;","bds:dtds":"border-style:dot-dash;","bds:dtdtds":"border-style:dot-dot-dash;","bds:w":"border-style:wave;","bds:g":"border-style:groove;",
"bds:r":"border-style:ridge;","bds:i":"border-style:inset;","bds:o":"border-style:outset;",bdw:"border-width:|;",bdt:"border-top:|;","bdt+":"border-top:${1:1px} ${2:solid} ${3:#000};","bdt:n":"border-top:none;",bdtw:"border-top-width:|;",bdts:"border-top-style:|;","bdts:n":"border-top-style:none;",bdtc:"border-top-color:${1:#000};",bdr:"border-right:|;","bdr+":"border-right:${1:1px} ${2:solid} ${3:#000};","bdr:n":"border-right:none;",bdrw:"border-right-width:|;",bdrs:"border-right-style:|;","bdrs:n":"border-right-style:none;",
bdrc:"border-right-color:${1:#000};",bdb:"border-bottom:|;","bdb+":"border-bottom:${1:1px} ${2:solid} ${3:#000};","bdb:n":"border-bottom:none;",bdbw:"border-bottom-width:|;",bdbs:"border-bottom-style:|;","bdbs:n":"border-bottom-style:none;",bdbc:"border-bottom-color:${1:#000};",bdl:"border-left:|;","bdl+":"border-left:${1:1px} ${2:solid} ${3:#000};","bdl:n":"border-left:none;",bdlw:"border-left-width:|;",bdls:"border-left-style:|;","bdls:n":"border-left-style:none;",bdlc:"border-left-color:${1:#000};",
bdrs:"border-radius:|;",bdtrrs:"border-top-right-radius:|;",bdtlrs:"border-top-left-radius:|;",bdbrrs:"border-bottom-right-radius:|;",bdblrs:"border-bottom-left-radius:|;",bg:"background:|;","bg+":"background:${1:#fff} url(${2}) ${3:0} ${4:0} ${5:no-repeat};","bg:n":"background:none;","bg:ie":"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1:x}.png',sizingMethod='${2:crop}');",bgc:"background-color:${1:#fff};",bgi:"background-image:url(|);","bgi:n":"background-image:none;",bgr:"background-repeat:|;",
"bgr:n":"background-repeat:no-repeat;","bgr:x":"background-repeat:repeat-x;","bgr:y":"background-repeat:repeat-y;",bga:"background-attachment:|;","bga:f":"background-attachment:fixed;","bga:s":"background-attachment:scroll;",bgp:"background-position:${1:0} ${2:0};",bgpx:"background-position-x:|;",bgpy:"background-position-y:|;",bgbk:"background-break:|;","bgbk:bb":"background-break:bounding-box;","bgbk:eb":"background-break:each-box;","bgbk:c":"background-break:continuous;",bgcp:"background-clip:|;",
"bgcp:bb":"background-clip:border-box;","bgcp:pb":"background-clip:padding-box;","bgcp:cb":"background-clip:content-box;","bgcp:nc":"background-clip:no-clip;",bgo:"background-origin:|;","bgo:pb":"background-origin:padding-box;","bgo:bb":"background-origin:border-box;","bgo:cb":"background-origin:content-box;",bgz:"background-size:|;","bgz:a":"background-size:auto;","bgz:ct":"background-size:contain;","bgz:cv":"background-size:cover;",c:"color:${1:#000};",tbl:"table-layout:|;","tbl:a":"table-layout:auto;",
"tbl:f":"table-layout:fixed;",cps:"caption-side:|;","cps:t":"caption-side:top;","cps:b":"caption-side:bottom;",ec:"empty-cells:|;","ec:s":"empty-cells:show;","ec:h":"empty-cells:hide;",lis:"list-style:|;","lis:n":"list-style:none;",lisp:"list-style-position:|;","lisp:i":"list-style-position:inside;","lisp:o":"list-style-position:outside;",list:"list-style-type:|;","list:n":"list-style-type:none;","list:d":"list-style-type:disc;","list:c":"list-style-type:circle;","list:s":"list-style-type:square;",
"list:dc":"list-style-type:decimal;","list:dclz":"list-style-type:decimal-leading-zero;","list:lr":"list-style-type:lower-roman;","list:ur":"list-style-type:upper-roman;",lisi:"list-style-image:|;","lisi:n":"list-style-image:none;",q:"quotes:|;","q:n":"quotes:none;","q:ru":"quotes:'\\00AB' '\\00BB' '\\201E' '\\201C';","q:en":"quotes:'\\201C' '\\201D' '\\2018' '\\2019';",ct:"content:|;","ct:n":"content:normal;","ct:oq":"content:open-quote;","ct:noq":"content:no-open-quote;","ct:cq":"content:close-quote;",
"ct:ncq":"content:no-close-quote;","ct:a":"content:attr(|);","ct:c":"content:counter(|);","ct:cs":"content:counters(|);",coi:"counter-increment:|;",cor:"counter-reset:|;",va:"vertical-align:|;","va:sup":"vertical-align:super;","va:t":"vertical-align:top;","va:tt":"vertical-align:text-top;","va:m":"vertical-align:middle;","va:bl":"vertical-align:baseline;","va:b":"vertical-align:bottom;","va:tb":"vertical-align:text-bottom;","va:sub":"vertical-align:sub;",ta:"text-align:|;","ta:l":"text-align:left;",
"ta:c":"text-align:center;","ta:r":"text-align:right;",tal:"text-align-last:|;","tal:a":"text-align-last:auto;","tal:l":"text-align-last:left;","tal:c":"text-align-last:center;","tal:r":"text-align-last:right;",td:"text-decoration:|;","td:n":"text-decoration:none;","td:u":"text-decoration:underline;","td:o":"text-decoration:overline;","td:l":"text-decoration:line-through;",te:"text-emphasis:|;","te:n":"text-emphasis:none;","te:ac":"text-emphasis:accent;","te:dt":"text-emphasis:dot;","te:c":"text-emphasis:circle;",
"te:ds":"text-emphasis:disc;","te:b":"text-emphasis:before;","te:a":"text-emphasis:after;",th:"text-height:|;","th:a":"text-height:auto;","th:f":"text-height:font-size;","th:t":"text-height:text-size;","th:m":"text-height:max-size;",ti:"text-indent:|;","ti:-":"text-indent:-9999px;",tj:"text-justify:|;","tj:a":"text-justify:auto;","tj:iw":"text-justify:inter-word;","tj:ii":"text-justify:inter-ideograph;","tj:ic":"text-justify:inter-cluster;","tj:d":"text-justify:distribute;","tj:k":"text-justify:kashida;",
"tj:t":"text-justify:tibetan;",to:"text-outline:|;","to+":"text-outline:${1:0} ${2:0} ${3:#000};","to:n":"text-outline:none;",tr:"text-replace:|;","tr:n":"text-replace:none;",tt:"text-transform:|;","tt:n":"text-transform:none;","tt:c":"text-transform:capitalize;","tt:u":"text-transform:uppercase;","tt:l":"text-transform:lowercase;",tw:"text-wrap:|;","tw:n":"text-wrap:normal;","tw:no":"text-wrap:none;","tw:u":"text-wrap:unrestricted;","tw:s":"text-wrap:suppress;",tsh:"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000};",
"tsh+":"text-shadow:${1:0} ${2:0} ${3:0} ${4:#000};","tsh:n":"text-shadow:none;",trf:"transform:|;","trf:skx":"transform: skewX(${1:angle});","trf:sky":"transform: skewY(${1:angle});","trf:sc":"transform: scale(${1:x}, ${2:y});","trf:scx":"transform: scaleX(${1:x});","trf:scy":"transform: scaleY(${1:y});","trf:r":"transform: rotate(${1:angle});","trf:t":"transform: translate(${1:x}, ${2:y});","trf:tx":"transform: translateX(${1:x});","trf:ty":"transform: translateY(${1:y});",lh:"line-height:|;",whs:"white-space:|;",
"whs:n":"white-space:normal;","whs:p":"white-space:pre;","whs:nw":"white-space:nowrap;","whs:pw":"white-space:pre-wrap;","whs:pl":"white-space:pre-line;",whsc:"white-space-collapse:|;","whsc:n":"white-space-collapse:normal;","whsc:k":"white-space-collapse:keep-all;","whsc:l":"white-space-collapse:loose;","whsc:bs":"white-space-collapse:break-strict;","whsc:ba":"white-space-collapse:break-all;",wob:"word-break:|;","wob:n":"word-break:normal;","wob:k":"word-break:keep-all;","wob:l":"word-break:loose;",
"wob:bs":"word-break:break-strict;","wob:ba":"word-break:break-all;",wos:"word-spacing:|;",wow:"word-wrap:|;","wow:nm":"word-wrap:normal;","wow:n":"word-wrap:none;","wow:u":"word-wrap:unrestricted;","wow:s":"word-wrap:suppress;",lts:"letter-spacing:|;",f:"font:|;","f+":"font:${1:1em} ${2:Arial,sans-serif};",fw:"font-weight:|;","fw:n":"font-weight:normal;","fw:b":"font-weight:bold;","fw:br":"font-weight:bolder;","fw:lr":"font-weight:lighter;",fs:"font-style:|;","fs:n":"font-style:normal;","fs:i":"font-style:italic;",
"fs:o":"font-style:oblique;",fv:"font-variant:|;","fv:n":"font-variant:normal;","fv:sc":"font-variant:small-caps;",fz:"font-size:|;",fza:"font-size-adjust:|;","fza:n":"font-size-adjust:none;",ff:"font-family:|;","ff:s":"font-family:serif;","ff:ss":"font-family:sans-serif;","ff:c":"font-family:cursive;","ff:f":"font-family:fantasy;","ff:m":"font-family:monospace;",fef:"font-effect:|;","fef:n":"font-effect:none;","fef:eg":"font-effect:engrave;","fef:eb":"font-effect:emboss;","fef:o":"font-effect:outline;",
fem:"font-emphasize:|;",femp:"font-emphasize-position:|;","femp:b":"font-emphasize-position:before;","femp:a":"font-emphasize-position:after;",fems:"font-emphasize-style:|;","fems:n":"font-emphasize-style:none;","fems:ac":"font-emphasize-style:accent;","fems:dt":"font-emphasize-style:dot;","fems:c":"font-emphasize-style:circle;","fems:ds":"font-emphasize-style:disc;",fsm:"font-smooth:|;","fsm:a":"font-smooth:auto;","fsm:n":"font-smooth:never;","fsm:aw":"font-smooth:always;",fst:"font-stretch:|;",
"fst:n":"font-stretch:normal;","fst:uc":"font-stretch:ultra-condensed;","fst:ec":"font-stretch:extra-condensed;","fst:c":"font-stretch:condensed;","fst:sc":"font-stretch:semi-condensed;","fst:se":"font-stretch:semi-expanded;","fst:e":"font-stretch:expanded;","fst:ee":"font-stretch:extra-expanded;","fst:ue":"font-stretch:ultra-expanded;",op:"opacity:|;","op:ie":"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);","op:ms":"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';",
rz:"resize:|;","rz:n":"resize:none;","rz:b":"resize:both;","rz:h":"resize:horizontal;","rz:v":"resize:vertical;",cur:"cursor:|;","cur:a":"cursor:auto;","cur:d":"cursor:default;","cur:c":"cursor:crosshair;","cur:ha":"cursor:hand;","cur:he":"cursor:help;","cur:m":"cursor:move;","cur:p":"cursor:pointer;","cur:t":"cursor:text;",pgbb:"page-break-before:|;","pgbb:au":"page-break-before:auto;","pgbb:al":"page-break-before:always;","pgbb:l":"page-break-before:left;","pgbb:r":"page-break-before:right;",pgbi:"page-break-inside:|;",
"pgbi:au":"page-break-inside:auto;","pgbi:av":"page-break-inside:avoid;",pgba:"page-break-after:|;","pgba:au":"page-break-after:auto;","pgba:al":"page-break-after:always;","pgba:l":"page-break-after:left;","pgba:r":"page-break-after:right;",orp:"orphans:|;",wid:"widows:|;"}},html:{filters:"html",snippets:{"cc:ie6":"<\!--[if lte IE 6]>\n\t${child}|\n<![endif]--\>","cc:ie":"<\!--[if IE]>\n\t${child}|\n<![endif]--\>","cc:noie":"<\!--[if !IE]><\!--\>\n\t${child}|\n<\!--<![endif]--\>","html:4t":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}">\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>',
"html:4s":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}">\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>',"html:xt":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>',
"html:xs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>',"html:xxs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>',
"html:5":'<!doctype html>\n<html lang="${lang}">\n<head>\n\t<meta charset="${charset}">\n\t<title></title>\n</head>\n<body>\n\t${child}|\n</body>\n</html>'},abbreviations:{a:'<a href="">',"a:link":'<a href="http://|">',"a:mail":'<a href="mailto:|">',abbr:'<abbr title="">',acronym:'<acronym title="">',base:'<base href="" />',bdo:'<bdo dir="">',"bdo:r":'<bdo dir="rtl">',"bdo:l":'<bdo dir="ltr">',link:'<link rel="stylesheet" href="" />',"link:css":'<link rel="stylesheet" href="${1:style}.css" media="all" />',
"bds:r":"border-style:ridge;","bds:i":"border-style:inset;","bds:o":"border-style:outset;",bdw:"border-width:|;",bdt:"border-top:|;",bt:"border-top:|;","bdt+":"border-top:${1:1px} ${2:solid} ${3:#000};","bdt:n":"border-top:none;",bdtw:"border-top-width:|;",bdts:"border-top-style:|;","bdts:n":"border-top-style:none;",bdtc:"border-top-color:#${1:000};",bdr:"border-right:|;",br:"border-right:|;","bdr+":"border-right:${1:1px} ${2:solid} ${3:#000};","bdr:n":"border-right:none;",bdrw:"border-right-width:|;",
bdrs:"border-right-style:|;","bdrs:n":"border-right-style:none;",bdrc:"border-right-color:#${1:000};",bdb:"border-bottom:|;",bb:"border-bottom:|;","bdb+":"border-bottom:${1:1px} ${2:solid} ${3:#000};","bdb:n":"border-bottom:none;",bdbw:"border-bottom-width:|;",bdbs:"border-bottom-style:|;","bdbs:n":"border-bottom-style:none;",bdbc:"border-bottom-color:#${1:000};",bdl:"border-left:|;",bl:"border-left:|;","bdl+":"border-left:${1:1px} ${2:solid} ${3:#000};","bdl:n":"border-left:none;",bdlw:"border-left-width:|;",
bdls:"border-left-style:|;","bdls:n":"border-left-style:none;",bdlc:"border-left-color:#${1:000};",bdrs:"border-radius:|;",bdtrrs:"border-top-right-radius:|;",bdtlrs:"border-top-left-radius:|;",bdbrrs:"border-bottom-right-radius:|;",bdblrs:"border-bottom-left-radius:|;",bg:"background:|;","bg+":"background:${1:#fff} url(${2}) ${3:0} ${4:0} ${5:no-repeat};","bg:n":"background:none;","bg:ie":"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1:x}.png',sizingMethod='${2:crop}');",bgc:"background-color:#${1:fff};",
bgi:"background-image:url(|);","bgi:n":"background-image:none;",bgr:"background-repeat:|;","bgr:n":"background-repeat:no-repeat;","bgr:x":"background-repeat:repeat-x;","bgr:y":"background-repeat:repeat-y;",bga:"background-attachment:|;","bga:f":"background-attachment:fixed;","bga:s":"background-attachment:scroll;",bgp:"background-position:${1:0} ${2:0};",bgpx:"background-position-x:|;",bgpy:"background-position-y:|;",bgbk:"background-break:|;","bgbk:bb":"background-break:bounding-box;","bgbk:eb":"background-break:each-box;",
"bgbk:c":"background-break:continuous;",bgcp:"background-clip:|;","bgcp:bb":"background-clip:border-box;","bgcp:pb":"background-clip:padding-box;","bgcp:cb":"background-clip:content-box;","bgcp:nc":"background-clip:no-clip;",bgo:"background-origin:|;","bgo:pb":"background-origin:padding-box;","bgo:bb":"background-origin:border-box;","bgo:cb":"background-origin:content-box;",bgz:"background-size:|;","bgz:a":"background-size:auto;","bgz:ct":"background-size:contain;","bgz:cv":"background-size:cover;",
c:"color:#${1:000};",cm:"/* |${child} */",cn:"content:|;",tbl:"table-layout:|;","tbl:a":"table-layout:auto;","tbl:f":"table-layout:fixed;",cps:"caption-side:|;","cps:t":"caption-side:top;","cps:b":"caption-side:bottom;",ec:"empty-cells:|;","ec:s":"empty-cells:show;","ec:h":"empty-cells:hide;",lis:"list-style:|;","lis:n":"list-style:none;",lisp:"list-style-position:|;","lisp:i":"list-style-position:inside;","lisp:o":"list-style-position:outside;",list:"list-style-type:|;","list:n":"list-style-type:none;",
"list:d":"list-style-type:disc;","list:c":"list-style-type:circle;","list:s":"list-style-type:square;","list:dc":"list-style-type:decimal;","list:dclz":"list-style-type:decimal-leading-zero;","list:lr":"list-style-type:lower-roman;","list:ur":"list-style-type:upper-roman;",lisi:"list-style-image:|;","lisi:n":"list-style-image:none;",q:"quotes:|;","q:n":"quotes:none;","q:ru":"quotes:'\\00AB' '\\00BB' '\\201E' '\\201C';","q:en":"quotes:'\\201C' '\\201D' '\\2018' '\\2019';",ct:"content:|;","ct:n":"content:normal;",
"ct:oq":"content:open-quote;","ct:noq":"content:no-open-quote;","ct:cq":"content:close-quote;","ct:ncq":"content:no-close-quote;","ct:a":"content:attr(|);","ct:c":"content:counter(|);","ct:cs":"content:counters(|);",coi:"counter-increment:|;",cor:"counter-reset:|;",va:"vertical-align:|;","va:sup":"vertical-align:super;","va:t":"vertical-align:top;","va:tt":"vertical-align:text-top;","va:m":"vertical-align:middle;","va:bl":"vertical-align:baseline;","va:b":"vertical-align:bottom;","va:tb":"vertical-align:text-bottom;",
"va:sub":"vertical-align:sub;",ta:"text-align:|;","ta:l":"text-align:left;","ta:c":"text-align:center;","ta:r":"text-align:right;",tal:"text-align-last:|;","tal:a":"text-align-last:auto;","tal:l":"text-align-last:left;","tal:c":"text-align-last:center;","tal:r":"text-align-last:right;",td:"text-decoration:|;","td:n":"text-decoration:none;","td:u":"text-decoration:underline;","td:o":"text-decoration:overline;","td:l":"text-decoration:line-through;",te:"text-emphasis:|;","te:n":"text-emphasis:none;",
"te:ac":"text-emphasis:accent;","te:dt":"text-emphasis:dot;","te:c":"text-emphasis:circle;","te:ds":"text-emphasis:disc;","te:b":"text-emphasis:before;","te:a":"text-emphasis:after;",th:"text-height:|;","th:a":"text-height:auto;","th:f":"text-height:font-size;","th:t":"text-height:text-size;","th:m":"text-height:max-size;",ti:"text-indent:|;","ti:-":"text-indent:-9999px;",tj:"text-justify:|;","tj:a":"text-justify:auto;","tj:iw":"text-justify:inter-word;","tj:ii":"text-justify:inter-ideograph;","tj:ic":"text-justify:inter-cluster;",
"tj:d":"text-justify:distribute;","tj:k":"text-justify:kashida;","tj:t":"text-justify:tibetan;",to:"text-outline:|;","to+":"text-outline:${1:0} ${2:0} ${3:#000};","to:n":"text-outline:none;",tr:"text-replace:|;","tr:n":"text-replace:none;",tt:"text-transform:|;","tt:n":"text-transform:none;","tt:c":"text-transform:capitalize;","tt:u":"text-transform:uppercase;","tt:l":"text-transform:lowercase;",tw:"text-wrap:|;","tw:n":"text-wrap:normal;","tw:no":"text-wrap:none;","tw:u":"text-wrap:unrestricted;",
"tw:s":"text-wrap:suppress;",tsh:"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000};","tsh+":"text-shadow:${1:0} ${2:0} ${3:0} ${4:#000};","tsh:n":"text-shadow:none;",trf:"transform:|;","trf:skx":"transform: skewX(${1:angle});","trf:sky":"transform: skewY(${1:angle});","trf:sc":"transform: scale(${1:x}, ${2:y});","trf:scx":"transform: scaleX(${1:x});","trf:scy":"transform: scaleY(${1:y});","trf:r":"transform: rotate(${1:angle});","trf:t":"transform: translate(${1:x}, ${2:y});","trf:tx":"transform: translateX(${1:x});",
"trf:ty":"transform: translateY(${1:y});",trs:"transition:${1:prop} ${2:time};",trsde:"transition-delay:${1:time};",trsdu:"transition-duration:${1:time};",trsp:"transition-property:${1:prop};",trstf:"transition-timing-function:${1:tfunc};",lh:"line-height:|;",whs:"white-space:|;","whs:n":"white-space:normal;","whs:p":"white-space:pre;","whs:nw":"white-space:nowrap;","whs:pw":"white-space:pre-wrap;","whs:pl":"white-space:pre-line;",whsc:"white-space-collapse:|;","whsc:n":"white-space-collapse:normal;",
"whsc:k":"white-space-collapse:keep-all;","whsc:l":"white-space-collapse:loose;","whsc:bs":"white-space-collapse:break-strict;","whsc:ba":"white-space-collapse:break-all;",wob:"word-break:|;","wob:n":"word-break:normal;","wob:k":"word-break:keep-all;","wob:l":"word-break:loose;","wob:bs":"word-break:break-strict;","wob:ba":"word-break:break-all;",wos:"word-spacing:|;",wow:"word-wrap:|;","wow:nm":"word-wrap:normal;","wow:n":"word-wrap:none;","wow:u":"word-wrap:unrestricted;","wow:s":"word-wrap:suppress;",
lts:"letter-spacing:|;",f:"font:|;","f+":"font:${1:1em} ${2:Arial,sans-serif};",fw:"font-weight:|;","fw:n":"font-weight:normal;","fw:b":"font-weight:bold;","fw:br":"font-weight:bolder;","fw:lr":"font-weight:lighter;",fs:"font-style:|;","fs:n":"font-style:normal;","fs:i":"font-style:italic;","fs:o":"font-style:oblique;",fv:"font-variant:|;","fv:n":"font-variant:normal;","fv:sc":"font-variant:small-caps;",fz:"font-size:|;",fza:"font-size-adjust:|;","fza:n":"font-size-adjust:none;",ff:"font-family:|;",
"ff:s":"font-family:serif;","ff:ss":"font-family:sans-serif;","ff:c":"font-family:cursive;","ff:f":"font-family:fantasy;","ff:m":"font-family:monospace;",fef:"font-effect:|;","fef:n":"font-effect:none;","fef:eg":"font-effect:engrave;","fef:eb":"font-effect:emboss;","fef:o":"font-effect:outline;",fem:"font-emphasize:|;",femp:"font-emphasize-position:|;","femp:b":"font-emphasize-position:before;","femp:a":"font-emphasize-position:after;",fems:"font-emphasize-style:|;","fems:n":"font-emphasize-style:none;",
"fems:ac":"font-emphasize-style:accent;","fems:dt":"font-emphasize-style:dot;","fems:c":"font-emphasize-style:circle;","fems:ds":"font-emphasize-style:disc;",fsm:"font-smooth:|;","fsm:a":"font-smooth:auto;","fsm:n":"font-smooth:never;","fsm:aw":"font-smooth:always;",fst:"font-stretch:|;","fst:n":"font-stretch:normal;","fst:uc":"font-stretch:ultra-condensed;","fst:ec":"font-stretch:extra-condensed;","fst:c":"font-stretch:condensed;","fst:sc":"font-stretch:semi-condensed;","fst:se":"font-stretch:semi-expanded;",
"fst:e":"font-stretch:expanded;","fst:ee":"font-stretch:extra-expanded;","fst:ue":"font-stretch:ultra-expanded;",op:"opacity:|;","op:ie":"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);","op:ms":"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';",rz:"resize:|;","rz:n":"resize:none;","rz:b":"resize:both;","rz:h":"resize:horizontal;","rz:v":"resize:vertical;",cur:"cursor:|;","cur:a":"cursor:auto;","cur:d":"cursor:default;","cur:c":"cursor:crosshair;","cur:ha":"cursor:hand;",
"cur:he":"cursor:help;","cur:m":"cursor:move;","cur:p":"cursor:pointer;","cur:t":"cursor:text;",pgbb:"page-break-before:|;","pgbb:au":"page-break-before:auto;","pgbb:al":"page-break-before:always;","pgbb:l":"page-break-before:left;","pgbb:r":"page-break-before:right;",pgbi:"page-break-inside:|;","pgbi:au":"page-break-inside:auto;","pgbi:av":"page-break-inside:avoid;",pgba:"page-break-after:|;","pgba:au":"page-break-after:auto;","pgba:al":"page-break-after:always;","pgba:l":"page-break-after:left;",
"pgba:r":"page-break-after:right;",orp:"orphans:|;",wid:"widows:|;"}},html:{filters:"html",profile:"html",snippets:{c:"<\!-- |${child} --\>","cc:ie6":"<\!--[if lte IE 6]>\n\t${child}|\n<![endif]--\>","cc:ie":"<\!--[if IE]>\n\t${child}|\n<![endif]--\>","cc:noie":"<\!--[if !IE]><\!--\>\n\t${child}|\n<\!--<![endif]--\>","html:4t":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}">\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>',
"html:4s":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}">\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>',"html:xt":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title></title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>',
"html:xs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>',"html:xxs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${lang}">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=${charset}" />\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>',
"html:5":'<!doctype html>\n<html lang="${lang}">\n<head>\n\t<meta charset="${charset}">\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>'},abbreviations:{"!":"html:5",a:'<a href="">',"a:link":'<a href="http://|">',"a:mail":'<a href="mailto:|">',abbr:'<abbr title="">',acronym:'<acronym title="">',base:'<base href="" />',bdo:'<bdo dir="">',"bdo:r":'<bdo dir="rtl">',"bdo:l":'<bdo dir="ltr">',link:'<link rel="stylesheet" href="" />',"link:css":'<link rel="stylesheet" href="${1:style}.css" media="all" />',
"link:print":'<link rel="stylesheet" href="${1:print}.css" media="print" />',"link:favicon":'<link rel="shortcut icon" type="image/x-icon" href="${1:favicon.ico}" />',"link:touch":'<link rel="apple-touch-icon" href="${1:favicon.png}" />',"link:rss":'<link rel="alternate" type="application/rss+xml" title="RSS" href="${1:rss.xml}" />',"link:atom":'<link rel="alternate" type="application/atom+xml" title="Atom" href="${1:atom.xml}" />',"meta:utf":'<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />',
"meta:win":'<meta http-equiv="Content-Type" content="text/html;charset=windows-1251" />',"meta:compat":'<meta http-equiv="X-UA-Compatible" content="${1:IE=7}" />',style:"<style>",script:"<script>","script:src":'<script src="">',img:'<img src="" alt="" />',iframe:'<iframe src="" frameborder="0">',embed:'<embed src="" type="" />',object:'<object data="" type="">',param:'<param name="" value="" />',map:'<map name="">',area:'<area shape="" coords="" href="" alt="" />',"area:d":'<area shape="default" href="" alt="" />',
"area:c":'<area shape="circle" coords="" href="" alt="" />',"area:r":'<area shape="rect" coords="" href="" alt="" />',"area:p":'<area shape="poly" coords="" href="" alt="" />',form:'<form action="">',"form:get":'<form action="" method="get">',"form:post":'<form action="" method="post">',label:'<label for="">',input:'<input type="" />',"input:hidden":'<input type="hidden" name="" />',"input:h":'<input type="hidden" name="" />',"input:text":'<input type="text" name="" id="" />',"input:t":'<input type="text" name="" id="" />',
"input:search":'<input type="search" name="" id="" />',"input:email":'<input type="email" name="" id="" />',"input:url":'<input type="url" name="" id="" />',"input:password":'<input type="password" name="" id="" />',"input:p":'<input type="password" name="" id="" />',"input:datetime":'<input type="datetime" name="" id="" />',"input:date":'<input type="date" name="" id="" />',"input:datetime-local":'<input type="datetime-local" name="" id="" />',"input:month":'<input type="month" name="" id="" />',
"input:week":'<input type="week" name="" id="" />',"input:time":'<input type="time" name="" id="" />',"input:number":'<input type="number" name="" id="" />',"input:color":'<input type="color" name="" id="" />',"input:checkbox":'<input type="checkbox" name="" id="" />',"input:c":'<input type="checkbox" name="" id="" />',"input:radio":'<input type="radio" name="" id="" />',"input:r":'<input type="radio" name="" id="" />',"input:range":'<input type="range" name="" id="" />',"input:file":'<input type="file" name="" id="" />',
"input:f":'<input type="file" name="" id="" />',"input:submit":'<input type="submit" value="" />',"input:s":'<input type="submit" value="" />',"input:image":'<input type="image" src="" alt="" />',"input:i":'<input type="image" src="" alt="" />',"input:reset":'<input type="reset" value="" />',"input:button":'<input type="button" value="" />',"input:b":'<input type="button" value="" />',select:'<select name="" id=""></select>',option:'<option value=""></option>',textarea:'<textarea name="" id="" cols="${1:30}" rows="${2:10}">',
"menu:context":'<menu type="context">',"menu:c":'<menu type="context">',"menu:toolbar":'<menu type="toolbar">',"menu:t":'<menu type="toolbar">',video:'<video src="">',audio:'<audio src="">',"html:xml":'<html xmlns="http://www.w3.org/1999/xhtml">',bq:"<blockquote>",acr:"<acronym>",fig:"<figure>",figc:"<figcaption>",ifr:"<iframe>",emb:"<embed>",obj:"<object>",src:"<source>",cap:"<caption>",colg:"<colgroup>",fst:"<fieldset>",btn:"<button>",optg:"<optgroup>",opt:"<option>",tarea:"<textarea>",leg:"<legend>",
sect:"<section>",art:"<article>",hdr:"<header>",ftr:"<footer>",adr:"<address>",dlg:"<dialog>",str:"<strong>",prog:"<progress>",fset:"<fieldset>",datag:"<datagrid>",datal:"<datalist>",kg:"<keygen>",out:"<output>",det:"<details>",cmd:"<command>","ol+":"ol>li","ul+":"ul>li","dl+":"dl>dt+dd","map+":"map>area","table+":"table>tr>td","colgroup+":"colgroup>col","colg+":"colgroup>col","tr+":"tr>td","select+":"select>option","optgroup+":"optgroup>option","optg+":"optgroup>option"}},xml:{"extends":"html",profile:"xml",
filters:"html"},xsl:{"extends":"html",filters:"html, xsl",abbreviations:{tm:'<xsl:template match="" mode="">',tmatch:"tm",tn:'<xsl:template name="">',tname:"tn",call:'<xsl:call-template name=""/>',ap:'<xsl:apply-templates select="" mode=""/>',api:"<xsl:apply-imports/>",imp:'<xsl:import href=""/>',inc:'<xsl:include href=""/>',ch:"<xsl:choose>","xsl:when":'<xsl:when test="">',wh:"xsl:when",ot:"<xsl:otherwise>","if":'<xsl:if test="">',par:'<xsl:param name="">',pare:'<xsl:param name="" select=""/>',"var":'<xsl:variable name="">',
vare:'<xsl:variable name="" select=""/>',wp:'<xsl:with-param name="" select=""/>',key:'<xsl:key name="" match="" use=""/>',elem:'<xsl:element name="">',attr:'<xsl:attribute name="">',attrs:'<xsl:attribute-set name="">',cp:'<xsl:copy select=""/>',co:'<xsl:copy-of select=""/>',val:'<xsl:value-of select=""/>',each:'<xsl:for-each select="">',"for":"each",tex:"<xsl:text></xsl:text>",com:"<xsl:comment>",msg:'<xsl:message terminate="no">',fall:"<xsl:fallback>",num:'<xsl:number value=""/>',nam:'<namespace-alias stylesheet-prefix="" result-prefix=""/>',
pres:'<xsl:preserve-space elements=""/>',strip:'<xsl:strip-space elements=""/>',proc:'<xsl:processing-instruction name="">',sort:'<xsl:sort select="" order=""/>',"choose+":"xsl:choose>xsl:when+xsl:otherwise"}},haml:{filters:"haml","extends":"html"},scss:{filters:"haml","extends":"css"},sass:{filters:"haml","extends":"css"},less:{filters:"haml","extends":"css"}},"system");
emmet.exec(function(h,e){var g={"Cmd-E":"expand_abbreviation",Tab:"expand_abbreviation","Cmd-D":"match_pair_outward","Shift-Cmd-D":"match_pair_inward","Shift-Cmd-A":"wrap_with_abbreviation","Ctrl-Alt-Right":"next_edit_point","Ctrl-Alt-Left":"prev_edit_point","Cmd-L":"select_line","Cmd-Shift-M":"merge_lines","Cmd-/":"toggle_comment","Cmd-J":"split_join_tag","Cmd-K":"remove_tag","Shift-Cmd-Y":"evaluate_math_expression","Ctrl-Up":"increment_number_by_1","Ctrl-Down":"decrement_number_by_1","Alt-Up":"increment_number_by_01",
"Alt-Down":"decrement_number_by_01","Ctrl-Alt-Up":"increment_number_by_10","Ctrl-Alt-Down":"decrement_number_by_10","Cmd-.":"select_next_item","Cmd-,":"select_previous_item","Cmd-B":"reflect_css_value",Enter:"insert_formatted_line_break"},f={"text/html":"html","application/xml":"xml","text/xsl":"xsl","text/css":"css","text/x-less":"less"};if(!(/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent)||/Mac/.test(navigator.platform))){var c={};e.each(g,function(a,b){c[b.replace("Cmd",
"Ctrl")]=a});g=c}CodeMirror.defaults.profile="html";var b={context:null,getSelectionRange:function(){var a=this.getCaretPos();return{start:a,end:a+this.getSelection().length}},createSelection:function(a,b){a==b?this.context.setCursor(this.context.posFromIndex(a)):this.context.setSelection(this.context.posFromIndex(a),this.context.posFromIndex(b))},getCurrentLineRange:function(){var a=this.context.getCursor(!0);return{start:this.context.indexFromPos({line:a.line,ch:0}),end:this.context.indexFromPos({line:a.line,
ch:this.context.getLine(a.line).length})}},getCaretPos:function(){return this.context.indexFromPos(this.context.getCursor(!0))},setCaretPos:function(a){this.createSelection(a,a)},getCurrentLine:function(){return this.context.getLine(this.context.getCursor(!0).line)||""},replaceContent:function(a,b,c,f){e.isUndefined(c)&&(c=e.isUndefined(b)?content.length:b);e.isUndefined(b)&&(b=0);var g=h("utils");f||(a=g.padString(a,g.getLinePaddingFromPosition(this.getContent(),b)));var f=h("tabStops").extract(a,
{escape:function(a){return a}}),a=f.text,n=f.tabstops[0];n?(n.start+=b,n.end+=b):n={start:a.length+b,end:a.length+b};var m=this;this.context.compoundChange(function(){m.context.replaceRange(a,m.context.posFromIndex(b),m.context.posFromIndex(c));m.createSelection(n.start,n.end)})},getContent:function(){return this.context.getValue()},getSyntax:function(){var a=this.context.getOption("mode");a in f&&(a=f[a]);var b=this.getCaretPos();h("resources").hasSyntax(a)||(a="html");if(a=="html"){var c=h("html_matcher").getTags(this.getContent(),
b);c&&c[0]&&c[0].type=="tag"&&c[0].name.toLowerCase()=="style"&&c[0].end<=b&&c[1].start>=b&&(a="css")}return a},getProfileName:function(){if(this.context.getOption("profile"))return this.context.getOption("profile");switch(this.getSyntax()){case "xml":case "xsl":return"xml";case "html":var a=h("resources").getVariable("profile");a||(a=this.getContent().search(/<!DOCTYPE[^>]+XHTML/i)!=-1?"xhtml":"html");return a}return"xhtml"},prompt:function(a){return prompt(a)},getSelection:function(){return this.context.getSelection()||
""},getFilePath:function(){return location.href}};if(!CodeMirror.defaults.extraKeys)CodeMirror.defaults.extraKeys={};e.each(g,function(a,c){CodeMirror.defaults.extraKeys[c]=function(c){b.context=c;var d="\t";c.getOption("indentWithTabs")||(d=h("utils").repeatString(" ",c.getOption("indentUnit")));h("resources").setVariable("indentation",d);try{if(h("actions").run(a,b))return!0}catch(e){}throw CodeMirror.Pass;}})});
"menu:context":'<menu type="context">',"menu:c":'<menu type="context">',"menu:toolbar":'<menu type="toolbar">',"menu:t":'<menu type="toolbar">',video:'<video src="">',audio:'<audio src="">',"html:xml":'<html xmlns="http://www.w3.org/1999/xhtml">',bq:"blockquote",acr:"acronym",fig:"figure",figc:"figcaption",ifr:"iframe",emb:"embed",obj:"object",src:"source",cap:"caption",colg:"colgroup",fst:"fieldset",btn:"button",optg:"optgroup",opt:"option",tarea:"textarea",leg:"legend",sect:"section",art:"article",
hdr:"header",ftr:"footer",adr:"address",dlg:"dialog",str:"strong",prog:"progress",fset:"fieldset",datag:"datagrid",datal:"datalist",kg:"keygen",out:"output",det:"details",cmd:"command","ol+":"ol>li","ul+":"ul>li","dl+":"dl>dt+dd","map+":"map>area","table+":"table>tr>td","colgroup+":"colgroup>col","colg+":"colgroup>col","tr+":"tr>td","select+":"select>option","optgroup+":"optgroup>option","optg+":"optgroup>option"}},xml:{"extends":"html",profile:"xml",filters:"html"},xsl:{"extends":"html",profile:"xml",
filters:"html, xsl",abbreviations:{tm:'<xsl:template match="" mode="">',tmatch:"tm",tn:'<xsl:template name="">',tname:"tn",call:'<xsl:call-template name=""/>',ap:'<xsl:apply-templates select="" mode=""/>',api:"<xsl:apply-imports/>",imp:'<xsl:import href=""/>',inc:'<xsl:include href=""/>',ch:"<xsl:choose>","xsl:when":'<xsl:when test="">',wh:"xsl:when",ot:"<xsl:otherwise>","if":'<xsl:if test="">',par:'<xsl:param name="">',pare:'<xsl:param name="" select=""/>',"var":'<xsl:variable name="">',vare:'<xsl:variable name="" select=""/>',
wp:'<xsl:with-param name="" select=""/>',key:'<xsl:key name="" match="" use=""/>',elem:'<xsl:element name="">',attr:'<xsl:attribute name="">',attrs:'<xsl:attribute-set name="">',cp:'<xsl:copy select=""/>',co:'<xsl:copy-of select=""/>',val:'<xsl:value-of select=""/>',each:'<xsl:for-each select="">',"for":"each",tex:"<xsl:text></xsl:text>",com:"<xsl:comment>",msg:'<xsl:message terminate="no">',fall:"<xsl:fallback>",num:'<xsl:number value=""/>',nam:'<namespace-alias stylesheet-prefix="" result-prefix=""/>',
pres:'<xsl:preserve-space elements=""/>',strip:'<xsl:strip-space elements=""/>',proc:'<xsl:processing-instruction name="">',sort:'<xsl:sort select="" order=""/>',"choose+":"xsl:choose>xsl:when+xsl:otherwise"}},haml:{filters:"haml","extends":"html"},scss:{"extends":"css"},sass:{"extends":"css"},less:{"extends":"css"},stylus:{"extends":"css"}},"system")});
emmet.define("cm-editor-proxy",function(h,d){var f=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent)||/Mac/.test(navigator.platform),i={"Cmd-E":"expand_abbreviation",Tab:"expand_abbreviation_with_tab","Cmd-D":"match_pair_outward","Shift-Cmd-D":"match_pair_inward","Cmd-T":"matching_pair","Shift-Cmd-A":"wrap_with_abbreviation","Ctrl-Alt-Right":"next_edit_point","Ctrl-Alt-Left":"prev_edit_point","Cmd-L":"select_line","Cmd-Shift-M":"merge_lines","Cmd-/":"toggle_comment",
"Cmd-J":"split_join_tag","Cmd-K":"remove_tag","Shift-Cmd-Y":"evaluate_math_expression","Ctrl-Up":"increment_number_by_1","Ctrl-Down":"decrement_number_by_1","Alt-Up":"increment_number_by_01","Alt-Down":"decrement_number_by_01","Ctrl-Alt-Up":"increment_number_by_10","Ctrl-Alt-Down":"decrement_number_by_10","Shift-Cmd-.":"select_next_item","Shift-Cmd-,":"select_previous_item","Cmd-B":"reflect_css_value",Enter:"insert_formatted_line_break_only"},b={"text/html":"html","application/xml":"xml","text/xsl":"xsl",
"text/css":"css","text/x-less":"less"};CodeMirror.defineOption?CodeMirror.defineOption("profile","html"):CodeMirror.defaults.profile="html";var c={context:null,getSelectionRange:function(){var a=this.getCaretPos();return{start:a,end:a+this.getSelection().length}},createSelection:function(a,b){a==b?this.context.setCursor(this.context.posFromIndex(a)):this.context.setSelection(this.context.posFromIndex(a),this.context.posFromIndex(b))},getCurrentLineRange:function(){var a=this.context.getCursor(!0);
return{start:this.context.indexFromPos({line:a.line,ch:0}),end:this.context.indexFromPos({line:a.line,ch:this.context.getLine(a.line).length})}},getCaretPos:function(){return this.context.indexFromPos(this.context.getCursor(!0))},setCaretPos:function(a){this.createSelection(a,a)},getCurrentLine:function(){return this.context.getLine(this.context.getCursor(!0).line)||""},replaceContent:function(a,b,c,f){d.isUndefined(c)&&(c=d.isUndefined(b)?content.length:b);d.isUndefined(b)&&(b=0);var i=h("utils");
f||(a=i.padString(a,i.getLinePaddingFromPosition(this.getContent(),b)));var f=h("tabStops").extract(a,{escape:function(a){return a}}),a=f.text,m=f.tabstops[0];m?(m.start+=b,m.end+=b):m={start:a.length+b,end:a.length+b};var n=this;(this.context.operation||this.context.compoundChange).call(this.context,function(){n.context.replaceRange(a,n.context.posFromIndex(b),n.context.posFromIndex(c));n.createSelection(m.start,m.end)})},getContent:function(){return this.context.getValue()},getSyntax:function(){var a=
this.context.getOption("mode");a in b&&(a=b[a]);return h("actionUtils").detectSyntax(this,a)},getProfileName:function(){return this.context.getOption("profile")?this.context.getOption("profile"):h("actionUtils").detectProfile(this)},prompt:function(a){return prompt(a)},getSelection:function(){return this.context.getSelection()||""},getFilePath:function(){return location.href},setupContext:function(a){this.context=a;var b="\t";a.getOption("indentWithTabs")||(b=h("utils").repeatString(" ",a.getOption("indentUnit")));
h("resources").setVariable("indentation",b)},addAction:function(a,b){var d="emmet."+a;CodeMirror.commands[d]||(CodeMirror.commands[d]=function(b){c.setupContext(b);var d;if(d=a=="expand_abbreviation_with_tab")if(!(d=c.getSelection()))d=c.getSyntax(),d=!h("resources").hasSyntax(d);if(d)return CodeMirror.Pass;d=!0;try{var e=h("actions").run(a,c);(a=="next_edit_point"||a=="prev_edit_point")&&b.replaceSelection("");!e&&a=="insert_formatted_line_break_only"&&(d=!1)}catch(f){}if(!d)return CodeMirror.Pass;
});if(b){if(!CodeMirror.defaults.extraKeys)CodeMirror.defaults.extraKeys={};f||(b=b.replace("Cmd","Ctrl"));CodeMirror.defaults.extraKeys[b]=d}}};typeof emmetKeymap!="undefined"&&(i=emmetKeymap);d.each(i,c.addAction);return c});

View File

@@ -1,29 +1,387 @@
// TODO number prefixes
(function() {
// Really primitive kill-ring implementation.
"use strict";
var Pos = CodeMirror.Pos;
function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
// Kill 'ring'
var killRing = [];
function addToRing(str) {
killRing.push(str);
if (killRing.length > 50) killRing.shift();
}
function getFromRing() { return killRing[killRing.length - 1] || ""; }
function growRingTop(str) {
if (!killRing.length) return addToRing(str);
killRing[killRing.length - 1] += str;
}
function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || ""; }
function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }
CodeMirror.keyMap.emacs = {
"Ctrl-X": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-X");},
"Ctrl-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
"Ctrl-Alt-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
"Alt-W": function(cm) {addToRing(cm.getSelection());},
"Ctrl-Y": function(cm) {cm.replaceSelection(getFromRing());},
var lastKill = null;
function kill(cm, from, to, mayGrow, text) {
if (text == null) text = cm.getRange(from, to);
if (mayGrow && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen))
growRingTop(text);
else
addToRing(text);
cm.replaceRange("", from, to, "+delete");
if (mayGrow) lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()};
else lastKill = null;
}
// Boundaries of various units
function byChar(cm, pos, dir) {
return cm.findPosH(pos, dir, "char", true);
}
function byWord(cm, pos, dir) {
return cm.findPosH(pos, dir, "word", true);
}
function byLine(cm, pos, dir) {
return cm.findPosV(pos, dir, "line", cm.doc.sel.goalColumn);
}
function byPage(cm, pos, dir) {
return cm.findPosV(pos, dir, "page", cm.doc.sel.goalColumn);
}
function byParagraph(cm, pos, dir) {
var no = pos.line, line = cm.getLine(no);
var sawText = /\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch));
var fst = cm.firstLine(), lst = cm.lastLine();
for (;;) {
no += dir;
if (no < fst || no > lst)
return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null));
line = cm.getLine(no);
var hasText = /\S/.test(line);
if (hasText) sawText = true;
else if (sawText) return Pos(no, 0);
}
}
function bySentence(cm, pos, dir) {
var line = pos.line, ch = pos.ch;
var text = cm.getLine(pos.line), sawWord = false;
for (;;) {
var next = text.charAt(ch + (dir < 0 ? -1 : 0));
if (!next) { // End/beginning of line reached
if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch);
text = cm.getLine(line + dir);
if (!/\S/.test(text)) return Pos(line, ch);
line += dir;
ch = dir < 0 ? text.length : 0;
continue;
}
if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0));
if (!sawWord) sawWord = /\w/.test(next);
ch += dir;
}
}
function byExpr(cm, pos, dir) {
var wrap;
if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, true))
&& wrap.match && (wrap.forward ? 1 : -1) == dir)
return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to;
for (var first = true;; first = false) {
var token = cm.getTokenAt(pos);
var after = Pos(pos.line, dir < 0 ? token.start : token.end);
if (first && dir > 0 && token.end == pos.ch || !/\w/.test(token.string)) {
var newPos = cm.findPosH(after, dir, "char");
if (posEq(after, newPos)) return pos;
else pos = newPos;
} else {
return after;
}
}
}
// Prefixes (only crudely supported)
function getPrefix(cm, precise) {
var digits = cm.state.emacsPrefix;
if (!digits) return precise ? null : 1;
clearPrefix(cm);
return digits == "-" ? -1 : Number(digits);
}
function repeated(cmd) {
var f = typeof cmd == "string" ? function(cm) { cm.execCommand(cmd); } : cmd;
return function(cm) {
var prefix = getPrefix(cm);
f(cm);
for (var i = 1; i < prefix; ++i) f(cm);
};
}
function findEnd(cm, by, dir) {
var pos = cm.getCursor(), prefix = getPrefix(cm);
if (prefix < 0) { dir = -dir; prefix = -prefix; }
for (var i = 0; i < prefix; ++i) {
var newPos = by(cm, pos, dir);
if (posEq(newPos, pos)) break;
pos = newPos;
}
return pos;
}
function move(by, dir) {
var f = function(cm) {
cm.extendSelection(findEnd(cm, by, dir));
};
f.motion = true;
return f;
}
function killTo(cm, by, dir) {
kill(cm, cm.getCursor(), findEnd(cm, by, dir), true);
}
function addPrefix(cm, digit) {
if (cm.state.emacsPrefix) {
if (digit != "-") cm.state.emacsPrefix += digit;
return;
}
// Not active yet
cm.state.emacsPrefix = digit;
cm.on("keyHandled", maybeClearPrefix);
cm.on("inputRead", maybeDuplicateInput);
}
var prefixPreservingKeys = {"Alt-G": true, "Ctrl-X": true, "Ctrl-Q": true, "Ctrl-U": true};
function maybeClearPrefix(cm, arg) {
if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg))
clearPrefix(cm);
}
function clearPrefix(cm) {
cm.state.emacsPrefix = null;
cm.off("keyHandled", maybeClearPrefix);
cm.off("inputRead", maybeDuplicateInput);
}
function maybeDuplicateInput(cm, event) {
var dup = getPrefix(cm);
if (dup > 1 && event.origin == "+input") {
var one = event.text.join("\n"), txt = "";
for (var i = 1; i < dup; ++i) txt += one;
cm.replaceSelection(txt, "end", "+input");
}
}
function addPrefixMap(cm) {
cm.state.emacsPrefixMap = true;
cm.addKeyMap(prefixMap);
cm.on("keyHandled", maybeRemovePrefixMap);
cm.on("inputRead", maybeRemovePrefixMap);
}
function maybeRemovePrefixMap(cm, arg) {
if (typeof arg == "string" && (/^\d$/.test(arg) || arg == "Ctrl-U")) return;
cm.removeKeyMap(prefixMap);
cm.state.emacsPrefixMap = false;
cm.off("keyHandled", maybeRemovePrefixMap);
cm.off("inputRead", maybeRemovePrefixMap);
}
// Utilities
function setMark(cm) {
cm.setCursor(cm.getCursor());
cm.setExtending(true);
cm.on("change", function() { cm.setExtending(false); });
}
function getInput(cm, msg, f) {
if (cm.openDialog)
cm.openDialog(msg + ": <input type=\"text\" style=\"width: 10em\"/>", f, {bottom: true});
else
f(prompt(msg, ""));
}
function operateOnWord(cm, op) {
var start = cm.getCursor(), end = cm.findPosH(start, 1, "word");
cm.replaceRange(op(cm.getRange(start, end)), start, end);
cm.setCursor(end);
}
function toEnclosingExpr(cm) {
var pos = cm.getCursor(), line = pos.line, ch = pos.ch;
var stack = [];
while (line >= cm.firstLine()) {
var text = cm.getLine(line);
for (var i = ch == null ? text.length : ch; i > 0;) {
var ch = text.charAt(--i);
if (ch == ")")
stack.push("(");
else if (ch == "]")
stack.push("[");
else if (ch == "}")
stack.push("{");
else if (/[\(\{\[]/.test(ch) && (!stack.length || stack.pop() != ch))
return cm.extendSelection(Pos(line, i));
}
--line; ch = null;
}
}
// Actual keymap
var keyMap = CodeMirror.keyMap.emacs = {
"Ctrl-W": function(cm) {kill(cm, cm.getCursor("start"), cm.getCursor("end"));},
"Ctrl-K": repeated(function(cm) {
var start = cm.getCursor(), end = cm.clipPos(Pos(start.line));
var text = cm.getRange(start, end);
if (!/\S/.test(text)) {
text += "\n";
end = Pos(start.line + 1, 0);
}
kill(cm, start, end, true, text);
}),
"Alt-W": function(cm) {
addToRing(cm.getSelection());
},
"Ctrl-Y": function(cm) {
var start = cm.getCursor();
cm.replaceRange(getFromRing(getPrefix(cm)), start, start, "paste");
cm.setSelection(start, cm.getCursor());
},
"Alt-Y": function(cm) {cm.replaceSelection(popFromRing());},
"Ctrl-/": "undo", "Shift-Ctrl--": "undo", "Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd",
"Ctrl-Space": setMark, "Ctrl-Shift-2": setMark,
"Ctrl-F": move(byChar, 1), "Ctrl-B": move(byChar, -1),
"Right": move(byChar, 1), "Left": move(byChar, -1),
"Ctrl-D": function(cm) { killTo(cm, byChar, 1); },
"Delete": function(cm) { killTo(cm, byChar, 1); },
"Ctrl-H": function(cm) { killTo(cm, byChar, -1); },
"Backspace": function(cm) { killTo(cm, byChar, -1); },
"Alt-F": move(byWord, 1), "Alt-B": move(byWord, -1),
"Alt-D": function(cm) { killTo(cm, byWord, 1); },
"Alt-Backspace": function(cm) { killTo(cm, byWord, -1); },
"Ctrl-N": move(byLine, 1), "Ctrl-P": move(byLine, -1),
"Down": move(byLine, 1), "Up": move(byLine, -1),
"Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
"End": "goLineEnd", "Home": "goLineStart",
"Alt-V": move(byPage, -1), "Ctrl-V": move(byPage, 1),
"PageUp": move(byPage, -1), "PageDown": move(byPage, 1),
"Ctrl-Up": move(byParagraph, -1), "Ctrl-Down": move(byParagraph, 1),
"Alt-A": move(bySentence, -1), "Alt-E": move(bySentence, 1),
"Alt-K": function(cm) { killTo(cm, bySentence, 1); },
"Ctrl-Alt-K": function(cm) { killTo(cm, byExpr, 1); },
"Ctrl-Alt-Backspace": function(cm) { killTo(cm, byExpr, -1); },
"Ctrl-Alt-F": move(byExpr, 1), "Ctrl-Alt-B": move(byExpr, -1),
"Shift-Ctrl-Alt-2": function(cm) {
cm.setSelection(findEnd(cm, byExpr, 1), cm.getCursor());
},
"Ctrl-Alt-T": function(cm) {
var leftStart = byExpr(cm, cm.getCursor(), -1), leftEnd = byExpr(cm, leftStart, 1);
var rightEnd = byExpr(cm, leftEnd, 1), rightStart = byExpr(cm, rightEnd, -1);
cm.replaceRange(cm.getRange(rightStart, rightEnd) + cm.getRange(leftEnd, rightStart) +
cm.getRange(leftStart, leftEnd), leftStart, rightEnd);
},
"Ctrl-Alt-U": repeated(toEnclosingExpr),
"Alt-Space": function(cm) {
var pos = cm.getCursor(), from = pos.ch, to = pos.ch, text = cm.getLine(pos.line);
while (from && /\s/.test(text.charAt(from - 1))) --from;
while (to < text.length && /\s/.test(text.charAt(to))) ++to;
cm.replaceRange(" ", Pos(pos.line, from), Pos(pos.line, to));
},
"Ctrl-O": repeated(function(cm) { cm.replaceSelection("\n", "start"); }),
"Ctrl-T": repeated(function(cm) {
var pos = cm.getCursor();
if (pos.ch < cm.getLine(pos.line).length) pos = Pos(pos.line, pos.ch + 1);
var from = cm.findPosH(pos, -2, "char");
var range = cm.getRange(from, pos);
if (range.length != 2) return;
cm.setSelection(from, pos);
cm.replaceSelection(range.charAt(1) + range.charAt(0), "end");
}),
"Alt-C": repeated(function(cm) {
operateOnWord(cm, function(w) {
var letter = w.search(/\w/);
if (letter == -1) return w;
return w.slice(0, letter) + w.charAt(letter).toUpperCase() + w.slice(letter + 1).toLowerCase();
});
}),
"Alt-U": repeated(function(cm) {
operateOnWord(cm, function(w) { return w.toUpperCase(); });
}),
"Alt-L": repeated(function(cm) {
operateOnWord(cm, function(w) { return w.toLowerCase(); });
}),
"Alt-;": "toggleComment",
"Ctrl-/": repeated("undo"), "Shift-Ctrl--": repeated("undo"),
"Ctrl-Z": repeated("undo"), "Cmd-Z": repeated("undo"),
"Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd",
"Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": "clearSearch", "Shift-Alt-5": "replace",
"Ctrl-Z": "undo", "Cmd-Z": "undo", "Alt-/": "autocomplete",
fallthrough: ["basic", "emacsy"]
"Alt-/": "autocomplete",
"Ctrl-J": "newlineAndIndent", "Enter": false, "Tab": "indentAuto",
"Alt-G": function(cm) {cm.setOption("keyMap", "emacs-Alt-G");},
"Ctrl-X": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-X");},
"Ctrl-Q": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-Q");},
"Ctrl-U": addPrefixMap
};
CodeMirror.keyMap["emacs-Ctrl-X"] = {
"Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": "undo", "K": "close",
"Tab": function(cm) {
cm.indentSelection(getPrefix(cm, true) || cm.getOption("indentUnit"));
},
"Ctrl-X": function(cm) {
cm.setSelection(cm.getCursor("head"), cm.getCursor("anchor"));
},
"Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": repeated("undo"), "K": "close",
"Delete": function(cm) { kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), true); },
auto: "emacs", nofallthrough: true, disableInput: true
};
CodeMirror.keyMap["emacs-Alt-G"] = {
"G": function(cm) {
var prefix = getPrefix(cm, true);
if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1);
getInput(cm, "Goto line", function(str) {
var num;
if (str && !isNaN(num = Number(str)) && num == num|0 && num > 0)
cm.setCursor(num - 1);
});
},
auto: "emacs", nofallthrough: true, disableInput: true
};
CodeMirror.keyMap["emacs-Ctrl-Q"] = {
"Tab": repeated("insertTab"),
auto: "emacs", nofallthrough: true
};
var prefixMap = {"Ctrl-G": clearPrefix};
function regPrefix(d) {
prefixMap[d] = function(cm) { addPrefix(cm, d); };
keyMap["Ctrl-" + d] = function(cm) { addPrefix(cm, d); };
prefixPreservingKeys["Ctrl-" + d] = true;
}
for (var i = 0; i < 10; ++i) regPrefix(String(i));
regPrefix("-");
})();

File diff suppressed because it is too large Load Diff

View File

@@ -1,173 +1,263 @@
.CodeMirror {
line-height: 1em;
font-family: monospace;
/* BASICS */
/* Necessary so the scrollbar can be absolutely positioned within the wrapper on Lion. */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
}
.CodeMirror-scroll {
/* Set scrolling behaviour here */
overflow: auto;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
}
/* CURSOR */
.CodeMirror div.CodeMirror-cursor {
border-left: 1px solid black;
z-index: 3;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
width: auto;
border: 0;
background: #7e7;
z-index: 1;
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
.cm-tab { display: inline-block; }
/* DEFAULT THEME */
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable {color: black;}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-property {color: black;}
.cm-s-default .cm-operator {color: black;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-error {color: #f00;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-invalidchar {color: #f00;}
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
line-height: 1;
position: relative;
/* This prevents unwanted scrollbars from showing up on the body and wrapper in IE. */
overflow: hidden;
background: white;
color: black;
}
.CodeMirror-scroll {
overflow: auto;
height: 300px;
/* This is needed to prevent an IE[67] bug where the scrolled content
is visible outside of the scrolling box. */
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px; padding-right: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-sizer {
position: relative;
outline: none;
}
/* Vertical scrollbar */
.CodeMirror-scrollbar {
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actuall scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
z-index: 5;
}
.CodeMirror-scrollbar-inner {
/* This needs to have a nonzero width in order for the scrollbar to appear
in Firefox and IE9. */
width: 1px;
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar.cm-sb-overlap {
/* Ensure that the scrollbar appears in Lion, and that it overlaps the content
rather than sitting to the right of it. */
position: absolute;
z-index: 1;
float: none;
right: 0;
min-width: 12px;
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-scrollbar.cm-sb-nonoverlap {
min-width: 12px;
}
.CodeMirror-scrollbar.cm-sb-ie7 {
min-width: 18px;
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutter {
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
z-index: 10;
background-color: #f7f7f7;
border-right: 1px solid #eee;
min-width: 2em;
padding-bottom: 30px;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
-moz-box-sizing: content-box;
box-sizing: content-box;
padding-bottom: 30px;
margin-bottom: -32px;
display: inline-block;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-text {
color: #aaa;
text-align: right;
padding: .4em .2em .4em .4em;
white-space: pre !important;
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-lines {
padding: .4em;
white-space: pre;
cursor: text;
}
.CodeMirror pre {
-moz-border-radius: 0;
-webkit-border-radius: 0;
-o-border-radius: 0;
border-radius: 0;
border-width: 0; margin: 0; padding: 0; background: transparent;
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
padding: 0; margin: 0;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-code pre {
border-right: 30px solid transparent;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
}
.CodeMirror-wrap .CodeMirror-code pre {
border-right: none;
width: auto;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-wrap .CodeMirror-scroll {
overflow-x: hidden;
}
.CodeMirror textarea {
outline: none !important;
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-measure pre { position: static; }
.CodeMirror pre.CodeMirror-cursor {
z-index: 10;
.CodeMirror div.CodeMirror-cursor {
position: absolute;
visibility: hidden;
border-left: 1px solid black;
border-right: none;
width: 0;
}
.cm-keymap-fat-cursor pre.CodeMirror-cursor {
width: auto;
border: 0;
background: transparent;
background: rgba(0, 200, 0, .4);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
}
/* Kludge to turn off filter in ie9+, which also accepts rgba */
.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
}
.CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {}
.CodeMirror-focused pre.CodeMirror-cursor {
.CodeMirror-focused div.CodeMirror-cursor {
visibility: visible;
}
div.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-searching {
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* Default theme */
.cm-s-default span.cm-keyword {color: #708;}
.cm-s-default span.cm-atom {color: #219;}
.cm-s-default span.cm-number {color: #164;}
.cm-s-default span.cm-def {color: #00f;}
.cm-s-default span.cm-variable {color: black;}
.cm-s-default span.cm-variable-2 {color: #05a;}
.cm-s-default span.cm-variable-3 {color: #085;}
.cm-s-default span.cm-property {color: black;}
.cm-s-default span.cm-operator {color: black;}
.cm-s-default span.cm-comment {color: #a50;}
.cm-s-default span.cm-string {color: #a11;}
.cm-s-default span.cm-string-2 {color: #f50;}
.cm-s-default span.cm-meta {color: #555;}
.cm-s-default span.cm-error {color: #f00;}
.cm-s-default span.cm-qualifier {color: #555;}
.cm-s-default span.cm-builtin {color: #30a;}
.cm-s-default span.cm-bracket {color: #cc7;}
.cm-s-default span.cm-tag {color: #170;}
.cm-s-default span.cm-attribute {color: #00c;}
.cm-s-default span.cm-header {color: blue;}
.cm-s-default span.cm-quote {color: #090;}
.cm-s-default span.cm-hr {color: #999;}
.cm-s-default span.cm-link {color: #00c;}
span.cm-header, span.cm-strong {font-weight: bold;}
span.cm-em {font-style: italic;}
span.cm-emstrong {font-style: italic; font-weight: bold;}
span.cm-link {text-decoration: underline;}
span.cm-invalidchar {color: #f00;}
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
@media print {
/* Hide the cursor when printing */
.CodeMirror pre.CodeMirror-cursor {
.CodeMirror div.CodeMirror-cursor {
visibility: hidden;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,164 +0,0 @@
/**
* Tag-closer extension for CodeMirror.
*
* This extension adds a "closeTag" utility function that can be used with key bindings to
* insert a matching end tag after the ">" character of a start tag has been typed. It can
* also complete "</" if a matching start tag is found. It will correctly ignore signal
* characters for empty tags, comments, CDATA, etc.
*
* The function depends on internal parser state to identify tags. It is compatible with the
* following CodeMirror modes and will ignore all others:
* - htmlmixed
* - xml
*
* See demos/closetag.html for a usage example.
*
* @author Nathan Williams <nathan@nlwillia.net>
* Contributed under the same license terms as CodeMirror.
*/
(function() {
/** Option that allows tag closing behavior to be toggled. Default is true. */
CodeMirror.defaults['closeTagEnabled'] = true;
/** Array of tag names to add indentation after the start tag for. Default is the list of block-level html tags. */
CodeMirror.defaults['closeTagIndent'] = ['applet', 'blockquote', 'body', 'button', 'div', 'dl', 'fieldset', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', 'iframe', 'layer', 'legend', 'object', 'ol', 'p', 'select', 'table', 'ul'];
/** Array of tag names where an end tag is forbidden. */
CodeMirror.defaults['closeTagVoid'] = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
/**
* Call during key processing to close tags. Handles the key event if the tag is closed, otherwise throws CodeMirror.Pass.
* - cm: The editor instance.
* - ch: The character being processed.
* - indent: Optional. An array of tag names to indent when closing. Omit or pass true to use the default indentation tag list defined in the 'closeTagIndent' option.
* Pass false to disable indentation. Pass an array to override the default list of tag names.
* - vd: Optional. An array of tag names that should not be closed. Omit to use the default void (end tag forbidden) tag list defined in the 'closeTagVoid' option. Ignored in xml mode.
*/
CodeMirror.defineExtension("closeTag", function(cm, ch, indent, vd) {
if (!cm.getOption('closeTagEnabled')) {
throw CodeMirror.Pass;
}
var mode = cm.getOption('mode');
if (mode == 'text/html' || mode == 'xml') {
/*
* Relevant structure of token:
*
* htmlmixed
* className
* state
* htmlState
* type
* tagName
* context
* tagName
* mode
*
* xml
* className
* state
* tagName
* type
*/
var pos = cm.getCursor();
var tok = cm.getTokenAt(pos);
var state = tok.state;
if (state.mode && state.mode != 'html') {
throw CodeMirror.Pass; // With htmlmixed, we only care about the html sub-mode.
}
if (ch == '>') {
var type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
if (tok.className == 'tag' && type == 'closeTag') {
throw CodeMirror.Pass; // Don't process the '>' at the end of an end-tag.
}
cm.replaceSelection('>'); // Mode state won't update until we finish the tag.
pos = {line: pos.line, ch: pos.ch + 1};
cm.setCursor(pos);
tok = cm.getTokenAt(cm.getCursor());
state = tok.state;
type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
if (tok.className == 'tag' && type != 'selfcloseTag') {
var tagName = state.htmlState ? state.htmlState.tagName : state.tagName; // htmlmixed : xml
if (tagName.length > 0 && shouldClose(cm, vd, tagName)) {
insertEndTag(cm, indent, pos, tagName);
}
return;
}
// Undo the '>' insert and allow cm to handle the key instead.
cm.setSelection({line: pos.line, ch: pos.ch - 1}, pos);
cm.replaceSelection("");
} else if (ch == '/') {
if (tok.className == 'tag' && tok.string == '<') {
var tagName = state.htmlState ? (state.htmlState.context ? state.htmlState.context.tagName : '') : (state.context ? state.context.tagName : ''); // htmlmixed : xml
if (tagName.length > 0) {
completeEndTag(cm, pos, tagName);
return;
}
}
}
}
throw CodeMirror.Pass; // Bubble if not handled
});
function insertEndTag(cm, indent, pos, tagName) {
if (shouldIndent(cm, indent, tagName)) {
cm.replaceSelection('\n\n</' + tagName + '>', 'end');
cm.indentLine(pos.line + 1);
cm.indentLine(pos.line + 2);
cm.setCursor({line: pos.line + 1, ch: cm.getLine(pos.line + 1).length});
} else {
cm.replaceSelection('</' + tagName + '>');
cm.setCursor(pos);
}
}
function shouldIndent(cm, indent, tagName) {
if (typeof indent == 'undefined' || indent == null || indent == true) {
indent = cm.getOption('closeTagIndent');
}
if (!indent) {
indent = [];
}
return indexOf(indent, tagName.toLowerCase()) != -1;
}
function shouldClose(cm, vd, tagName) {
if (cm.getOption('mode') == 'xml') {
return true; // always close xml tags
}
if (typeof vd == 'undefined' || vd == null) {
vd = cm.getOption('closeTagVoid');
}
if (!vd) {
vd = [];
}
return indexOf(vd, tagName.toLowerCase()) == -1;
}
// C&P from codemirror.js...would be nice if this were visible to utilities.
function indexOf(collection, elt) {
if (collection.indexOf) return collection.indexOf(elt);
for (var i = 0, e = collection.length; i < e; ++i)
if (collection[i] == elt) return i;
return -1;
}
function completeEndTag(cm, pos, tagName) {
cm.replaceSelection('/' + tagName + '>');
cm.setCursor({line: pos.line, ch: pos.ch + tagName.length + 2 });
}
})();

View File

@@ -1,196 +0,0 @@
// the tagRangeFinder function is
// Copyright (C) 2011 by Daniel Glazman <daniel@glazman.org>
// released under the MIT license (../../LICENSE) like the rest of CodeMirror
CodeMirror.tagRangeFinder = function(cm, line, hideEnd) {
var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
var xmlNAMERegExp = new RegExp("^[" + nameStartChar + "][" + nameChar + "]*");
var lineText = cm.getLine(line);
var found = false;
var tag = null;
var pos = 0;
while (!found) {
pos = lineText.indexOf("<", pos);
if (-1 == pos) // no tag on line
return;
if (pos + 1 < lineText.length && lineText[pos + 1] == "/") { // closing tag
pos++;
continue;
}
// ok we weem to have a start tag
if (!lineText.substr(pos + 1).match(xmlNAMERegExp)) { // not a tag name...
pos++;
continue;
}
var gtPos = lineText.indexOf(">", pos + 1);
if (-1 == gtPos) { // end of start tag not in line
var l = line + 1;
var foundGt = false;
var lastLine = cm.lineCount();
while (l < lastLine && !foundGt) {
var lt = cm.getLine(l);
var gt = lt.indexOf(">");
if (-1 != gt) { // found a >
foundGt = true;
var slash = lt.lastIndexOf("/", gt);
if (-1 != slash && slash < gt) {
var str = lineText.substr(slash, gt - slash + 1);
if (!str.match( /\/\s*\>/ )) { // yep, that's the end of empty tag
if (hideEnd === true) l++;
return l;
}
}
}
l++;
}
found = true;
}
else {
var slashPos = lineText.lastIndexOf("/", gtPos);
if (-1 == slashPos) { // cannot be empty tag
found = true;
// don't continue
}
else { // empty tag?
// check if really empty tag
var str = lineText.substr(slashPos, gtPos - slashPos + 1);
if (!str.match( /\/\s*\>/ )) { // finally not empty
found = true;
// don't continue
}
}
}
if (found) {
var subLine = lineText.substr(pos + 1);
tag = subLine.match(xmlNAMERegExp);
if (tag) {
// we have an element name, wooohooo !
tag = tag[0];
// do we have the close tag on same line ???
if (-1 != lineText.indexOf("</" + tag + ">", pos)) // yep
{
found = false;
}
// we don't, so we have a candidate...
}
else
found = false;
}
if (!found)
pos++;
}
if (found) {
var startTag = "(\\<\\/" + tag + "\\>)|(\\<" + tag + "\\>)|(\\<" + tag + "\\s)|(\\<" + tag + "$)";
var startTagRegExp = new RegExp(startTag, "g");
var endTag = "</" + tag + ">";
var depth = 1;
var l = line + 1;
var lastLine = cm.lineCount();
while (l < lastLine) {
lineText = cm.getLine(l);
var match = lineText.match(startTagRegExp);
if (match) {
for (var i = 0; i < match.length; i++) {
if (match[i] == endTag)
depth--;
else
depth++;
if (!depth) {
if (hideEnd === true) l++;
return l;
}
}
}
l++;
}
return;
}
};
CodeMirror.braceRangeFinder = function(cm, line, hideEnd) {
var lineText = cm.getLine(line), at = lineText.length, startChar, tokenType;
for (;;) {
var found = lineText.lastIndexOf("{", at);
if (found < 0) break;
tokenType = cm.getTokenAt({line: line, ch: found}).className;
if (!/^(comment|string)/.test(tokenType)) { startChar = found; break; }
at = found - 1;
}
if (startChar == null || lineText.lastIndexOf("}") > startChar) return;
var count = 1, lastLine = cm.lineCount(), end;
outer: for (var i = line + 1; i < lastLine; ++i) {
var text = cm.getLine(i), pos = 0;
for (;;) {
var nextOpen = text.indexOf("{", pos), nextClose = text.indexOf("}", pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (cm.getTokenAt({line: i, ch: pos + 1}).className == tokenType) {
if (pos == nextOpen) ++count;
else if (!--count) { end = i; break outer; }
}
++pos;
}
}
if (end == null || end == line + 1) return;
if (hideEnd === true) end++;
return end;
};
CodeMirror.indentRangeFinder = function(cm, line) {
var tabSize = cm.getOption("tabSize");
var myIndent = cm.getLineHandle(line).indentation(tabSize), last;
for (var i = line + 1, end = cm.lineCount(); i < end; ++i) {
var handle = cm.getLineHandle(i);
if (!/^\s*$/.test(handle.text)) {
if (handle.indentation(tabSize) <= myIndent) break;
last = i;
}
}
if (!last) return null;
return last + 1;
};
CodeMirror.newFoldFunction = function(rangeFinder, markText, hideEnd) {
var folded = [];
if (markText == null) markText = '<div style="position: absolute; left: 2px; color:#600">&#x25bc;</div>%N%';
function isFolded(cm, n) {
for (var i = 0; i < folded.length; ++i) {
var start = cm.lineInfo(folded[i].start);
if (!start) folded.splice(i--, 1);
else if (start.line == n) return {pos: i, region: folded[i]};
}
}
function expand(cm, region) {
cm.clearMarker(region.start);
for (var i = 0; i < region.hidden.length; ++i)
cm.showLine(region.hidden[i]);
}
return function(cm, line) {
cm.operation(function() {
var known = isFolded(cm, line);
if (known) {
folded.splice(known.pos, 1);
expand(cm, known.region);
} else {
var end = rangeFinder(cm, line, hideEnd);
if (end == null) return;
var hidden = [];
for (var i = line + 1; i < end; ++i) {
var handle = cm.hideLine(i);
if (handle) hidden.push(handle);
}
var first = cm.setMarker(line, markText);
var region = {start: first, hidden: hidden};
cm.onDeleteLine(first, function() { expand(cm, region); });
folded.push(region);
}
});
};
};

View File

@@ -1,299 +0,0 @@
// ============== Formatting extensions ============================
// A common storage for all mode-specific formatting features
if (!CodeMirror.modeExtensions) CodeMirror.modeExtensions = {};
// Returns the extension of the editor's current mode
CodeMirror.defineExtension("getModeExt", function () {
var mname = CodeMirror.resolveMode(this.getOption("mode")).name;
var ext = CodeMirror.modeExtensions[mname];
if (!ext) throw new Error("No extensions found for mode " + mname);
return ext;
});
// If the current mode is 'htmlmixed', returns the extension of a mode located at
// the specified position (can be htmlmixed, css or javascript). Otherwise, simply
// returns the extension of the editor's current mode.
CodeMirror.defineExtension("getModeExtAtPos", function (pos) {
var token = this.getTokenAt(pos);
if (token && token.state && token.state.mode)
return CodeMirror.modeExtensions[token.state.mode == "html" ? "htmlmixed" : token.state.mode];
else
return this.getModeExt();
});
// Comment/uncomment the specified range
CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
var curMode = this.getModeExtAtPos(this.getCursor());
if (isComment) { // Comment range
var commentedText = this.getRange(from, to);
this.replaceRange(curMode.commentStart + this.getRange(from, to) + curMode.commentEnd
, from, to);
if (from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside
this.setCursor(from.line, from.ch + curMode.commentStart.length);
}
}
else { // Uncomment range
var selText = this.getRange(from, to);
var startIndex = selText.indexOf(curMode.commentStart);
var endIndex = selText.lastIndexOf(curMode.commentEnd);
if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
// Take string till comment start
selText = selText.substr(0, startIndex)
// From comment start till comment end
+ selText.substring(startIndex + curMode.commentStart.length, endIndex)
// From comment end till string end
+ selText.substr(endIndex + curMode.commentEnd.length);
}
this.replaceRange(selText, from, to);
}
});
// Applies automatic mode-aware indentation to the specified range
CodeMirror.defineExtension("autoIndentRange", function (from, to) {
var cmInstance = this;
this.operation(function () {
for (var i = from.line; i <= to.line; i++) {
cmInstance.indentLine(i, "smart");
}
});
});
// Applies automatic formatting to the specified range
CodeMirror.defineExtension("autoFormatRange", function (from, to) {
var absStart = this.indexFromPos(from);
var absEnd = this.indexFromPos(to);
// Insert additional line breaks where necessary according to the
// mode's syntax
var res = this.getModeExt().autoFormatLineBreaks(this.getValue(), absStart, absEnd);
var cmInstance = this;
// Replace and auto-indent the range
this.operation(function () {
cmInstance.replaceRange(res, from, to);
var startLine = cmInstance.posFromIndex(absStart).line;
var endLine = cmInstance.posFromIndex(absStart + res.length).line;
for (var i = startLine; i <= endLine; i++) {
cmInstance.indentLine(i, "smart");
}
});
});
// Define extensions for a few modes
CodeMirror.modeExtensions["css"] = {
commentStart: "/*",
commentEnd: "*/",
wordWrapChars: [";", "\\{", "\\}"],
autoFormatLineBreaks: function (text, startPos, endPos) {
text = text.substring(startPos, endPos);
return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
}
};
CodeMirror.modeExtensions["javascript"] = {
commentStart: "/*",
commentEnd: "*/",
wordWrapChars: [";", "\\{", "\\}"],
getNonBreakableBlocks: function (text) {
var nonBreakableRegexes = [
new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"),
new RegExp("\\\\\"([\\s\\S]*?)(\\\\\"|$)"),
new RegExp("\\\\\'([\\s\\S]*?)(\\\\\'|$)"),
new RegExp("'([\\s\\S]*?)('|$)"),
new RegExp("\"([\\s\\S]*?)(\"|$)"),
new RegExp("//.*([\r\n]|$)")
];
var nonBreakableBlocks = new Array();
for (var i = 0; i < nonBreakableRegexes.length; i++) {
var curPos = 0;
while (curPos < text.length) {
var m = text.substr(curPos).match(nonBreakableRegexes[i]);
if (m != null) {
nonBreakableBlocks.push({
start: curPos + m.index,
end: curPos + m.index + m[0].length
});
curPos += m.index + Math.max(1, m[0].length);
}
else { // No more matches
break;
}
}
}
nonBreakableBlocks.sort(function (a, b) {
return a.start - b.start;
});
return nonBreakableBlocks;
},
autoFormatLineBreaks: function (text, startPos, endPos) {
text = text.substring(startPos, endPos);
var curPos = 0;
var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n;])", "g");
var nonBreakableBlocks = this.getNonBreakableBlocks(text);
if (nonBreakableBlocks != null) {
var res = "";
for (var i = 0; i < nonBreakableBlocks.length; i++) {
if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block
res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2");
curPos = nonBreakableBlocks[i].start;
}
if (nonBreakableBlocks[i].start <= curPos
&& nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
res += text.substring(curPos, nonBreakableBlocks[i].end);
curPos = nonBreakableBlocks[i].end;
}
}
if (curPos < text.length - 1) {
res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2");
}
return res;
}
else {
return text.replace(reLinesSplitter, "$1\n$2");
}
}
};
CodeMirror.modeExtensions["xml"] = {
commentStart: "<!--",
commentEnd: "-->",
wordWrapChars: [">"],
autoFormatLineBreaks: function (text, startPos, endPos) {
text = text.substring(startPos, endPos);
var lines = text.split("\n");
var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
var reOpenBrackets = new RegExp("<", "g");
var reCloseBrackets = new RegExp("(>)([^\r\n])", "g");
for (var i = 0; i < lines.length; i++) {
var mToProcess = lines[i].match(reProcessedPortion);
if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces
lines[i] = mToProcess[1]
+ mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2")
+ mToProcess[3];
continue;
}
}
return lines.join("\n");
}
};
CodeMirror.modeExtensions["htmlmixed"] = {
commentStart: "<!--",
commentEnd: "-->",
wordWrapChars: [">", ";", "\\{", "\\}"],
getModeInfos: function (text, absPos) {
var modeInfos = new Array();
modeInfos[0] =
{
pos: 0,
modeExt: CodeMirror.modeExtensions["xml"],
modeName: "xml"
};
var modeMatchers = new Array();
modeMatchers[0] =
{
regex: new RegExp("<style[^>]*>([\\s\\S]*?)(</style[^>]*>|$)", "i"),
modeExt: CodeMirror.modeExtensions["css"],
modeName: "css"
};
modeMatchers[1] =
{
regex: new RegExp("<script[^>]*>([\\s\\S]*?)(</script[^>]*>|$)", "i"),
modeExt: CodeMirror.modeExtensions["javascript"],
modeName: "javascript"
};
var lastCharPos = (typeof (absPos) !== "undefined" ? absPos : text.length - 1);
// Detect modes for the entire text
for (var i = 0; i < modeMatchers.length; i++) {
var curPos = 0;
while (curPos <= lastCharPos) {
var m = text.substr(curPos).match(modeMatchers[i].regex);
if (m != null) {
if (m.length > 1 && m[1].length > 0) {
// Push block begin pos
var blockBegin = curPos + m.index + m[0].indexOf(m[1]);
modeInfos.push(
{
pos: blockBegin,
modeExt: modeMatchers[i].modeExt,
modeName: modeMatchers[i].modeName
});
// Push block end pos
modeInfos.push(
{
pos: blockBegin + m[1].length,
modeExt: modeInfos[0].modeExt,
modeName: modeInfos[0].modeName
});
curPos += m.index + m[0].length;
continue;
}
else {
curPos += m.index + Math.max(m[0].length, 1);
}
}
else { // No more matches
break;
}
}
}
// Sort mode infos
modeInfos.sort(function sortModeInfo(a, b) {
return a.pos - b.pos;
});
return modeInfos;
},
autoFormatLineBreaks: function (text, startPos, endPos) {
var modeInfos = this.getModeInfos(text);
var reBlockStartsWithNewline = new RegExp("^\\s*?\n");
var reBlockEndsWithNewline = new RegExp("\n\\s*?$");
var res = "";
// Use modes info to break lines correspondingly
if (modeInfos.length > 1) { // Deal with multi-mode text
for (var i = 1; i <= modeInfos.length; i++) {
var selStart = modeInfos[i - 1].pos;
var selEnd = (i < modeInfos.length ? modeInfos[i].pos : endPos);
if (selStart >= endPos) { // The block starts later than the needed fragment
break;
}
if (selStart < startPos) {
if (selEnd <= startPos) { // The block starts earlier than the needed fragment
continue;
}
selStart = startPos;
}
if (selEnd > endPos) {
selEnd = endPos;
}
var textPortion = text.substring(selStart, selEnd);
if (modeInfos[i - 1].modeName != "xml") { // Starting a CSS or JavaScript block
if (!reBlockStartsWithNewline.test(textPortion)
&& selStart > 0) { // The block does not start with a line break
textPortion = "\n" + textPortion;
}
if (!reBlockEndsWithNewline.test(textPortion)
&& selEnd < text.length - 1) { // The block does not end with a line break
textPortion += "\n";
}
}
res += modeInfos[i - 1].modeExt.autoFormatLineBreaks(textPortion);
}
}
else { // Single-mode text
res = modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPos, endPos));
}
return res;
}
};

View File

@@ -1,44 +0,0 @@
// Define match-highlighter commands. Depends on searchcursor.js
// Use by attaching the following function call to the onCursorActivity event:
//myCodeMirror.matchHighlight(minChars);
// And including a special span.CodeMirror-matchhighlight css class (also optionally a separate one for .CodeMirror-focused -- see demo matchhighlighter.html)
(function() {
var DEFAULT_MIN_CHARS = 2;
function MatchHighlightState() {
this.marked = [];
}
function getMatchHighlightState(cm) {
return cm._matchHighlightState || (cm._matchHighlightState = new MatchHighlightState());
}
function clearMarks(cm) {
var state = getMatchHighlightState(cm);
for (var i = 0; i < state.marked.length; ++i)
state.marked[i].clear();
state.marked = [];
}
function markDocument(cm, className, minChars) {
clearMarks(cm);
minChars = (typeof minChars !== 'undefined' ? minChars : DEFAULT_MIN_CHARS);
if (cm.somethingSelected() && cm.getSelection().replace(/^\s+|\s+$/g, "").length >= minChars) {
var state = getMatchHighlightState(cm);
var query = cm.getSelection();
cm.operation(function() {
if (cm.lineCount() < 2000) { // This is too expensive on big documents.
for (var cursor = cm.getSearchCursor(query); cursor.findNext();) {
//Only apply matchhighlight to the matches other than the one actually selected
if (!(cursor.from().line === cm.getCursor(true).line && cursor.from().ch === cm.getCursor(true).ch))
state.marked.push(cm.markText(cursor.from(), cursor.to(), className));
}
}
});
}
}
CodeMirror.defineExtension("matchHighlight", function(className, minChars) {
markDocument(this, className, minChars);
});
})();

View File

@@ -1,53 +0,0 @@
CodeMirror.runMode = function(string, modespec, callback, options) {
function esc(str) {
return str.replace(/[<&]/, function(ch) { return ch == "<" ? "&lt;" : "&amp;"; });
}
var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);
var isNode = callback.nodeType == 1;
var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;
if (isNode) {
var node = callback, accum = [], col = 0;
callback = function(text, style) {
if (text == "\n") {
accum.push("<br>");
col = 0;
return;
}
var escaped = "";
// HTML-escape and replace tabs
for (var pos = 0;;) {
var idx = text.indexOf("\t", pos);
if (idx == -1) {
escaped += esc(text.slice(pos));
col += text.length - pos;
break;
} else {
col += idx - pos;
escaped += esc(text.slice(pos, idx));
var size = tabSize - col % tabSize;
col += size;
for (var i = 0; i < size; ++i) escaped += " ";
pos = idx + 1;
}
}
if (style)
accum.push("<span class=\"cm-" + esc(style) + "\">" + escaped + "</span>");
else
accum.push(escaped);
};
}
var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode);
for (var i = 0, e = lines.length; i < e; ++i) {
if (i) callback("\n");
var stream = new CodeMirror.StringStream(lines[i]);
while (!stream.eol()) {
var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start);
stream.start = stream.pos;
}
}
if (isNode)
node.innerHTML = accum.join("");
};

View File

@@ -1,119 +0,0 @@
(function(){
function SearchCursor(cm, query, pos, caseFold) {
this.atOccurrence = false; this.cm = cm;
if (caseFold == null && typeof query == "string") caseFold = false;
pos = pos ? cm.clipPos(pos) : {line: 0, ch: 0};
this.pos = {from: pos, to: pos};
// The matches method is filled in based on the type of query.
// It takes a position and a direction, and returns an object
// describing the next occurrence of the query, or null if no
// more matches were found.
if (typeof query != "string") { // Regexp match
if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
this.matches = function(reverse, pos) {
if (reverse) {
query.lastIndex = 0;
var line = cm.getLine(pos.line).slice(0, pos.ch), match = query.exec(line), start = 0;
while (match) {
start += match.index;
line = line.slice(match.index);
query.lastIndex = 0;
var newmatch = query.exec(line);
if (newmatch) match = newmatch;
else break;
start++;
}
} else {
query.lastIndex = pos.ch;
var line = cm.getLine(pos.line), match = query.exec(line),
start = match && match.index;
}
if (match)
return {from: {line: pos.line, ch: start},
to: {line: pos.line, ch: start + match[0].length},
match: match};
};
} else { // String query
if (caseFold) query = query.toLowerCase();
var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
var target = query.split("\n");
// Different methods for single-line and multi-line queries
if (target.length == 1)
this.matches = function(reverse, pos) {
var line = fold(cm.getLine(pos.line)), len = query.length, match;
if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
: (match = line.indexOf(query, pos.ch)) != -1)
return {from: {line: pos.line, ch: match},
to: {line: pos.line, ch: match + len}};
};
else
this.matches = function(reverse, pos) {
var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(cm.getLine(ln));
var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
if (reverse ? offsetA >= pos.ch || offsetA != match.length
: offsetA <= pos.ch || offsetA != line.length - match.length)
return;
for (;;) {
if (reverse ? !ln : ln == cm.lineCount() - 1) return;
line = fold(cm.getLine(ln += reverse ? -1 : 1));
match = target[reverse ? --idx : ++idx];
if (idx > 0 && idx < target.length - 1) {
if (line != match) return;
else continue;
}
var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
return;
var start = {line: pos.line, ch: offsetA}, end = {line: ln, ch: offsetB};
return {from: reverse ? end : start, to: reverse ? start : end};
}
};
}
}
SearchCursor.prototype = {
findNext: function() {return this.find(false);},
findPrevious: function() {return this.find(true);},
find: function(reverse) {
var self = this, pos = this.cm.clipPos(reverse ? this.pos.from : this.pos.to);
function savePosAndFail(line) {
var pos = {line: line, ch: 0};
self.pos = {from: pos, to: pos};
self.atOccurrence = false;
return false;
}
for (;;) {
if (this.pos = this.matches(reverse, pos)) {
this.atOccurrence = true;
return this.pos.match || true;
}
if (reverse) {
if (!pos.line) return savePosAndFail(0);
pos = {line: pos.line-1, ch: this.cm.getLine(pos.line-1).length};
}
else {
var maxLine = this.cm.lineCount();
if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
pos = {line: pos.line+1, ch: 0};
}
}
},
from: function() {if (this.atOccurrence) return this.pos.from;},
to: function() {if (this.atOccurrence) return this.pos.to;},
replace: function(newText) {
var self = this;
if (this.atOccurrence)
self.pos.to = this.cm.replaceRange(newText, self.pos.from, self.pos.to);
}
};
CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
return new SearchCursor(this, query, pos, caseFold);
});
})();

View File

@@ -1,16 +0,0 @@
.CodeMirror-completions {
position: absolute;
z-index: 10;
overflow: hidden;
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
}
.CodeMirror-completions select {
background: #fafafa;
outline: none;
border: none;
padding: 0;
margin: 0;
font-family: monospace;
}

View File

@@ -1,97 +0,0 @@
(function() {
CodeMirror.simpleHint = function(editor, getHints, givenOptions) {
// Determine effective options based on given values and defaults.
var options = {}, defaults = CodeMirror.simpleHint.defaults;
for (var opt in defaults)
if (defaults.hasOwnProperty(opt))
options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
function collectHints(previousToken) {
// We want a single cursor position.
if (editor.somethingSelected()) return;
var tempToken = editor.getTokenAt(editor.getCursor());
// Don't show completions if token has changed and the option is set.
if (options.closeOnTokenChange && previousToken != null &&
(tempToken.start != previousToken.start || tempToken.className != previousToken.className)) {
return;
}
var result = getHints(editor);
if (!result || !result.list.length) return;
var completions = result.list;
function insert(str) {
editor.replaceRange(str, result.from, result.to);
}
// When there is only one completion, use it directly.
if (completions.length == 1) {insert(completions[0]); return true;}
// Build the select widget
var complete = document.createElement("div");
complete.className = "CodeMirror-completions";
var sel = complete.appendChild(document.createElement("select"));
// Opera doesn't move the selection when pressing up/down in a
// multi-select, but it does properly support the size property on
// single-selects, so no multi-select is necessary.
if (!window.opera) sel.multiple = true;
for (var i = 0; i < completions.length; ++i) {
var opt = sel.appendChild(document.createElement("option"));
opt.appendChild(document.createTextNode(completions[i]));
}
sel.firstChild.selected = true;
sel.size = Math.min(10, completions.length);
var pos = editor.cursorCoords();
complete.style.left = pos.x + "px";
complete.style.top = pos.yBot + "px";
document.body.appendChild(complete);
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
if(winW - pos.x < sel.clientWidth)
complete.style.left = (pos.x - sel.clientWidth) + "px";
// Hack to hide the scrollbar.
if (completions.length <= 10)
complete.style.width = (sel.clientWidth - 1) + "px";
var done = false;
function close() {
if (done) return;
done = true;
complete.parentNode.removeChild(complete);
}
function pick() {
insert(completions[sel.selectedIndex]);
close();
setTimeout(function(){editor.focus();}, 50);
}
CodeMirror.connect(sel, "blur", close);
CodeMirror.connect(sel, "keydown", function(event) {
var code = event.keyCode;
// Enter
if (code == 13) {CodeMirror.e_stop(event); pick();}
// Escape
else if (code == 27) {CodeMirror.e_stop(event); close(); editor.focus();}
else if (code != 38 && code != 40) {
close(); editor.focus();
// Pass the event to the CodeMirror instance so that it can handle things like backspace properly.
editor.triggerOnKeyDown(event);
// Don't show completions if the code is backspace and the option is set.
if (!options.closeOnBackspace || code != 8) {
setTimeout(function(){collectHints(tempToken);}, 50);
}
}
});
CodeMirror.connect(sel, "dblclick", pick);
sel.focus();
// Opera sometimes ignores focusing a freshly created node
if (window.opera) setTimeout(function(){if (!done) sel.focus();}, 100);
return true;
}
return collectHints();
};
CodeMirror.simpleHint.defaults = {
closeOnBackspace: true,
closeOnTokenChange: false
};
})();

View File

@@ -1,137 +0,0 @@
(function() {
CodeMirror.xmlHints = [];
CodeMirror.xmlHint = function(cm, simbol) {
if(simbol.length > 0) {
var cursor = cm.getCursor();
cm.replaceSelection(simbol);
cursor = {line: cursor.line, ch: cursor.ch + 1};
cm.setCursor(cursor);
}
// dirty hack for simple-hint to receive getHint event on space
var getTokenAt = editor.getTokenAt;
editor.getTokenAt = function() { return 'disabled'; };
CodeMirror.simpleHint(cm, getHint);
editor.getTokenAt = getTokenAt;
};
var getHint = function(cm) {
var cursor = cm.getCursor();
if (cursor.ch > 0) {
var text = cm.getRange({line: 0, ch: 0}, cursor);
var typed = '';
var simbol = '';
for(var i = text.length - 1; i >= 0; i--) {
if(text[i] == ' ' || text[i] == '<') {
simbol = text[i];
break;
}
else {
typed = text[i] + typed;
}
}
text = text.slice(0, text.length - typed.length);
var path = getActiveElement(cm, text) + simbol;
var hints = CodeMirror.xmlHints[path];
if(typeof hints === 'undefined')
hints = [''];
else {
hints = hints.slice(0);
for (var i = hints.length - 1; i >= 0; i--) {
if(hints[i].indexOf(typed) != 0)
hints.splice(i, 1);
}
}
return {
list: hints,
from: { line: cursor.line, ch: cursor.ch - typed.length },
to: cursor
};
};
};
var getActiveElement = function(codeMirror, text) {
var element = '';
if(text.length >= 0) {
var regex = new RegExp('<([^!?][^\\s/>]*).*?>', 'g');
var matches = [];
var match;
while ((match = regex.exec(text)) != null) {
matches.push({
tag: match[1],
selfclose: (match[0].slice(match[0].length - 2) === '/>')
});
}
for (var i = matches.length - 1, skip = 0; i >= 0; i--) {
var item = matches[i];
if (item.tag[0] == '/')
{
skip++;
}
else if (item.selfclose == false)
{
if (skip > 0)
{
skip--;
}
else
{
element = '<' + item.tag + '>' + element;
}
}
}
element += getOpenTag(text);
}
return element;
};
var getOpenTag = function(text) {
var open = text.lastIndexOf('<');
var close = text.lastIndexOf('>');
if (close < open)
{
text = text.slice(open);
if(text != '<') {
var space = text.indexOf(' ');
if(space < 0)
space = text.indexOf('\t');
if(space < 0)
space = text.indexOf('\n');
if (space < 0)
space = text.length;
return text.slice(0, space);
}
}
return '';
};
})();

View File

@@ -0,0 +1,160 @@
CodeMirror.defineMode("apl", function() {
var builtInOps = {
".": "innerProduct",
"\\": "scan",
"/": "reduce",
"⌿": "reduce1Axis",
"⍀": "scan1Axis",
"¨": "each",
"⍣": "power"
};
var builtInFuncs = {
"+": ["conjugate", "add"],
"": ["negate", "subtract"],
"×": ["signOf", "multiply"],
"÷": ["reciprocal", "divide"],
"⌈": ["ceiling", "greaterOf"],
"⌊": ["floor", "lesserOf"],
"": ["absolute", "residue"],
"": ["indexGenerate", "indexOf"],
"?": ["roll", "deal"],
"⋆": ["exponentiate", "toThePowerOf"],
"⍟": ["naturalLog", "logToTheBase"],
"○": ["piTimes", "circularFuncs"],
"!": ["factorial", "binomial"],
"⌹": ["matrixInverse", "matrixDivide"],
"<": [null, "lessThan"],
"≤": [null, "lessThanOrEqual"],
"=": [null, "equals"],
">": [null, "greaterThan"],
"≥": [null, "greaterThanOrEqual"],
"≠": [null, "notEqual"],
"≡": ["depth", "match"],
"≢": [null, "notMatch"],
"∈": ["enlist", "membership"],
"⍷": [null, "find"],
"": ["unique", "union"],
"∩": [null, "intersection"],
"": ["not", "without"],
"": [null, "or"],
"∧": [null, "and"],
"⍱": [null, "nor"],
"⍲": [null, "nand"],
"": ["shapeOf", "reshape"],
",": ["ravel", "catenate"],
"⍪": [null, "firstAxisCatenate"],
"⌽": ["reverse", "rotate"],
"⊖": ["axis1Reverse", "axis1Rotate"],
"⍉": ["transpose", null],
"↑": ["first", "take"],
"↓": [null, "drop"],
"⊂": ["enclose", "partitionWithAxis"],
"⊃": ["diclose", "pick"],
"⌷": [null, "index"],
"⍋": ["gradeUp", null],
"⍒": ["gradeDown", null],
"": ["encode", null],
"⊥": ["decode", null],
"⍕": ["format", "formatByExample"],
"⍎": ["execute", null],
"⊣": ["stop", "left"],
"⊢": ["pass", "right"]
};
var isOperator = /[\.\/⌿⍀¨⍣]/;
var isNiladic = /⍬/;
var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;
var isArrow = /←/;
var isComment = /[⍝#].*$/;
var stringEater = function(type) {
var prev;
prev = false;
return function(c) {
prev = c;
if (c === type) {
return prev === "\\";
}
return true;
};
};
return {
startState: function() {
return {
prev: false,
func: false,
op: false,
string: false,
escape: false
};
},
token: function(stream, state) {
var ch, funcName, word;
if (stream.eatSpace()) {
return null;
}
ch = stream.next();
if (ch === '"' || ch === "'") {
stream.eatWhile(stringEater(ch));
stream.next();
state.prev = true;
return "string";
}
if (/[\[{\(]/.test(ch)) {
state.prev = false;
return null;
}
if (/[\]}\)]/.test(ch)) {
state.prev = true;
return null;
}
if (isNiladic.test(ch)) {
state.prev = false;
return "niladic";
}
if (/[¯\d]/.test(ch)) {
if (state.func) {
state.func = false;
state.prev = false;
} else {
state.prev = true;
}
stream.eatWhile(/[\w\.]/);
return "number";
}
if (isOperator.test(ch)) {
return "operator apl-" + builtInOps[ch];
}
if (isArrow.test(ch)) {
return "apl-arrow";
}
if (isFunction.test(ch)) {
funcName = "apl-";
if (builtInFuncs[ch] != null) {
if (state.prev) {
funcName += builtInFuncs[ch][1];
} else {
funcName += builtInFuncs[ch][0];
}
}
state.func = true;
state.prev = false;
return "function " + funcName;
}
if (isComment.test(ch)) {
stream.skipToEnd();
return "comment";
}
if (ch === "∘" && stream.peek() === ".") {
stream.next();
return "function jot-dot";
}
stream.eatWhile(/[\w\$_]/);
word = stream.current();
state.prev = true;
return "keyword";
}
};
});
CodeMirror.defineMIME("text/apl", "apl");

View File

@@ -0,0 +1,72 @@
<!doctype html>
<title>CodeMirror: APL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="./apl.js"></script>
<style>
.CodeMirror { border: 2px inset #dee; }
</style>
<div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">APL</a>
</ul>
</div>
<article>
<h2>APL mode</h2>
<form><textarea id="code" name="code">
⍝ Conway's game of life
⍝ This example was inspired by the impressive demo at
⍝ http://www.youtube.com/watch?v=a9xAKttWgP4
⍝ Create a matrix:
⍝ 0 1 1
⍝ 1 1 0
⍝ 0 1 0
creature ← (3 3 9) ∈ 1 2 3 4 7 ⍝ Original creature from demo
creature ← (3 3 9) ∈ 1 3 6 7 8 ⍝ Glider
⍝ Place the creature on a larger board, near the centre
board ← ¯1 ⊖ ¯2 ⌽ 5 7 ↑ creature
⍝ A function to move from one generation to the next
life ← {/ 1 ⍵ ∧ 3 4 = ⊂+/ +⌿ 1 0 ¯1 ∘.⊖ 1 0 ¯1 ⌽¨ ⊂⍵}
⍝ Compute n-th generation and format it as a
⍝ character matrix
gen ← {' #'[(life ⍣ ⍵) board]}
⍝ Show first three generations
(gen 1) (gen 2) (gen 3)
</textarea></form>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
lineNumbers: true,
matchBrackets: true,
mode: "text/apl"
});
</script>
<p>Simple mode that tries to handle APL as well as it can.</p>
<p>It attempts to label functions/operators based upon
monadic/dyadic usage (but this is far from fully fleshed out).
This means there are meaningful classnames so hover states can
have popups etc.</p>
<p><strong>MIME types defined:</strong> <code>text/apl</code> (APL code)</p>
</article>

View File

@@ -0,0 +1,183 @@
/*
* =====================================================================================
*
* Filename: mode/asterisk/asterisk.js
*
* Description: CodeMirror mode for Asterisk dialplan
*
* Created: 05/17/2012 09:20:25 PM
* Revision: none
*
* Author: Stas Kobzar (stas@modulis.ca),
* Company: Modulis.ca Inc.
*
* =====================================================================================
*/
CodeMirror.defineMode("asterisk", function() {
var atoms = ["exten", "same", "include","ignorepat","switch"],
dpcmd = ["#include","#exec"],
apps = [
"addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi",
"alarmreceiver","amd","answer","authenticate","background","backgrounddetect",
"bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent",
"changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge",
"congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge",
"dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility",
"datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa",
"dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy",
"externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif",
"goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete",
"ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus",
"jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme",
"meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete",
"minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode",
"mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish",
"originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce",
"parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones",
"privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten",
"readfile","receivefax","receivefax","receivefax","record","removequeuemember",
"resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun",
"saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax",
"sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags",
"setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel",
"slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground",
"speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound",
"speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor",
"stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec",
"trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate",
"vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring",
"waitforsilence","waitmusiconhold","waituntil","while","zapateller"
];
function basicToken(stream,state){
var cur = '';
var ch = '';
ch = stream.next();
// comment
if(ch == ";") {
stream.skipToEnd();
return "comment";
}
// context
if(ch == '[') {
stream.skipTo(']');
stream.eat(']');
return "header";
}
// string
if(ch == '"') {
stream.skipTo('"');
return "string";
}
if(ch == "'") {
stream.skipTo("'");
return "string-2";
}
// dialplan commands
if(ch == '#') {
stream.eatWhile(/\w/);
cur = stream.current();
if(dpcmd.indexOf(cur) !== -1) {
stream.skipToEnd();
return "strong";
}
}
// application args
if(ch == '$'){
var ch1 = stream.peek();
if(ch1 == '{'){
stream.skipTo('}');
stream.eat('}');
return "variable-3";
}
}
// extension
stream.eatWhile(/\w/);
cur = stream.current();
if(atoms.indexOf(cur) !== -1) {
state.extenStart = true;
switch(cur) {
case 'same': state.extenSame = true; break;
case 'include':
case 'switch':
case 'ignorepat':
state.extenInclude = true;break;
default:break;
}
return "atom";
}
}
return {
startState: function() {
return {
extenStart: false,
extenSame: false,
extenInclude: false,
extenExten: false,
extenPriority: false,
extenApplication: false
};
},
token: function(stream, state) {
var cur = '';
var ch = '';
if(stream.eatSpace()) return null;
// extension started
if(state.extenStart){
stream.eatWhile(/[^\s]/);
cur = stream.current();
if(/^=>?$/.test(cur)){
state.extenExten = true;
state.extenStart = false;
return "strong";
} else {
state.extenStart = false;
stream.skipToEnd();
return "error";
}
} else if(state.extenExten) {
// set exten and priority
state.extenExten = false;
state.extenPriority = true;
stream.eatWhile(/[^,]/);
if(state.extenInclude) {
stream.skipToEnd();
state.extenPriority = false;
state.extenInclude = false;
}
if(state.extenSame) {
state.extenPriority = false;
state.extenSame = false;
state.extenApplication = true;
}
return "tag";
} else if(state.extenPriority) {
state.extenPriority = false;
state.extenApplication = true;
ch = stream.next(); // get comma
if(state.extenSame) return null;
stream.eatWhile(/[^,]/);
return "number";
} else if(state.extenApplication) {
stream.eatWhile(/,/);
cur = stream.current();
if(cur === ',') return null;
stream.eatWhile(/\w/);
cur = stream.current().toLowerCase();
state.extenApplication = false;
if(apps.indexOf(cur) !== -1){
return "def strong";
}
} else{
return basicToken(stream,state);
}
return null;
}
};
});
CodeMirror.defineMIME("text/x-asterisk", "asterisk");

View File

@@ -0,0 +1,154 @@
<!doctype html>
<title>CodeMirror: Asterisk dialplan mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="asterisk.js"></script>
<style>
.CodeMirror {border: 1px solid #999;}
.cm-s-default span.cm-arrow { color: red; }
</style>
<div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Asterisk dialplan</a>
</ul>
</div>
<article>
<h2>Asterisk dialplan mode</h2>
<form><textarea id="code" name="code">
; extensions.conf - the Asterisk dial plan
;
[general]
;
; If static is set to no, or omitted, then the pbx_config will rewrite
; this file when extensions are modified. Remember that all comments
; made in the file will be lost when that happens.
static=yes
#include "/etc/asterisk/additional_general.conf
[iaxprovider]
switch => IAX2/user:[key]@myserver/mycontext
[dynamic]
#exec /usr/bin/dynamic-peers.pl
[trunkint]
;
; International long distance through trunk
;
exten => _9011.,1,Macro(dundi-e164,${EXTEN:4})
exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${FILTER(0-9,${EXTEN:${GLOBAL(TRUNKMSD)}})})
[local]
;
; Master context for local, toll-free, and iaxtel calls only
;
ignorepat => 9
include => default
[demo]
include => stdexten
;
; We start with what to do when a call first comes in.
;
exten => s,1,Wait(1) ; Wait a second, just for fun
same => n,Answer ; Answer the line
same => n,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
same => n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 seconds
same => n(restart),BackGround(demo-congrats) ; Play a congratulatory message
same => n(instruct),BackGround(demo-instruct) ; Play some instructions
same => n,WaitExten ; Wait for an extension to be dialed.
exten => 2,1,BackGround(demo-moreinfo) ; Give some more information.
exten => 2,n,Goto(s,instruct)
exten => 3,1,Set(LANGUAGE()=fr) ; Set language to french
exten => 3,n,Goto(s,restart) ; Start with the congratulations
exten => 1000,1,Goto(default,s,1)
;
; We also create an example user, 1234, who is on the console and has
; voicemail, etc.
;
exten => 1234,1,Playback(transfer,skip) ; "Please hold while..."
; (but skip if channel is not up)
exten => 1234,n,Gosub(${EXTEN},stdexten(${GLOBAL(CONSOLE)}))
exten => 1234,n,Goto(default,s,1) ; exited Voicemail
exten => 1235,1,Voicemail(1234,u) ; Right to voicemail
exten => 1236,1,Dial(Console/dsp) ; Ring forever
exten => 1236,n,Voicemail(1234,b) ; Unless busy
;
; # for when they're done with the demo
;
exten => #,1,Playback(demo-thanks) ; "Thanks for trying the demo"
exten => #,n,Hangup ; Hang them up.
;
; A timeout and "invalid extension rule"
;
exten => t,1,Goto(#,1) ; If they take too long, give up
exten => i,1,Playback(invalid) ; "That's not valid, try again"
;
; Create an extension, 500, for dialing the
; Asterisk demo.
;
exten => 500,1,Playback(demo-abouttotry); Let them know what's going on
exten => 500,n,Dial(IAX2/guest@pbx.digium.com/s@default) ; Call the Asterisk demo
exten => 500,n,Playback(demo-nogo) ; Couldn't connect to the demo site
exten => 500,n,Goto(s,6) ; Return to the start over message.
;
; Create an extension, 600, for evaluating echo latency.
;
exten => 600,1,Playback(demo-echotest) ; Let them know what's going on
exten => 600,n,Echo ; Do the echo test
exten => 600,n,Playback(demo-echodone) ; Let them know it's over
exten => 600,n,Goto(s,6) ; Start over
;
; You can use the Macro Page to intercom a individual user
exten => 76245,1,Macro(page,SIP/Grandstream1)
; or if your peernames are the same as extensions
exten => _7XXX,1,Macro(page,SIP/${EXTEN})
;
;
; System Wide Page at extension 7999
;
exten => 7999,1,Set(TIMEOUT(absolute)=60)
exten => 7999,2,Page(Local/Grandstream1@page&Local/Xlite1@page&Local/1234@page/n,d)
; Give voicemail at extension 8500
;
exten => 8500,1,VoicemailMain
exten => 8500,n,Goto(s,6)
</textarea></form>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: "text/x-asterisk",
matchBrackets: true,
lineNumber: true
});
</script>
<p><strong>MIME types defined:</strong> <code>text/x-asterisk</code>.</p>
</article>

View File

@@ -1,5 +1,7 @@
CodeMirror.defineMode("clike", function(config, parserConfig) {
var indentUnit = config.indentUnit,
statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
dontAlignCalls = parserConfig.dontAlignCalls,
keywords = parserConfig.keywords || {},
builtin = parserConfig.builtin || {},
blockKeywords = parserConfig.blockKeywords || {},
@@ -89,7 +91,10 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
this.prev = prev;
}
function pushContext(state, col, type) {
return state.context = new Context(state.indented, col, type, null, state.context);
var indent = state.indented;
if (state.context && state.context.type == "statement")
indent = state.context.indented;
return state.context = new Context(indent, col, type, null, state.context);
}
function popContext(state) {
var t = state.context.type;
@@ -123,7 +128,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
if (style == "comment" || style == "meta") return style;
if (ctx.align == null) ctx.align = true;
if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state);
else if (curPunc == "{") pushContext(state, stream.column(), "}");
else if (curPunc == "[") pushContext(state, stream.column(), "]");
else if (curPunc == "(") pushContext(state, stream.column(), ")");
@@ -133,23 +138,28 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
while (ctx.type == "statement") ctx = popContext(state);
}
else if (curPunc == ctx.type) popContext(state);
else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))
pushContext(state, stream.column(), "statement");
state.startOfLine = false;
return style;
},
indent: function(state, textAfter) {
if (state.tokenize != tokenBase && state.tokenize != null) return 0;
if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
var closing = firstChar == ctx.type;
if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
else if (ctx.align) return ctx.column + (closing ? 0 : 1);
if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
else if (ctx.align && (!dontAlignCalls || ctx.type != ")")) return ctx.column + (closing ? 0 : 1);
else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit;
else return ctx.indented + (closing ? 0 : indentUnit);
},
electricChars: "{}"
electricChars: "{}",
blockCommentStart: "/*",
blockCommentEnd: "*/",
lineComment: "//",
fold: "brace"
};
});
@@ -165,7 +175,19 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
function cppHook(stream, state) {
if (!state.startOfLine) return false;
stream.skipToEnd();
for (;;) {
if (stream.skipTo("\\")) {
stream.next();
if (stream.eol()) {
state.tokenize = cppHook;
break;
}
} else {
stream.skipToEnd();
state.tokenize = null;
break;
}
}
return "meta";
}
@@ -204,7 +226,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
});
CodeMirror.defineMIME("text/x-java", {
name: "clike",
keywords: words("abstract assert boolean break byte case catch char class const continue default " +
keywords: words("abstract assert boolean break byte case catch char class const continue default " +
"do double else enum extends final finally float for goto if implements import " +
"instanceof int interface long native new package private protected public " +
"return short static strictfp super switch synchronized this throw throws transient " +
@@ -212,7 +234,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
blockKeywords: words("catch class do else finally for if switch try while"),
atoms: words("true false null"),
hooks: {
"@": function(stream, state) {
"@": function(stream) {
stream.eatWhile(/[\w\$_]/);
return "meta";
}
@@ -220,12 +242,12 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
});
CodeMirror.defineMIME("text/x-csharp", {
name: "clike",
keywords: words("abstract as base break case catch checked class const continue" +
" default delegate do else enum event explicit extern finally fixed for" +
" foreach goto if implicit in interface internal is lock namespace new" +
" operator out override params private protected public readonly ref return sealed" +
" sizeof stackalloc static struct switch this throw try typeof unchecked" +
" unsafe using virtual void volatile while add alias ascending descending dynamic from get" +
keywords: words("abstract as base break case catch checked class const continue" +
" default delegate do else enum event explicit extern finally fixed for" +
" foreach goto if implicit in interface internal is lock namespace new" +
" operator out override params private protected public readonly ref return sealed" +
" sizeof stackalloc static struct switch this throw try typeof unchecked" +
" unsafe using virtual void volatile while add alias ascending descending dynamic from get" +
" global group into join let orderby partial remove select set value var yield"),
blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
builtin: words("Boolean Byte Char DateTime DateTimeOffset Decimal Double" +
@@ -247,38 +269,94 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
CodeMirror.defineMIME("text/x-scala", {
name: "clike",
keywords: words(
/* scala */
"abstract case catch class def do else extends false final finally for forSome if " +
"implicit import lazy match new null object override package private protected return " +
"sealed super this throw trait try trye type val var while with yield _ : = => <- <: " +
"<% >: # @ " +
/* package scala */
"assert assume require print println printf readLine readBoolean readByte readShort " +
"readChar readInt readLong readFloat readDouble " +
"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " +
"Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable " +
"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " +
"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " +
"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector :: #:: " +
/* package java.lang */
/* package java.lang */
"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
),
blockKeywords: words("catch class do else finally for forSome if match switch try while"),
atoms: words("true false null"),
hooks: {
"@": function(stream, state) {
"@": function(stream) {
stream.eatWhile(/[\w\$_]/);
return "meta";
}
}
});
mimes(["x-shader/x-vertex", "x-shader/x-fragment"], {
name: "clike",
keywords: words("float int bool void " +
"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " +
"mat2 mat3 mat4 " +
"sampler1D sampler2D sampler3D samplerCube " +
"sampler1DShadow sampler2DShadow" +
"const attribute uniform varying " +
"break continue discard return " +
"for while do if else struct " +
"in out inout"),
blockKeywords: words("for while do if else struct"),
builtin: words("radians degrees sin cos tan asin acos atan " +
"pow exp log exp2 sqrt inversesqrt " +
"abs sign floor ceil fract mod min max clamp mix step smootstep " +
"length distance dot cross normalize ftransform faceforward " +
"reflect refract matrixCompMult " +
"lessThan lessThanEqual greaterThan greaterThanEqual " +
"equal notEqual any all not " +
"texture1D texture1DProj texture1DLod texture1DProjLod " +
"texture2D texture2DProj texture2DLod texture2DProjLod " +
"texture3D texture3DProj texture3DLod texture3DProjLod " +
"textureCube textureCubeLod " +
"shadow1D shadow2D shadow1DProj shadow2DProj " +
"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " +
"dFdx dFdy fwidth " +
"noise1 noise2 noise3 noise4"),
atoms: words("true false " +
"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " +
"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " +
"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " +
"gl_FogCoord " +
"gl_Position gl_PointSize gl_ClipVertex " +
"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " +
"gl_TexCoord gl_FogFragCoord " +
"gl_FragCoord gl_FrontFacing " +
"gl_FragColor gl_FragData gl_FragDepth " +
"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
"gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
"gl_ProjectionMatrixInverseTranspose " +
"gl_ModelViewProjectionMatrixInverseTranspose " +
"gl_TextureMatrixInverseTranspose " +
"gl_NormalScale gl_DepthRange gl_ClipPlane " +
"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " +
"gl_FrontLightModelProduct gl_BackLightModelProduct " +
"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " +
"gl_FogParameters " +
"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " +
"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " +
"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " +
"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " +
"gl_MaxDrawBuffers"),
hooks: {"#": cppHook}
});
}());

Some files were not shown because too many files have changed in this diff Show More