* added missing autocompletions:
- code-block
- container
- header
- image
- link
- pdf
* added extraTags ([name=], [time=], [color=]) to the link autocompletion, because they trigger on the same characters
added getUser in /redux/user/methods to retrive the current user outside of .tsx files
improve the regexps on several autocompletion
* renamed hints to auto
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add 'yarn lint' command and run it in GH actions
* Move linting to own workflow
* Remove linting from build-workflow
* Solve linting warnings
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
- added csv-replacer
- changed highlghted-code plugin:
each replacer extracts what he need from the data-extra attribute now
- changed CHANGELOG.md
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
This fix needs a little bit of explanation. Normally the 'keyUp' prevent is preferred because it fires after being sure, that not some buttons more belong to the shortcut. Additionally some platforms set the key-property of the 'keyDown'-event to the composition result of the key-combination thus resolving under certain environments to '€' while in other environments to 'e'.
The browser's event flow is as following: keyDown -> keyPress -> textInput -> keyUp.
As the keyUp-event is too late (after textinput) and the keyPress-event does not work properly with the modifiers, we felt compelled to use 'keyDown' and watch for 'e' as well as '€' key-properties. If some other keyboard locale does output different characters than these two, that person got a problem - meaning no functionality of the shortcut. But still better than nothing.
* Replaced connection indicator in editor top bar with user-menu
* Added basic layout of bottom document bar
* Fixed margins between elements
* Reorganized document-bar
* Added dividers into toolbar
* Move files from task-bar to document-bar and remove test file
* moved connection-indicator components into its own folder
* moved document bar to the top
* moved connection-indicator once again
* Change design
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* New idea for timestamps
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add css
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Revert "Add css"
This reverts commit 6780aa05
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Revert "New idea for timestamps"
This reverts commit bf2891e1
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* split import / export
* Made version input field to a common component
* added read-only modal
added document-time
added placeholder text for permissions
* remove flex-nowrap from editor toolbar
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add codimd permission menu
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Move permission picker to the right
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* add use memo
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add user-select-none to documenttime component
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* added status-bar
* fixed status-bar
* Add document info mock
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* changed published to share in i18n
* reordered document bar
moved share modal in it's own component
* changed the divider color in the toolbar
* Add details to document info
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add pin mock button
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Restructure toolbar after rebase and extract EmojiPicker+Button into component
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Correct linue number output
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add some space into status bar
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Cleanup code to make ESLint happy
* Fix Toc button position
* Added link to presentation mode button
* Cache codemirror props
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Fix code blocks not being completely visible
* Improve document info modal
- The document info timeline always wrapped the received moment.js-object into a new moment.js object instead of directly using the given one.
- The timestamps were configured to be displayed without suffix, but this is necessary to support valid translation grammar.
- There was no margin between the icons and the texts.
* Highlighted user name in document-info modal
* Add avatar icon to document-info modal
* Improved english translation of the share-info
* Improve performance of copyable-fields by using useCallback
* Add translation keys for pin-to-history button
* Forwarded note title to editor-menu for deletion modal info
* Add placeholders to translations
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* change translation
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Change permission dropdown to permission button
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Fix translations of emoji-picker and preferences
* remove unused imports
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add alt attribute
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Fix share button and i18n files
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Fix use of i18n keys
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Use modal-body
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* useCallback
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Use more specific i18n key
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add a new entry and move i18n key for usercontribution
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Fix i18nkey für shareLink
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* remove unused i18nkey
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Rename component DocumentInfo to DocumentInfoButton
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Extract revision button code into own component
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* wrap buttons in navbar-nav
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* organize imports
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* organize imports
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added editor-preferences modal
* Added functionality to preferences modal
* Activated search and replace feature in CodeMirror
* pdf export unavailability notice (#403)
* added pdf export unavailability notice with link to FAQ
as many users ask all the time why this was removed and when they'll get it back, this seemed like a fine solution in the meantime.
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
* Refactored editor-preferences to just use one generic select component
* Fixed warnings regarding duplicated controlId and missing useCb-deps
* Reorganized translation keys
* Fixed i18n indentation for POEditor.com
* Added translation key for 'avatar of ...'
* Remove fragment
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Use user-avatar in document-info-line.tsx
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Revert changes in user-avatar and solve the problem otherwise
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Removed unnecessary import
* Removed another unnecessary import
* Refactored EditorPreferenceSelect to use enum and automatic type conversions
* Remove unused CodeMirror reference
* Fix spacing problem
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Increate size of image
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* fixed share-link's space around the copyable-field
Co-authored-by: Philip Molares <philip.molares@udo.edu>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Philip Molares <git@molar.es>
* added toolbar e2e test
changed addTable function
* fixed toolbar unit test
* added emoji to toolbar e2e tests
added selection with link to toolbar e2e tests
* Added emoji-mart as emoji-picker
* Fixed JSON to TypeScript-object parsing
* added fork awesome to emoji-picker
added ForkAwesomeIcons enum, because it's not possible to iterate over a typescript type consisting of strings [1]. This is a bit unfortunate since we now have two lists of all the fork awesome icons, but sadly it can not be done another way.
added fork awesome as a custom category to the emoji picker.
[1]: https://stackoverflow.com/questions/40863488/how-to-iterate-over-a-custom-literal-type-in-typescript
* made picker close, when clicking away
added react-use dependency for useClickAway hook
* Fixed emoji-picker loading images from unpkg instead of using font
* fixed addEmoji function
added tests
* Extract customIcons into useMemo
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added config option to enable/disable the email signup
* Added register API call
* Added register button and error handling
* Show register button only if enabled in config
* Renamed login handler, added dir-attribute, removed obsolete css class
* Added separate registration page, changed email-login to internal-login
As an username is sufficient for registration, this commit changes the email-login into an username-based login. This login method is now called "internal" in the code.
This commit also introduces a new registration page instead of using the same form as for login.
* Added information texts below form fields
* Added error differentiation
* Added CHANGELOG entry
* Replace "magic string" with Enum representation
* Removed password-field to DOM rewrite
With the value attribute set, the password would be written to the DOM while typing. That's bad practise as attackers could read that password (e.g. with dirty CSS-hacks).
* Fixed backendConfig to config renaming
* Fixed links on register page being external links
* Refactored error handling to use string-enum that corresponds with i18n keys
* Fix chrome warnings regarding autocomplete and duplicated id
* Refactor login action buttons to use callbacks and handle promises directly
* Remove unnecessary async function
* Added promise chaining
* Add plantuml support
* Enable PlantUML rendering only if plantumlServer config is set
* Show warning box when plantuml is enabled but no server is configured
renamed frontend-config to api-url
renamed backend-config to config
removed api call to set frontend-config as the frontend either know where the backend is as it is delivered by it or get's this information via the enviroment variable REACT_APP_BACKEND
always start the client on Port 3001 as the backend will run on 3000 during development. changed the port on multiple occasions to accommodate for this
added package.json script 'start:dev'
changed README to better explain how to run backend and frontend side-by-side
* Added yaml-frontmatter extracting and error handling
* add tests
* changed document-title, so the editor can change the title to the title of the yaml metadata. closes#303
* extracted first line parsing in a core rule of markdown-it
document title will now be determined like this:
1. yaml metadata title
2. opengraph title
3. first level one heading
4. 'Untitled'
* added documentTitle e2e test
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
Co-authored-by: Philip Molares <philip@mauricedoepke.de>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: mrdrogdrog <mr.drogdrog@gmail.com>
* added all functionality to the toolbar buttons
* added unit tests for the toolbar functions
* added unit tests to CI
* Added translated titles to buttons of toolbar
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: mrdrogdrog <mr.drogdrog@gmail.com>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
* Update dependency react-bootstrap to v1.2.1
* Fixed sort-button event name
With the upgrade to Bootstrap-React 1.2.1 the ButtonProps extend now React.HTMLAttributes which in favor extends the DOMAttributes interface. This interface defines almost every possible attribute for DOM-/HTML-elements.
Our SortButtonProps interface introduced an onChange event handler with a type matching our condition. With the BS-React upgrade the onChange event must not be redefined/overriden with this type and therefore I renamed it.
* updated react-bootstrap to 1.2.2
* fixed wrong prop name in HistoryToolbar
Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
Co-authored-by: Philip Molares <philip.molares@udo.edu>
* Fix history element's entry menu deletion button
The note deletion button inside the EntryMenu of a history element has one button to remove the note from the user's history and one to delete the note from the system. Both buttons pointed to the history-removal.
* Added modals for note deletion and note from history removal
* Removed redundant code
* Added CHANGELOG entry
* Added note title in deletion/removal prompts
* Refactored DeleteNoteItem and RemoveNoteEntryItem into one common component
* Refactored DeleteRemoveNoteItem-component and added two composition components
* Redesigned modal dialog to make the note title more clearly readable
* Renamed the generic dropdown-with-deletion-modal-component
added branding option via '@ <logo>' or '@ <name>' after the CodiMD logo and text.
This was a user can personalize their CodiMD instance
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Replaced links to /features with /n/features
It was discussed and agreed on that all notes should reside under the /n/ namespace in the future. Even if we want to redirect all pre-2.0-notes from the root namespace to the /n/ namespace, it might be better to set the internal links for the features page properly instead on relying on the redirect.
* Improved note placeholder text
* Refactored modals (added CommonModal and DeletionModal besides ErrorModal)
This change allows more code reusage by defining a common modal that has a translated title with an optional icon.
* Replace the eslint-hack with a proper TypeScript conform solution
Instead of asserting non-null and disabling eslint, the 'as ...'-syntax is used to convince the compiler that everything is fine.
* Improved property names and ShowIf-construct
* Fixed missing renamings
* Fixed bug that two p-tags were encapsulated inside each other
This bug was introduced because the wider-possible-replacer replaced each element that was subject to be enlarged with a brand new p-surrounding. That surrounding got the key of the old (now inner) element and therefore casts an duplicate key exception.
This fix solves that problem by setting the 'wider-possible' class attribute directly on the selected tag instead of creating a surrounding.
* Removed unnecessary console log
* Optimized attribute assignment to not fail on elements without attribs
* Added comment describing the node.attribs assignment
made some components wider in View Mode
These objects include
- `<img>` alone in a paragraph
- `<codimd-youtube>`
- `<codimd-vimeo>`
- `<codimd-pdf>`
This can be toggled via the `wider` prop in `MarkdownRenderer`
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added possibility to add a text below the icon on the preview
* Changes naming of i18nKey argument
* Rebase fixes
* Show preview image only if defined
added image-replacer
this component replaces all `<img>`'s in the markdown-it output with an ImageFrame component. This enables us to implement image proxies and other per image customization in the future.
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add activation callback to one-click-embedding
* use activation callback to change size of pdf
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added regexes to replace name and time extras
* Added [color=#abc] replacements inside of blockquotes
This works with the following "algorithm":
1. Transform any [color=]-Tags with a valid css color into a codimd-quote-options element.
2. While transforming blockquotes, check if one of their paragraphs contains a codimd-quote-options element. If multiple are found, only the first one will be used.
3. Remove the codimd-quote-options element and set the border-left-color of the blockquote appropriately.
* Added correct CSS styling of blockquote extras
* Added tag icon when [color=...] is used outside a blockquote
In version 1.6 of CodiMD the [color=...] tag renders a tag-icon in the specified color when used outside of a blockquote paragraph.
* Added changelog entry
* Flip if-else in quote-options for better readability
* Flip another if-else in quote-options for better readability
* Extract language codes into object
* Restructure language search so it would find more specific language codes first.
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added TOC support and anchors for headings
* Moved @types/markdown-it-anchor from devDependencies to dependencies
* Add subnode renderer
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Added node-replacer for toc generation
ul lists may not be nested inside a p element. Therefore replaces this replacer every p that has a div.table-of-contents inside of it with the div directly.
* Add index to replacer function
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add TOC to example code
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Remove unused import
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Removed unnecessary div wrapper of toc
* Fixed toc-renderer
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
this makes it possible to use abbreviations like these
```
*[HTML]: Hyper Text Markup Language
*[W3C]: World Wide Web Consortium
The HTML specification
is maintained by the W3C.
```
Co-authored-by: Philip Molares <philip@mauricedoepke.de>
this makes it possible to use definition lists like
```
Term 1
: Definition 1
with lazy continuation.
Term 2 with *inline markup*
: Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
_Compact style:_
Term 1
~ Definition 1
Term 2
~ Definition 2a
~ Definition 2b
```
Co-authored-by: Philip Molares <philip@mauricedoepke.de>
* Add basic markdown it rendering
* Add markdown preview
* Add embedings for vimeo, youtube, gist
* Add support for legacy shortcodes and link detection
* Set "both" as editor default
* Add markdown-it-task-lists
* Add twemoji
* Changed SlideShare short-code behaviour from embedding to generating a link
* Extract markdown it parser debugger into separate component
* Deactivate markdown it linkify for now
* Add link safety attributes
* Add one-click-embedding component and use it
* Added embedding changes and deprecations to CHANGELOG.md
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Philip Molares <philip@mauricedoepke.de>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
* added info-banner component to show the banner.text, we got from the backend config. This banner is shown on top of the landing page (intro, history, login/signup and profile) and also on top of the editor and links to `/n/banner`
* added banner to backendConfig Redux state
* added BannerState to the ApplicationState with that the showing of the banner is globally controlled, the banner text is given to the banner component and the timestamp to acknowledge a banner was read by the user
* the timestamp of a dismissed note is saved in the browsers localStorage to determine in the future if the banner should be shown
Signed-off-by: Philip Molares <philip.molares@udo.edu>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
* Added Link objects around history-cards and the title in table-view
This commit adds one Link element wrapping the title of a note in the table view and one Link element wrapping the whole card of a note in cards view.
This behaviour currently doesn't work completely correct as other buttons on the card become unclickable and needs to be fixed in another commit before merging this branch.
* Fixed Link behaviour for card view
The cards aren't wrapped inside a Link element anymore but the middle column of a card (where the title and tags are located) is now wrapped inside the Link element.
With this approach not the whole card is clickable anymore, but it's enough clickable space anyway. The positive aspect is that we don't have to deal with "position: absolute"-elements that may break responsiveness.
* added redirector component
* it will redirect every request to /$something that is not handled otherwise (/intro, /login and such) to /n/$something
* added getNote API Call
* added NotFound component
* added LandingLayout around the NotFound component, so users can easily navigate away from the component
Signed-off-by: Philip Molares <philip.molares@udo.edu>
- added entry-menu
- added subsection in entry-menu with the location of the history entry and the action to remove an entry from history
- added uploadAll functionality
- show uploadAll Button in history only if the user is logged in
- added deleteNote api call
Signed-off-by: Philip Molares <philip.molares@udo.edu>
* set text direction on language load and change to rtl if arabic is chosen
see https://www.w3schools.com/tags/att_global_dir.asp
* minor fixes to make rtl-mode look good:
- margins not only on the right, but on both sides
- fix bootstrap ToggleButtonGroup to always be ltr
* removed console.log statements
* fixed margin on the name in the user-avatar
* '$Icon CodiMD' on the intro page now always uses ftr text direction, since we don't translate the same of the software
* fixed import
* removed setHTMLDirection function
* added toplevel div with dir='auto'
some elements got dir='auto' if they contain potentially not translated or intended english text
* added text-align: start to the user-dropdown
* moved toplevel dir='auto'
* moved shortenLanguageCode to language-picker
* Changed mr-2 to mx-2 for profile buttons
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
* Move common components to the `common` directory
* rename style directory
* Move ForkAwesome to common
* Move initializers and restructure application-loader.tsx
We discussed whether the minor-version is relevant for the API base-path and came to the conclusion, that it's not really needed as breaking API changes need a new major version anyway.
This commit also removes the trailing slash from the URL which is returned by `getBackendUrl`. This is needed as we composed the API routes in our implementation always with a starting slash thus leading to double slashes.
Example of old behaviour:
getBackendUrl() + '/config'
=> example.com/api/v2.0//config
Example of new behaviuor:
getBackendUrl() + '/config'
=> example.com/api/v2/config
* Hide "Sign-in via ..." box if no provider is enabled
* Show sign-in buttons only if auth-providers exist
* Rebase fixes
* Replaced ternary operators with ShowIf
* Added ShowIf on two other code positions
* added history toolbar functionality
* export now adds a version number
* renamed OldHistoryEntry to V0HistoryEntry
Signed-off-by: Philip Molares <philip.molares@udo.edu>
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* removed css from body
* added internal-link and translated-internal-link
* icon in links are always fixedWidth
* added help button
Signed-off-by: Philip Molares <philip.molares@udo.edu>
Co-authored-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Add new format for translation files
Co-authored-by: Philip Molares <philip.molares@udo.edu>
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
* Card-ify login components
* Fix lint warnings
* Replace HTML with react-bootstrap components
* Remove now obsolete flex div
* Apply fixed width to fa-icons
* Reset sign-in buttons to normal size
* using saml and oauth2 customAuthNames in login
* add saml and oauth2 customAuthNames to backend config
* changed default name of oauth button
Signed-off-by: Philip Molares <philip.molares@udo.edu>
* convert the old localStorage["notehistory"] to the new history format, if there is no new history in localStorage
fixes#20
Signed-off-by: Philip Molares <philip.molares@udo.edu>
* used toDate instead of fromUnixTime
Signed-off-by: Philip Molares <philip.molares@udo.edu>
* extracted OldHistoryEntry interface
Signed-off-by: Philip Molares <philip.molares@udo.edu>
polished via-email component
used state to track email and password.
explicitly did not put email and password in value of the appropriate input fields because that is not necessary nor do we want to write the clear text password into the dom
Signed-off-by: Philip Molares <philip.molares@udo.edu>
(cherry picked from commit c5f5956b8d8bb02553f85443f8b04acbf0c31f2b)