├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── dev-client.js ├── dev-server.js ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js ├── webpack.prod.conf.js └── webpack.test.conf.js ├── config ├── dev.env.js ├── index.js ├── prod.env.js └── test.env.js ├── docs ├── 2cf8189448c76b1e3b2a.worker.js ├── 2cf8189448c76b1e3b2a.worker.js.map ├── b9c1687494af7153c7d7.worker.js ├── b9c1687494af7153c7d7.worker.js.map ├── index.html └── static │ ├── css │ ├── app.187b8153b7b88dc8ad135afdb675e052.css │ └── app.187b8153b7b88dc8ad135afdb675e052.css.map │ └── js │ ├── 0.a4b9f936df4a36b0f706.js │ ├── 0.a4b9f936df4a36b0f706.js.map │ ├── app.4df998011aada0dee28f.js │ ├── app.4df998011aada0dee28f.js.map │ ├── manifest.ae8d1e482089407e08f1.js │ ├── manifest.ae8d1e482089407e08f1.js.map │ ├── vendor.0d95ecf461c06ce88a38.js │ └── vendor.0d95ecf461c06ce88a38.js.map ├── index.html ├── package.json ├── src ├── App.vue ├── assets │ └── logo.png ├── components │ ├── Annotator.vue │ ├── AreaSelect.vue │ ├── Editor.vue │ ├── PDF.vue │ ├── PDFZoneViewer.vue │ ├── SelectionPreview.vue │ ├── Uploader.vue │ └── ZoneViewer.vue ├── main.js └── router │ └── index.js ├── static └── .gitkeep └── test └── unit ├── .eslintrc ├── index.js ├── karma.conf.js └── specs └── Hello.spec.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["istanbul"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | test/unit/coverage 8 | 9 | # Editor directories and files 10 | .idea 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserlist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kull: A Text Region Selector 2 | 3 | A tool to interactively select text regions of PDFs and images. Use with [PDFQuery](https://github.com/jcushman/pdfquery) to select PDF areas using Python or [tesseract](https://github.com/tesseract-ocr/tesseract) for image-to-text with UZN/OCR zone files. 4 | 5 | Find the interactive version at [https://jsoma.github.io/kull/](https://jsoma.github.io/kull/). 6 | 7 | If you'd like to simplify the tesseract/`.uzn` process, try [tesseract-uzn](https://github.com/jsoma/tesseract-uzn). -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | process.env.NODE_ENV = 'production' 4 | 5 | var ora = require('ora') 6 | var rm = require('rimraf') 7 | var path = require('path') 8 | var chalk = require('chalk') 9 | var webpack = require('webpack') 10 | var config = require('../config') 11 | var webpackConfig = require('./webpack.prod.conf') 12 | 13 | var spinner = ora('building for production...') 14 | spinner.start() 15 | 16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 17 | if (err) throw err 18 | webpack(webpackConfig, function (err, stats) { 19 | spinner.stop() 20 | if (err) throw err 21 | process.stdout.write(stats.toString({ 22 | colors: true, 23 | modules: false, 24 | children: false, 25 | chunks: false, 26 | chunkModules: false 27 | }) + '\n\n') 28 | 29 | console.log(chalk.cyan(' Build complete.\n')) 30 | console.log(chalk.yellow( 31 | ' Tip: built files are meant to be served over an HTTP server.\n' + 32 | ' Opening index.html over file:// won\'t work.\n' 33 | )) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | var chalk = require('chalk') 2 | var semver = require('semver') 3 | var packageConfig = require('../package.json') 4 | var shell = require('shelljs') 5 | function exec (cmd) { 6 | return require('child_process').execSync(cmd).toString().trim() 7 | } 8 | 9 | var versionRequirements = [ 10 | { 11 | name: 'node', 12 | currentVersion: semver.clean(process.version), 13 | versionRequirement: packageConfig.engines.node 14 | }, 15 | ] 16 | 17 | if (shell.which('npm')) { 18 | versionRequirements.push({ 19 | name: 'npm', 20 | currentVersion: exec('npm --version'), 21 | versionRequirement: packageConfig.engines.npm 22 | }) 23 | } 24 | 25 | module.exports = function () { 26 | var warnings = [] 27 | for (var i = 0; i < versionRequirements.length; i++) { 28 | var mod = versionRequirements[i] 29 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 30 | warnings.push(mod.name + ': ' + 31 | chalk.red(mod.currentVersion) + ' should be ' + 32 | chalk.green(mod.versionRequirement) 33 | ) 34 | } 35 | } 36 | 37 | if (warnings.length) { 38 | console.log('') 39 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 40 | console.log() 41 | for (var i = 0; i < warnings.length; i++) { 42 | var warning = warnings[i] 43 | console.log(' ' + warning) 44 | } 45 | console.log() 46 | process.exit(1) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /build/dev-server.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | var config = require('../config') 4 | if (!process.env.NODE_ENV) { 5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 6 | } 7 | 8 | var opn = require('opn') 9 | var path = require('path') 10 | var express = require('express') 11 | var webpack = require('webpack') 12 | var proxyMiddleware = require('http-proxy-middleware') 13 | var webpackConfig = process.env.NODE_ENV === 'testing' 14 | ? require('./webpack.prod.conf') 15 | : require('./webpack.dev.conf') 16 | 17 | // default port where dev server listens for incoming traffic 18 | var port = process.env.PORT || config.dev.port 19 | // automatically open browser, if not set will be false 20 | var autoOpenBrowser = !!config.dev.autoOpenBrowser 21 | // Define HTTP proxies to your custom API backend 22 | // https://github.com/chimurai/http-proxy-middleware 23 | var proxyTable = config.dev.proxyTable 24 | 25 | var app = express() 26 | var compiler = webpack(webpackConfig) 27 | 28 | var devMiddleware = require('webpack-dev-middleware')(compiler, { 29 | publicPath: webpackConfig.output.publicPath, 30 | quiet: true 31 | }) 32 | 33 | var hotMiddleware = require('webpack-hot-middleware')(compiler, { 34 | log: () => {} 35 | }) 36 | // force page reload when html-webpack-plugin template changes 37 | compiler.plugin('compilation', function (compilation) { 38 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 39 | hotMiddleware.publish({ action: 'reload' }) 40 | cb() 41 | }) 42 | }) 43 | 44 | // proxy api requests 45 | Object.keys(proxyTable).forEach(function (context) { 46 | var options = proxyTable[context] 47 | if (typeof options === 'string') { 48 | options = { target: options } 49 | } 50 | app.use(proxyMiddleware(options.filter || context, options)) 51 | }) 52 | 53 | // handle fallback for HTML5 history API 54 | app.use(require('connect-history-api-fallback')()) 55 | 56 | // serve webpack bundle output 57 | app.use(devMiddleware) 58 | 59 | // enable hot-reload and state-preserving 60 | // compilation error display 61 | app.use(hotMiddleware) 62 | 63 | // serve pure static assets 64 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 65 | app.use(staticPath, express.static('./static')) 66 | 67 | var uri = 'http://localhost:' + port 68 | 69 | var _resolve 70 | var readyPromise = new Promise(resolve => { 71 | _resolve = resolve 72 | }) 73 | 74 | console.log('> Starting dev server...') 75 | devMiddleware.waitUntilValid(() => { 76 | console.log('> Listening at ' + uri + '\n') 77 | // when env is testing, don't need open it 78 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { 79 | opn(uri) 80 | } 81 | _resolve() 82 | }) 83 | 84 | var server = app.listen(port) 85 | 86 | module.exports = { 87 | ready: readyPromise, 88 | close: () => { 89 | server.close() 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | exports.assetsPath = function (_path) { 6 | var assetsSubDirectory = process.env.NODE_ENV === 'production' 7 | ? config.build.assetsSubDirectory 8 | : config.dev.assetsSubDirectory 9 | return path.posix.join(assetsSubDirectory, _path) 10 | } 11 | 12 | exports.cssLoaders = function (options) { 13 | options = options || {} 14 | 15 | var cssLoader = { 16 | loader: 'css-loader', 17 | options: { 18 | minimize: process.env.NODE_ENV === 'production', 19 | sourceMap: options.sourceMap 20 | } 21 | } 22 | 23 | // generate loader string to be used with extract text plugin 24 | function generateLoaders (loader, loaderOptions) { 25 | var loaders = [cssLoader] 26 | if (loader) { 27 | loaders.push({ 28 | loader: loader + '-loader', 29 | options: Object.assign({}, loaderOptions, { 30 | sourceMap: options.sourceMap 31 | }) 32 | }) 33 | } 34 | 35 | // Extract CSS when that option is specified 36 | // (which is the case during production build) 37 | if (options.extract) { 38 | return ExtractTextPlugin.extract({ 39 | use: loaders, 40 | fallback: 'vue-style-loader' 41 | }) 42 | } else { 43 | return ['vue-style-loader'].concat(loaders) 44 | } 45 | } 46 | 47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 48 | return { 49 | css: generateLoaders(), 50 | postcss: generateLoaders(), 51 | less: generateLoaders('less'), 52 | sass: generateLoaders('sass', { indentedSyntax: true }), 53 | scss: generateLoaders('sass'), 54 | stylus: generateLoaders('stylus'), 55 | styl: generateLoaders('stylus') 56 | } 57 | } 58 | 59 | // Generate loaders for standalone style files (outside of .vue) 60 | exports.styleLoaders = function (options) { 61 | var output = [] 62 | var loaders = exports.cssLoaders(options) 63 | for (var extension in loaders) { 64 | var loader = loaders[extension] 65 | output.push({ 66 | test: new RegExp('\\.' + extension + '$'), 67 | use: loader 68 | }) 69 | } 70 | return output 71 | } 72 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var config = require('../config') 3 | var isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction 8 | ? config.build.productionSourceMap 9 | : config.dev.cssSourceMap, 10 | extract: isProduction 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var config = require('../config') 4 | var vueLoaderConfig = require('./vue-loader.conf') 5 | 6 | function resolve (dir) { 7 | return path.join(__dirname, '..', dir) 8 | } 9 | 10 | module.exports = { 11 | entry: { 12 | app: './src/main.js' 13 | }, 14 | output: { 15 | path: config.build.assetsRoot, 16 | filename: '[name].js', 17 | publicPath: process.env.NODE_ENV === 'production' 18 | ? config.build.assetsPublicPath 19 | : config.dev.assetsPublicPath 20 | }, 21 | resolve: { 22 | extensions: ['.js', '.vue', '.json'], 23 | alias: { 24 | 'vue$': 'vue/dist/vue.esm.js', 25 | '@': resolve('src') 26 | } 27 | }, 28 | module: { 29 | rules: [ 30 | { 31 | test: /\.(js|vue)$/, 32 | loader: 'eslint-loader', 33 | enforce: 'pre', 34 | include: [resolve('src'), resolve('test')], 35 | options: { 36 | formatter: require('eslint-friendly-formatter') 37 | } 38 | }, 39 | { 40 | test: /\.vue$/, 41 | loader: 'vue-loader', 42 | options: vueLoaderConfig 43 | }, 44 | { 45 | test: /\.js$/, 46 | loader: 'babel-loader', 47 | include: [resolve('src'), resolve('test')] 48 | }, 49 | { 50 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 51 | loader: 'url-loader', 52 | options: { 53 | limit: 10000, 54 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 55 | } 56 | }, 57 | { 58 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 59 | loader: 'url-loader', 60 | options: { 61 | limit: 10000, 62 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 63 | } 64 | } 65 | ] 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var webpack = require('webpack') 3 | var config = require('../config') 4 | var merge = require('webpack-merge') 5 | var baseWebpackConfig = require('./webpack.base.conf') 6 | var HtmlWebpackPlugin = require('html-webpack-plugin') 7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 8 | 9 | // add hot-reload related code to entry chunks 10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 12 | }) 13 | 14 | module.exports = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 17 | }, 18 | // cheap-module-eval-source-map is faster for development 19 | devtool: '#cheap-module-eval-source-map', 20 | plugins: [ 21 | new webpack.DefinePlugin({ 22 | 'process.env': config.dev.env 23 | }), 24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 25 | new webpack.HotModuleReplacementPlugin(), 26 | new webpack.NoEmitOnErrorsPlugin(), 27 | // https://github.com/ampedandwired/html-webpack-plugin 28 | new HtmlWebpackPlugin({ 29 | filename: 'index.html', 30 | template: 'index.html', 31 | inject: true 32 | }), 33 | new FriendlyErrorsPlugin() 34 | ] 35 | }) 36 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var webpack = require('webpack') 4 | var config = require('../config') 5 | var merge = require('webpack-merge') 6 | var baseWebpackConfig = require('./webpack.base.conf') 7 | var CopyWebpackPlugin = require('copy-webpack-plugin') 8 | var HtmlWebpackPlugin = require('html-webpack-plugin') 9 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 11 | 12 | var env = process.env.NODE_ENV === 'testing' 13 | ? require('../config/test.env') 14 | : config.build.env 15 | 16 | var webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true 21 | }) 22 | }, 23 | devtool: config.build.productionSourceMap ? '#source-map' : false, 24 | output: { 25 | path: config.build.assetsRoot, 26 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 27 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 28 | }, 29 | plugins: [ 30 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 31 | new webpack.DefinePlugin({ 32 | 'process.env': env 33 | }), 34 | new webpack.optimize.UglifyJsPlugin({ 35 | compress: { 36 | warnings: false 37 | }, 38 | sourceMap: true 39 | }), 40 | // extract css into its own file 41 | new ExtractTextPlugin({ 42 | filename: utils.assetsPath('css/[name].[contenthash].css') 43 | }), 44 | // Compress extracted CSS. We are using this plugin so that possible 45 | // duplicated CSS from different components can be deduped. 46 | new OptimizeCSSPlugin({ 47 | cssProcessorOptions: { 48 | safe: true 49 | } 50 | }), 51 | // generate dist index.html with correct asset hash for caching. 52 | // you can customize output by editing /index.html 53 | // see https://github.com/ampedandwired/html-webpack-plugin 54 | new HtmlWebpackPlugin({ 55 | filename: process.env.NODE_ENV === 'testing' 56 | ? 'index.html' 57 | : config.build.index, 58 | template: 'index.html', 59 | inject: true, 60 | minify: { 61 | removeComments: true, 62 | collapseWhitespace: true, 63 | removeAttributeQuotes: true 64 | // more options: 65 | // https://github.com/kangax/html-minifier#options-quick-reference 66 | }, 67 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 68 | chunksSortMode: 'dependency' 69 | }), 70 | // split vendor js into its own file 71 | new webpack.optimize.CommonsChunkPlugin({ 72 | name: 'vendor', 73 | minChunks: function (module, count) { 74 | // any required modules inside node_modules are extracted to vendor 75 | return ( 76 | module.resource && 77 | /\.js$/.test(module.resource) && 78 | module.resource.indexOf( 79 | path.join(__dirname, '../node_modules') 80 | ) === 0 81 | ) 82 | } 83 | }), 84 | // extract webpack runtime and module manifest to its own file in order to 85 | // prevent vendor hash from being updated whenever app bundle is updated 86 | new webpack.optimize.CommonsChunkPlugin({ 87 | name: 'manifest', 88 | chunks: ['vendor'] 89 | }), 90 | // copy custom static assets 91 | new CopyWebpackPlugin([ 92 | { 93 | from: path.resolve(__dirname, '../static'), 94 | to: config.build.assetsSubDirectory, 95 | ignore: ['.*'] 96 | } 97 | ]) 98 | ] 99 | }) 100 | 101 | if (config.build.productionGzip) { 102 | var CompressionWebpackPlugin = require('compression-webpack-plugin') 103 | 104 | webpackConfig.plugins.push( 105 | new CompressionWebpackPlugin({ 106 | asset: '[path].gz[query]', 107 | algorithm: 'gzip', 108 | test: new RegExp( 109 | '\\.(' + 110 | config.build.productionGzipExtensions.join('|') + 111 | ')$' 112 | ), 113 | threshold: 10240, 114 | minRatio: 0.8 115 | }) 116 | ) 117 | } 118 | 119 | if (config.build.bundleAnalyzerReport) { 120 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 121 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 122 | } 123 | 124 | module.exports = webpackConfig 125 | -------------------------------------------------------------------------------- /build/webpack.test.conf.js: -------------------------------------------------------------------------------- 1 | // This is the webpack config used for unit tests. 2 | 3 | var utils = require('./utils') 4 | var webpack = require('webpack') 5 | var merge = require('webpack-merge') 6 | var baseConfig = require('./webpack.base.conf') 7 | 8 | var webpackConfig = merge(baseConfig, { 9 | // use inline sourcemap for karma-sourcemap-loader 10 | module: { 11 | rules: utils.styleLoaders() 12 | }, 13 | devtool: '#inline-source-map', 14 | resolveLoader: { 15 | alias: { 16 | // necessary to to make lang="scss" work in test when using vue-loader's ?inject option 17 | // see discussion at https://github.com/vuejs/vue-loader/issues/724 18 | 'scss-loader': 'sass-loader' 19 | } 20 | }, 21 | plugins: [ 22 | new webpack.DefinePlugin({ 23 | 'process.env': require('../config/test.env') 24 | }) 25 | ] 26 | }) 27 | 28 | // no need for app entry during tests 29 | delete webpackConfig.entry 30 | 31 | module.exports = webpackConfig 32 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../docs/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../docs'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '/kull/', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'], 18 | // Run the build command with an extra argument to 19 | // View the bundle analyzer report after build finishes: 20 | // `npm run build --report` 21 | // Set to `true` or `false` to always turn it on or off 22 | bundleAnalyzerReport: process.env.npm_config_report 23 | }, 24 | dev: { 25 | env: require('./dev.env'), 26 | port: 8080, 27 | autoOpenBrowser: true, 28 | assetsSubDirectory: 'static', 29 | assetsPublicPath: '/', 30 | proxyTable: {}, 31 | // CSS Sourcemaps off by default because relative paths are "buggy" 32 | // with this option, according to the CSS-Loader README 33 | // (https://github.com/webpack/css-loader#sourcemaps) 34 | // In our experience, they generally work as expected, 35 | // just be aware of this issue when enabling this option. 36 | cssSourceMap: false 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var devEnv = require('./dev.env') 3 | 4 | module.exports = merge(devEnv, { 5 | NODE_ENV: '"testing"' 6 | }) 7 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | Kull: A text region selection tool for images and PDFs
-------------------------------------------------------------------------------- /docs/static/css/app.187b8153b7b88dc8ad135afdb675e052.css: -------------------------------------------------------------------------------- 1 | body,html{height:100%;padding:0;margin:0}.editor{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-top:60px}.sidebar{width:400px;left:0;padding:10px}.content,.sidebar{position:absolute;top:0}.content{width:auto;margin-left:30px;left:410px}textarea{box-sizing:border-box;font-size:1em}h2{background:#fff800}h1,h2{padding:10px 25px}h1{background:#c50080;color:#fff}div[data-v-0043a522]{text-align:center}input[data-v-0043a522]{display:none}p[data-v-0043a522]{font-size:12px}label[data-v-0043a522]{text-decoration:underline}#dragover[data-v-0043a522]{background:#f1f1f1;border:3px solid #dedede;padding:20px 30px;margin-bottom:30px}.selection-area[data-v-557e482b]{position:relative;display:inline-block;outline:1px solid #000}h3 span.filename[data-v-557e482b]{padding:0 15px;background:#fff800}h3 span.filetype[data-v-557e482b]{text-transform:lowercase;font-size:.75em;background:#000;color:#fff;border-radius:10px;padding:2px 12px}.selection-box[data-v-1849b72a]{position:absolute;pointer-events:none;text-align:center;z-index:1000}span[data-v-1849b72a]{color:#000;display:inline;position:relative;font-weight:700;font-size:12px;text-shadow:#fff 0 0 2px,#fff 0 0 2px,#fff 0 0 5px,#fff 0 0 5px,#fff 0 0 30px,#fff 0 0 30px,#fff 0 0 30px,#fff 0 0 30px,#fff 0 0 30px,#fff 0 0 60px,#fff 0 0 60px,#fff 0 0 60px}.pdfViewer{width:auto}.canvasWrapper,.textLayer{pointer-events:none}.textLayer{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;opacity:.2;line-height:1}.textLayer>div{color:transparent;position:absolute;white-space:pre;cursor:text;-webkit-transform-origin:0 0;transform-origin:0 0}.textLayer .highlight{margin:-1px;padding:1px;background-color:#b400aa;border-radius:4px}.textLayer .highlight.begin{border-radius:4px 0 0 4px}.textLayer .highlight.end{border-radius:0 4px 4px 0}.textLayer .highlight.middle{border-radius:0}.textLayer .highlight.selected{background-color:#006400}.textLayer ::selection{background:#00f}.textLayer ::-moz-selection{background:#00f}.textLayer .endOfContent{display:block;position:absolute;left:0;top:100%;right:0;bottom:0;z-index:-1;cursor:default;-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}.textLayer .endOfContent.active{top:0}.annotationLayer section{position:absolute}.annotationLayer .linkAnnotation>a{position:absolute;font-size:1em;top:0;left:0;width:100%;height:100%;background:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 0 0 repeat}.annotationLayer .linkAnnotation>a:hover{opacity:.2;background:#ff0;box-shadow:0 2px 10px #ff0}.annotationLayer .textAnnotation img{position:absolute;cursor:pointer}.annotationLayer .buttonWidgetAnnotation.checkBox input,.annotationLayer .buttonWidgetAnnotation.radioButton input,.annotationLayer .choiceWidgetAnnotation select,.annotationLayer .textWidgetAnnotation input,.annotationLayer .textWidgetAnnotation textarea{background-color:rgba(0,54,255,.13);border:1px solid transparent;box-sizing:border-box;font-size:9px;height:100%;padding:0 3px;vertical-align:top;width:100%}.annotationLayer .textWidgetAnnotation textarea{font:message-box;font-size:9px;resize:none}.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled],.annotationLayer .choiceWidgetAnnotation select[disabled],.annotationLayer .textWidgetAnnotation input[disabled],.annotationLayer .textWidgetAnnotation textarea[disabled]{background:none;border:1px solid transparent;cursor:not-allowed}.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,.annotationLayer .buttonWidgetAnnotation.radioButton input:hover,.annotationLayer .choiceWidgetAnnotation select:hover,.annotationLayer .textWidgetAnnotation input:hover,.annotationLayer .textWidgetAnnotation textarea:hover{border:1px solid #000}.annotationLayer .choiceWidgetAnnotation select:focus,.annotationLayer .textWidgetAnnotation input:focus,.annotationLayer .textWidgetAnnotation textarea:focus{background:none;border:1px solid transparent}.annotationLayer .textWidgetAnnotation input.comb{font-family:monospace;padding-left:2px;padding-right:0}.annotationLayer .textWidgetAnnotation input.comb:focus{width:115%}.annotationLayer .buttonWidgetAnnotation.checkBox input,.annotationLayer .buttonWidgetAnnotation.radioButton input{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none}.annotationLayer .popupWrapper{position:absolute;width:20em}.annotationLayer .popup{position:absolute;z-index:200;max-width:20em;background-color:#ff9;box-shadow:0 2px 5px #333;border-radius:2px;padding:.6em;margin-left:5px;cursor:pointer;word-wrap:break-word}.annotationLayer .popup h1{font-size:1em;border-bottom:1px solid #000;padding-bottom:.2em}.annotationLayer .popup p{padding-top:.2em}.annotationLayer .fileAttachmentAnnotation,.annotationLayer .highlightAnnotation,.annotationLayer .lineAnnotation svg line,.annotationLayer .squigglyAnnotation,.annotationLayer .strikeoutAnnotation,.annotationLayer .underlineAnnotation{cursor:pointer}.pdfViewer .canvasWrapper{overflow:hidden}.pdfViewer .page{direction:ltr;width:816px;height:1056px;position:relative;overflow:visible;background-clip:content-box;background-color:#fff}.pdfViewer.removePageBorders .page{margin:0 auto 10px;border:none}.pdfViewer.singlePageView{display:inline-block}.pdfViewer.singlePageView .page{margin:0;border:none}.pdfViewer .page canvas{margin:0;display:block}.pdfViewer .page canvas[hidden]{display:none}.pdfViewer .page .loadingIcon{position:absolute;display:block;left:0;top:0;right:0;bottom:0}.pdfPresentationMode:-webkit-full-screen .pdfViewer .page{margin-bottom:100%;border:0}.pdfPresentationMode:-moz-full-screen .pdfViewer .page{margin-bottom:100%;border:0}.pdfPresentationMode:-ms-fullscreen .pdfViewer .page{margin-bottom:100%!important;border:0}.pdfPresentationMode:fullscreen .pdfViewer .page{margin-bottom:100%;border:0}.preview{display:none}.selected-preview{background:red}textarea{width:calc(100% - 20px);min-height:200px}textarea,textarea[data-v-3b727782]{white-space:pre;overflow-wrap:normal;overflow-x:scroll}textarea[data-v-3b727782]{width:100%;height:300px;font-family:Courier New} -------------------------------------------------------------------------------- /docs/static/css/app.187b8153b7b88dc8ad135afdb675e052.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/App.vue","webpack:///./src/components/Editor.vue","webpack:///./src/components/Uploader.vue","webpack:///./src/components/Annotator.vue","webpack:///./src/components/AreaSelect.vue","webpack:///./src/components/PDF.vue","webpack:///./src/components/SelectionPreview.vue","webpack:///./src/components/ZoneViewer.vue","webpack:///./src/components/PDFZoneViewer.vue"],"names":[],"mappings":"AACA,UACE,YACA,UACA,QAAU,CCHZ,QACE,8CACA,mCACA,kCAEA,eAAiB,CAEnB,SAEE,YAEA,OACA,YAAc,CAEhB,kBANE,kBAEA,KAAO,CAUR,SAJC,WACA,iBAEA,UAAY,CAEd,SACE,sBACA,aAAe,CAEjB,GACE,kBAAoB,CAGtB,MAFE,iBAAmB,CAMpB,GAHC,mBAEA,UAAa,CChCf,qBACE,iBAAmB,CAErB,uBACE,YAAc,CAEhB,mBACE,cAAgB,CAElB,uBACE,yBAA2B,CAE7B,2BACE,mBACA,yBACA,kBACA,kBAAoB,CChBtB,iCACE,kBACA,qBACA,sBAAyB,CAE3B,kCACE,eACA,kBAAoB,CAEtB,kCACE,yBACA,gBACA,gBACA,WACA,mBACA,gBAAkB,CCfpB,gCACE,kBACA,oBACA,kBACA,YAAc,CAEhB,sBACE,WACA,eACA,kBACA,gBACA,eACA,+KAAwP,CCZ1P,WACE,UAAY,CAEd,0BACE,mBAAqB,CAiBvB,WACE,kBACA,OACA,MACA,QACA,SACA,gBACA,WACA,aAAiB,CAEnB,eACE,kBACA,kBACA,gBACA,YACA,6BACA,oBAAwB,CAE1B,sBACE,YACA,YAEA,yBACA,iBAAmB,CAErB,4BACE,yBAA+B,CAEjC,0BACE,yBAA+B,CAEjC,6BACE,eAAmB,CAErB,+BACE,wBAAiC,CAInC,uBAAyB,eAAyB,CAElD,4BAA8B,eAAyB,CAEvD,yBACE,cACA,kBACA,OACA,SACA,QACA,SACA,WACA,eACA,yBACA,qBACA,qBAAuB,CAEzB,gCACE,KAAS,CAEX,yBACE,iBAAmB,CAErB,mCACE,kBACA,cACA,MACA,OACA,WACA,YAGA,2GAA6G,CAE/G,yCACE,WACA,gBACA,0BAA8B,CAEhC,qCACE,kBACA,cAAgB,CAElB,gQAKE,oCACA,6BACA,sBACA,cACA,YACA,cACA,mBACA,UAAY,CAEd,gDACE,iBACA,cACA,WAAa,CAEf,kTAKE,gBACA,6BACA,kBAAoB,CAEtB,8RAKE,qBAAuB,CAEzB,+JAGE,gBACA,4BAA8B,CAEhC,kDACE,sBACA,iBACA,eAAiB,CAEnB,wDAOE,UAAY,CAEd,mHAEE,wBACA,qBACA,oBACA,eAAiB,CAEnB,+BACE,kBACA,UAAY,CAEd,wBACE,kBACA,YACA,eACA,sBACA,0BACA,kBACA,aACA,gBACA,eACA,oBAAsB,CAExB,2BACE,cACA,6BACA,mBAAsB,CAExB,0BACE,gBAAmB,CAErB,4OAME,cAAgB,CAElB,0BACE,eAAiB,CAEnB,iBACE,cACA,YACA,cAEA,kBACA,iBAEA,4BAEA,qBAAwB,CAE1B,mCACE,mBACA,WAAa,CAEf,0BACE,oBAAsB,CAExB,gCACE,SACA,WAAa,CAEf,wBACE,SACA,aAAe,CAEjB,gCACE,YAAc,CAEhB,8BACE,kBACA,cACA,OACA,MACA,QACA,QAAU,CAGZ,0DACE,mBACA,QAAU,CAEZ,uDACE,mBACA,QAAU,CAEZ,qDACE,6BACA,QAAU,CAEZ,iDACE,mBACA,QAAU,CC7PZ,SACE,YAAc,CAShB,kBACE,cAAgB,CCXlB,SACE,gBACA,qBACA,kBACA,wBACA,gBAAkB,CCLpB,0BACE,gBACA,qBACA,kBACA,WACA,aACA,uBAA2B","file":"static/css/app.187b8153b7b88dc8ad135afdb675e052.css","sourcesContent":["\nhtml, body {\n height: 100%;\n padding: 0;\n margin: 0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/App.vue","\n.editor {\n font-family: 'Avenir', Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n margin-top: 60px;\n}\n.sidebar {\n position: absolute;\n width: 400px;\n top: 0;\n left: 0;\n padding: 10px;\n}\n.content {\n position: absolute;\n width: auto;\n margin-left: 30px;\n top: 0px;\n left: 410px;\n}\ntextarea {\n box-sizing: border-box;\n font-size: 1em;\n}\nh2 {\n background: #FFF800;\n padding: 10px 25px;\n}\nh1 {\n background: #C50080;\n padding: 10px 25px;\n color: white;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Editor.vue","\ndiv[data-v-0043a522] {\n text-align: center;\n}\ninput[data-v-0043a522] {\n display: none;\n}\np[data-v-0043a522] {\n font-size: 12px;\n}\nlabel[data-v-0043a522] {\n text-decoration: underline;\n}\n#dragover[data-v-0043a522] {\n background: #f1f1f1;\n border: solid #dedede 3px;\n padding: 20px 30px;\n margin-bottom: 30px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Uploader.vue","\n.selection-area[data-v-557e482b] {\n position: relative;\n display: inline-block;\n outline: solid 1px black;\n}\nh3 span.filename[data-v-557e482b] {\n padding: 0px 15px;\n background: #FFF800;\n}\nh3 span.filetype[data-v-557e482b] {\n text-transform: lowercase;\n font-size: 0.75em;\n background: black;\n color: white;\n border-radius: 10px;\n padding: 2px 12px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Annotator.vue","\n.selection-box[data-v-1849b72a] {\n position: absolute;\n pointer-events: none;\n text-align: center;\n z-index: 1000;\n}\nspan[data-v-1849b72a] {\n color: black;\n display: inline;\n position: relative;\n font-weight: bold;\n font-size: 12px;\n text-shadow: white 0px 0px 2px, white 0px 0px 2px, white 0px 0px 5px, white 0px 0px 5px, white 0px 0px 30px, white 0px 0px 30px, white 0px 0px 30px, white 0px 0px 30px, white 0px 0px 30px, white 0px 0px 60px, white 0px 0px 60px, white 0px 0px 60px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/AreaSelect.vue","\n.pdfViewer {\n width: auto;\n}\n.textLayer, .canvasWrapper {\n pointer-events: none;\n}\n\n/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.textLayer {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n opacity: 0.2;\n line-height: 1.0;\n}\n.textLayer > div {\n color: transparent;\n position: absolute;\n white-space: pre;\n cursor: text;\n -webkit-transform-origin: 0% 0%;\n transform-origin: 0% 0%;\n}\n.textLayer .highlight {\n margin: -1px;\n padding: 1px;\n\n background-color: rgb(180, 0, 170);\n border-radius: 4px;\n}\n.textLayer .highlight.begin {\n border-radius: 4px 0px 0px 4px;\n}\n.textLayer .highlight.end {\n border-radius: 0px 4px 4px 0px;\n}\n.textLayer .highlight.middle {\n border-radius: 0px;\n}\n.textLayer .highlight.selected {\n background-color: rgb(0, 100, 0);\n}\n.textLayer ::-moz-selection { background: rgb(0,0,255);\n}\n.textLayer ::selection { background: rgb(0,0,255);\n}\n.textLayer ::-moz-selection { background: rgb(0,0,255);\n}\n.textLayer .endOfContent {\n display: block;\n position: absolute;\n left: 0px;\n top: 100%;\n right: 0px;\n bottom: 0px;\n z-index: -1;\n cursor: default;\n -webkit-user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n}\n.textLayer .endOfContent.active {\n top: 0px;\n}\n.annotationLayer section {\n position: absolute;\n}\n.annotationLayer .linkAnnotation > a {\n position: absolute;\n font-size: 1em;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n.annotationLayer .linkAnnotation > a /* -ms-a */ {\n background: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\") 0 0 repeat;\n}\n.annotationLayer .linkAnnotation > a:hover {\n opacity: 0.2;\n background: #ff0;\n box-shadow: 0px 2px 10px #ff0;\n}\n.annotationLayer .textAnnotation img {\n position: absolute;\n cursor: pointer;\n}\n.annotationLayer .textWidgetAnnotation input,\n.annotationLayer .textWidgetAnnotation textarea,\n.annotationLayer .choiceWidgetAnnotation select,\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n background-color: rgba(0, 54, 255, 0.13);\n border: 1px solid transparent;\n box-sizing: border-box;\n font-size: 9px;\n height: 100%;\n padding: 0 3px;\n vertical-align: top;\n width: 100%;\n}\n.annotationLayer .textWidgetAnnotation textarea {\n font: message-box;\n font-size: 9px;\n resize: none;\n}\n.annotationLayer .textWidgetAnnotation input[disabled],\n.annotationLayer .textWidgetAnnotation textarea[disabled],\n.annotationLayer .choiceWidgetAnnotation select[disabled],\n.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],\n.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {\n background: none;\n border: 1px solid transparent;\n cursor: not-allowed;\n}\n.annotationLayer .textWidgetAnnotation input:hover,\n.annotationLayer .textWidgetAnnotation textarea:hover,\n.annotationLayer .choiceWidgetAnnotation select:hover,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,\n.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {\n border: 1px solid #000;\n}\n.annotationLayer .textWidgetAnnotation input:focus,\n.annotationLayer .textWidgetAnnotation textarea:focus,\n.annotationLayer .choiceWidgetAnnotation select:focus {\n background: none;\n border: 1px solid transparent;\n}\n.annotationLayer .textWidgetAnnotation input.comb {\n font-family: monospace;\n padding-left: 2px;\n padding-right: 0;\n}\n.annotationLayer .textWidgetAnnotation input.comb:focus {\n /*\n * Letter spacing is placed on the right side of each character. Hence, the\n * letter spacing of the last character may be placed outside the visible\n * area, causing horizontal scrolling. We avoid this by extending the width\n * when the element has focus and revert this when it loses focus.\n */\n width: 115%;\n}\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n -webkit-appearance: none;\n -moz-appearance: none;\n -ms-appearance: none;\n appearance: none;\n}\n.annotationLayer .popupWrapper {\n position: absolute;\n width: 20em;\n}\n.annotationLayer .popup {\n position: absolute;\n z-index: 200;\n max-width: 20em;\n background-color: #FFFF99;\n box-shadow: 0px 2px 5px #333;\n border-radius: 2px;\n padding: 0.6em;\n margin-left: 5px;\n cursor: pointer;\n word-wrap: break-word;\n}\n.annotationLayer .popup h1 {\n font-size: 1em;\n border-bottom: 1px solid #000000;\n padding-bottom: 0.2em;\n}\n.annotationLayer .popup p {\n padding-top: 0.2em;\n}\n.annotationLayer .highlightAnnotation,\n.annotationLayer .underlineAnnotation,\n.annotationLayer .squigglyAnnotation,\n.annotationLayer .strikeoutAnnotation,\n.annotationLayer .lineAnnotation svg line,\n.annotationLayer .fileAttachmentAnnotation {\n cursor: pointer;\n}\n.pdfViewer .canvasWrapper {\n overflow: hidden;\n}\n.pdfViewer .page {\n direction: ltr;\n width: 816px;\n height: 1056px;\n/* margin: 1px auto -8px auto; */\n position: relative;\n overflow: visible;\n/* border: 9px solid transparent;*/\n background-clip: content-box;\n/* border-image: url(images/shadow.png) 9 9 repeat;*/\n background-color: white;\n}\n.pdfViewer.removePageBorders .page {\n margin: 0px auto 10px auto;\n border: none;\n}\n.pdfViewer.singlePageView {\n display: inline-block;\n}\n.pdfViewer.singlePageView .page {\n margin: 0;\n border: none;\n}\n.pdfViewer .page canvas {\n margin: 0;\n display: block;\n}\n.pdfViewer .page canvas[hidden] {\n display: none;\n}\n.pdfViewer .page .loadingIcon {\n position: absolute;\n display: block;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n/* background: url('images/loading-icon.gif') center no-repeat;*/\n}\n.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {\n margin-bottom: 100%;\n border: 0;\n}\n.pdfPresentationMode:-moz-full-screen .pdfViewer .page {\n margin-bottom: 100%;\n border: 0;\n}\n.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {\n margin-bottom: 100% !important;\n border: 0;\n}\n.pdfPresentationMode:fullscreen .pdfViewer .page {\n margin-bottom: 100%;\n border: 0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/PDF.vue","\n.preview {\n display: none;\n/* position: absolute;\n pointer-events: none;\n opacity: 0.5;\n padding: 10px;\n max-width: 300px;\n z-index: 4000;\n background: white;*/\n}\n.selected-preview {\n background: red;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/SelectionPreview.vue","\ntextarea {\n white-space: pre;\n overflow-wrap: normal;\n overflow-x: scroll;\n width: calc(100% - 20px);\n min-height: 200px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/ZoneViewer.vue","\ntextarea[data-v-3b727782] {\n white-space: pre;\n overflow-wrap: normal;\n overflow-x: scroll;\n width: 100%;\n height: 300px;\n font-family: 'Courier New';\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/PDFZoneViewer.vue"],"sourceRoot":""} -------------------------------------------------------------------------------- /docs/static/js/app.4df998011aada0dee28f.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([2],Array(26).concat([function(e,t,n){"use strict";var i=n(15),o=n(98),r=n(83),a=n.n(r);i.a.use(o.a),t.a=new o.a({routes:[{path:"/",name:"Editor",component:a.a}]})},function(e,t,n){function i(e){n(76)}var o=n(0)(n(30),n(96),i,null,null);e.exports=o.exports},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(15),o=n(27),r=n.n(o),a=n(26);i.a.config.productionTip=!1,new i.a({el:"#app",router:a.a,template:"",components:{App:r.a}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={name:"app"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(82),o=n.n(i),r=n(84),a=n.n(r),s=n(86),c=n.n(s);t.default={name:"Annotator",components:{AreaSelect:o.a,PDF:a.a,SelectionPreview:c.a},props:["src","name","selections","addSelection","arrayBuffer","setPdfSize"],data:function(){return{down:!1,coords:{xa:null,ya:null,xb:null,yb:null},pageNumber:1,pageOffset:{top:0,left:0}}},computed:{coordinates:function(){return{left:Math.min(this.coords.xa,this.coords.xb),top:Math.min(this.coords.ya,this.coords.yb),width:Math.abs(this.coords.xa-this.coords.xb),height:Math.abs(this.coords.ya-this.coords.yb),page:this.pageNumber,pageOffset:{top:this.pageOffset.top,left:this.pageOffset.left}}}},methods:{reset:function(){this.coords.xa=null,this.coords.ya=null,this.coords.xb=null,this.coords.yb=null},start:function(e){this.down=!0,this.pageNumber=parseInt(e.target.getAttribute("data-page-number")||1),this.pageOffset.top=e.target.offsetTop,this.pageOffset.left=e.target.offsetLeft,this.coords.xa=e.offsetX,this.coords.ya=e.offsetY,this.coords.xb=e.offsetX,this.coords.yb=e.offsetY},end:function(e){e.stopPropagation(),e.preventDefault(),this.down=!1,this.addSelection(this.coordinates),this.reset()},drag:function(e){e.stopPropagation(),e.preventDefault(),this.down&&(this.coords.xb=e.offsetX,this.coords.yb=e.offsetY)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={name:"area-select",props:["coordinates","color","name","active"],computed:{styleObject:function(){return 0===this.height||0===this.width?{display:"none"}:{left:this.coordinates.left+this.coordinates.pageOffset.left+"px",top:this.coordinates.top+this.coordinates.pageOffset.top+"px",width:this.coordinates.width+"px",height:this.coordinates.height+"px",border:"solid "+this.color+" 1px",background:this.color.replace(/\)$/,", 0.05)").replace("rgb(","rgba(")}}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(87),o=n.n(i),r=n(81),a=n.n(r),s=n(88),c=n.n(s),l=n(85),u=n.n(l),d=n(80),f=n.n(d);t.default={name:"editor",components:{Uploader:o.a,Annotator:a.a,ZoneViewer:c.a,PDFZoneViewer:u.a},data:function(){return{src:null,arrayBuffer:null,name:"",selections:[],pdfDimensions:{height:0,width:0}}},methods:{batchUpdateSelections:function(e){this.selections=e},setPdfSize:function(e,t){this.pdfDimensions={width:e,height:t}},addSelection:function(e){0!==e.height&&0!==e.width&&this.selections.push({id:+new Date,coordinates:{top:e.top,left:e.left,height:e.height,width:e.width,page:e.page,pageOffset:e.pageOffset},color:f()({format:"rgb"}),name:"Unnamed"+this.selections.length})},newFile:function(e){this.name=e.name,this.src=e.src,this.arrayBuffer=e.arrayBuffer,this.selections=[]}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(78),o=n.n(i),r=n(79);r.PDFViewer=o.a.PDFJS.PDFViewer,t.default={props:["arrayBuffer","setPdfSize"],data:function(){return{width:null}},computed:{styleObject:function(){return{width:this.width?this.width+"px":"auto"}}},watch:{arrayBuffer:function(){this.loadDocument()}},methods:{loadDocument:function(){var e=this;console.log("new document"),r.getDocument(this.arrayBuffer).then(function(t){t.getPage(1).then(function(n){var i=n.getViewport(1);e.setPdfSize(i.width,i.height),e.width=i.width,e.pdfViewer.setDocument(t).then(function(){window.scrollTo(0,0)})})})}},mounted:function(){var e=this,t=this.$refs["pdf-container"];this.pdfViewer=new r.PDFViewer({container:t}),t.addEventListener("pagesinit",function(){e.pdfViewer.currentScaleValue="page-width"}),this.loadDocument()}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={props:["selections","batchUpdateSelections","originalFilename","dimensions"],data:function(){return{uzn:null,editing:!1}},computed:{downloadable:function(){var e=new Blob([this.uzn],{type:"octet/stream"});return window.URL.createObjectURL(e)},filename:function(){return this.originalFilename.replace(/(.*)\..*/,"$1.uzn")}},mounted:function(){this.redrawUzn()},watch:{selections:function(){this.redrawUzn()}},methods:{startEditing:function(){this.editing=!0},stopEditing:function(){this.editing=!1,this.redrawUzn()},redrawUzn:function(){var e=this;if(!this.editing){if(0===this.selections.length)return void(this.uzn="");var t=this.selections.map(function(t){var n=parseInt(e.dimensions.height-t.coordinates.top),i=parseInt(e.dimensions.height-t.coordinates.top-t.coordinates.height),o=[t.coordinates.left,Math.max(n,i),t.coordinates.left+t.coordinates.width,Math.min(n,i)].join(","),r="LTPage[pageid=\\'"+t.coordinates.page+"\\'] LTTextLineHorizontal:overlaps_bbox(\""+o+'")';return"\t('"+t.name+"', '"+r+"')"}),n=t.join(",\n");this.uzn="pdf = pdfquery.PDFQuery('"+this.originalFilename+"')\n\npdf.extract([\n\t('with_formatter', 'text'),\n"+n+"\n])"}},changed:function(e){var t=this;console.log("CHANGED");var n=0,i=this.uzn.split("\n").map(function(e){var i=e.match(/\('(.*)',.*pageid=\\'(\d+)\\'.*bbox\("(\d+),(\d+),(\d+),(\d+)"\)/);try{var o=t.selections[n];return o.coordinates.left=parseInt(i[3]),o.coordinates.top=t.dimensions.height-parseInt(i[4]),o.coordinates.width=parseInt(i[5])-parseInt(i[3]),o.coordinates.height=Math.abs(parseInt(i[6])-parseInt(i[4])),o.name=i[1],o.page=i[2],n++,o}catch(e){return console.log(e),null}}).filter(function(e){return null!=e});this.batchUpdateSelections(i)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(39),o=n.n(i);t.default={props:["coordinates"],data:function(){return{text:null}},computed:{},watch:{coordinates:function(){this.highlightOverlaps()}},methods:{hasCoordinates:function(){var e=this.coordinates;return!!(e&&e.top&&e.left&&0!==e.height&&0!==e.width)},overlapping:function(){if(this.hasCoordinates()){var e=document.querySelectorAll('.page[data-page-number="1"] .textLayer div');return Array.prototype.filter.call(e,this._overlaps)}return[]},overlappingText:function(){return this.overlapping().map(function(e){return e.textContent}).join(" ")},highlightOverlaps:function(){this.unhighlight(),this.overlapping().forEach(this._highlight)},_highlight:function(e){-1===e.className.indexOf("selected-preview")&&(e.className+=" selected-preview")},unhighlight:function(e){var t=document.querySelectorAll(".selected-preview"),n=!0,i=!1,r=void 0;try{for(var a,s=o()(t);!(n=(a=s.next()).done);n=!0){var c=a.value;c.className=c.className.replace("selected-preview","")}}catch(e){i=!0,r=e}finally{try{!n&&s.return&&s.return()}finally{if(i)throw r}}},_overlaps:function(e){var t=this.coordinates;return!(e.offsetLeft>t.left+t.width||e.offsetLeft+e.offsetWidtht.top+t.height||t.top>e.offsetTop+e.offsetHeight)},_sorted:function(e,t){return e.offsetTop===t.offsetTop?e.offsetLeft0?n("div",{staticClass:"zone-viewer"},[n("h2",[e._v("Your zone file")]),e._v(" "),e._m(0),e._v(" "),n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.uzn,expression:"uzn"}],ref:"textarea",domProps:{value:e.uzn},on:{keyup:e.changed,blur:e.stopEditing,focus:e.startEditing,input:function(t){t.target.composing||(e.uzn=t.target.value)}}}),e._v(" "),n("a",{attrs:{href:e.downloadable,download:e.filename}},[e._v("Download .uzn file")])]):e._e()},staticRenderFns:[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[n("strong",[e._v("Edit the code below")]),e._v(" and it'll update on the right!")])}]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"selection-box",style:e.styleObject},[n("span",[e._v(e._s(e.name))])])},staticRenderFns:[]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement;return(e._self._c||t)("div",{staticClass:"preview"},[e._v("\n"+e._s(e.text)+"\n")])},staticRenderFns:[]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.selections.length>0?n("div",{staticClass:"pdf-zone-viewer"},[n("h2",[e._v("Your extraction code")]),e._v(" "),e._m(0),e._v(" "),n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.uzn,expression:"uzn"}],ref:"textarea",domProps:{value:e.uzn},on:{keyup:e.changed,blur:e.stopEditing,focus:e.startEditing,input:function(t){t.target.composing||(e.uzn=t.target.value)}}}),e._v(" "),e._m(1)]):e._e()},staticRenderFns:[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[n("strong",[e._v("Edit the variable names and numbers below")]),e._v(" and you'll see it update to the right!")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[e._v("This code uses "),n("a",{attrs:{href:"https://github.com/jcushman/pdfquery",target:"_blank"}},[e._v("pdfquery")]),e._v(". You can just cut and paste if you want, but if you read the documentation it'll save you a lot of time.")])}]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.name?n("h3",[e._v("\n Currently working on: "),n("span",{staticClass:"filename"},[e._v(e._s(e.name))]),e._v(" "),n("span",{staticClass:"filetype"},[e._v(e._s(e.arrayBuffer?"PDF":"image"))])]):e._e(),e._v(" "),n("p",[e._v("If you want to zoom in/out, you'll need to use your browser zoom for the moment.")]),e._v(" "),e.src||e.arrayBuffer?n("div",{ref:"selectionArea",staticClass:"selection-area",on:{mousedown:e.start,mouseup:e.end,mousemove:e.drag}},[e.src?n("img",{attrs:{src:e.src}}):e._e(),e._v(" "),e.arrayBuffer?n("PDF",{attrs:{setPdfSize:e.setPdfSize,arrayBuffer:e.arrayBuffer}}):e._e(),e._v(" "),e.arrayBuffer?n("SelectionPreview",{attrs:{coordinates:e.coordinates}}):e._e(),e._v(" "),n("AreaSelect",{ref:"activeSelector",attrs:{coordinates:e.coordinates,color:"rgb(0,255,0)",active:"true"}}),e._v(" "),e._l(e.selections,function(e){return n("AreaSelect",{key:e.id,attrs:{color:e.color,coordinates:e.coordinates,name:e.name}})})],2):e._e()])},staticRenderFns:[]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("router-view")],1)},staticRenderFns:[]}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"editor"},[n("div",{staticClass:"sidebar"},[n("h1",[e._v("Kull")]),e._v(" "),e._m(0),e._v(" "),e._m(1),e._v(" "),n("Uploader",{attrs:{notify:e.newFile}}),e._v(" "),e.name?n("p",[n("strong",[e._v("Click and drag on the image to the right")]),e._v(" to form selection areas.")]):e._e(),e._v(" "),e.src?n("ZoneViewer",{staticClass:"zone-viewer",attrs:{selections:e.selections,batchUpdateSelections:e.batchUpdateSelections,originalFilename:e.name}}):e._e(),e._v(" "),e.arrayBuffer?n("PDFZoneViewer",{staticClass:"zone-viewer",attrs:{dimensions:e.pdfDimensions,selections:e.selections,batchUpdateSelections:e.batchUpdateSelections,originalFilename:e.name}}):e._e()],1),e._v(" "),n("div",{staticClass:"content"},[n("Annotator",{attrs:{src:e.src,setPdfSize:e.setPdfSize,arrayBuffer:e.arrayBuffer,name:e.name,selections:e.selections,addSelection:e.addSelection}})],1)])},staticRenderFns:[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[n("strong",[e._v("A tool to interactively select text regions of PDFs and images.")]),e._v(" Use with "),n("a",{attrs:{href:"https://github.com/jcushman/pdfquery"}},[e._v("PDFQuery")]),e._v(" (Python/PDF) or to make UZN/OCR zone files for "),n("a",{attrs:{href:"https://github.com/tesseract-ocr/tesseract"}},[e._v("tesseract")]),e._v(" (image-to-text).")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[e._v("More details (maybe) at "),n("a",{attrs:{href:"https://github.com/jsoma/kull"}},[e._v("https://github.com/jsoma/kull")]),e._v(".")])}]}}]),[29]); 2 | //# sourceMappingURL=app.4df998011aada0dee28f.js.map -------------------------------------------------------------------------------- /docs/static/js/app.4df998011aada0dee28f.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///static/js/app.4df998011aada0dee28f.js","webpack:///./src/router/index.js","webpack:///./src/App.vue?fc6a","webpack:///./src/main.js","webpack:///App.vue","webpack:///Annotator.vue","webpack:///AreaSelect.vue","webpack:///Editor.vue","webpack:///PDF.vue","webpack:///PDFZoneViewer.vue","webpack:///SelectionPreview.vue","webpack:///Uploader.vue","webpack:///ZoneViewer.vue","webpack:///./src/components/Annotator.vue?e227","webpack:///./src/components/AreaSelect.vue?34de","webpack:///./src/components/Editor.vue?898c","webpack:///./src/components/PDF.vue?2841","webpack:///./src/components/PDFZoneViewer.vue?2bc0","webpack:///./src/components/SelectionPreview.vue?6c13","webpack:///./src/components/Uploader.vue?b757","webpack:///./src/components/ZoneViewer.vue?5ceb","webpack:///./src/components/Uploader.vue?9d66","webpack:///./src/components/PDF.vue?4804","webpack:///./src/components/ZoneViewer.vue?7733","webpack:///./src/components/AreaSelect.vue?b380","webpack:///./src/components/SelectionPreview.vue?fa5c","webpack:///./src/components/PDFZoneViewer.vue?7eec","webpack:///./src/components/Annotator.vue?b780","webpack:///./src/App.vue?a0f9","webpack:///./src/components/Editor.vue?e241"],"names":["webpackJsonp","Array","concat","module","__webpack_exports__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0_vue__","__WEBPACK_IMPORTED_MODULE_1_vue_router__","__WEBPACK_IMPORTED_MODULE_2__components_Editor__","__WEBPACK_IMPORTED_MODULE_2__components_Editor___default","n","use","routes","path","name","component","a","exports","injectStyle","ssrContext","Component","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_1__App__","__WEBPACK_IMPORTED_MODULE_1__App___default","__WEBPACK_IMPORTED_MODULE_2__router__","config","productionTip","el","router","template","components","App","__WEBPACK_IMPORTED_MODULE_0__components_AreaSelect__","__WEBPACK_IMPORTED_MODULE_0__components_AreaSelect___default","__WEBPACK_IMPORTED_MODULE_1__components_PDF__","__WEBPACK_IMPORTED_MODULE_1__components_PDF___default","__WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview__","__WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview___default","AreaSelect","PDF","SelectionPreview","props","data","down","coords","xa","ya","xb","yb","pageNumber","pageOffset","top","left","computed","coordinates","Math","min","this","width","abs","height","page","methods","reset","start","event","parseInt","target","getAttribute","offsetTop","offsetLeft","offsetX","offsetY","end","stopPropagation","preventDefault","addSelection","drag","styleObject","display","border","color","background","replace","__WEBPACK_IMPORTED_MODULE_0__components_Uploader__","__WEBPACK_IMPORTED_MODULE_0__components_Uploader___default","__WEBPACK_IMPORTED_MODULE_1__components_Annotator__","__WEBPACK_IMPORTED_MODULE_1__components_Annotator___default","__WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer__","__WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer___default","__WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer__","__WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer___default","__WEBPACK_IMPORTED_MODULE_4_randomcolor__","__WEBPACK_IMPORTED_MODULE_4_randomcolor___default","Uploader","Annotator","ZoneViewer","PDFZoneViewer","src","arrayBuffer","selections","pdfDimensions","batchUpdateSelections","setPdfSize","push","id","Date","format","length","newFile","__WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js__","__WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js___default","PDFJS","PDFViewer","watch","loadDocument","_this","console","log","getDocument","then","pdf","getPage","viewport","getViewport","pdfViewer","setDocument","window","scrollTo","mounted","_this2","container","$refs","addEventListener","currentScaleValue","uzn","editing","downloadable","blob","Blob","type","URL","createObjectURL","filename","originalFilename","redrawUzn","startEditing","stopEditing","lines","map","s","y0","dimensions","y1","bbox","max","join","query","pretty","changed","index","split","line","elements","match","selection","err","filter","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default","text","highlightOverlaps","hasCoordinates","overlapping","allText","document","querySelectorAll","prototype","call","_overlaps","overlappingText","element","textContent","unhighlight","forEach","_highlight","className","indexOf","highlighted","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","next","done","h","return","offsetWidth","offsetHeight","_sorted","b","notify","Function","require","processReaderImage","readerData","result","processReaderPDF","getFile","fileList","file","reader","FileReader","readAsDataURL","_reader","readAsArrayBuffer","alert","selected","files","drop","dataTransfer","dragover","dropEffect","render","_vm","_h","$createElement","_c","_self","attrs","on","_v","_m","change","staticRenderFns","for","ref","staticClass","style","directives","rawName","expression","domProps","keyup","blur","focus","input","$event","composing","href","download","_e","_s","mousedown","mouseup","mousemove","active","_l","key"],"mappings":"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","file":"static/js/app.4df998011aada0dee28f.js","sourcesContent":["webpackJsonp([2],Array(26).concat([\n/* 26 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vue_router__ = __webpack_require__(98);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_Editor__ = __webpack_require__(83);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_Editor___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__components_Editor__);\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].use(__WEBPACK_IMPORTED_MODULE_1_vue_router__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (new __WEBPACK_IMPORTED_MODULE_1_vue_router__[\"a\" /* default */]({\n routes: [{\n path: '/',\n name: 'Editor',\n component: __WEBPACK_IMPORTED_MODULE_2__components_Editor___default.a\n }]\n}));\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(76)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(30),\n /* template */\n __webpack_require__(96),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 28 */,\n/* 29 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App__ = __webpack_require__(27);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__App__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__router__ = __webpack_require__(26);\n// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].config.productionTip = false;\n\n/* eslint-disable no-new */\nnew __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */]({\n el: '#app',\n router: __WEBPACK_IMPORTED_MODULE_2__router__[\"a\" /* default */],\n template: '',\n components: { App: __WEBPACK_IMPORTED_MODULE_1__App___default.a }\n});\n\n/***/ }),\n/* 30 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'app'\n});\n\n/***/ }),\n/* 31 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_AreaSelect__ = __webpack_require__(82);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_AreaSelect___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__components_AreaSelect__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_PDF__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_PDF___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__components_PDF__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview__ = __webpack_require__(86);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Annotator',\n components: {\n AreaSelect: __WEBPACK_IMPORTED_MODULE_0__components_AreaSelect___default.a,\n PDF: __WEBPACK_IMPORTED_MODULE_1__components_PDF___default.a,\n SelectionPreview: __WEBPACK_IMPORTED_MODULE_2__components_SelectionPreview___default.a\n },\n props: ['src', 'name', 'selections', 'addSelection', 'arrayBuffer', 'setPdfSize'],\n data: function data() {\n return {\n down: false,\n coords: {\n xa: null,\n ya: null,\n xb: null,\n yb: null\n },\n pageNumber: 1,\n pageOffset: {\n top: 0,\n left: 0\n }\n };\n },\n\n computed: {\n coordinates: function coordinates() {\n return {\n left: Math.min(this.coords.xa, this.coords.xb),\n top: Math.min(this.coords.ya, this.coords.yb),\n width: Math.abs(this.coords.xa - this.coords.xb),\n height: Math.abs(this.coords.ya - this.coords.yb),\n page: this.pageNumber,\n pageOffset: {\n top: this.pageOffset.top,\n left: this.pageOffset.left\n }\n };\n }\n },\n methods: {\n reset: function reset() {\n this.coords.xa = null;\n this.coords.ya = null;\n this.coords.xb = null;\n this.coords.yb = null;\n },\n start: function start(event) {\n // event.stopPropagation()\n // event.preventDefault()\n this.down = true;\n\n this.pageNumber = parseInt(event.target.getAttribute('data-page-number') || 1);\n this.pageOffset.top = event.target.offsetTop;\n this.pageOffset.left = event.target.offsetLeft;\n this.coords.xa = event.offsetX;\n this.coords.ya = event.offsetY;\n this.coords.xb = event.offsetX;\n this.coords.yb = event.offsetY;\n },\n end: function end(event) {\n event.stopPropagation();\n event.preventDefault();\n this.down = false;\n this.addSelection(this.coordinates);\n this.reset();\n },\n drag: function drag(event) {\n event.stopPropagation();\n event.preventDefault();\n if (this.down) {\n this.coords.xb = event.offsetX;\n this.coords.yb = event.offsetY;\n }\n }\n }\n});\n\n/***/ }),\n/* 32 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'area-select',\n props: ['coordinates', 'color', 'name', 'active'],\n computed: {\n styleObject: function styleObject() {\n if (this.height === 0 || this.width === 0) {\n return {\n display: 'none'\n };\n }\n return {\n left: this.coordinates.left + this.coordinates.pageOffset.left + 'px',\n top: this.coordinates.top + this.coordinates.pageOffset.top + 'px',\n width: this.coordinates.width + 'px',\n height: this.coordinates.height + 'px',\n border: 'solid ' + this.color + ' 1px',\n background: this.color.replace(/\\)$/, ', 0.05)').replace('rgb(', 'rgba(')\n };\n }\n }\n});\n\n/***/ }),\n/* 33 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_Uploader__ = __webpack_require__(87);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_Uploader___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__components_Uploader__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_Annotator__ = __webpack_require__(81);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_Annotator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__components_Annotator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer__ = __webpack_require__(88);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_randomcolor__ = __webpack_require__(80);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_randomcolor___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_randomcolor__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'editor',\n components: {\n Uploader: __WEBPACK_IMPORTED_MODULE_0__components_Uploader___default.a,\n Annotator: __WEBPACK_IMPORTED_MODULE_1__components_Annotator___default.a,\n ZoneViewer: __WEBPACK_IMPORTED_MODULE_2__components_ZoneViewer___default.a,\n PDFZoneViewer: __WEBPACK_IMPORTED_MODULE_3__components_PDFZoneViewer___default.a\n },\n data: function data() {\n return {\n src: null,\n arrayBuffer: null,\n name: '',\n selections: [],\n pdfDimensions: {\n height: 0,\n width: 0\n }\n };\n },\n\n methods: {\n batchUpdateSelections: function batchUpdateSelections(selections) {\n this.selections = selections;\n },\n setPdfSize: function setPdfSize(width, height) {\n this.pdfDimensions = {\n width: width,\n height: height\n };\n },\n addSelection: function addSelection(coords) {\n if (coords.height === 0 || coords.width === 0) {\n return;\n }\n\n this.selections.push({\n id: +new Date(),\n coordinates: {\n top: coords.top,\n left: coords.left,\n height: coords.height,\n width: coords.width,\n page: coords.page,\n pageOffset: coords.pageOffset\n },\n color: __WEBPACK_IMPORTED_MODULE_4_randomcolor___default()({ format: 'rgb' }),\n name: 'Unnamed' + this.selections.length\n });\n },\n newFile: function newFile(data) {\n this.name = data.name;\n this.src = data.src;\n this.arrayBuffer = data.arrayBuffer;\n this.selections = [];\n }\n }\n});\n\n/***/ }),\n/* 34 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js__ = __webpack_require__(78);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js__);\n//\n//\n//\n//\n//\n//\n//\n//\n\nvar PDFJS = __webpack_require__(79);\n\n\nPDFJS.PDFViewer = __WEBPACK_IMPORTED_MODULE_0__node_modules_pdfjs_dist_web_pdf_viewer_js___default.a.PDFJS.PDFViewer;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['arrayBuffer', 'setPdfSize'],\n data: function data() {\n return {\n width: null\n };\n },\n\n computed: {\n styleObject: function styleObject() {\n return {\n width: this.width ? this.width + 'px' : 'auto'\n };\n }\n },\n watch: {\n arrayBuffer: function arrayBuffer() {\n this.loadDocument();\n }\n },\n methods: {\n loadDocument: function loadDocument() {\n var _this = this;\n\n console.log('new document');\n PDFJS.getDocument(this.arrayBuffer).then(function (pdf) {\n pdf.getPage(1).then(function (page) {\n var viewport = page.getViewport(1);\n _this.setPdfSize(viewport.width, viewport.height);\n _this.width = viewport.width;\n _this.pdfViewer.setDocument(pdf).then(function () {\n window.scrollTo(0, 0);\n });\n });\n });\n }\n },\n mounted: function mounted() {\n var _this2 = this;\n\n var container = this.$refs['pdf-container'];\n\n this.pdfViewer = new PDFJS.PDFViewer({\n container: container\n });\n\n container.addEventListener('pagesinit', function () {\n _this2.pdfViewer.currentScaleValue = 'page-width';\n });\n this.loadDocument();\n }\n});\n\n/***/ }),\n/* 35 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['selections', 'batchUpdateSelections', 'originalFilename', 'dimensions'],\n data: function data() {\n return {\n uzn: null,\n editing: false\n };\n },\n\n computed: {\n downloadable: function downloadable() {\n var blob = new Blob([this.uzn], { type: 'octet/stream' });\n var url = window.URL.createObjectURL(blob);\n return url;\n },\n filename: function filename() {\n return this.originalFilename.replace(/(.*)\\..*/, '$1.uzn');\n }\n },\n mounted: function mounted() {\n this.redrawUzn();\n },\n\n watch: {\n selections: function selections() {\n this.redrawUzn();\n }\n },\n methods: {\n startEditing: function startEditing() {\n this.editing = true;\n },\n stopEditing: function stopEditing() {\n this.editing = false;\n this.redrawUzn();\n },\n redrawUzn: function redrawUzn() {\n var _this = this;\n\n if (this.editing) {\n return;\n }\n if (this.selections.length === 0) {\n this.uzn = '';\n return;\n }\n var lines = this.selections.map(function (s) {\n var y0 = parseInt(_this.dimensions.height - s.coordinates.top);\n var y1 = parseInt(_this.dimensions.height - s.coordinates.top - s.coordinates.height);\n var bbox = [s.coordinates.left, Math.max(y0, y1), s.coordinates.left + s.coordinates.width, Math.min(y0, y1)].join(',');\n var query = 'LTPage[pageid=\\\\\\'' + s.coordinates.page + '\\\\\\'] LTTextLineHorizontal:overlaps_bbox(\"' + bbox + '\")';\n return '\\t(\\'' + s.name + '\\', \\'' + query + '\\')';\n });\n\n var pretty = lines.join(',\\n');\n this.uzn = 'pdf = pdfquery.PDFQuery(\\'' + this.originalFilename + '\\')\\n\\npdf.extract([\\n\\t(\\'with_formatter\\', \\'text\\'),\\n' + pretty + '\\n])';\n },\n changed: function changed(event) {\n var _this2 = this;\n\n console.log('CHANGED');\n var index = 0;\n var selections = this.uzn.split('\\n').map(function (line) {\n var elements = line.match(/\\('(.*)',.*pageid=\\\\'(\\d+)\\\\'.*bbox\\(\"(\\d+),(\\d+),(\\d+),(\\d+)\"\\)/);\n try {\n // 1 - name\n // 2 - page\n // 3 - left\n // 4 - top\n // 5 - right\n // 6 - bottom (?)\n var selection = _this2.selections[index];\n selection.coordinates.left = parseInt(elements[3]);\n selection.coordinates.top = _this2.dimensions.height - parseInt(elements[4]);\n selection.coordinates.width = parseInt(elements[5]) - parseInt(elements[3]);\n selection.coordinates.height = Math.abs(parseInt(elements[6]) - parseInt(elements[4]));\n selection.name = elements[1];\n selection.page = elements[2];\n index++;\n return selection;\n } catch (err) {\n console.log(err);\n return null;\n }\n }).filter(function (selection) {\n return selection != null;\n });\n\n this.batchUpdateSelections(selections);\n }\n }\n});\n\n/***/ }),\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__);\n\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['coordinates'],\n data: function data() {\n return {\n text: null\n };\n },\n\n computed: {},\n watch: {\n coordinates: function coordinates() {\n this.highlightOverlaps();\n // this.text = this.overlappingText()\n }\n },\n methods: {\n hasCoordinates: function hasCoordinates() {\n var coordinates = this.coordinates;\n if (!coordinates || !coordinates.top || !coordinates.left || coordinates.height === 0 || coordinates.width === 0) {\n return false;\n }\n return true;\n },\n overlapping: function overlapping() {\n if (this.hasCoordinates()) {\n var allText = document.querySelectorAll('.page[data-page-number=\"1\"] .textLayer div');\n return Array.prototype.filter.call(allText, this._overlaps);\n } else {\n return [];\n }\n },\n overlappingText: function overlappingText() {\n return this.overlapping().map(function (element) {\n return element.textContent;\n }).join(' ');\n },\n highlightOverlaps: function highlightOverlaps() {\n this.unhighlight();\n this.overlapping().forEach(this._highlight);\n },\n _highlight: function _highlight(element) {\n if (element.className.indexOf('selected-preview') === -1) {\n element.className += ' selected-preview';\n }\n },\n unhighlight: function unhighlight(element) {\n var highlighted = document.querySelectorAll('.selected-preview');\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(highlighted), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var h = _step.value;\n\n h;\n h.className = h.className.replace('selected-preview', '');\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n },\n _overlaps: function _overlaps(element) {\n var coordinates = this.coordinates;\n if (element.offsetLeft > coordinates.left + coordinates.width || element.offsetLeft + element.offsetWidth < coordinates.left) {\n return false;\n }\n if (element.offsetTop > coordinates.top + coordinates.height || coordinates.top > element.offsetTop + element.offsetHeight) {\n return false;\n }\n return true;\n },\n _sorted: function _sorted(a, b) {\n if (a.offsetTop === b.offsetTop) {\n return a.offsetLeft < b.offsetTop ? -1 : 1;\n }\n return a.offsetTop < b.offsetTop ? -1 : 1;\n }\n }\n});\n\n/***/ }),\n/* 37 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: {\n notify: {\n type: Function,\n require: true\n }\n },\n data: function data() {\n return {\n name: null\n };\n },\n\n methods: {\n processReaderImage: function processReaderImage(readerData) {\n this.notify({\n name: this.name,\n src: readerData.target.result\n });\n },\n processReaderPDF: function processReaderPDF(readerData) {\n this.notify({\n name: this.name,\n arrayBuffer: readerData.target.result\n });\n },\n getFile: function getFile(fileList) {\n var file = fileList[0];\n\n this.name = file.name;\n\n if (file.type.match('image.*')) {\n var reader = new FileReader();\n reader.addEventListener('load', this.processReaderImage, false);\n reader.readAsDataURL(file);\n } else if (file.type.match('.*pdf.*')) {\n var _reader = new FileReader();\n _reader.addEventListener('load', this.processReaderPDF, false);\n _reader.readAsArrayBuffer(file);\n } else {\n alert('Not a PDF or image file');\n }\n },\n selected: function selected(event) {\n this.getFile(event.target.files);\n },\n drop: function drop(event) {\n event.stopPropagation();\n event.preventDefault();\n this.getFile(event.dataTransfer.files);\n },\n dragover: function dragover(event) {\n event.stopPropagation();\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n }\n }\n});\n\n/***/ }),\n/* 38 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'zone-viewer',\n props: ['selections', 'batchUpdateSelections', 'originalFilename'],\n data: function data() {\n return {\n uzn: null,\n editing: false\n };\n },\n\n computed: {\n downloadable: function downloadable() {\n var blob = new Blob([this.uzn], { type: 'octet/stream' });\n var url = window.URL.createObjectURL(blob);\n return url;\n },\n filename: function filename() {\n return this.originalFilename.replace(/(.*)\\..*/, '$1.uzn');\n }\n },\n mounted: function mounted() {\n this.redrawUzn();\n },\n\n watch: {\n selections: function selections() {\n this.redrawUzn();\n }\n },\n methods: {\n startEditing: function startEditing() {\n this.editing = true;\n },\n stopEditing: function stopEditing() {\n this.editing = false;\n this.redrawUzn();\n },\n redrawUzn: function redrawUzn() {\n if (this.editing) {\n return;\n }\n var lines = this.selections.map(function (s) {\n return s.coordinates.left + ' ' + s.coordinates.top + ' ' + s.coordinates.width + ' ' + s.coordinates.height + ' ' + s.name;\n });\n\n this.uzn = lines.join('\\n');\n },\n changed: function changed(event) {\n var _this = this;\n\n var selections = this.uzn.split('\\n').map(function (line, index) {\n try {\n var elements = line.match(/(\\d+) (\\d+) (\\d+) (\\d+) (.*)/);\n var selection = _this.selections[index];\n selection.coordinates.left = parseInt(elements[1]);\n selection.coordinates.top = parseInt(elements[2]);\n selection.coordinates.width = parseInt(elements[3]);\n selection.coordinates.height = parseInt(elements[4]);\n selection.name = elements[5];\n return selection;\n } catch (err) {\n return null;\n }\n }).filter(function (selection) {\n return selection != null;\n });\n console.log('updating with', selections);\n this.batchUpdateSelections(selections);\n }\n }\n});\n\n/***/ }),\n/* 39 */,\n/* 40 */,\n/* 41 */,\n/* 42 */,\n/* 43 */,\n/* 44 */,\n/* 45 */,\n/* 46 */,\n/* 47 */,\n/* 48 */,\n/* 49 */,\n/* 50 */,\n/* 51 */,\n/* 52 */,\n/* 53 */,\n/* 54 */,\n/* 55 */,\n/* 56 */,\n/* 57 */,\n/* 58 */,\n/* 59 */,\n/* 60 */,\n/* 61 */,\n/* 62 */,\n/* 63 */,\n/* 64 */,\n/* 65 */,\n/* 66 */,\n/* 67 */,\n/* 68 */,\n/* 69 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 78 */,\n/* 79 */,\n/* 80 */,\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(75)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(31),\n /* template */\n __webpack_require__(95),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-557e482b\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(72)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(32),\n /* template */\n __webpack_require__(92),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-1849b72a\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(77)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(33),\n /* template */\n __webpack_require__(97),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(70)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(34),\n /* template */\n __webpack_require__(90),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(74)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(35),\n /* template */\n __webpack_require__(94),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-3b727782\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(73)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(36),\n /* template */\n __webpack_require__(93),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(69)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(37),\n /* template */\n __webpack_require__(89),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-0043a522\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction injectStyle (ssrContext) {\n __webpack_require__(71)\n}\nvar Component = __webpack_require__(0)(\n /* script */\n __webpack_require__(38),\n /* template */\n __webpack_require__(91),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [_c('div', {\n attrs: {\n \"id\": \"dragover\"\n },\n on: {\n \"dragover\": _vm.dragover,\n \"drop\": _vm.drop\n }\n }, [_c('h3', [_vm._v(\"Drag & drop your file here\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('p', [_vm._v(\"accepts images and PDFs\")]), _vm._v(\" \"), _c('input', {\n attrs: {\n \"type\": \"file\",\n \"id\": \"file\",\n \"name\": \"file\"\n },\n on: {\n \"change\": _vm.selected\n }\n })])])\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"or \"), _c('label', {\n attrs: {\n \"for\": \"file\"\n }\n }, [_vm._v(\"click to browse\")])])\n}]}\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [_c('div', {\n ref: \"pdf-container\",\n staticClass: \"pdf-container\",\n style: (_vm.styleObject)\n }, [_c('div', {\n staticClass: \"pdfViewer\"\n })])])\n},staticRenderFns: []}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return (_vm.selections.length > 0) ? _c('div', {\n staticClass: \"zone-viewer\"\n }, [_c('h2', [_vm._v(\"Your zone file\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('textarea', {\n directives: [{\n name: \"model\",\n rawName: \"v-model\",\n value: (_vm.uzn),\n expression: \"uzn\"\n }],\n ref: \"textarea\",\n domProps: {\n \"value\": (_vm.uzn)\n },\n on: {\n \"keyup\": _vm.changed,\n \"blur\": _vm.stopEditing,\n \"focus\": _vm.startEditing,\n \"input\": function($event) {\n if ($event.target.composing) { return; }\n _vm.uzn = $event.target.value\n }\n }\n }), _vm._v(\" \"), _c('a', {\n attrs: {\n \"href\": _vm.downloadable,\n \"download\": _vm.filename\n }\n }, [_vm._v(\"Download .uzn file\")])]) : _vm._e()\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"Edit the code below\")]), _vm._v(\" and it'll update on the right!\")])\n}]}\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"selection-box\",\n style: (_vm.styleObject)\n }, [_c('span', [_vm._v(_vm._s(_vm.name))])])\n},staticRenderFns: []}\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"preview\"\n }, [_vm._v(\"\\n\" + _vm._s(_vm.text) + \"\\n\")])\n},staticRenderFns: []}\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return (_vm.selections.length > 0) ? _c('div', {\n staticClass: \"pdf-zone-viewer\"\n }, [_c('h2', [_vm._v(\"Your extraction code\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('textarea', {\n directives: [{\n name: \"model\",\n rawName: \"v-model\",\n value: (_vm.uzn),\n expression: \"uzn\"\n }],\n ref: \"textarea\",\n domProps: {\n \"value\": (_vm.uzn)\n },\n on: {\n \"keyup\": _vm.changed,\n \"blur\": _vm.stopEditing,\n \"focus\": _vm.startEditing,\n \"input\": function($event) {\n if ($event.target.composing) { return; }\n _vm.uzn = $event.target.value\n }\n }\n }), _vm._v(\" \"), _vm._m(1)]) : _vm._e()\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"Edit the variable names and numbers below\")]), _vm._v(\" and you'll see it update to the right!\")])\n},function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"This code uses \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jcushman/pdfquery\",\n \"target\": \"_blank\"\n }\n }, [_vm._v(\"pdfquery\")]), _vm._v(\". You can just cut and paste if you want, but if you read the documentation it'll save you a lot of time.\")])\n}]}\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [(_vm.name) ? _c('h3', [_vm._v(\"\\n Currently working on: \"), _c('span', {\n staticClass: \"filename\"\n }, [_vm._v(_vm._s(_vm.name))]), _vm._v(\" \"), _c('span', {\n staticClass: \"filetype\"\n }, [_vm._v(_vm._s(_vm.arrayBuffer ? \"PDF\" : \"image\"))])]) : _vm._e(), _vm._v(\" \"), _c('p', [_vm._v(\"If you want to zoom in/out, you'll need to use your browser zoom for the moment.\")]), _vm._v(\" \"), (_vm.src || _vm.arrayBuffer) ? _c('div', {\n ref: \"selectionArea\",\n staticClass: \"selection-area\",\n on: {\n \"mousedown\": _vm.start,\n \"mouseup\": _vm.end,\n \"mousemove\": _vm.drag\n }\n }, [(_vm.src) ? _c('img', {\n attrs: {\n \"src\": _vm.src\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('PDF', {\n attrs: {\n \"setPdfSize\": _vm.setPdfSize,\n \"arrayBuffer\": _vm.arrayBuffer\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('SelectionPreview', {\n attrs: {\n \"coordinates\": _vm.coordinates\n }\n }) : _vm._e(), _vm._v(\" \"), _c('AreaSelect', {\n ref: \"activeSelector\",\n attrs: {\n \"coordinates\": _vm.coordinates,\n \"color\": \"rgb(0,255,0)\",\n \"active\": \"true\"\n }\n }), _vm._v(\" \"), _vm._l((_vm.selections), function(selection) {\n return _c('AreaSelect', {\n key: selection.id,\n attrs: {\n \"color\": selection.color,\n \"coordinates\": selection.coordinates,\n \"name\": selection.name\n }\n })\n })], 2) : _vm._e()])\n},staticRenderFns: []}\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n attrs: {\n \"id\": \"app\"\n }\n }, [_c('router-view')], 1)\n},staticRenderFns: []}\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"editor\"\n }, [_c('div', {\n staticClass: \"sidebar\"\n }, [_c('h1', [_vm._v(\"Kull\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _vm._m(1), _vm._v(\" \"), _c('Uploader', {\n attrs: {\n \"notify\": _vm.newFile\n }\n }), _vm._v(\" \"), (_vm.name) ? _c('p', [_c('strong', [_vm._v(\"Click and drag on the image to the right\")]), _vm._v(\" to form selection areas.\")]) : _vm._e(), _vm._v(\" \"), (_vm.src) ? _c('ZoneViewer', {\n staticClass: \"zone-viewer\",\n attrs: {\n \"selections\": _vm.selections,\n \"batchUpdateSelections\": _vm.batchUpdateSelections,\n \"originalFilename\": _vm.name\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('PDFZoneViewer', {\n staticClass: \"zone-viewer\",\n attrs: {\n \"dimensions\": _vm.pdfDimensions,\n \"selections\": _vm.selections,\n \"batchUpdateSelections\": _vm.batchUpdateSelections,\n \"originalFilename\": _vm.name\n }\n }) : _vm._e()], 1), _vm._v(\" \"), _c('div', {\n staticClass: \"content\"\n }, [_c('Annotator', {\n attrs: {\n \"src\": _vm.src,\n \"setPdfSize\": _vm.setPdfSize,\n \"arrayBuffer\": _vm.arrayBuffer,\n \"name\": _vm.name,\n \"selections\": _vm.selections,\n \"addSelection\": _vm.addSelection\n }\n })], 1)])\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"A tool to interactively select text regions of PDFs and images.\")]), _vm._v(\" Use with \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jcushman/pdfquery\"\n }\n }, [_vm._v(\"PDFQuery\")]), _vm._v(\" (Python/PDF) or to make UZN/OCR zone files for \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/tesseract-ocr/tesseract\"\n }\n }, [_vm._v(\"tesseract\")]), _vm._v(\" (image-to-text).\")])\n},function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"More details (maybe) at \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jsoma/kull\"\n }\n }, [_vm._v(\"https://github.com/jsoma/kull\")]), _vm._v(\".\")])\n}]}\n\n/***/ })\n]),[29]);\n\n\n// WEBPACK FOOTER //\n// static/js/app.4df998011aada0dee28f.js","import Vue from 'vue'\nimport Router from 'vue-router'\nimport Editor from '@/components/Editor'\n\nVue.use(Router)\n\nexport default new Router({\n routes: [\n {\n path: '/',\n name: 'Editor',\n component: Editor\n }\n ]\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7eab3909\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar Component = require(\"!../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"),\n /* template */\n require(\"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7eab3909\\\"}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 27\n// module chunks = 2","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport router from './router'\n\nVue.config.productionTip = false\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n template: '',\n components: { App }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// App.vue?1b3acc9c","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// Annotator.vue?bc385484","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// AreaSelect.vue?179cb883","\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// Editor.vue?20cd80ae","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// PDF.vue?d61eb5ee","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// PDFZoneViewer.vue?0738e7c2","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// SelectionPreview.vue?efdd6072","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// Uploader.vue?1b8eb9cc","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ZoneViewer.vue?25cb24cc","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-557e482b\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Annotator.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Annotator.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-557e482b\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Annotator.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-557e482b\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Annotator.vue\n// module id = 81\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1849b72a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./AreaSelect.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./AreaSelect.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1849b72a\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./AreaSelect.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-1849b72a\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/AreaSelect.vue\n// module id = 82\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ac3441a4\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Editor.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Editor.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ac3441a4\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Editor.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Editor.vue\n// module id = 83\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-02009581\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./PDF.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./PDF.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-02009581\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./PDF.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/PDF.vue\n// module id = 84\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-3b727782\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./PDFZoneViewer.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./PDFZoneViewer.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b727782\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./PDFZoneViewer.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-3b727782\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/PDFZoneViewer.vue\n// module id = 85\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-206dc39d\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./SelectionPreview.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./SelectionPreview.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-206dc39d\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./SelectionPreview.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/SelectionPreview.vue\n// module id = 86\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-0043a522\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Uploader.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Uploader.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0043a522\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Uploader.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n \"data-v-0043a522\",\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Uploader.vue\n// module id = 87\n// module chunks = 2","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-067e719f\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./ZoneViewer.vue\")\n}\nvar Component = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./ZoneViewer.vue\"),\n /* template */\n require(\"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-067e719f\\\"}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./ZoneViewer.vue\"),\n /* styles */\n injectStyle,\n /* scopeId */\n null,\n /* moduleIdentifier (server only) */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/ZoneViewer.vue\n// module id = 88\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [_c('div', {\n attrs: {\n \"id\": \"dragover\"\n },\n on: {\n \"dragover\": _vm.dragover,\n \"drop\": _vm.drop\n }\n }, [_c('h3', [_vm._v(\"Drag & drop your file here\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('p', [_vm._v(\"accepts images and PDFs\")]), _vm._v(\" \"), _c('input', {\n attrs: {\n \"type\": \"file\",\n \"id\": \"file\",\n \"name\": \"file\"\n },\n on: {\n \"change\": _vm.selected\n }\n })])])\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"or \"), _c('label', {\n attrs: {\n \"for\": \"file\"\n }\n }, [_vm._v(\"click to browse\")])])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-0043a522\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/Uploader.vue\n// module id = 89\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [_c('div', {\n ref: \"pdf-container\",\n staticClass: \"pdf-container\",\n style: (_vm.styleObject)\n }, [_c('div', {\n staticClass: \"pdfViewer\"\n })])])\n},staticRenderFns: []}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-02009581\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/PDF.vue\n// module id = 90\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return (_vm.selections.length > 0) ? _c('div', {\n staticClass: \"zone-viewer\"\n }, [_c('h2', [_vm._v(\"Your zone file\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('textarea', {\n directives: [{\n name: \"model\",\n rawName: \"v-model\",\n value: (_vm.uzn),\n expression: \"uzn\"\n }],\n ref: \"textarea\",\n domProps: {\n \"value\": (_vm.uzn)\n },\n on: {\n \"keyup\": _vm.changed,\n \"blur\": _vm.stopEditing,\n \"focus\": _vm.startEditing,\n \"input\": function($event) {\n if ($event.target.composing) { return; }\n _vm.uzn = $event.target.value\n }\n }\n }), _vm._v(\" \"), _c('a', {\n attrs: {\n \"href\": _vm.downloadable,\n \"download\": _vm.filename\n }\n }, [_vm._v(\"Download .uzn file\")])]) : _vm._e()\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"Edit the code below\")]), _vm._v(\" and it'll update on the right!\")])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-067e719f\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/ZoneViewer.vue\n// module id = 91\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"selection-box\",\n style: (_vm.styleObject)\n }, [_c('span', [_vm._v(_vm._s(_vm.name))])])\n},staticRenderFns: []}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-1849b72a\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/AreaSelect.vue\n// module id = 92\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"preview\"\n }, [_vm._v(\"\\n\" + _vm._s(_vm.text) + \"\\n\")])\n},staticRenderFns: []}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-206dc39d\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/SelectionPreview.vue\n// module id = 93\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return (_vm.selections.length > 0) ? _c('div', {\n staticClass: \"pdf-zone-viewer\"\n }, [_c('h2', [_vm._v(\"Your extraction code\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('textarea', {\n directives: [{\n name: \"model\",\n rawName: \"v-model\",\n value: (_vm.uzn),\n expression: \"uzn\"\n }],\n ref: \"textarea\",\n domProps: {\n \"value\": (_vm.uzn)\n },\n on: {\n \"keyup\": _vm.changed,\n \"blur\": _vm.stopEditing,\n \"focus\": _vm.startEditing,\n \"input\": function($event) {\n if ($event.target.composing) { return; }\n _vm.uzn = $event.target.value\n }\n }\n }), _vm._v(\" \"), _vm._m(1)]) : _vm._e()\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"Edit the variable names and numbers below\")]), _vm._v(\" and you'll see it update to the right!\")])\n},function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"This code uses \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jcushman/pdfquery\",\n \"target\": \"_blank\"\n }\n }, [_vm._v(\"pdfquery\")]), _vm._v(\". You can just cut and paste if you want, but if you read the documentation it'll save you a lot of time.\")])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-3b727782\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/PDFZoneViewer.vue\n// module id = 94\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', [(_vm.name) ? _c('h3', [_vm._v(\"\\n Currently working on: \"), _c('span', {\n staticClass: \"filename\"\n }, [_vm._v(_vm._s(_vm.name))]), _vm._v(\" \"), _c('span', {\n staticClass: \"filetype\"\n }, [_vm._v(_vm._s(_vm.arrayBuffer ? \"PDF\" : \"image\"))])]) : _vm._e(), _vm._v(\" \"), _c('p', [_vm._v(\"If you want to zoom in/out, you'll need to use your browser zoom for the moment.\")]), _vm._v(\" \"), (_vm.src || _vm.arrayBuffer) ? _c('div', {\n ref: \"selectionArea\",\n staticClass: \"selection-area\",\n on: {\n \"mousedown\": _vm.start,\n \"mouseup\": _vm.end,\n \"mousemove\": _vm.drag\n }\n }, [(_vm.src) ? _c('img', {\n attrs: {\n \"src\": _vm.src\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('PDF', {\n attrs: {\n \"setPdfSize\": _vm.setPdfSize,\n \"arrayBuffer\": _vm.arrayBuffer\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('SelectionPreview', {\n attrs: {\n \"coordinates\": _vm.coordinates\n }\n }) : _vm._e(), _vm._v(\" \"), _c('AreaSelect', {\n ref: \"activeSelector\",\n attrs: {\n \"coordinates\": _vm.coordinates,\n \"color\": \"rgb(0,255,0)\",\n \"active\": \"true\"\n }\n }), _vm._v(\" \"), _vm._l((_vm.selections), function(selection) {\n return _c('AreaSelect', {\n key: selection.id,\n attrs: {\n \"color\": selection.color,\n \"coordinates\": selection.coordinates,\n \"name\": selection.name\n }\n })\n })], 2) : _vm._e()])\n},staticRenderFns: []}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-557e482b\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/Annotator.vue\n// module id = 95\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n attrs: {\n \"id\": \"app\"\n }\n }, [_c('router-view')], 1)\n},staticRenderFns: []}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-7eab3909\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 96\n// module chunks = 2","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"editor\"\n }, [_c('div', {\n staticClass: \"sidebar\"\n }, [_c('h1', [_vm._v(\"Kull\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _vm._m(1), _vm._v(\" \"), _c('Uploader', {\n attrs: {\n \"notify\": _vm.newFile\n }\n }), _vm._v(\" \"), (_vm.name) ? _c('p', [_c('strong', [_vm._v(\"Click and drag on the image to the right\")]), _vm._v(\" to form selection areas.\")]) : _vm._e(), _vm._v(\" \"), (_vm.src) ? _c('ZoneViewer', {\n staticClass: \"zone-viewer\",\n attrs: {\n \"selections\": _vm.selections,\n \"batchUpdateSelections\": _vm.batchUpdateSelections,\n \"originalFilename\": _vm.name\n }\n }) : _vm._e(), _vm._v(\" \"), (_vm.arrayBuffer) ? _c('PDFZoneViewer', {\n staticClass: \"zone-viewer\",\n attrs: {\n \"dimensions\": _vm.pdfDimensions,\n \"selections\": _vm.selections,\n \"batchUpdateSelections\": _vm.batchUpdateSelections,\n \"originalFilename\": _vm.name\n }\n }) : _vm._e()], 1), _vm._v(\" \"), _c('div', {\n staticClass: \"content\"\n }, [_c('Annotator', {\n attrs: {\n \"src\": _vm.src,\n \"setPdfSize\": _vm.setPdfSize,\n \"arrayBuffer\": _vm.arrayBuffer,\n \"name\": _vm.name,\n \"selections\": _vm.selections,\n \"addSelection\": _vm.addSelection\n }\n })], 1)])\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('strong', [_vm._v(\"A tool to interactively select text regions of PDFs and images.\")]), _vm._v(\" Use with \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jcushman/pdfquery\"\n }\n }, [_vm._v(\"PDFQuery\")]), _vm._v(\" (Python/PDF) or to make UZN/OCR zone files for \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/tesseract-ocr/tesseract\"\n }\n }, [_vm._v(\"tesseract\")]), _vm._v(\" (image-to-text).\")])\n},function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_vm._v(\"More details (maybe) at \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/jsoma/kull\"\n }\n }, [_vm._v(\"https://github.com/jsoma/kull\")]), _vm._v(\".\")])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler?{\"id\":\"data-v-ac3441a4\"}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/Editor.vue\n// module id = 97\n// module chunks = 2"],"sourceRoot":""} -------------------------------------------------------------------------------- /docs/static/js/manifest.ae8d1e482089407e08f1.js: -------------------------------------------------------------------------------- 1 | !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,a,c){for(var u,i,f,l=0,s=[];l 2 | 3 | 4 | 5 | Kull: A text region selection tool for images and PDFs 6 | 7 | 8 |
9 | 10 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kull", 3 | "version": "1.0.0", 4 | "description": "A tool to interactively select text regions of PDFs and images - use with PDFQuery (Python) / UZN files (OCR zone files)", 5 | "author": "Jonathan Soma ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "start": "node build/dev-server.js", 10 | "build": "node build/build.js", 11 | "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", 12 | "test": "npm run unit", 13 | "lint": "eslint --ext .js,.vue src test/unit/specs" 14 | }, 15 | "dependencies": { 16 | "pdfjs-dist": "^1.8.524", 17 | "randomcolor": "^0.5.3", 18 | "vue": "^2.3.3", 19 | "vue-router": "^2.3.1" 20 | }, 21 | "devDependencies": { 22 | "autoprefixer": "^6.7.2", 23 | "babel-core": "^6.22.1", 24 | "babel-eslint": "^7.1.1", 25 | "babel-loader": "^6.2.10", 26 | "babel-plugin-transform-runtime": "^6.22.0", 27 | "babel-preset-env": "^1.3.2", 28 | "babel-preset-stage-2": "^6.22.0", 29 | "babel-register": "^6.22.0", 30 | "chalk": "^1.1.3", 31 | "connect-history-api-fallback": "^1.3.0", 32 | "copy-webpack-plugin": "^4.0.1", 33 | "css-loader": "^0.28.0", 34 | "eslint": "^3.19.0", 35 | "eslint-friendly-formatter": "^2.0.7", 36 | "eslint-loader": "^1.7.1", 37 | "eslint-plugin-html": "^2.0.0", 38 | "eslint-config-standard": "^6.2.1", 39 | "eslint-plugin-promise": "^3.4.0", 40 | "eslint-plugin-standard": "^2.0.1", 41 | "eventsource-polyfill": "^0.9.6", 42 | "express": "^4.14.1", 43 | "extract-text-webpack-plugin": "^2.0.0", 44 | "file-loader": "^0.11.1", 45 | "friendly-errors-webpack-plugin": "^1.1.3", 46 | "html-webpack-plugin": "^2.28.0", 47 | "http-proxy-middleware": "^0.17.3", 48 | "webpack-bundle-analyzer": "^2.2.1", 49 | "cross-env": "^4.0.0", 50 | "karma": "^1.4.1", 51 | "karma-coverage": "^1.1.1", 52 | "karma-mocha": "^1.3.0", 53 | "karma-phantomjs-launcher": "^1.0.2", 54 | "karma-phantomjs-shim": "^1.4.0", 55 | "karma-sinon-chai": "^1.3.1", 56 | "karma-sourcemap-loader": "^0.3.7", 57 | "karma-spec-reporter": "0.0.30", 58 | "karma-webpack": "^2.0.2", 59 | "lolex": "^1.5.2", 60 | "mocha": "^3.2.0", 61 | "chai": "^3.5.0", 62 | "sinon": "^2.1.0", 63 | "sinon-chai": "^2.8.0", 64 | "inject-loader": "^3.0.0", 65 | "babel-plugin-istanbul": "^4.1.1", 66 | "phantomjs-prebuilt": "^2.1.14", 67 | "semver": "^5.3.0", 68 | "shelljs": "^0.7.6", 69 | "opn": "^4.0.2", 70 | "optimize-css-assets-webpack-plugin": "^1.3.0", 71 | "ora": "^1.2.0", 72 | "rimraf": "^2.6.0", 73 | "url-loader": "^0.5.8", 74 | "vue-loader": "^12.1.0", 75 | "vue-style-loader": "^3.0.1", 76 | "vue-template-compiler": "^2.3.3", 77 | "webpack": "^2.6.1", 78 | "webpack-dev-middleware": "^1.10.0", 79 | "webpack-hot-middleware": "^2.18.0", 80 | "webpack-merge": "^4.1.0" 81 | }, 82 | "engines": { 83 | "node": ">= 4.0.0", 84 | "npm": ">= 3.0.0" 85 | }, 86 | "browserslist": [ 87 | "> 1%", 88 | "last 2 versions", 89 | "not ie <= 8" 90 | ] 91 | } 92 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsoma/kull/c0231395e549f7a954faa6205dfca716114da76a/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/Annotator.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 105 | 106 | 127 | -------------------------------------------------------------------------------- /src/components/AreaSelect.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 30 | 31 | 48 | -------------------------------------------------------------------------------- /src/components/Editor.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 84 | 85 | 86 | 130 | -------------------------------------------------------------------------------- /src/components/PDF.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 63 | 64 | 362 | -------------------------------------------------------------------------------- /src/components/PDFZoneViewer.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 106 | 107 | 117 | -------------------------------------------------------------------------------- /src/components/SelectionPreview.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 77 | 78 | 94 | -------------------------------------------------------------------------------- /src/components/Uploader.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 71 | 72 | 96 | -------------------------------------------------------------------------------- /src/components/ZoneViewer.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 83 | 84 | 93 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | 7 | Vue.config.productionTip = false 8 | 9 | /* eslint-disable no-new */ 10 | new Vue({ 11 | el: '#app', 12 | router, 13 | template: '', 14 | components: { App } 15 | }) 16 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Editor from '@/components/Editor' 4 | 5 | Vue.use(Router) 6 | 7 | export default new Router({ 8 | routes: [ 9 | { 10 | path: '/', 11 | name: 'Editor', 12 | component: Editor 13 | } 14 | ] 15 | }) 16 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsoma/kull/c0231395e549f7a954faa6205dfca716114da76a/static/.gitkeep -------------------------------------------------------------------------------- /test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "globals": { 6 | "expect": true, 7 | "sinon": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /test/unit/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | Vue.config.productionTip = false 4 | 5 | // require all test files (files that ends with .spec.js) 6 | const testsContext = require.context('./specs', true, /\.spec$/) 7 | testsContext.keys().forEach(testsContext) 8 | 9 | // require all src files except main.js for coverage. 10 | // you can also change this to match only the subset of files that 11 | // you want coverage for. 12 | const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) 13 | srcContext.keys().forEach(srcContext) 14 | -------------------------------------------------------------------------------- /test/unit/karma.conf.js: -------------------------------------------------------------------------------- 1 | // This is a karma config file. For more details see 2 | // http://karma-runner.github.io/0.13/config/configuration-file.html 3 | // we are also using it with karma-webpack 4 | // https://github.com/webpack/karma-webpack 5 | 6 | var webpackConfig = require('../../build/webpack.test.conf') 7 | 8 | module.exports = function (config) { 9 | config.set({ 10 | // to run in additional browsers: 11 | // 1. install corresponding karma launcher 12 | // http://karma-runner.github.io/0.13/config/browsers.html 13 | // 2. add it to the `browsers` array below. 14 | browsers: ['PhantomJS'], 15 | frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'], 16 | reporters: ['spec', 'coverage'], 17 | files: ['./index.js'], 18 | preprocessors: { 19 | './index.js': ['webpack', 'sourcemap'] 20 | }, 21 | webpack: webpackConfig, 22 | webpackMiddleware: { 23 | noInfo: true 24 | }, 25 | coverageReporter: { 26 | dir: './coverage', 27 | reporters: [ 28 | { type: 'lcov', subdir: '.' }, 29 | { type: 'text-summary' } 30 | ] 31 | } 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /test/unit/specs/Hello.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Hello from '@/components/Hello' 3 | 4 | describe('Hello.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(Hello) 7 | const vm = new Constructor().$mount() 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .to.equal('Welcome to Your Vue.js App') 10 | }) 11 | }) 12 | --------------------------------------------------------------------------------