Markdown pour la description
- Ajout d'un editeur de markdown - On garde le formattage des espaces - On empeche l'utilisateur de mettre du html
This commit is contained in:
parent
beee7874dc
commit
83e0cae47a
@ -133,12 +133,26 @@ class Utils {
|
|||||||
return TABLENAME_PREFIX . $tableName;
|
return TABLENAME_PREFIX . $tableName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function markdown($md, $clear) {
|
public static function markdown($md, $clear=false, $line=true) {
|
||||||
$parseDown = new \Parsedown();
|
$parseDown = new \Parsedown();
|
||||||
|
|
||||||
$html = $parseDown
|
$parseDown
|
||||||
->setMarkupEscaped(true)
|
->setMarkupEscaped(true)
|
||||||
->line($md);
|
->setBreaksEnabled(true)
|
||||||
|
->setUrlsLinked(false);
|
||||||
|
|
||||||
|
if ($line) {
|
||||||
|
$html = $parseDown->line($md);
|
||||||
|
} else {
|
||||||
|
$md = preg_replace_callback(
|
||||||
|
'#( ){2,}#',
|
||||||
|
function ($m) {
|
||||||
|
return str_repeat(' ', strlen($m[0]));
|
||||||
|
},
|
||||||
|
$md
|
||||||
|
);
|
||||||
|
$html = $parseDown->text($md);
|
||||||
|
}
|
||||||
|
|
||||||
$text = strip_tags($html);
|
$text = strip_tags($html);
|
||||||
|
|
||||||
|
@ -57,8 +57,8 @@ function smarty_function_poll_url($params, Smarty_Internal_Template $template) {
|
|||||||
return Utils::getUrlSondage($poll_id, $admin, $vote_unique_id, $action, $action_value);
|
return Utils::getUrlSondage($poll_id, $admin, $vote_unique_id, $action, $action_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function smarty_modifier_markdown($md, $clear = false) {
|
function smarty_modifier_markdown($md, $clear = false, $inline=true) {
|
||||||
return Utils::markdown($md, $clear);
|
return Utils::markdown($md, $clear, $inline);
|
||||||
}
|
}
|
||||||
|
|
||||||
function smarty_modifier_resource($link) {
|
function smarty_modifier_resource($link) {
|
||||||
|
@ -270,7 +270,7 @@ $smarty->assign('goToStep2', GO_TO_STEP_2);
|
|||||||
$smarty->assign('poll_type', $poll_type);
|
$smarty->assign('poll_type', $poll_type);
|
||||||
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
|
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
|
||||||
$smarty->assign('poll_id', Utils::fromPostOrDefault('id', $_SESSION['form']->id));
|
$smarty->assign('poll_id', Utils::fromPostOrDefault('id', $_SESSION['form']->id));
|
||||||
$smarty->assign('poll_description', Utils::fromPostOrDefault('description', $_SESSION['form']->description));
|
$smarty->assign('poll_description', !empty($_POST['description']) ? $_POST['description'] : $_SESSION['form']->description);
|
||||||
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
|
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
|
||||||
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));
|
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));
|
||||||
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $_SESSION['form']->editable));
|
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $_SESSION['form']->editable));
|
||||||
|
7
css/simplemde.min.css
vendored
Normal file
7
css/simplemde.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -136,10 +136,22 @@ header .lead {
|
|||||||
|
|
||||||
.poll-description {
|
.poll-description {
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
white-space: pre-wrap;
|
|
||||||
word-break: initial;
|
word-break: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Description in markdown **/
|
||||||
|
.CodeMirror, .CodeMirror-scroll {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
.CodeMirror {
|
||||||
|
background: #f5f5f5 none repeat scroll 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.editor-toolbar {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
h4.control-label {
|
h4.control-label {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
var element = $('#' + $(this).val());
|
var element = $('#' + $(this).val());
|
||||||
|
|
||||||
if (img != '' && link != '') {
|
if (img != '' && link != '') {
|
||||||
.val('[![' + text + '](' + img + ')](' + link + ')');
|
element.val('[![' + text + '](' + img + ')](' + link + ')');
|
||||||
} else if (img != '') {
|
} else if (img != '') {
|
||||||
element.val('![' + text + '](' + img + ')');
|
element.val('![' + text + '](' + img + ')');
|
||||||
} else if (link != '') {
|
} else if (link != '') {
|
||||||
|
@ -90,4 +90,13 @@ $(document).ready(function () {
|
|||||||
document.getElementById("cookie-warning").setAttribute("style", "");
|
document.getElementById("cookie-warning").setAttribute("style", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Markdown for description
|
||||||
|
var simplemde = new SimpleMDE({
|
||||||
|
element: $('#poll_comments')[0],
|
||||||
|
forceSync: true,
|
||||||
|
status: false,
|
||||||
|
previewRender: window.myPreviewRender
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
22
js/core.js
22
js/core.js
@ -1,6 +1,7 @@
|
|||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
window.lang = $('html').attr('lang');
|
window.lang = $('html').attr('lang');
|
||||||
|
var simplemde;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adminstuds.php
|
* adminstuds.php
|
||||||
@ -48,17 +49,38 @@ $(document).ready(function() {
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.myPreviewRender = function (text) {
|
||||||
|
text = text.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
|
||||||
|
return '&#'+i.charCodeAt(0)+';';
|
||||||
|
});
|
||||||
|
text = SimpleMDE.prototype.markdown(text);
|
||||||
|
text = text.replace(/ /g, ' ');
|
||||||
|
|
||||||
|
return text;
|
||||||
|
};
|
||||||
|
|
||||||
$('#description-form .btn-edit').on('click', function() {
|
$('#description-form .btn-edit').on('click', function() {
|
||||||
$('#description-form .well').hide();
|
$('#description-form .well').hide();
|
||||||
|
$('#description-form .control-label .btn-edit').hide();
|
||||||
$('#description-form .js-desc').removeClass('hidden');
|
$('#description-form .js-desc').removeClass('hidden');
|
||||||
$('.js-desc textarea').focus();
|
$('.js-desc textarea').focus();
|
||||||
|
simplemde = new SimpleMDE({
|
||||||
|
element: $('.js-desc textarea')[0],
|
||||||
|
forceSync: true,
|
||||||
|
status: false,
|
||||||
|
previewRender: window.myPreviewRender
|
||||||
|
});
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#description-form .btn-cancel').on('click', function() {
|
$('#description-form .btn-cancel').on('click', function() {
|
||||||
$('#description-form .well').show();
|
$('#description-form .well').show();
|
||||||
|
$('#description-form .control-label .btn-edit').show();
|
||||||
$('#description-form .js-desc').addClass('hidden');
|
$('#description-form .js-desc').addClass('hidden');
|
||||||
$('.js-desc .btn-edit').focus();
|
$('.js-desc .btn-edit').focus();
|
||||||
|
simplemde.toTextArea();
|
||||||
|
simplemde = null;
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
14
js/simplemde.min.js
vendored
Normal file
14
js/simplemde.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1,8 +1,10 @@
|
|||||||
{extends file='page.tpl'}
|
{extends file='page.tpl'}
|
||||||
|
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
|
<script src="{"js/simplemde.min.js"|resource}" type="text/javascript"></script>
|
||||||
<script src="{"js/app/create_poll.js"|resource}" type="text/javascript"></script>
|
<script src="{"js/app/create_poll.js"|resource}" type="text/javascript"></script>
|
||||||
<link rel="stylesheet" href="{"css/app/create_poll.css"|resource}">
|
<link rel="stylesheet" href="{"css/app/create_poll.css"|resource}">
|
||||||
|
<link rel="stylesheet" href="{"css/simplemde.min.css"|resource}">
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
{block name=main}
|
{block name=main}
|
||||||
@ -63,7 +65,7 @@
|
|||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<textarea id="poll_comments" name="description"
|
<textarea id="poll_comments" name="description"
|
||||||
class="form-control" {$errors['description']['aria']}
|
class="form-control" {$errors['description']['aria']}
|
||||||
rows="5">{$poll_description|html}</textarea>
|
rows="5">{$poll_description|escape}</textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{if !empty($errors['description']['msg'])}
|
{if !empty($errors['description']['msg'])}
|
||||||
|
@ -75,9 +75,9 @@
|
|||||||
{if $admin || preg_match('/[^ \r\n]/', $poll->description)}
|
{if $admin || preg_match('/[^ \r\n]/', $poll->description)}
|
||||||
<div class="form-group col-md-8" id="description-form">
|
<div class="form-group col-md-8" id="description-form">
|
||||||
<label class="control-label">{__('Generic', 'Description')}{if $admin && !$expired} <button class="btn btn-link btn-sm btn-edit" title="{__('PollInfo', 'Edit the description')}"><span class="glyphicon glyphicon-pencil"></span><span class="sr-only">{__('Generic', 'Edit')}</span></button>{/if}</label>
|
<label class="control-label">{__('Generic', 'Description')}{if $admin && !$expired} <button class="btn btn-link btn-sm btn-edit" title="{__('PollInfo', 'Edit the description')}"><span class="glyphicon glyphicon-pencil"></span><span class="sr-only">{__('Generic', 'Edit')}</span></button>{/if}</label>
|
||||||
<pre class="form-control-static well poll-description">{$poll->description|html}</pre>
|
<div class="form-control-static well poll-description">{$poll->description|markdown:false:false}</div>
|
||||||
{if $admin && !$expired}
|
{if $admin && !$expired}
|
||||||
<div class="hidden js-desc text-right">
|
<div class="hidden js-desc">
|
||||||
<label class="sr-only" for="newdescription">{__('Generic', 'Description')}</label>
|
<label class="sr-only" for="newdescription">{__('Generic', 'Description')}</label>
|
||||||
<textarea class="form-control" id="newdescription" name="description" rows="2" cols="40">{$poll->description|html}</textarea>
|
<textarea class="form-control" id="newdescription" name="description" rows="2" cols="40">{$poll->description|html}</textarea>
|
||||||
<button type="submit" id="btn-new-desc" name="update_poll_info" value="description" class="btn btn-sm btn-success" title="{__('PollInfo', 'Save the description')}"><span class="glyphicon glyphicon-ok"></span><span class="sr-only">{__('Generic', 'Save')}</span></button>
|
<button type="submit" id="btn-new-desc" name="update_poll_info" value="description" class="btn btn-sm btn-success" title="{__('PollInfo', 'Save the description')}"><span class="glyphicon glyphicon-ok"></span><span class="sr-only">{__('Generic', 'Save')}</span></button>
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
<script src="{"js/jquery-ui.min.js"|resource}" type="text/javascript"></script>
|
<script src="{"js/jquery-ui.min.js"|resource}" type="text/javascript"></script>
|
||||||
<script src="{"js/Chart.min.js"|resource}" type="text/javascript"></script>
|
<script src="{"js/Chart.min.js"|resource}" type="text/javascript"></script>
|
||||||
<script src="{"js/Chart.StackedBar.js"|resource}" type="text/javascript"></script>
|
<script src="{"js/Chart.StackedBar.js"|resource}" type="text/javascript"></script>
|
||||||
|
<script src="{"js/simplemde.min.js"|resource}" type="text/javascript"></script>
|
||||||
<script src="{"js/app/studs.js"|resource}" type="text/javascript"></script>
|
<script src="{"js/app/studs.js"|resource}" type="text/javascript"></script>
|
||||||
<link rel="stylesheet" href="{'css/jquery-ui.min.css'|resource}">
|
<link rel="stylesheet" href="{'css/jquery-ui.min.css'|resource}">
|
||||||
|
<link rel="stylesheet" href="{'css/simplemde.min.css'|resource}">
|
||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user