Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/betaflight/betaflight-configurator.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhaslinghuis <mark@numloq.nl>2022-03-01 23:08:04 +0300
committerGitHub <noreply@github.com>2022-03-01 23:08:04 +0300
commitea6958f8c224bb13fe3f83f919f084b4f8dfa2db (patch)
tree05194b6e2804c5e2a1307767713ecf6c6bc17d69
parenta8a9ac6b6a64df4aa9cbb22a891b667c41356504 (diff)
parent35d7cb699c2392fb16b72d0e678374b9c6d587cf (diff)
Merge pull request #2841 from limonspb/marked
Presets: support Marked description layout
-rw-r--r--package.json1
-rw-r--r--src/js/gui.js9
-rw-r--r--src/js/tabs/firmware_flasher.js5
-rw-r--r--src/main.html1
-rw-r--r--src/tabs/presets/DetailedDialog/PresetsDetailedDialog.css33
-rw-r--r--src/tabs/presets/DetailedDialog/PresetsDetailedDialog.html1
-rw-r--r--src/tabs/presets/DetailedDialog/PresetsDetailedDialog.js27
-rw-r--r--src/tabs/presets/PresetsRepoIndexed/PresetParser.js10
-rw-r--r--yarn.lock5
9 files changed, 82 insertions, 10 deletions
diff --git a/package.json b/package.json
index 4e392a5b..17055a00 100644
--- a/package.json
+++ b/package.json
@@ -54,6 +54,7 @@
"@panter/vue-i18next": "^0.15.2",
"bluebird": "^3.7.2",
"djv": "^2.1.4",
+ "dompurify": "^2.3.6",
"i18next": "^19.0.0",
"i18next-xhr-backend": "^3.2.2",
"inflection": "^1.12.0",
diff --git a/src/js/gui.js b/src/js/gui.js
index d3e30c86..3f375d8a 100644
--- a/src/js/gui.js
+++ b/src/js/gui.js
@@ -500,7 +500,6 @@ GuiControl.prototype.saveToTextFileDialog = function(textToSave, suggestedFileNa
});
};
-
GuiControl.prototype._saveToTextFileDialogFileSelected = function(entry, textToSave, resolve, reject) {
checkChromeRuntimeError();
@@ -533,7 +532,6 @@ GuiControl.prototype._saveToTextFileDialogFileSelected = function(entry, textToS
});
};
-
GuiControl.prototype.readTextFileDialog = function(extension) {
const accepts = [{ description: `${extension.toUpperCase()} files`, extensions: [extension] }];
@@ -560,7 +558,6 @@ GuiControl.prototype.readTextFileDialog = function(extension) {
});
};
-
GuiControl.prototype.escapeHtml = function(unsafe) {
return unsafe
.replace(/&/g, "&amp;")
@@ -570,5 +567,11 @@ GuiControl.prototype.escapeHtml = function(unsafe) {
.replace(/'/g, "&#039;");
};
+GuiControl.prototype.addLinksTargetBlank = function(element) {
+ element.find('a').each(function() {
+ $(this).attr('target', '_blank');
+ });
+};
+
// initialize object into GUI variable
window.GUI = new GuiControl();
diff --git a/src/js/tabs/firmware_flasher.js b/src/js/tabs/firmware_flasher.js
index 6e1ad001..d4f42c0b 100644
--- a/src/js/tabs/firmware_flasher.js
+++ b/src/js/tabs/firmware_flasher.js
@@ -84,10 +84,9 @@ firmware_flasher.initialize = function (callback) {
let formattedNotes = summary.notes.replace(/#(\d+)/g, '[#$1](https://github.com/betaflight/betaflight/pull/$1)');
formattedNotes = marked.parse(formattedNotes);
+ formattedNotes = DOMPurify.sanitize(formattedNotes);
$('div.release_info .notes').html(formattedNotes);
- $('div.release_info .notes').find('a').each(function() {
- $(this).attr('target', '_blank');
- });
+ GUI.addLinksTargetBlank($('div.release_info .notes'));
if (self.releases) {
$('div.release_info').slideDown();
diff --git a/src/main.html b/src/main.html
index c6b0c49c..9efc0dd0 100644
--- a/src/main.html
+++ b/src/main.html
@@ -59,6 +59,7 @@
<!-- CORDOVA_INCLUDE js/cordova_startup.js -->
<script type="text/javascript" src="./node_modules/lru_map/lru.js"></script>
<script type="text/javascript" src="./node_modules/marked/marked.min.js"></script>
+ <script type="text/javascript" src="./node_modules/dompurify/dist/purify.min.js"></script>
<script type="text/javascript" src="./node_modules/universal-ga/lib/analytics.min.js"></script>
<script type="text/javascript" src="./node_modules/short-unique-id/dist/short-unique-id.min.js"></script>
<script type="text/javascript" src="./node_modules/object-hash/dist/object_hash.js"></script>
diff --git a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.css b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.css
index 1f0b6672..3a659333 100644
--- a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.css
+++ b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.css
@@ -41,6 +41,39 @@
user-select: text;
}
+#presets_detailed_dialog_html_description {
+ white-space: normal;
+}
+
+#presets_detailed_dialog_html_description h1, h2 {
+ padding-top: 10px;
+ padding-bottom: 3px;
+}
+
+#presets_detailed_dialog_html_description h3 {
+ padding-top: 5px;
+ padding-bottom: 0px;
+}
+
+#presets_detailed_dialog_html_description h4, h5, h6 {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+#presets_detailed_dialog_html_description ul, ol {
+ padding-left: 25px;
+}
+
+#presets_detailed_dialog_html_description ul li {
+ padding-left: 12px;
+ list-style-type: disclosure-closed;
+}
+
+#presets_detailed_dialog_html_description ol li {
+ padding-left: 12px;
+ list-style-type: decimal;
+}
+
#presets_detailed_dialog_properties {
height: 360px;
}
diff --git a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.html b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.html
index 12a1561a..ed43d4c9 100644
--- a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.html
+++ b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.html
@@ -7,6 +7,7 @@
<select multiple="multiple" id="presets_options_select"></select>
</div>
<div class="presets_detailed_dialog_text" id="presets_detailed_dialog_text_description"></div>
+ <div class="presets_detailed_dialog_text" id="presets_detailed_dialog_html_description"></div>
<div class="presets_detailed_dialog_text" id="presets_detailed_dialog_text_cli"></div>
</div>
<div id = "presets_detailed_dialog_loading" class="data-loading"></div>
diff --git a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.js b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.js
index b09efb20..c6602ca6 100644
--- a/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.js
+++ b/src/tabs/presets/DetailedDialog/PresetsDetailedDialog.js
@@ -7,6 +7,7 @@ class PresetsDetailedDialog {
this._finalDialogYesNoSettings = {};
this._onPresetPickedCallback = onPresetPickedCallback;
this._openPromiseResolve = undefined;
+ this._isDescriptionHtml = false;
}
load() {
@@ -57,7 +58,7 @@ class PresetsDetailedDialog {
}
_loadPresetUi() {
- this._domDescription.text(this._preset.description?.join("\n"));
+ this._loadDescription();
this._domGitHubLink.attr("href", this._presetsRepo.getPresetOnlineLink(this._preset));
@@ -76,6 +77,24 @@ class PresetsDetailedDialog {
this._showCliText(false);
}
+ _loadDescription() {
+ let text = this._preset.description?.join("\n");
+
+ switch(this._preset.parser) {
+ case "MARKED":
+ this._isDescriptionHtml = true;
+ text = marked.parse(text);
+ text = DOMPurify.sanitize(text);
+ this._domDescriptionHtml.html(text);
+ GUI.addLinksTargetBlank(this._domDescriptionHtml);
+ break;
+ default:
+ this._isDescriptionHtml = false;
+ this._domDescriptionText.text(text);
+ break;
+ }
+ }
+
_updateFinalCliText() {
this._domCliText.text(this._getFinalCliText().join("\n"));
}
@@ -107,7 +126,8 @@ class PresetsDetailedDialog {
this._domError = $('#presets_detailed_dialog_error');
this._domProperties = $('#presets_detailed_dialog_properties');
this._titlePanel = $('.preset_detailed_dialog_title_panel');
- this._domDescription = $('#presets_detailed_dialog_text_description');
+ this._domDescriptionText = $('#presets_detailed_dialog_text_description');
+ this._domDescriptionHtml = $('#presets_detailed_dialog_html_description');
this._domCliText = $('#presets_detailed_dialog_text_cli');
this._domGitHubLink = this._domDialog.find('#presets_open_online');
this._domDiscussionLink = this._domDialog.find('#presets_open_discussion');
@@ -118,7 +138,8 @@ class PresetsDetailedDialog {
}
_showCliText(value) {
- this._domDescription.toggle(!value);
+ this._domDescriptionText.toggle(!value && !this._isDescriptionHtml);
+ this._domDescriptionHtml.toggle(!value && this._isDescriptionHtml);
this._domCliText.toggle(value);
this._domButtonCliShow.toggle(!value);
this._domButtonCliHide.toggle(value);
diff --git a/src/tabs/presets/PresetsRepoIndexed/PresetParser.js b/src/tabs/presets/PresetsRepoIndexed/PresetParser.js
index 82a48e23..111465e4 100644
--- a/src/tabs/presets/PresetsRepoIndexed/PresetParser.js
+++ b/src/tabs/presets/PresetsRepoIndexed/PresetParser.js
@@ -6,7 +6,7 @@ class PresetParser {
}
readPresetProperties(preset, strings) {
- const propertiesToRead = ["description", "discussion", "warning", "disclaimer", "include_warning", "include_disclaimer", "discussion", "force_options_review"];
+ const propertiesToRead = ["description", "discussion", "warning", "disclaimer", "include_warning", "include_disclaimer", "discussion", "force_options_review", "parser"];
const propertiesMetadata = {};
preset.options = [];
@@ -113,11 +113,19 @@ class PresetParser {
case this._settings.MetadataTypes.BOOLEAN:
this._processBooleanProperty(preset, line, propertyName);
break;
+ case this._settings.MetadataTypes.PARSER:
+ this._processParserProperty(preset, line, propertyName);
+ break;
default:
this.console.err(`Parcing preset: unknown property type '${this._settings.presetsFileMetadata[property].type}' for the property '${propertyName}'`);
}
}
+ _processParserProperty(preset, line, propertyName)
+ {
+ preset[propertyName] = line;
+ }
+
_processBooleanProperty(preset, line, propertyName) {
const trueValues = ["true", "yes"];
diff --git a/yarn.lock b/yarn.lock
index e9c73fae..218b1ab3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2630,6 +2630,11 @@ domain-browser@^1.2.0:
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+dompurify@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.6.tgz#2e019d7d7617aacac07cbbe3d88ae3ad354cf875"
+ integrity sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==
+
dot-prop@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"