From 24367ef90619dab7dce357867cf72e3491be1330 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2019 11:07:47 +0200 Subject: Bump css-loader from 2.1.1 to 3.1.0 (#11382) * Bump css-loader from 2.1.1 to 3.1.0 Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 2.1.1 to 3.1.0. - [Release notes](https://github.com/webpack-contrib/css-loader/releases) - [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-loader/compare/v2.1.1...v3.1.0) Signed-off-by: dependabot-preview[bot] * localIdentName -> modules.localIdentName --- config/webpack/rules/css.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'config/webpack') diff --git a/config/webpack/rules/css.js b/config/webpack/rules/css.js index 3b5b51232..52af1497e 100644 --- a/config/webpack/rules/css.js +++ b/config/webpack/rules/css.js @@ -9,7 +9,9 @@ module.exports = { options: { sourceMap: true, importLoaders: 2, - localIdentName: '[name]__[local]___[hash:base64:5]', + modules: { + localIdentName: '[name]__[local]___[hash:base64:5]', + }, }, }, { -- cgit From fada60cbe72764756d8538017d8a0100429ccb23 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Tue, 23 Jul 2019 22:47:48 +0900 Subject: Remove modules.localIdentName (#11398) --- config/webpack/rules/css.js | 3 --- 1 file changed, 3 deletions(-) (limited to 'config/webpack') diff --git a/config/webpack/rules/css.js b/config/webpack/rules/css.js index 52af1497e..bc1f42c13 100644 --- a/config/webpack/rules/css.js +++ b/config/webpack/rules/css.js @@ -9,9 +9,6 @@ module.exports = { options: { sourceMap: true, importLoaders: 2, - modules: { - localIdentName: '[name]__[local]___[hash:base64:5]', - }, }, }, { -- cgit From 28636f43e4b0c04befa243b847c38e81c90f1289 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 15 Aug 2019 15:13:26 +0200 Subject: Add OCR tool to media editing modal (#11566) --- .../features/compose/components/upload_form.js | 3 +- .../features/compose/components/upload_progress.js | 9 +- .../features/ui/components/focal_point_modal.js | 60 +++++++-- app/javascript/styles/mastodon/components.scss | 81 +++++++++--- config/initializers/content_security_policy.rb | 8 +- config/webpack/development.js | 1 + config/webpack/shared.js | 5 + package.json | 2 + public/ocr/lang-data/eng.traineddata.gz | Bin 0 -> 10923060 bytes yarn.lock | 140 ++++++++++++++++++++- 10 files changed, 275 insertions(+), 34 deletions(-) create mode 100644 public/ocr/lang-data/eng.traineddata.gz (limited to 'config/webpack') diff --git a/app/javascript/mastodon/features/compose/components/upload_form.js b/app/javascript/mastodon/features/compose/components/upload_form.js index 9ff2aa0fa..c6eac554e 100644 --- a/app/javascript/mastodon/features/compose/components/upload_form.js +++ b/app/javascript/mastodon/features/compose/components/upload_form.js @@ -4,6 +4,7 @@ import UploadProgressContainer from '../containers/upload_progress_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import UploadContainer from '../containers/upload_container'; import SensitiveButtonContainer from '../containers/sensitive_button_container'; +import { FormattedMessage } from 'react-intl'; export default class UploadForm extends ImmutablePureComponent { @@ -16,7 +17,7 @@ export default class UploadForm extends ImmutablePureComponent { return (
- + } />
{mediaIds.map(id => ( diff --git a/app/javascript/mastodon/features/compose/components/upload_progress.js b/app/javascript/mastodon/features/compose/components/upload_progress.js index cbe58f573..b0bfe0c9a 100644 --- a/app/javascript/mastodon/features/compose/components/upload_progress.js +++ b/app/javascript/mastodon/features/compose/components/upload_progress.js @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import Motion from '../../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; -import { FormattedMessage } from 'react-intl'; import Icon from 'mastodon/components/icon'; export default class UploadProgress extends React.PureComponent { @@ -10,10 +9,12 @@ export default class UploadProgress extends React.PureComponent { static propTypes = { active: PropTypes.bool, progress: PropTypes.number, + icon: PropTypes.string.isRequired, + message: PropTypes.node.isRequired, }; render () { - const { active, progress } = this.props; + const { active, progress, icon, message } = this.props; if (!active) { return null; @@ -22,11 +23,11 @@ export default class UploadProgress extends React.PureComponent { return (
- +
- + {message}
diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js index e15bf69d6..b21d5c9d4 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js @@ -10,6 +10,11 @@ import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import IconButton from 'mastodon/components/icon_button'; import Button from 'mastodon/components/button'; import Video from 'mastodon/features/video'; +import { TesseractWorker } from 'tesseract.js'; +import Textarea from 'react-textarea-autosize'; +import UploadProgress from 'mastodon/features/compose/components/upload_progress'; +import CharacterCounter from 'mastodon/features/compose/components/character_counter'; +import { length } from 'stringz'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, @@ -29,6 +34,12 @@ const mapDispatchToProps = (dispatch, { id }) => ({ }); +const removeExtraLineBreaks = str => str.replace(/\n\n/g, '******') + .replace(/\n/g, ' ') + .replace(/\*\*\*\*\*\*/g, '\n\n'); + +const assetHost = process.env.CDN_HOST || ''; + export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl class FocalPointModal extends ImmutablePureComponent { @@ -47,6 +58,7 @@ class FocalPointModal extends ImmutablePureComponent { dragging: false, description: '', dirty: false, + progress: 0, }; componentWillMount () { @@ -133,9 +145,27 @@ class FocalPointModal extends ImmutablePureComponent { this.node = c; } + handleTextDetection = () => { + const { media } = this.props; + + const worker = new TesseractWorker({ + workerPath: `${assetHost}/packs/ocr/worker.min.js`, + corePath: `${assetHost}/packs/ocr/tesseract-core.wasm.js`, + langPath: `${assetHost}/ocr/lang-data`, + }); + + this.setState({ detecting: true }); + + worker.recognize(media.get('url')) + .progress(({ progress }) => this.setState({ progress })) + .finally(() => worker.terminate()) + .then(({ text }) => this.setState({ description: removeExtraLineBreaks(text), dirty: true, detecting: false })) + .catch(() => this.setState({ detecting: false })); + } + render () { const { media, intl, onClose } = this.props; - const { x, y, dragging, description, dirty } = this.state; + const { x, y, dragging, description, dirty, detecting, progress } = this.state; const width = media.getIn(['meta', 'original', 'width']) || null; const height = media.getIn(['meta', 'original', 'height']) || null; @@ -158,15 +188,27 @@ class FocalPointModal extends ImmutablePureComponent { -