Compare commits

...
63 Commits
Author SHA1 Message Date
Lauri Ojansivu 479472c1d8 v4.30 2020-09-13 11:15:00 +03:00
Lauri Ojansivu c10c10c4a9 Update ChangeLog. 2020-09-13 11:07:48 +03:00
Lauri Ojansivu d8c515c858 Update translations. 2020-09-13 11:01:01 +03:00
Lauri Ojansivu 168a308f5f Merge branch 'helioguardabaxo-master' 2020-09-13 10:56:15 +03:00
Lauri Ojansivu fe40c5fd37 Update English text 2020-09-13 10:53:13 +03:00
Lauri Ojansivu c430e36357 Merge branch 'master' of https://github.com/helioguardabaxo/wekan into helioguardabaxo-master 2020-09-13 10:51:08 +03:00
Lauri Ojansivu 007bf743a6 Merge branch 'xoe-labs-da-use-grifs-stream-updated-fork' 2020-09-13 10:49:28 +03:00
Lauri Ojansivu 774f57f3f6 Merge branch 'da-use-grifs-stream-updated-fork' of https://github.com/xoe-labs/wekan into xoe-labs-da-use-grifs-stream-updated-fork 2020-09-13 09:57:37 +03:00
Lauri Ojansivu 044a64b964 Update ChangeLog. 2020-09-13 09:49:01 +03:00
Lauri Ojansivu f6bdb4d694 - Remove mouse scroll settings of already removed custom scrollbar.
- Add setting OAUTH2_ADFS_ENABLED=false
- Add testing for both string and boolean version of true

Thanks to xet7 !

Fixes #2949
2020-09-13 09:41:53 +03:00
helioguardabaxo 6a6b76e084 Bold minicard item title 2020-09-13 01:11:19 -03:00
helioguardabaxo 9357ce8a26 Card details layout improvements 2020-09-13 00:23:12 -03:00
helioguardabaxo 0aab2b3085 Put card custom field check in the same line 2020-09-12 16:11:54 -03:00
helioguardabaxo 3edafd6c67 This PR add 'Template' label and modify placeholder in template search 2020-09-12 13:33:29 -03:00
David Arnold 850ded2e17 Use forked & updated version of gridfs-stream 2020-09-11 12:43:01 -05:00
Lauri Ojansivu 67a58daaf3 Update ChangeLog. 2020-09-11 19:18:50 +03:00
Lauri Ojansivu 9fdafd2008 Update npm-mongo dependency.
Thanks to filipenevola.
2020-09-11 19:16:01 +03:00
Lauri Ojansivu 66c37ccd3e Update dependencies. 2020-09-11 14:35:50 +03:00
Lauri Ojansivu fd3139201a Merge pull request #3268 from blaggacao/patch-1
bump: mongodb -> 3.6.2
2020-09-11 14:16:49 +03:00
Lauri Ojansivu abfedf573b Merge pull request #3269 from phaseshift3r/patch-1
Update oidc_server.js
2020-09-11 14:10:14 +03:00
phaseshift3r a1f9536657 Update oidc_server.js
added hack for getting the claims in the accessToken instead of the /adfs/oauth2/userinfo endpoint 

https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/overview/ad-fs-faq#i-am-trying-to-get-additional-claims-on-the-user-info-endpoint-but-its-only-returning-subject-how-can-i-get-additional-claims

Environment variable needed set
OAUTH2_ADFS=true
2020-09-11 11:16:28 +02:00
David Arnold dec0563e3c bump: mongodb -> 3.6.2
https://github.com/mongodb/node-mongodb-native/releases
2020-09-10 20:44:22 -05:00
Lauri Ojansivu 9a4136399f v4.29 2020-09-11 02:18:40 +03:00
Lauri Ojansivu 20b0177105 Changed markdown from marked to markdown-it. Added emoji support https://github.com/wekan/wekan/wiki/Emoji
Thanks to xet7 !

Fixes #2696,
fixes #1537
2020-09-11 02:04:17 +03:00
Lauri Ojansivu e0957f70e6 v4.28 2020-09-11 00:53:50 +03:00
Lauri Ojansivu 125c4684bd Update dependencies.
Thanks to developers of dependencies!
2020-09-11 00:45:46 +03:00
Lauri Ojansivu 991d4909e1 Update ChangeLog. 2020-09-11 00:31:56 +03:00
Lauri Ojansivu f81fd8084f Try to fix language names.
Thanks to buplet, xoas and xet7.

Fixes #3265
2020-09-11 00:28:33 +03:00
Lauri Ojansivu 231137617f Update translations. 2020-09-10 17:11:55 +03:00
Lauri Ojansivu f6b4c0ab25 Update ChangeLog. 2020-09-10 15:57:00 +03:00
Lauri Ojansivu 30f2de151b Update translations. 2020-09-10 15:54:02 +03:00
Lauri Ojansivu 20fe8bc09b Merge pull request #3264 from tborychowski/master
fix(card): fix card scrollbar on windows
2020-09-10 15:33:21 +03:00
Tomasz Borychowski 2e715444ed fix(card): fix card scrollbar on windows 2020-09-10 09:15:45 +01:00
Lauri Ojansivu 1b13beb106 v4.27 2020-09-09 09:14:13 +03:00
Lauri Ojansivu 88213911fd Update translations. 2020-09-09 09:08:19 +03:00
Lauri Ojansivu 50f3957011 Update ChangeLog. 2020-09-09 09:03:18 +03:00
Lauri Ojansivu bf18792d77 Reverted incomplete fix for "Checklist + card title with starting number and point", because it disabled some markdown. Related #2696
More fixes to GFM checklist not displayed properly in card title, fixes #2818

Thanks to xet7 !
2020-09-09 08:52:37 +03:00
Lauri Ojansivu ca39fce578 Update translations. 2020-09-08 21:01:31 +03:00
Lauri Ojansivu f0df8dcdc7 v4.26 2020-09-05 03:54:35 +03:00
Lauri Ojansivu 7d594705fb Update translations. 2020-09-05 03:47:20 +03:00
Lauri Ojansivu fe5e124f93 Update ChangeLog. 2020-09-05 03:04:38 +03:00
Lauri Ojansivu 41b1c55988 Disable list formatting and converting to HTML.
Fixes:
- Checklist + card title with starting number and point #2696
- How to begin a card title with "3. "? #1421
- GFM checklist not displayed properly in card title #2818

Thanks to xet7 !

Fixes #2696,
fixes #1421,
fixes #2818
2020-09-05 02:50:36 +03:00
Lauri Ojansivu cfcbf640d6 Update dependencies.
Thanks to developers of dependencies.
2020-09-05 01:36:43 +03:00
Lauri Ojansivu d344c39d49 Delete markdown demo that is not in use.
Thanks to xet7 !
2020-09-04 22:44:40 +03:00
Lauri Ojansivu 22d07d7a65 Update translations. 2020-09-04 20:56:29 +03:00
Lauri Ojansivu 44fc7c0771 Merge pull request #3254 from wekan/dependabot/npm_and_yarn/bl-2.2.1
Bump bl from 2.2.0 to 2.2.1
2020-09-04 17:21:30 +03:00
dependabot[bot] 7ec671bb9f Bump bl from 2.2.0 to 2.2.1
Bumps [bl](https://github.com/rvagg/bl) from 2.2.0 to 2.2.1.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v2.2.0...v2.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-03 18:55:54 +00:00
Lauri Ojansivu df35683043 Create codeql-analysis.yml 2020-09-03 19:32:02 +03:00
Lauri Ojansivu 03bfd8a734 v4.25 2020-08-31 15:25:27 +03:00
Lauri Ojansivu 409245e374 Update ChangeLog. 2020-08-31 15:11:37 +03:00
Lauri Ojansivu 5870d38e8e Restore original package.json and package-lock.json 2020-08-31 13:30:25 +03:00
Lauri Ojansivu c105e348d8 Merge branch 'tborychowski-master' 2020-08-31 13:29:13 +03:00
Lauri Ojansivu ccd0f89ae0 Merge branch 'master' of https://github.com/tborychowski/wekan into tborychowski-master 2020-08-31 13:28:34 +03:00
Lauri Ojansivu bdd28444bb Merge pull request #3248 from relikd/patch-1
Improving documentation for nextcloud integration
2020-08-31 12:28:22 +03:00
Oleg Geier c96468d76d Update docker-compose.yml
Important information missing in description
2020-08-30 18:58:11 +02:00
Lauri Ojansivu 943cd25592 Update translations. 2020-08-30 17:09:21 +03:00
Lauri Ojansivu 7f4d3ff3ec Update ChangeLog. 2020-08-30 17:07:37 +03:00
Lauri Ojansivu 5d2daa4a80 Mongo 4.4 does not work. Mongo 4.2 and 3.x works.
Thanks to GuidoDr for info.

Related #3247
2020-08-30 17:03:59 +03:00
Tomasz Borychowski 6372bb82c4 fix(scrollbar): revert formatting 2020-08-28 11:57:50 +01:00
Tomasz Borychowski 03a7da0795 fix(scrollbar): revert formatting 2020-08-28 11:56:10 +01:00
Tom bc1165ef3e revert formatting 2020-08-28 11:54:03 +01:00
Tom 47f34f6d12 revert formatting 2020-08-28 11:53:39 +01:00
Tomasz Borychowski d887e553ce fix(scrollbar): remove custom scrollbar 2020-08-28 11:46:51 +01:00
138 changed files with 43166 additions and 59642 deletions

No files matched your search

+1 -3
View File
@@ -39,6 +39,7 @@ ENV \
TRUSTED_URL="" \
WEBHOOKS_ATTRIBUTES="" \
OAUTH2_ENABLED=false \
OAUTH2_ADFS_ENABLED=false \
OAUTH2_LOGIN_STYLE=redirect \
OAUTH2_CLIENT_ID="" \
OAUTH2_SECRET="" \
@@ -112,9 +113,6 @@ ENV \
CORS_ALLOW_HEADERS="" \
CORS_EXPOSE_HEADERS="" \
DEFAULT_AUTHENTICATION_METHOD="" \
SCROLLINERTIA="0" \
SCROLLAMOUNT="auto" \
SCROLLDELTAFACTOR="auto" \
PASSWORD_LOGIN_ENABLED=true
# Install OS
+1 -1
View File
@@ -45,7 +45,7 @@
"no-spaced-func": 2,
"no-trailing-spaces": 2,
"operator-linebreak": 2,
"quotes": [2, "single"],
"quotes": [2, "single", { "avoidEscape": true }],
"semi-spacing": 2,
"space-unary-ops": 2,
"arrow-spacing": 2,
+62
View File
@@ -0,0 +1,62 @@
name: "CodeQL"
on:
push:
branches: [master]
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
schedule:
- cron: '0 16 * * 3'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['javascript', 'python']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
-2
View File
@@ -82,8 +82,6 @@ momentjs:moment@2.22.2
browser-policy-framing@1.1.0
mquandalle:moment
msavin:usercache
wekan-scrollbar
mquandalle:perfect-scrollbar
mdg:meteor-apm-agent@3.2.0-rc.0!
# Keep stylus in 1.1.0, because building v2 takes extra 52 minutes.
coagmano:stylus@1.1.0!
+3 -5
View File
@@ -17,7 +17,7 @@ base64@1.0.12
binary-heap@1.0.11
blaze@2.3.4
blaze-tools@1.0.10
boilerplate-generator@1.7.0
boilerplate-generator@1.7.1
browser-policy-common@1.0.11
browser-policy-framing@1.1.0
caching-compiler@1.2.2
@@ -101,7 +101,7 @@ meteorhacks:collection-utils@1.2.0
meteorhacks:picker@1.0.3
meteorhacks:subs-manager@1.6.4
meteorspark:util@0.2.0
minifier-css@1.5.2
minifier-css@1.5.3
minifier-js@2.6.0
minifiers@1.1.8-faster-rebuild.0
minimongo@1.6.0
@@ -124,10 +124,9 @@ mquandalle:jquery-textcomplete@0.8.0_1
mquandalle:jquery-ui-drag-drop-sort@0.2.0
mquandalle:moment@1.0.1
mquandalle:mousetrap-bindglobal@0.0.1
mquandalle:perfect-scrollbar@0.6.5_2
msavin:usercache@1.8.0
npm-bcrypt@0.9.3
npm-mongo@3.8.0
npm-mongo@3.8.1
oauth@1.3.0
oauth2@1.3.0
observe-sequence@1.0.16
@@ -194,6 +193,5 @@ wekan-accounts-oidc@1.0.10
wekan-ldap@0.0.2
wekan-markdown@1.0.9
wekan-oidc@1.0.12
wekan-scrollbar@3.1.3
yasaricli:slugify@0.0.7
zimme:active-route@2.3.2
+103
View File
@@ -1,3 +1,106 @@
# v4.30 2020-09-13 Wekan release
This release adds the following new features and improvements:
- [Add setting for OAUTH2_ADFS_ENABLED=true](https://github.com/wekan/wekan/pull/3269)
for [SSO Integration with ADFS 4.0 using OAuth 2 and OpenID](https://github.com/wekan/wekan/issues/3184).
Thanks to phaseshift3r.
- [Add setting OAUTH2_ADFS_ENABLED=false for most platforms. Remove mouse scroll settings of already removed custom scrollbar.
Add testing for both string and boolean version of true](https://github.com/wekan/wekan/commit/f6bdb4d694453d73f4bfa6a75814833594cf5000).
Thanks to xet7.
- [Design improvements in templates, card details and custom fields](https://github.com/wekan/wekan/pull/3271)
and [related change to translation](https://github.com/wekan/wekan/commit/fe40c5fd37a7c54240c080caf98b6130229f5d31).
Thanks to helioguardabaxo and xet7.
and adds the following updates:
- [Use forked & updated version of gridfs-stream](https://github.com/wekan/wekan/pull/3270).
Thanks to blaggacao.
- [Update dependencies](https://github.com/wekan/wekan/pull/3268).
Thanks to blaggacao.
- [Update npm-mongo dependency](https://github.com/wekan/wekan/commit/9fdafd20081b20302af3d1a6397fb840348f1209).
Thanks to filipenevola.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.29 2020-09-11
This release adds the following new features:
- [Changed markdown from marked to markdown-it](https://github.com/wekan/wekan/commit/20b01771055ca4d8871d13abb559ab92ecee10f4) and
added emoji support https://github.com/wekan/wekan/wiki/Emoji .
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.28 2020-09-11 Wekan release
This release updates some dependencies:
- [Update some dependencies](https://github.com/wekan/wekan/commit/125c4684bd6815a8f49241bc2663e82112afe67b).
Thanks to developers of dependencies.
and fixes the following bugs:
- [Fix card scrollbar on Windows](https://github.com/wekan/wekan/pull/3264).
Thanks to tborychowski.
- [Try to fix language names](https://github.com/wekan/wekan/commit/f81fd8084fd6cd1ad57daefcc22ed1fb0acaaeca).
Thanks to buplet, xoas and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.27 2020-09-09 Wekan release
This release fixes the following bugs:
- [Reverted incomplete fix for "Checklist + card title with starting number and point", because it disabled some markdown.
Also more fixes to GFM checklist not displayed properly](https://github.com/wekan/wekan/commit/bf18792d7733d6e6cfb61a8d6db4caafdcc19b34).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.26 2020-09-05 Wekan release
This release adds the following quality checks:
- [Added GitHub automatic code quality analysis](https://github.com/wekan/wekan/commit/df35683043603f6ecb9bd4f2a4b357e374397ad1).
Thanks to xet7.
and updates the following dependencies:
- [bl](https://github.com/wekan/wekan/commit/7ec671bb9f8a33c5eb28c26b98143f9b4cd9b958).
Thanks to developers of dependencies.
- [Delete markdown demo that is not in use](https://github.com/wekan/wekan/commit/d344c39d497cc291ee7927fdda900dc8bac22bc2).
Thanks to xet7.
- [Update markdown and xss](https://github.com/wekan/wekan/commit/cfcbf640d64bdfc4f3a482c32e35f396e1a22191)
Thanks to developers of dependencies.
and fixes the following bugs:
- [Disable list formatting and converting to HTML. This fixes markdown numbering and viewing bugs](https://github.com/wekan/wekan/commit/41b1c55988a9a65005ac0b9e1ddcc0596c047a49).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.25 2020-08-31 Wekan release
This release adds the following docker-compose.yml changes:
- [Mongo 4.4 does not work. Mongo 4.2 and 3.x works](https://github.com/wekan/wekan/commit/5d2daa4a80c819f0610ff2f17589de1e1085836c).
Thanks to GuidoDr for info. Related https://github.com/wekan/wekan/issues/3247
and adds the following Nextcloud documentation:
- [Improving documentation for Nextcloud integration](https://github.com/wekan/wekan/pull/3248).
Thanks to relikd.
and removes the following code and allows double quotes in code:
- Removed custom scrollbar [1](https://github.com/wekan/wekan/pull/3246) and [2](https://github.com/wekan/wekan/commit/5870d38e8e63159ede8c18d1766a4f9f6ba8987c).
Also in eslint settings allowed double quotes in code. Thanks to tborychowski and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.24 2020-08-27 Wekan release
This release adds the following updates:
+1 -3
View File
@@ -41,6 +41,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
TRUSTED_URL="" \
WEBHOOKS_ATTRIBUTES="" \
OAUTH2_ENABLED=false \
OAUTH2_ADFS_ENABLED=false \
OAUTH2_LOGIN_STYLE=redirect \
OAUTH2_CLIENT_ID="" \
OAUTH2_SECRET="" \
@@ -114,9 +115,6 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
CORS_ALLOW_HEADERS="" \
CORS_EXPOSE_HEADERS="" \
DEFAULT_AUTHENTICATION_METHOD="" \
SCROLLINERTIA="0" \
SCROLLAMOUNT="auto" \
SCROLLDELTAFACTOR="auto" \
PASSWORD_LOGIN_ENABLED=true
# Copy the app to the image
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v4.24.0"
appVersion: "v4.30.0"
files:
userUploads:
- README.md
+1 -1
View File
@@ -15,7 +15,7 @@ template(name="board")
template(name="boardBody")
.board-wrapper(class=currentBoard.colorClass)
+sidebar
.board-canvas.js-swimlanes.js-perfect-scrollbar(
.board-canvas.js-swimlanes(
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
@@ -4,8 +4,7 @@ template(name="cardCustomFieldsPopup")
li.item(class="")
a.name.js-select-field(href="#")
span.full-name
+viewer
= name
= name
if hasCustomField
i.fa.fa-check
hr
+53 -47
View File
@@ -1,5 +1,5 @@
template(name="cardDetails")
section.card-details.js-card-details.js-perfect-scrollbar: .card-details-canvas
section.card-details.js-card-details: .card-details-canvas
.card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
+inlinedForm(classNames="js-card-details-title")
+editCardTitleForm
@@ -42,12 +42,28 @@ template(name="cardDetails")
else
p.warning {{_ 'card-archived'}}
.card-details-items
.card-details-items
if currentBoard.allowsLabels
.card-details-item.card-details-item-labels
h3.card-details-item-title
i.fa.fa-tags
| {{_ 'labels'}}
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
each labels
span.card-label(class="card-label-{{color}}" title=name)
+viewer
= name
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
if currentBoard.allowsReceivedDate
hr
.card-details-item.card-details-item-received
h3
h3.card-details-item-title
i.fa.fa-sign-out
card-details-item-title {{_ 'card-received'}}
| {{_ 'card-received'}}
if getReceived
+cardReceivedDate
else
@@ -58,9 +74,9 @@ template(name="cardDetails")
if currentBoard.allowsStartDate
.card-details-item.card-details-item-start
h3
h3.card-details-item-title
i.fa.fa-hourglass-start
card-details-item-title {{_ 'card-start'}}
| {{_ 'card-start'}}
if getStart
+cardStartDate
else
@@ -71,9 +87,9 @@ template(name="cardDetails")
if currentBoard.allowsDueDate
.card-details-item.card-details-item-due
h3
h3.card-details-item-title
i.fa.fa-sign-in
card-details-item-title {{_ 'card-due'}}
| {{_ 'card-due'}}
if getDue
+cardDueDate
else
@@ -84,9 +100,9 @@ template(name="cardDetails")
if currentBoard.allowsEndDate
.card-details-item.card-details-item-end
h3
h3.card-details-item-title
i.fa.fa-hourglass-end
card-details-item-title {{_ 'card-end'}}
| {{_ 'card-end'}}
if getEnd
+cardEndDate
else
@@ -97,10 +113,11 @@ template(name="cardDetails")
//.card-details-items
if currentBoard.allowsMembers
hr
.card-details-item.card-details-item-members
h3
h3.card-details-item-title
i.fa.fa-users
card-details-item-title {{_ 'members'}}
| {{_ 'members'}}
each getMembers
+userAvatar(userId=this cardId=../_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
@@ -112,9 +129,9 @@ template(name="cardDetails")
//if assigneeSelected
if currentBoard.allowsAssignee
.card-details-item.card-details-item-assignees
h3
h3.card-details-item-title
i.fa.fa-user
card-details-item-title {{_ 'assignee'}}
| {{_ 'assignee'}}
each getAssignees
+userAvatarAssignee(userId=this cardId=../_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
@@ -126,44 +143,23 @@ template(name="cardDetails")
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
i.fa.fa-plus
if currentBoard.allowsLabels
.card-details-item.card-details-item-labels
h3
i.fa.fa-tags
card-details-item-title {{_ 'labels'}}
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
each labels
span.card-label(class="card-label-{{color}}" title=name)
+viewer
= name
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
//.card-details-items
each customFieldsWD
.card-details-item.card-details-item-customfield
h3.card-details-item-title
+viewer
= definition.name
+cardCustomField
//.card-details-items
if getSpentTime
.card-details-item.card-details-item-spent
if getIsOvertime
h3.card-details-item-title {{_ 'overtime-hours'}}
h3.card-details-item-title
| {{_ 'overtime-hours'}}
else
h3.card-details-item-title {{_ 'spent-time-hours'}}
h3.card-details-item-title
| {{_ 'spent-time-hours'}}
+cardSpentTime
//.card-details-items
if currentBoard.allowsRequestedBy
.card-details-item.card-details-item-name
h3
h3.card-details-item-title
i.fa.fa-shopping-cart
card-details-item-title {{_ 'requested-by'}}
| {{_ 'requested-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-requester")
@@ -181,9 +177,9 @@ template(name="cardDetails")
if currentBoard.allowsAssignedBy
.card-details-item.card-details-item-name
h3
h3.card-details-item-title
i.fa.fa-user-plus
card-details-item-title {{_ 'assigned-by'}}
| {{_ 'assigned-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-assigner")
@@ -199,6 +195,16 @@ template(name="cardDetails")
+viewer
= getAssignedBy
//.card-details-items
if customFieldsWD
hr
each customFieldsWD
.card-details-item.card-details-item-customfield
h3.card-details-item-title
i.fa.fa-list-alt
= definition.name
+cardCustomField
if getVoteQuestion
hr
.vote-title
@@ -234,9 +240,9 @@ template(name="cardDetails")
unless currentUser.isWorker
if currentBoard.allowsDescriptionTitle
hr
h3
h3.card-details-item-title
i.fa.fa-align-left
card-details-item-title {{_ 'description'}}
| {{_ 'description'}}
if currentBoard.allowsDescriptionText
+inlinedCardDescription(classNames="card-description js-card-description")
+editor(autofocus=true)
@@ -276,7 +282,7 @@ template(name="cardDetails")
+subtasks(cardId = _id)
if currentBoard.allowsAttachments
hr
h3
h3.card-details-item-title
i.fa.fa-paperclip
| {{_ 'attachments'}}
.card-checklist-attachmentGalery.card-attachmentGalery
@@ -285,7 +291,7 @@ template(name="cardDetails")
hr
unless currentUser.isNoComments
.activity-title
h3
h3.card-details-item-title
i.fa.fa-history
| {{ _ 'activity'}}
if currentUser.isBoardMember
+1 -8
View File
@@ -8,7 +8,7 @@ Meteor.startup(() => {
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
return [Mixins.InfiniteScrolling];
},
calculateNextPeak() {
@@ -171,13 +171,6 @@ BlazeComponent.extendComponent({
if (!Utils.isMiniScreen()) {
Meteor.setTimeout(() => {
$('.card-details').mCustomScrollbar({
theme: 'minimal-dark',
setWidth: false,
setLeft: 0,
scrollbarPosition: 'outside',
mouseWheel: true,
});
this.scrollParentContainer();
}, 500);
}
+20 -15
View File
@@ -89,7 +89,7 @@ avatar-radius = 50%
.card-details
padding: 0
flex-shrink: 0
flex-basis: 510px
flex-basis: 600px
will-change: flex-basis
overflow-y: scroll
overflow-x: hidden
@@ -104,17 +104,13 @@ avatar-radius = 50%
.mCustomScrollBox
padding-left: 0
.ps-scrollbar-y-rail
pointer-event: all
position: absolute
.card-details-canvas
width: 470px
padding-left: 20px
width: auto
padding: 0 20px
.card-details-header
margin: 0 -20px 5px
padding 7px 16px
padding 7px 20px
background: darken(white, 7%)
border-bottom: 1px solid darken(white, 14%)
@@ -202,23 +198,32 @@ avatar-radius = 50%
margin-right: 0.5em
&:last-child
margin-right: 0
&.card-details-item-labels,
&.card-details-item-labels
display: block
word-wrap: break-word
max-width: 95%
flex-grow: 1
&.card-details-item-members,
&.card-details-item-assignees,
&.card-details-item-received,
&.card-details-item-start,
&.card-details-item-due,
&.card-details-item-end,
&.card-details-item-customfield,
&.card-details-item-name
display: block
word-wrap: break-word
max-width: 48%
max-width: 36%
flex-grow: 1
&.card-details-item-received,
&.card-details-item-start,
&.card-details-item-due,
&.card-details-item-end
display: block
word-wrap: break-word
max-width: 28%
flex-grow: 1
.card-details-item-title
font-size: 16px
color: #000
font-weight: bold
color: #4d4d4d
.card-label
padding-top: 5px
+1 -1
View File
@@ -1,6 +1,6 @@
template(name="checklists")
.checklists-title
h3
h3.card-details-item-title
i.fa.fa-check
| {{_ 'checklists'}}
if currentUser.isBoardMember
+1 -1
View File
@@ -1,5 +1,5 @@
template(name="subtasks")
h3
h3.card-details-item-title
i.fa.fa-sitemap
| {{_ 'subtasks'}}
if toggleDeleteDialog.get
-3
View File
@@ -120,9 +120,6 @@
form
margin-bottom: 9px
.ps-scrollbar-y-rail
transform: translateX(2px)
.open-minicard-composer
border-radius: 2px
color: #8c8c8c
+4 -2
View File
@@ -1,5 +1,5 @@
template(name="listBody")
.list-body.js-perfect-scrollbar
.list-body
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
if cards.count
+inlinedForm(autoclose=false position="top")
@@ -105,8 +105,10 @@ template(name="searchElementPopup")
each boards
option(value="{{_id}}") {{title}}
form.js-search-term-form
label
| {{_ 'template'}}
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
.list-body.js-perfect-scrollbar.search-card-results
.list-body.search-card-results
.minicards.clearfix.js-minicards
if isBoardTemplateSearch
each results
+3 -3
View File
@@ -8,7 +8,7 @@ BlazeComponent.extendComponent({
},
mixins() {
return [Mixins.PerfectScrollbar];
return [];
},
openForm(options) {
@@ -523,7 +523,7 @@ BlazeComponent.extendComponent({
BlazeComponent.extendComponent({
mixins() {
return [Mixins.PerfectScrollbar];
return [];
},
onCreated() {
@@ -721,7 +721,7 @@ BlazeComponent.extendComponent({
onRendered() {
this.spinner = this.find('.sk-spinner-list');
this.container = this.$(this.spinner).parents('.js-perfect-scrollbar')[0];
this.container = this.$(this.spinner).parents('.list-body')[0];
$(this.container).on(
`scroll.spinner_${this.swimlaneId}_${this.listId}`,
+24
View File
@@ -74,10 +74,34 @@ Template.userFormsLayout.helpers({
let name = lang.name;
if (lang.name === 'br') {
name = 'Brezhoneg';
} else if (lang.name === 'Español') {
name = 'español';
} else if (lang.name === 'Español de Argentina') {
name = 'español de Argentina';
} else if (lang.name === 'Español de Chile') {
name = 'español de Chile';
} else if (lang.name === 'Español de Colombia') {
name = 'español de Colombia';
} else if (lang.name === 'Español de México') {
name = 'español de México';
} else if (lang.name === 'Español de Puerto Rico') {
name = 'español de Puerto Rico';
} else if (lang.name === 'fr-BE') {
name = 'Français (Belgique)';
} else if (lang.name === 'fr-CA') {
name = 'Français (Canada)';
} else if (lang.name === 'fr-CA') {
name = 'Français (Canada)';
} else if (lang.name === 'ig') {
name = 'Igbo';
} else if (lang.name === 'lv') {
name = 'Latviešu';
} else if (lang.name === 'latviešu valoda') {
name = 'Latviešu';
} else if (lang.name === 'oc') {
name = 'Occitan';
} else if (lang.name === 'st') {
name = 'Sãotomense';
} else if (lang.name === '繁体中文(台湾)') {
name = '繁體中文(台灣)';
}
-5
View File
@@ -107,11 +107,6 @@ $popupWidth = 300px
padding: 8px 4px 8px 10px
margin-right: 8px
&::-webkit-scrollbar-button
display: block
height: 4px
width: 4px
.at-form
.at-error, .at-result
padding: 8px 12px
@@ -1,16 +0,0 @@
const { isTouchDevice } = Utils;
Mixins.PerfectScrollbar = BlazeComponent.extendComponent({
onRendered() {
if (!isTouchDevice()) {
const component = this.mixinParent();
const domElement = component.find('.js-perfect-scrollbar');
Ps.initialize(domElement);
// XXX We should create an event map to be consistent with other components
// but since BlazeComponent doesn't merge Mixins events transparently I
// prefered to use a jQuery event (which is what an event map ends up doing)
component.$(domElement).on('mouseenter', () => Ps.update(domElement));
}
},
});
@@ -1,2 +0,0 @@
.ps-container
position: relative
+1 -1
View File
@@ -9,7 +9,7 @@ template(name="sidebar")
a.board-header-btn.js-shortcuts
i.fa.fa-keyboard-o
span {{_ 'keyboard-shortcuts' }}
.sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
.sidebar-content.js-board-sidebar-content
//a.hide-btn.js-hide-sidebar
// i.fa.fa-navicon
unless isDefaultView
+1 -1
View File
@@ -16,7 +16,7 @@ const viewTitles = {
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
return [Mixins.InfiniteScrolling];
},
onCreated() {
@@ -1,7 +1,7 @@
template(name="searchSidebar")
form.js-search-term-form
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
.list-body.js-perfect-scrollbar
.list-body
.minilists.clearfix.js-minilists
each (lists)
a.minilist-wrapper.js-minilist(href=absoluteUrl)
-9
View File
@@ -65,15 +65,6 @@ window.ExportHtml = Popup => {
'.list-composer,.js-card-composer, .js-add-card',
),
).forEach(elem => elem.remove());
Array.from(
document.querySelectorAll('.js-perfect-scrollbar > div:nth-of-type(n+2)'),
).forEach(elem => elem.remove());
Array.from(document.querySelectorAll('.js-perfect-scrollbar')).forEach(
elem => {
elem.style = 'overflow-y: auto !important;';
elem.classList.remove('js-perfect-scrollbar');
},
);
Array.from(document.querySelectorAll('[href]:not(link)')).forEach(elem =>
elem.attributes.removeNamedItem('href'),
);
+7 -8
View File
@@ -93,7 +93,9 @@ services:
#-------------------------------------------------------------------------------------
# ==== MONGODB AND METEOR VERSION ====
# a) For Wekan Meteor 1.8.x version at master branch, use mongo 4.x
image: mongo:latest
# DOES NOT WORK: mongo 4.4, see https://github.com/wekan/wekan/issues/3247
# WORKS: mongo 3.x and 4.2
image: mongo:4.2
# b) For Wekan Meteor 1.6.x version at devel branch.
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
#image: mongo:3.2.21
@@ -240,12 +242,6 @@ services:
# https://github.com/wekan/wekan/pull/2560
- RICHER_CARD_COMMENT_EDITOR=false
#---------------------------------------------------------------
# ==== MOUSE SCROLL ====
# https://github.com/wekan/wekan/issues/2949
- SCROLLINERTIA=0
- SCROLLAMOUNT=auto
- SCROLLDELTAFACTOR=auto
#---------------------------------------------------------------
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
# https://github.com/wekan/wekan/issues/2518
- CARD_OPENED_WEBHOOK_ENABLED=false
@@ -334,6 +330,8 @@ services:
# 2) Configure the environment variables. This differs slightly
# by installation type, but make sure you have the following:
#- OAUTH2_ENABLED=true
# Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting.
#- OAUTH2_ADFS_ENABLED=false
# OAuth2 login style: popup or redirect.
#- OAUTH2_LOGIN_STYLE=redirect
# Application GUID captured during app registration:
@@ -354,8 +352,9 @@ services:
#- OAUTH2_EMAIL_MAP=email
#-----------------------------------------------------------------
# ==== OAUTH2 Nextcloud ====
# 1) Register the application with Nextcloud: https://your.nextcloud/settings/admin/security
# 1) Register the application with Nextcloud: https://your.nextcloud/index.php/settings/admin/security
# Make sure you capture the application ID as well as generate a secret key.
# Use https://your.wekan/_oauth/oidc for the redirect URI.
# 2) Configure the environment variables. This differs slightly
# by installation type, but make sure you have the following:
#- OAUTH2_ENABLED=true
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -465,7 +465,7 @@
"search": "Search",
"rules": "Rules",
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
"search-example": "Text to search for?",
"search-example": "Write text you search and press Enter",
"select-color": "Select Color",
"set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
"setWipLimitPopup-title": "Set WIP Limit",
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -465,7 +465,7 @@
"search": "Zoek",
"rules": "Regels",
"search-cards": "Zoek in kaart/lijst, titels, beschrijvingen en maatwerkvelden op dit bord",
"search-example": "Tekst om naar te zoeken?",
"search-example": "Write text you search and press Enter",
"select-color": "Selecteer kleur",
"set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
"setWipLimitPopup-title": "Zet een WIP limiet",
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+814 -814
View File
File diff suppressed because it is too large. Load diff
+11 -4
View File
@@ -187,19 +187,26 @@ if (Meteor.isServer) {
}
function isLdapEnabled() {
return process.env.LDAP_ENABLE === 'true';
return (
process.env.LDAP_ENABLE === 'true' || process.env.LDAP_ENABLE === true
);
}
function isOauth2Enabled() {
return process.env.OAUTH2_ENABLED === 'true';
return (
process.env.OAUTH2_ENABLED === 'true' ||
process.env.OAUTH2_ENABLED === true
);
}
function isCasEnabled() {
return process.env.CAS_ENABLED === 'true';
return (
process.env.CAS_ENABLED === 'true' || process.env.CAS_ENABLED === true
);
}
function isApiEnabled() {
return process.env.WITH_API === 'true';
return process.env.WITH_API === 'true' || process.env.WITH_API === true;
}
Meteor.methods({
+58 -21
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v4.24.0",
"version": "v4.30.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -836,7 +836,6 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
@@ -1030,9 +1029,9 @@
}
},
"bl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
"integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
@@ -1529,6 +1528,11 @@
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"entities": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
"integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
},
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -2300,9 +2304,8 @@
"dev": true
},
"gridfs-stream": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/gridfs-stream/-/gridfs-stream-1.1.1.tgz",
"integrity": "sha1-PdOhAOwgIaGBKC9utGcJY2B034k=",
"version": "https://github.com/wekan/gridfs-stream/tarball/master",
"integrity": "sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==",
"requires": {
"flushwritable": "^1.0.0"
}
@@ -2896,6 +2899,14 @@
"immediate": "~3.0.5"
}
},
"linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz",
"integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==",
"requires": {
"uc.micro": "^1.0.1"
}
},
"lint-staged": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.3.0.tgz",
@@ -3197,6 +3208,28 @@
"object-visit": "^1.0.0"
}
},
"markdown-it": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.0.tgz",
"integrity": "sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg==",
"requires": {
"argparse": "^1.0.7",
"entities": "~2.0.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
},
"markdown-it-emoji": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz",
"integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw="
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
},
"memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
@@ -3857,11 +3890,11 @@
"optional": true
},
"mongodb": {
"version": "3.5.8",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.8.tgz",
"integrity": "sha512-jz7mR58z66JKL8Px4ZY+FXbgB7d0a0hEGCT7kw8iye46/gsqPrOEpZOswwJ2BQlfzsrCLKdsF9UcaUfGVN2HrQ==",
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz",
"integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==",
"requires": {
"bl": "^2.2.0",
"bl": "^2.2.1",
"bson": "^1.1.4",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
@@ -3870,9 +3903,9 @@
},
"dependencies": {
"bson": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
"integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
}
}
},
@@ -5048,8 +5081,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"staged-git-files": {
"version": "1.1.1",
@@ -5373,6 +5405,11 @@
"integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==",
"dev": true
},
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"union-value": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@@ -5627,11 +5664,11 @@
}
},
"xss": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.6.tgz",
"integrity": "sha512-6Q9TPBeNyoTRxgZFk5Ggaepk/4vUOYdOsIUYvLehcsIZTFjaavbVnsuAkLA5lIFuug5hw8zxcB9tm01gsjph2A==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz",
"integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==",
"requires": {
"commander": "^2.9.0",
"commander": "^2.20.3",
"cssfilter": "0.0.10"
}
},
+6 -4
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v4.24.0",
"version": "v4.30.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
@@ -65,16 +65,18 @@
"es6-promise": "^4.2.4",
"fibers": "^5.0.0",
"flatted": "^3.0.4",
"gridfs-stream": "^1.1.1",
"gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master",
"jszip": "^3.4.0",
"ldapjs": "^2.1.1",
"markdown-it": "^11.0.0",
"markdown-it-emoji": "^1.4.0",
"meteor-node-stubs": "^1.0.1",
"mongodb": "^3.5.7",
"mongodb": "^3.6.2",
"os": "^0.1.1",
"page": "^1.11.5",
"papaparse": "^5.2.0",
"qs": "^6.9.4",
"source-map-support": "^0.5.19",
"xss": "^1.0.6"
"xss": "^1.0.8"
}
}
-1
View File
@@ -1 +0,0 @@
.build*
Executable → Regular
View File
File mode changed.
-43
View File
@@ -1,43 +0,0 @@
# License information
## Contribution License Agreement
If you contribute code to this project, you are implicitly allowing your code
to be distributed under the MIT license. You are also implicitly verifying that
all code is your original work. `</legalese>`
## Marked
Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
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.
## Markdown
Copyright © 2004, John Gruber
http://daringfireball.net/
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
-76
View File
@@ -1,76 +0,0 @@
<a href="https://marked.js.org">
<img width="60px" height="60px" src="https://marked.js.org/img/logo-black.svg" align="right" />
</a>
# Marked
[![npm](https://badgen.net/npm/v/marked)](https://www.npmjs.com/package/marked)
[![gzip size](https://badgen.net/badgesize/gzip/https://cdn.jsdelivr.net/npm/marked/marked.min.js)](https://cdn.jsdelivr.net/npm/marked/marked.min.js)
[![install size](https://badgen.net/packagephobia/install/marked)](https://packagephobia.now.sh/result?p=marked)
[![downloads](https://badgen.net/npm/dt/marked)](https://www.npmjs.com/package/marked)
[![dep](https://badgen.net/david/dep/markedjs/marked?label=deps)](https://david-dm.org/markedjs/marked)
[![dev dep](https://badgen.net/david/dev/markedjs/marked?label=devDeps)](https://david-dm.org/markedjs/marked?type=dev)
[![travis](https://badgen.net/travis/markedjs/marked)](https://travis-ci.org/markedjs/marked)
[![snyk](https://snyk.io/test/npm/marked/badge.svg)](https://snyk.io/test/npm/marked)
- ⚡ built for speed
- ⬇️ low-level compiler for parsing markdown without caching or blocking for long periods of time
- ⚖️ light-weight while implementing all markdown features from the supported flavors & specifications
- 🌐 works in a browser, on a server, or from a command line interface (CLI)
## Demo
Checkout the [demo page](https://marked.js.org/demo/) to see marked in action ⛹️
## Docs
Our [documentation pages](https://marked.js.org) are also rendered using marked 💯
Also read about:
* [Options](https://marked.js.org/#/USING_ADVANCED.md)
* [Extensibility](https://marked.js.org/#/USING_PRO.md)
## Installation
**CLI:** `npm install -g marked`
**In-browser:** `npm install marked`
## Usage
### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML. Please use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! 🚨
**CLI**
``` bash
$ marked -o hello.html
hello world
^D
$ cat hello.html
<p>hello world</p>
```
**Browser**
```html
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Marked in the browser</title>
</head>
<body>
<div id="content"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
document.getElementById('content').innerHTML =
marked('# Marked in the browser\n\nRendered by **marked**.');
</script>
</body>
</html>
```
## License
Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
-10
View File
@@ -1,10 +0,0 @@
# Security Policy
The only completely secure system is the one that doesn't exist in the first place.
Having said that, we take the security of Marked very seriously.
## Reporting a Vulnerability
Please disclose potential security issues by email to the project [committers](https://marked.js.org/#/AUTHORS.md) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner).
We will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks
(also, feel free to contribute a fix for the issue).
@@ -1,33 +0,0 @@
{
"extends": "standard",
"plugins": [
"standard"
],
"parserOptions": {
"ecmaVersion": 5,
"sourceType": "script"
},
"rules": {
"semi": ["error", "always"],
"indent": ["error", 2, {
"SwitchCase": 1,
"VariableDeclarator": { "var": 2 },
"outerIIFEBody": 0
}],
"operator-linebreak": ["error", "before", { "overrides": { "=": "after" } }],
"space-before-function-paren": ["error", "never"],
"no-cond-assign": "off",
"no-useless-escape": "off",
"one-var": "off",
"no-control-regex": "off",
"no-prototype-builtins": "off",
"prefer-const": "off",
"no-var": "off"
},
"env": {
"node": true,
"browser": true,
"amd": true
}
}
-269
View File
@@ -1,269 +0,0 @@
# Authors
Marked takes an encompassing approach to its community. As such, you can think of these as [concentric circles](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951), where each group encompasses the following groups.
<table>
<tbody>
<tr>
<td align="center" valign="top" style="width:32%">
<a href="https://github.com/chjj">
<img width="100" height="100" src="https://github.com/chjj.png?s=150">
</a>
<br>
<a href="https://github.com/chjj">Christopher Jeffrey</a>
<div>Original Author</div>
<small>Started the fire</small>
</td>
<td align="center" valign="top" style="width:32%">
<a href="https://github.com/joshbruce">
<img width="100" height="100" src="https://github.com/joshbruce.png?s=150">
</a>
<br>
<a href="https://joshbruce.com">Josh Bruce</a>
<div>Publisher</div>
<small>Release Wrangler; Humaning Helper; Heckler of Hypertext</small>
</td>
<td align="center" valign="top" style="width:32%">
<a href="https://github.com/styfle">
<img width="100" height="100" src="https://github.com/styfle.png?s=150">
</a>
<br>
<a href="https://www.ceriously.com">Steven</a>
<div>Publisher</div>
<small>Release Wrangler; Dr. Docs; Open source, of course; GitHub Guru; Humaning Helper</small>
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="https://github.com/davisjam">
<img width="100" height="100" src="https://github.com/davisjam.png?s=150">
</a>
<br>
<a href="https://github.com/davisjam">Jamie Davis</a>
<div>Committer</div>
<small>Seeker of Security</small>
</td>
<td align="center" valign="top">
<a href="https://github.com/UziTech">
<img width="100" height="100" src="https://github.com/UziTech.png?s=150">
</a>
<br>
<a href="https://tony.brix.ninja">Tony Brix</a>
<div>Publisher</div>
<small>Release Wrangler; Titan of the test harness; Dr. DevOps</small>
</td>
<td align="center" valign="top">
&nbsp;
</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td align="center" valign="top">
<a href="https://github.com/intcreator">
<img width="100" height="100" src="https://github.com/intcreator.png?s=150">
</a>
<br>
<a href="https://github.com/intcreator">Brandon der Blätter</a>
<div>Contributor</div>
<small>Curious Contributor</small>
</td>
<td align="center" valign="top">
<a href="https://github.com/carlosvalle">
<img width="100" height="100" src="https://github.com/carlosvalle.png?s=150">
</a>
<br>
<a href="https://github.com/carlosvalle">Carlos Valle</a>
<div>Contributor</div>
<small>Maker of the Marked mark from 2018 to present</small>
</td>
<td align="center" width="20%" valign="top">
<a href="https://github.com/Feder1co5oave">
<img width="100" height="100" src="https://github.com/Feder1co5oave.png?s=150">
</a>
<br>
<a href="https://github.com/Feder1co5oave">Federico Soave</a>
<div>Contributor</div>
<small>Regent of the Regex; Master of Marked</small>
</td>
<td align="center" valign="top">
<a href="https://github.com/karenyavine">
<img width="100" height="100" src="https://github.com/karenyavine.png?s=150">
</a>
<br>
<a href="https://github.com/karenyavine">Karen Yavine</a>
<div>Contributor</div>
<small>Snyk's Security Saint</small>
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="https://github.com/KostyaTretyak">
<img width="100" height="100" src="https://github.com/KostyaTretyak.png?s=150">
</a>
<br>
<a href="https://github.com/KostyaTretyak">Костя Третяк</a>
<div>Contributor</div>
<small></small>
</td>
<td align="center" width="20%" valign="top">
<a href="https://github.com/tomtheisen">
<img width="100" height="100" src="https://github.com/tomtheisen.png?s=150">
</a>
<br>
<a href="https://github.com/tomtheisen">Tom Theisen</a>
<div>Contributor</div>
<small>Defibrillator</small>
</td>
<td align="center" width="20%" valign="top">
<a href="https://github.com/mccraveiro">
<img width="100" height="100" src="https://github.com/mccraveiro.png?s=150">
</a>
<br>
<a href="https://github.com/mccraveiro">Mateus Craveiro</a>
<div>Contributor</div>
<small>Defibrillator</small>
</td>
<td align="center" width="20%" valign="top">
</td>
</tr>
</tbody>
</table>
## Publishers
Publishers are admins who also have the responsibility, privilege, and burden of publishing the new releases to NPM and performing outreach and external stakeholder communications. Further, when things go pear-shaped, they're the ones taking most of the heat. Finally, when things go well, they're the primary ones praising the contributors who made it possible.
(In other words, while Admins are focused primarily on the internal workings of the project, Publishers are focused on internal *and* external concerns.)
**Should not exceed 2:** Having more people with the authority to publish a release can quickly turn into a consensus seeking nightmare (design by committee). Having only one is preferred (Directly Responsible Individual); however, given the nature of the project and its history, having an immediate fallback, and a potential deep fallback (Original author) is probably a good idea.
[Details on badges](#badges)
## Admins
Admins are committers who also have the responsibility, privilege, and burden of selecting committers and making sure the project itself runs smoothly, which includes community maintenance, governance, dispute resolution, and so on. (Letting the contributors easily enter into, and work within, the project to begin contributing, with as little friction as possible.)
**Should not exceed 3:** When there are too many people with the ability to resolve disputes, the dispute itself can quickly turn into a dispute amongst the admins themselves; therefore, we want this group to be small enough to commit to action and large enough to not put too much burden on one person. (Should ensure faster resolution and responsiveness.)
To be listed: Admins are usually selected from the pool of committers (or they volunteer, using the same process) who demonstrate good understanding of the marked culture, operations, and do their best to help new contributors get up to speed on how to contribute effectively to the project.
To be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).
[Details on badges](#badges)
## Committers
Committers are contributors who also have the responsibility, privilege, some might even say burden of being able to review and merge contributions (just usually not their own).
A note on "decision making authority". This is related to submitting PRs and the [advice process](http://www.reinventingorganizationswiki.com/Decision_Making). The person marked as having decision making authority over a certain area should be sought for advice in that area before committing to a course of action.
**Should not exceed 5:** For larger PRs affecting more of the codebase and, most likely, review by more people, we try to keep this pool small and responsive and let those with decision making authority have final say without negative repercussions from the other committers.
To be listed: Committers are usually selected (or they volunteer, using the same process) from contributors who enter the discussions regarding the future direction of Marked (maybe even doing informal reviews of contributions despite not being able to merge them yourself).
To be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).
A note on volunteering:
1. Please do not volunteer unless you believe you can demonstrate to your peers you can do the work required.
2. Please do not overcommit yourself; we count on those committed to the project to be responsive. Really consider, with all you have going on, whether you able to really commit to it.
3. Don't let the previous frighten you away, it can always be changed later by you or your peers.
[Details on badges](#badges)
## Contributors
Contributors are users who submit a [PR](https://github.com/markedjs/marked/pulls), [Issue](https://github.com/markedjs/marked/issues), or collaborate in making Marked a better product and experience for all the users.
To be listed: make a contribution and, if it has significant impact, the committers may be able to add you here.
To be removed: please let us know or submit a PR.
[Details on badges](#badges)
## Users
Users are anyone using Marked in some fashion, without them, there's no reason for us to exist.
|Individual or Organization |Website |Project |Submitted by |
|:--------------------------|:-----------------------|:------------------------------------|:---------------------------------------------------|
|MarkedJS |https://marked.js.org |https://github.com/markedjs/marked |The marked committers |
To be listed: All fields are optional. Contact any of the committers or, more timely, submit a pull request with the following (using the first row as an example):
- **Individual or Organization:** The name you would like associated with the record.
- **Website:** A URL to a standalone website for the project.
- **Project:** A URL for the repository of the project using marked.
- **Submitted by:** The name and optional honorifics for the person adding the listing.
To be removed: Same as above. Only instead of requesting addition request deletion or delete the row yourself.
<h2 id="badges">Badges</h2>
Badges? You don't *need* no stinkin' badges.
Movie references aside. (It was either that or, "Let's play a game", but that would have been creepy&hellip;that's why it will most likely come later.)
Badges? If you *want* 'em, we got 'em, and here's how you get 'em (and&hellip;dramatic pause&hellip;why not two dramatic pauses for emphasis?&hellip; how they can be taken away).
- [ ] Add the appropriate badge to the desired contributor in the desired column of this page, even if they're not listed here yet.
- [ ] Submit a PR (we're big on PRs around here, if you haven't noticed, help us help you).
- [ ] Follow the instructions for submitting a badge PR. (There are more details to find within. Come on. Everybody likes surprises, right? No? Actually, we just try to put documentation where it belongs, closer to the code and part of the sequence of events.)
### Badges at play:
<dl>
<dt>Curious Contributor</dt>
<dd>A contributor with less than one year on this page who is actively engaged in submitting PRs, Issues, making recommendations, sharing thoughts&hellip;without being too annoying about it (let's be clear, submitting 100 Issues recommending the Marked Committers send everyone candy is trying for the badge, not honestly earning it).</dd>
<dt>Dr. DevOps</dt>
<dd>
<p>Someone who understands and contributes to improving the developer experience and flow of Marked into the world.</p>
<blockquote>
"The main characteristic of the DevOps movement is to strongly advocate automation and monitoring at all steps of software construction, from integration, testing, releasing to deployment and infrastructure management. DevOps aims at shorter development cycles, increased deployment frequency, more dependable releases, in close alignment with business objectives." ~ <a href="https://www.wikipedia.org/wiki/DevOps">Wikipedia</a>
</blockquote>
</dd>
<dt>Dr. Docs</dt>
<dd>Someone who has contributed a great deal to the creation and maintenance of the non-code areas of marked.</dd>
<dt>Eye for the CLI</dt>
<dd>At this point? Pretty much anyone who can update that `man` file to the current Marked version without regression in the CLI tool itself.</dd>
<dt>GitHub Guru</dt>
<dd>Someone who always seems to be able to tell you easier ways to do things with GitHub.</dd>
<dt>Humaning Helper</dt>
<dd>Someone who goes out of their way to help contributors feel welcomed and valued. Further, someone who takes the extra steps(s) necessary to help new contributors get up to speed. Finally, they maintain composure even in times of disagreement and dispute resolution.</dd>
<dt>Heckler of Hypertext</dt>
<dd>Someone who demonstrates an esoteric level of knowledge when it comes to HTML. In other words, someone who says things like, "Did you know most Markdown flavors don't have a way to render a description list (`dl`)? All the more reason Markdown `!==` HTML."</dd>
<dt>Markdown Maestro</dt>
<dd>You know that person who knows about way too many different flavors of Markdown? The one who maybe seems a little too obsessed with the possibilities of Markdown beyond HTML? Come on. You know who they are. Or, at least you could, if you give them this badge.</dd>
<dt>Master of Marked</dt>
<dd>Someone who demonstrates they know the ins and outs of the codebase for Marked.</dd>
<dt>Open source, of course</dt>
<dd>Someone who advocates for and has a proven understanding of how to operate within open source communities.</dd>
<dt>Regent of the Regex</dt>
<dd><p>Can you demonstrate you understand the following without Google and Stackoverflow?</p>
<p><code>/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/</code></p>
<p>Because this author can't yet. That's who gets these.</p>
</dd>
<dt>Seeker of Security</dt>
<dd>Someone who has demonstrated a high degree of expertise or authority when it comes to software security.</dd>
<dt>Titan of the Test Harness</dt>
<dd>Someone who demonstrates high-levels of understanding regarding Marked's test harness.</dd>
<dt>Totally Tron</dt>
<dd>Someone who demonstrates they are willing and able to "fight for the users", both developers dependent on marked to do their jobs as well as end-users interacting with the output (particularly in the realm of those with the disabilities).</dd>
</dl>
### Special badges that come with the job:
<dl>
<dt>Defibrillator</dt>
<dd>A contributor who stepped up to help bring Marked back to life by contributing solutions to help Marked pass when compared against the CommonMark and GitHub Flavored Markdown specifications.</dd>
<dt>Maker of the Marked mark</dt>
<dd>This badge is given to the person or organization credited with creating the logo (or logotype) used in Marked communications for a given period of time. **Maker of the Marked mark from 2017 to present**, for example.</dd>
<dt>Release Wrangler</dt>
<dd>This is a badge given to all Publishers.</dd>
<dt>Snyk's Security Saint</dt>
<dd>This is a badge given to whomever primarily reaches out from Snyk to let us know about security issues.</dd>
</dl>
-1
View File
@@ -1 +0,0 @@
marked.js.org
@@ -1,74 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to block temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team by submitting a PR with changes to the [AUTHORS](#/AUTHORS.md) page (or emailing josh@8fold.com). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version [1.4][version].
[homepage]: https://www.contributor-covenant.org/
[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
@@ -1,95 +0,0 @@
# Contributing to Marked
- [ ] Fork `markedjs/marked`.
- [ ] Clone the library locally using GitHub Desktop or the command line.
- [ ] Make sure you are on the `master` branch.
- [ ] Be sure to run `npm install` or `npm update`.
- [ ] Create a branch.
- [ ] Update code in `src` folder. (`lib` folder is for auto compiled code)
- [ ] Run `npm run test:all`, fix any broken things (for linting, you can run `npm run lint` to have the linter fix them for you).
- [ ] Run `npm run build:reset` to remove changes to compiled files.
- [ ] Submit a Pull Request.
## Design principles
Marked tends to favor following the SOLID set of software design and development principles; mainly the [single responsibility](https://en.wikipedia.org/wiki/Single_responsibility_principle) and [open/closed principles](https://en.wikipedia.org/wiki/Open/closed_principle):
- **Single responsibility:** Marked, and the components of Marked, have the single responsibility of converting Markdown strings into HTML.
- **Open/closed:** Marked favors giving developers the means to easily extend the library and its components over changing Marked's behavior through configuration options.
## Priorities
We think we have our priorities sorted to build quality in.
The following table lists the ticket type labels we use when there is work to be done on the code either through an Issue or a PR; in priority order.
|Ticket type label |Description |
|:----------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|L0 - security |A security vulnerability within the Marked library is discovered. |
|L1 - broken |Valid usage results in incorrect output compared to [supported specifications](#/README.md#specifications) OR causes marked to crash AND there is no known workaround for the issue. |
|L2 - annoying |Similar to L1 - broken only there is a known workaround available for the issue. |
|RR - refactor and re-engineer |Results in an improvement to developers using Marked (improved readability) or end-users (faster performance) or both. |
|NFS - new feature (spec related) |A capability Marked does not currently provide but is in one of the [supported specifications](#/README.md#specifications) |
|NFU - new feature (user requested) |A capability Marked does not currently provide but has been requested by users of Marked. |
|NFE - new feature (should be an extension) |A capability Marked does not currently provide and is not part of a spec. |
## Test early, often, and everything
We try to write test cases to validate output (writing tests based on the [supported specifications](#/README.md#specifications)) and minimize regression (writing tests for issues fixed). Therefore, if you would like to contribute, some things you should know regarding the test harness.
|Location |Description |
|:---------------------|:--------------------------------------------------------------------------------------------------------------|
|/test/specs/commonmark|Tests for [CommonMark](https://spec.commonmark.org/current/) compliance |
|/test/specs/gfm |Tests for [GFM](https://github.github.com/gfm/) compliance |
|/test/specs/new |Tests not related to the original `markdown.pl`. |
|/test/specs/original |Tests validating against the original `markdown.pl`. |
|/test/specs/redos |Tests for [ReDOS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) vulnerabilities|
If your test uses features or options, assuming `gfm` is set to `false`, for example, you can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
your `.md` file
``` yml
---
gfm: false
---
```
## Submitting PRs and Issues
Marked provides templates for submitting both pull requests and issues. When you begin creating a new PR or issue, you will see instructions on using the template.
The PR templates include checklists for both the submitter and the reviewer, which, in most cases, will not be the same person.
## Scripts
When it comes to NPM commands, we try to use the native scripts provided by the NPM framework.
To run the tests:
``` bash
npm test
```
To test whether you are using the standard syntax rules for the project:
```bash
npm run test:lint
```
To see time comparisons between Marked and other popular Markdown libraries:
```bash
npm run bench
```
To check for (and fix) standardized syntax (lint):
```bash
npm run lint
```
To build your own es5, esm, and minified versions of Marked:
```bash
npm run build
```
@@ -1,24 +0,0 @@
# Releasing Marked
- [ ] See [contributing](#/CONTRIBUTING.md)
- [ ] Create release branch from `master` (`release-x.y.z`)
- [ ] Submit PR with minimal name: Release x.y.z
- [ ] Complete PR checklists
## Overall strategy
**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new features, bug fixes, and so on. (Almost a continuous deployment setup, without automation.)
## Versioning
We follow [semantic versioning](https://semver.org) where the following sequence is true `[major].[minor].[patch]`; therefore, consider the following implications of the release you are preparing:
1. **Major:** There is at least one change not deemed backward compatible.
2. **Minor:** There is at least one new feature added to the release.
3. **Patch:** No breaking changes, no new features.
What to expect while Marked is a zero-major (0.x.y):
1. The major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package.
2. The minor will tend to be more analogous to a `major` release.
3. The patch will tend to be more analogous to a `minor` release or a collection of bug fixes (patches).
-85
View File
@@ -1,85 +0,0 @@
Marked is
1. built for speed.<sup>*</sup>
2. a low-level markdown compiler for parsing markdown without caching or blocking for long periods of time.<sup>**</sup>
3. light-weight while implementing all markdown features from the supported flavors & specifications.<sup>***</sup>
4. available as a command line interface (CLI) and running in client- or server-side JavaScript projects.
<p><small><sup>*</sup> Still working on metrics for comparative analysis and definition.</small><br>
<small><sup>**</sup> As few dependencies as possible.</small><br>
<small><sup>***</sup> Strict compliance could result in slower processing when running comparative benchmarking.</small></p>
<h2 id="demo">Demo</h2>
Checkout the [demo page](./demo/) to see marked in action ⛹️
These documentation pages are also rendered using marked 💯
<h2 id="installation">Installation</h2>
**CLI:** `npm install -g marked`
**In-browser:** `npm install marked`
<h2 id="usage">Usage</h2>
### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML. Please use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! 🚨
**CLI**
``` bash
$ marked -o hello.html
hello world
^D
$ cat hello.html
<p>hello world</p>
```
``` bash
$ marked -s "*hello world*"
<p><em>hello world</em></p>
```
**Browser**
```html
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Marked in the browser</title>
</head>
<body>
<div id="content"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
document.getElementById('content').innerHTML =
marked('# Marked in browser\n\nRendered by **marked**.');
</script>
</body>
</html>
```
Marked offers [advanced configurations](#/USING_ADVANCED.md) and [extensibility](#/USING_PRO.md) as well.
<h2 id="specifications">Supported Markdown specifications</h2>
We actively support the features of the following [Markdown flavors](https://github.com/commonmark/CommonMark/wiki/Markdown-Flavors).
|Flavor |Version |
|:----------------------------------------------------------|:----------|
|The original markdown.pl |-- |
|[CommonMark](http://spec.commonmark.org/0.29/) |0.29 |
|[GitHub Flavored Markdown](https://github.github.com/gfm/) |0.29 |
By supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community.
<h2 id="security">Security</h2>
The only completely secure system is the one that doesn't exist in the first place. Having said that, we take the security of Marked very seriously.
Therefore, please disclose potential security issues by email to the project [committers](#/AUTHORS.md) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner). We will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks (also, feel free to contribute a fix for the issue).
@@ -1,154 +0,0 @@
## The `marked` function
```js
marked(markdownString [,options] [,callback])
```
|Argument |Type |Notes |
|:---------------------|:------------|:----------------------------------------------------------------------------------------------------|
|markdownString |`string` |String of markdown source to be compiled. |
|<a href="#options">options</a>|`object`|Hash of options. Can also use `marked.setOptions`. |
|callback |`function` |Called when `markdownString` has been parsed. Can be used as second argument if no `options` present.|
### Alternative using reference
```js
// Create reference instance
const marked = require('marked');
// Set options
// `highlight` example uses `highlight.js`
marked.setOptions({
renderer: new marked.Renderer(),
highlight: function(code, language) {
const hljs = require('highlight.js');
const validLanguage = hljs.getLanguage(language) ? language : 'plaintext';
return hljs.highlight(validLanguage, code).value;
},
pedantic: false,
gfm: true,
breaks: false,
sanitize: false,
smartLists: true,
smartypants: false,
xhtml: false
});
// Compile
console.log(marked(markdownString));
```
<h2 id="options">Options</h2>
|Member |Type |Default |Since |Notes |
|:-----------|:---------|:--------|:--------|:-------------|
|baseUrl |`string` |`null` |0.3.9 |A prefix url for any relative link. |
|breaks |`boolean` |`false` |v0.2.7 |If true, add `<br>` on a single line break (copies GitHub behavior on comments, but not on rendered markdown files). Requires `gfm` be `true`.|
|gfm |`boolean` |`true` |v0.2.1 |If true, use approved [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/).|
|headerIds |`boolean` |`true` |v0.4.0 |If true, include an `id` attribute when emitting headings (h1, h2, h3, etc).|
|headerPrefix|`string` |`''` |v0.3.0 |A string to prefix the `id` attribute when emitting headings (h1, h2, h3, etc).|
|highlight |`function`|`null` |v0.3.0 |A function to highlight code blocks, see <a href="#highlight">Asynchronous highlighting</a>.|
|langPrefix |`string` |`'language-'`|v0.3.0|A string to prefix the className in a `<code>` block. Useful for syntax highlighting.|
|mangle |`boolean` |`true` |v0.3.4 |If true, autolinked email address is escaped with HTML character references.|
|pedantic |`boolean` |`false` |v0.2.1 |If true, conform to the original `markdown.pl` as much as possible. Don't fix original markdown bugs or behavior. Turns off and overrides `gfm`.|
|renderer |`object` |`new Renderer()`|v0.3.0|An object containing functions to render tokens to HTML. See [extensibility](/#/USING_PRO.md) for more details.|
|sanitize |`boolean` |`false` |v0.2.1 |If true, sanitize the HTML passed into `markdownString` with the `sanitizer` function.<br>**Warning**: This feature is deprecated and it should NOT be used as it cannot be considered secure.<br>Instead use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! |
|sanitizer |`function`|`null` |v0.3.4 |A function to sanitize the HTML passed into `markdownString`.|
|silent |`boolean` |`false` |v0.2.7 |If true, the parser does not throw any exception.|
|smartLists |`boolean` |`false` |v0.2.8 |If true, use smarter list behavior than those found in `markdown.pl`.|
|smartypants |`boolean` |`false` |v0.2.9 |If true, use "smart" typographic punctuation for things like quotes and dashes.|
|tokenizer |`object` |`new Tokenizer()`|v1.0.0|An object containing functions to create tokens from markdown. See [extensibility](/#/USING_PRO.md) for more details.|
|walkTokens |`function` |`null`|v1.1.0|A function which is called for every token. See [extensibility](/#/USING_PRO.md) for more details.|
|xhtml |`boolean` |`false` |v0.3.2 |If true, emit self-closing HTML tags for void elements (&lt;br/&gt;, &lt;img/&gt;, etc.) with a "/" as required by XHTML.|
<h2 id="highlight">Asynchronous highlighting</h2>
Unlike `highlight.js` the `pygmentize.js` library uses asynchronous highlighting. This example demonstrates that marked is agnostic when it comes to the highlighter you use.
```js
marked.setOptions({
highlight: function(code, lang, callback) {
require('pygmentize-bundled') ({ lang: lang, format: 'html' }, code, function (err, result) {
callback(err, result.toString());
});
}
});
console.log(marked(markdownString));
```
In both examples, `code` is a `string` representing the section of code to pass to the highlighter. In this example, `lang` is a `string` informing the highlighter what programming language to use for the `code` and `callback` is the `function` the asynchronous highlighter will call once complete.
<h2 id="workers">Workers</h2>
To prevent ReDoS attacks you can run marked on a worker and terminate it when parsing takes longer than usual.
Marked can be run in a [worker thread](https://nodejs.org/api/worker_threads.html) on a node server, or a [web worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) in a browser.
### Node Worker Thread
```js
// markedWorker.js
const marked = require('marked');
const { parentPort } = require('worker_threads');
parentPort.on('message', (markdownString) => {
parentPort.postMessage(marked(markdownString));
});
```
```js
// index.js
const { Worker } = require('worker_threads');
const markedWorker = new Worker('./markedWorker.js');
const markedTimeout = setTimeout(() => {
markedWorker.terminate();
throw new Error('Marked took too long!');
}, timeoutLimit);
markedWorker.on('message', (html) => {
clearTimeout(markedTimeout);
console.log(html);
markedWorker.terminate();
});
markedWorker.postMessage(markdownString);
```
### Web Worker
> **NOTE**: Web Workers send the payload from `postMessage` in an object with the payload in a `.data` property
```js
// markedWorker.js
importScripts('path/to/marked.min.js');
onmessage = (e) => {
const markdownString = e.data
postMessage(marked(markdownString));
};
```
```js
// script.js
const markedWorker = new Worker('./markedWorker.js');
const markedTimeout = setTimeout(() => {
markedWorker.terminate();
throw new Error('Marked took too long!');
}, timeoutLimit);
markedWorker.onmessage = (e) => {
clearTimeout(markedTimeout);
const html = e.data;
console.log(html);
markedWorker.terminate();
};
markedWorker.postMessage(markdownString);
```
-352
View File
@@ -1,352 +0,0 @@
## Extending Marked
To champion the single-responsibility and open/closed principles, we have tried to make it relatively painless to extend marked. If you are looking to add custom functionality, this is the place to start.
<h2 id="use">marked.use()</h2>
`marked.use(options)` is the recommended way to extend marked. The options object can contain any [option](#/USING_ADVANCED.md#options) available in marked.
The `renderer` and `tokenizer` options can be an object with functions that will be merged into the `renderer` and `tokenizer` respectively.
The `renderer` and `tokenizer` functions can return false to fallback to the previous function.
The `walkTokens` option can be a function that will be called with every token before rendering. When calling `use` multiple times with different `walkTokens` functions each function will be called in the **reverse** order in which they were assigned.
All other options will overwrite previously set options.
<h2 id="renderer">The renderer</h2>
The renderer defines the output of the parser.
**Example:** Overriding default heading token by adding an embedded anchor tag like on GitHub.
```js
// Create reference instance
const marked = require('marked');
// Override function
const renderer = {
heading(text, level) {
const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
return `
<h${level}>
<a name="${escapedText}" class="anchor" href="#${escapedText}">
<span class="header-link"></span>
</a>
${text}
</h${level}>`;
}
};
marked.use({ renderer });
// Run marked
console.log(marked('# heading+'));
```
**Output:**
```html
<h1>
<a name="heading-" class="anchor" href="#heading-">
<span class="header-link"></span>
</a>
heading+
</h1>
```
### Block level renderer methods
- code(*string* code, *string* infostring, *boolean* escaped)
- blockquote(*string* quote)
- html(*string* html)
- heading(*string* text, *number* level, *string* raw, *Slugger* slugger)
- hr()
- list(*string* body, *boolean* ordered, *number* start)
- listitem(*string* text, *boolean* task, *boolean* checked)
- checkbox(*boolean* checked)
- paragraph(*string* text)
- table(*string* header, *string* body)
- tablerow(*string* content)
- tablecell(*string* content, *object* flags)
`slugger` has the `slug` method to create a unique id from value:
```js
slugger.slug('foo') // foo
slugger.slug('foo') // foo-1
slugger.slug('foo') // foo-2
slugger.slug('foo 1') // foo-1-1
slugger.slug('foo-1') // foo-1-2
...
```
`flags` has the following properties:
```js
{
header: true || false,
align: 'center' || 'left' || 'right'
}
```
### Inline level renderer methods
- strong(*string* text)
- em(*string* text)
- codespan(*string* code)
- br()
- del(*string* text)
- link(*string* href, *string* title, *string* text)
- image(*string* href, *string* title, *string* text)
- text(*string* text)
<h2 id="tokenizer">The tokenizer</h2>
The tokenizer defines how to turn markdown text into tokens.
**Example:** Overriding default `codespan` tokenizer to include LaTeX.
```js
// Create reference instance
const marked = require('marked');
// Override function
const tokenizer = {
codespan(src) {
const match = src.match(/\$+([^\$\n]+?)\$+/);
if (match) {
return {
type: 'codespan',
raw: match[0],
text: match[1].trim()
};
}
// return false to use original codespan tokenizer
return false;
}
};
marked.use({ tokenizer });
// Run marked
console.log(marked('$ latex code $\n\n` other code `'));
```
**Output:**
```html
<p><code>latex code</code></p>
<p><code>other code</code></p>
```
### Block level tokenizer methods
- space(*string* src)
- code(*string* src, *array* tokens)
- fences(*string* src)
- heading(*string* src)
- nptable(*string* src)
- hr(*string* src)
- blockquote(*string* src)
- list(*string* src)
- html(*string* src)
- def(*string* src)
- table(*string* src)
- lheading(*string* src)
- paragraph(*string* src)
- text(*string* src, *array* tokens)
### Inline level tokenizer methods
- escape(*string* src)
- tag(*string* src, *bool* inLink, *bool* inRawBlock)
- link(*string* src)
- reflink(*string* src, *object* links)
- strong(*string* src)
- em(*string* src)
- codespan(*string* src)
- br(*string* src)
- del(*string* src)
- autolink(*string* src, *function* mangle)
- url(*string* src, *function* mangle)
- inlineText(*string* src, *bool* inRawBlock, *function* smartypants)
`mangle` is a method that changes text to HTML character references:
```js
mangle('test@example.com')
// "&#x74;&#101;&#x73;&#116;&#x40;&#101;&#120;&#x61;&#x6d;&#112;&#108;&#101;&#46;&#x63;&#111;&#x6d;"
```
`smartypants` is a method that translates plain ASCII punctuation characters into “smart” typographic punctuation HTML entities:
https://daringfireball.net/projects/smartypants/
```js
smartypants('"this ... string"')
// "“this … string”"
```
<h2 id="walk-tokens">Walk Tokens</h2>
The walkTokens function gets called with every token. Child tokens are called before moving on to sibling tokens. Each token is passed by reference so updates are persisted when passed to the parser. The return value of the function is ignored.
**Example:** Overriding heading tokens to start at h2.
```js
const marked = require('marked');
// Override function
const walkTokens = (token) => {
if (token.type === 'heading') {
token.depth += 1;
}
};
marked.use({ walkTokens });
// Run marked
console.log(marked('# heading 2\n\n## heading 3'));
```
**Output:**
```html
<h2 id="heading-2">heading 2</h2>
<h3 id="heading-3">heading 3</h3>
```
<h2 id="lexer">The lexer</h2>
The lexer takes a markdown string and calls the tokenizer functions.
<h2 id="parser">The parser</h2>
The parser takes tokens as input and calls the renderer functions.
***
<h2 id="extend">Access to lexer and parser</h2>
You also have direct access to the lexer and parser if you so desire.
``` js
const tokens = marked.lexer(markdown, options);
console.log(marked.parser(tokens, options));
```
``` js
const lexer = new marked.Lexer(options);
const tokens = lexer.lex(markdown);
console.log(tokens);
console.log(lexer.tokenizer.rules.block); // block level rules used
console.log(lexer.tokenizer.rules.inline); // inline level rules used
console.log(marked.Lexer.rules.block); // all block level rules
console.log(marked.Lexer.rules.inline); // all inline level rules
```
``` bash
$ node
> require('marked').lexer('> I am using marked.')
[
{
type: "blockquote",
raw: "> I am using marked.",
tokens: [
{
type: "paragraph",
raw: "I am using marked.",
text: "I am using marked.",
tokens: [
{
type: "text",
raw: "I am using marked.",
text: "I am using marked."
}
]
}
]
},
links: {}
]
```
The Lexer builds an array of tokens, which will be passed to the Parser.
The Parser processes each token in the token array:
``` js
const marked = require('marked');
const md = `
# heading
[link][1]
[1]: #heading "heading"
`;
const tokens = marked.lexer(md);
console.log(tokens);
const html = marked.parser(tokens);
console.log(html);
```
``` bash
[
{
type: "heading",
raw: " # heading\n\n",
depth: 1,
text: "heading",
tokens: [
{
type: "text",
raw: "heading",
text: "heading"
}
]
},
{
type: "paragraph",
raw: " [link][1]",
text: " [link][1]",
tokens: [
{
type: "text",
raw: " ",
text: " "
},
{
type: "link",
raw: "[link][1]",
text: "link",
href: "#heading",
title: "heading",
tokens: [
{
type: "text",
raw: "link",
text: "link"
}
]
}
]
},
{
type: "space",
raw: "\n\n"
},
links: {
"1": {
href: "#heading",
title: "heading"
}
}
]
<h1 id="heading">heading</h1>
<p> <a href="#heading" title="heading">link</a></p>
```
-426
View File
@@ -1,426 +0,0 @@
# Markdown is broken
I have a lot of scraps of markdown engine oddities that I've collected over the
years. What you see below is slightly messy, but it's what I've managed to
cobble together to illustrate the differences between markdown engines, and
why, if there ever is a markdown specification, it has to be absolutely
thorough. There are a lot more of these little differences I have documented
elsewhere. I know I will find them lingering on my disk one day, but until
then, I'll continue to add whatever strange nonsensical things I find.
Some of these examples may only mention a particular engine compared to marked.
However, the examples with markdown.pl could easily be swapped out for
discount, upskirt, or markdown.js, and you would very easily see even more
inconsistencies.
A lot of this was written when I was very unsatisfied with the inconsistencies
between markdown engines. Please excuse the frustration noticeable in my
writing.
## Examples of markdown's "stupid" list parsing
```
$ markdown.pl
* item1
* item2
text
^D
<ul>
<li><p>item1</p>
<ul>
<li>item2</li>
</ul>
<p><p>text</p></li>
</ul></p>
```
```
$ marked
* item1
* item2
text
^D
<ul>
<li><p>item1</p>
<ul>
<li>item2</li>
</ul>
<p>text</p>
</li>
</ul>
```
Which looks correct to you?
- - -
```
$ markdown.pl
* hello
> world
^D
<p><ul>
<li>hello</p>
<blockquote>
<p>world</li>
</ul></p>
</blockquote>
```
```
$ marked
* hello
> world
^D
<ul>
<li>hello<blockquote>
<p>world</p>
</blockquote>
</li>
</ul>
```
Again, which looks correct to you?
- - -
EXAMPLE:
```
$ markdown.pl
* hello
* world
* hi
code
^D
<ul>
<li>hello
<ul>
<li>world</li>
<li>hi
code</li>
</ul></li>
</ul>
```
The code isn't a code block even though it's after the bullet margin. I know,
lets give it two more spaces, effectively making it 8 spaces past the bullet.
```
$ markdown.pl
* hello
* world
* hi
code
^D
<ul>
<li>hello
<ul>
<li>world</li>
<li>hi
code</li>
</ul></li>
</ul>
```
And, it's still not a code block. Did you also notice that the 3rd item isn't
even its own list? Markdown screws that up too because of its indentation
unaware parsing.
- - -
Let's look at some more examples of markdown's list parsing:
```
$ markdown.pl
* item1
* item2
text
^D
<ul>
<li><p>item1</p>
<ul>
<li>item2</li>
</ul>
<p><p>text</p></li>
</ul></p>
```
Misnested tags.
```
$ marked
* item1
* item2
text
^D
<ul>
<li><p>item1</p>
<ul>
<li>item2</li>
</ul>
<p>text</p>
</li>
</ul>
```
Which looks correct to you?
- - -
```
$ markdown.pl
* hello
> world
^D
<p><ul>
<li>hello</p>
<blockquote>
<p>world</li>
</ul></p>
</blockquote>
```
More misnested tags.
```
$ marked
* hello
> world
^D
<ul>
<li>hello<blockquote>
<p>world</p>
</blockquote>
</li>
</ul>
```
Again, which looks correct to you?
- - -
# Why quality matters - Part 2
``` bash
$ markdown.pl
* hello
> world
^D
<p><ul>
<li>hello</p>
<blockquote>
<p>world</li>
</ul></p>
</blockquote>
```
``` bash
$ sundown # upskirt
* hello
> world
^D
<ul>
<li>hello
&gt; world</li>
</ul>
```
``` bash
$ marked
* hello
> world
^D
<ul><li>hello <blockquote><p>world</p></blockquote></li></ul>
```
Which looks correct to you?
- - -
See: https://github.com/evilstreak/markdown-js/issues/23
``` bash
$ markdown.pl # upskirt/markdown.js/discount
* hello
var a = 1;
* world
^D
<ul>
<li>hello
var a = 1;</li>
<li>world</li>
</ul>
```
``` bash
$ marked
* hello
var a = 1;
* world
^D
<ul><li>hello
<pre>code>var a = 1;</code></pre></li>
<li>world</li></ul>
```
Which looks more reasonable? Why shouldn't code blocks be able to appear in
list items in a sane way?
- - -
``` bash
$ markdown.js
<div>hello</div>
<span>hello</span>
^D
<p>&lt;div&gt;hello&lt;/div&gt;</p>
<p>&lt;span&gt;hello&lt;/span&gt;</p>
```
``` bash
$ marked
<div>hello</div>
<span>hello</span>
^D
<div>hello</div>
<p><span>hello</span>
</p>
```
- - -
See: https://github.com/evilstreak/markdown-js/issues/27
``` bash
$ markdown.js
[![an image](/image)](/link)
^D
<p><a href="/image)](/link">![an image</a></p>
```
``` bash
$ marked
[![an image](/image)](/link)
^D
<p><a href="/link"><img src="/image" alt="an image"></a>
</p>
```
- - -
See: https://github.com/evilstreak/markdown-js/issues/24
``` bash
$ markdown.js
> a
> b
> c
^D
<blockquote><p>a</p><p>bundefined&gt; c</p></blockquote>
```
``` bash
$ marked
> a
> b
> c
^D
<blockquote><p>a
</p></blockquote>
<blockquote><p>b
</p></blockquote>
<blockquote><p>c
</p></blockquote>
```
- - -
``` bash
$ markdown.pl
* hello
* world
how
are
you
* today
* hi
^D
<ul>
<li><p>hello</p>
<ul>
<li>world
how</li>
</ul>
<p>are
you</p>
<ul>
<li>today</li>
</ul></li>
<li>hi</li>
</ul>
```
``` bash
$ marked
* hello
* world
how
are
you
* today
* hi
^D
<ul>
<li><p>hello</p>
<ul>
<li><p>world
how</p>
<p>are
you</p>
</li>
<li><p>today</p>
</li>
</ul>
</li>
<li>hi</li>
</ul>
```
@@ -1,72 +0,0 @@
html, body {
margin: 0;
padding: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #333;
background-color: #fbfbfb;
height: 100%;
}
textarea {
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 12px;
resize: none;
}
header {
padding-top: 10px;
display: flex;
height: 58px;
}
header h1 {
margin: 0;
}
.github-ribbon {
position: absolute;
top: 0;
right: 0;
border: 0;
z-index: 1000;
}
.containers {
display: flex;
height: calc(100vh - 68px);
}
.container {
flex-basis: 50%;
padding: 5px;
display: flex;
flex-direction: column;
height: 100%;
box-sizing: border-box;
}
.pane, .inputPane {
margin-top: 5px;
padding: 0.6em;
border: 1px solid #ccc;
overflow: auto;
flex-grow: 1;
flex-shrink: 1;
}
#preview {
display: flex;
}
#preview iframe {
flex-grow: 1;
}
#main {
display: none;
}
.error {
border-color: red;
background-color: #FEE
}
Loaded 100 of 138 files, more files were not shown because too many files have changed in this diff. Show more