+
+ viewer
+
+
+open content(.txt):
+open annotation(.json):
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..9890a11
--- /dev/null
+++ b/main.js
@@ -0,0 +1,71 @@
+/**
+ * Created by yjh on 2016/10/8.
+ */
+System.register(['./node_modules/synyi-annotation-tool/src/Annotator'], function(exports_1, context_1) {
+ "use strict";
+ var __moduleName = context_1 && context_1.id;
+ var Annotator_1;
+ var categories;
+ function loadContentOfFile(file) {
+ var fr = new FileReader();
+ return new Promise(function (resolve) {
+ fr.onload = function () {
+ resolve(fr.result);
+ };
+ fr.readAsText(file, 'utf-8');
+ });
+ }
+ function run() {
+ document.querySelector('#con').innerHTML = '';
+ var contentInput = document.querySelector('input#content');
+ var annotationInput = document.querySelector('input#annotation');
+ Promise.all([loadContentOfFile(contentInput.files[0]), loadContentOfFile(annotationInput.files[0])])
+ .then(function (results) {
+ var ann = new Annotator_1.Annotator(document.querySelector('#con'));
+ var annotations = JSON.parse(results[1]);
+ var relations = [];
+ var labels = annotations['concepts'].map(function (concept) {
+ concept['relations'] = concept['relations'] || [];
+ concept['relations'].forEach(function (relation) {
+ if (relation['attribute_id'] != undefined) {
+ relations.push({
+ dst: concept['meta']['id'],
+ src: relation['attribute_id'],
+ text: relation['relation_type']
+ });
+ }
+ });
+ return {
+ 'category': Annotator_1.Categories[concept['meta']['category']],
+ 'pos': [concept['meta']['start_index'], concept['meta']['end_index'] - 1],
+ 'id': concept['meta']['id']
+ };
+ }).filter(function (x) { return !(x['category'] == undefined); });
+ ann.import(results[0], categories, labels, relations);
+ });
+ }
+ return {
+ setters:[
+ function (Annotator_1_1) {
+ Annotator_1 = Annotator_1_1;
+ }],
+ execute: function() {
+ categories = [
+ { id: 1, fill: 'rgb(174, 214, 241)', boader: 'rgb(93, 173, 226)', highlight: 'rgba(174, 214, 241,0.4)', text: "症状、表现", },
+ { id: 2, fill: 'rgb(169, 204, 227)', boader: 'rgb(84, 153, 199)', highlight: 'rgba(169, 204, 227,0.4)', text: "疾病", },
+ { id: 3, fill: 'rgb(210, 180, 222)', boader: 'rgb(165, 105, 189)', highlight: 'rgba(210, 180, 222,0.4)', text: "检查、评分", },
+ { id: 4, fill: 'rgb(215, 189, 226)', boader: 'rgb(175, 122, 197)', highlight: 'rgba(215, 189, 226,0.4)', text: "治疗", },
+ { id: 5, fill: 'rgb(245, 183, 177)', boader: 'rgb(236, 112, 99)', highlight: 'rgba(245, 183, 177,0.4)', text: "指标", },
+ { id: 6, fill: 'rgb(230, 176, 170)', boader: 'rgb(205, 97, 85)', highlight: 'rgba(230, 176, 170,0.4)', text: "药物", },
+ { id: 7, fill: 'rgb(237, 187, 153)', boader: 'rgb(245, 176, 65)', highlight: 'rgba(237, 187, 153,0.4)', text: "部位、方位", },
+ { id: 8, fill: 'rgb(245, 203, 167)', boader: 'rgb(244, 208, 63)', highlight: 'rgba(245, 203, 167,0.4)', text: "频率", },
+ { id: 9, fill: 'rgb(250, 215, 160)', boader: 'rgb(252, 220, 160)', highlight: 'rgba(250, 215, 160,0.4)', text: "值", },
+ { id: 10, fill: 'rgb(171, 235, 198)', boader: 'rgb(181, 222, 190)', highlight: 'rgba(171, 235, 198,0.4)', text: "症状变化", },
+ { id: 11, fill: 'rgb(169, 223, 191)', boader: 'rgb(175, 220, 190)', highlight: 'rgba(169, 223, 191,0.4)', text: "其他修饰词" },
+ { id: 12, fill: 'rgb(249, 231, 159)', boader: 'rgb(82, 190, 128)', highlight: 'rgba(249, 231, 159,0.4)', text: "时间", },
+ ];
+ document.querySelector('#run').addEventListener('click', function () { return run(); });
+ }
+ }
+});
+//# sourceMappingURL=main.js.map
\ No newline at end of file
diff --git a/main.js.map b/main.js.map
new file mode 100644
index 0000000..44db45b
--- /dev/null
+++ b/main.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/main.ts b/main.ts
new file mode 100644
index 0000000..0754d09
--- /dev/null
+++ b/main.ts
@@ -0,0 +1,58 @@
+/**
+ * Created by yjh on 2016/10/8.
+ */
+
+import {Annotator, Categories} from './node_modules/synyi-annotation-tool/src/Annotator'
+function loadContentOfFile(file: File) {
+ let fr = new FileReader();
+ return new Promise(resolve=> {
+ fr.onload = function () {
+ resolve(fr.result)
+ };
+ fr.readAsText(file, 'utf-8')
+ })
+}
+let categories=[
+ {id:1, fill: 'rgb(174, 214, 241)', boader: 'rgb(93, 173, 226)', highlight: 'rgba(174, 214, 241,0.4)', text: "症状、表现",},
+ {id:2, fill: 'rgb(169, 204, 227)', boader: 'rgb(84, 153, 199)', highlight: 'rgba(169, 204, 227,0.4)', text: "疾病",},
+ {id:3, fill: 'rgb(210, 180, 222)', boader: 'rgb(165, 105, 189)',highlight: 'rgba(210, 180, 222,0.4)', text: "检查、评分",},
+ {id:4, fill: 'rgb(215, 189, 226)', boader: 'rgb(175, 122, 197)',highlight: 'rgba(215, 189, 226,0.4)', text: "治疗",},
+ {id:5, fill: 'rgb(245, 183, 177)', boader: 'rgb(236, 112, 99)', highlight: 'rgba(245, 183, 177,0.4)', text: "指标",},
+ {id:6, fill: 'rgb(230, 176, 170)', boader: 'rgb(205, 97, 85)', highlight: 'rgba(230, 176, 170,0.4)', text: "药物",},
+ {id:7, fill: 'rgb(237, 187, 153)', boader: 'rgb(245, 176, 65)', highlight: 'rgba(237, 187, 153,0.4)', text: "部位、方位",},
+ {id:8, fill: 'rgb(245, 203, 167)', boader: 'rgb(244, 208, 63)', highlight: 'rgba(245, 203, 167,0.4)', text: "频率",},
+ {id:9, fill: 'rgb(250, 215, 160)', boader: 'rgb(252, 220, 160)', highlight: 'rgba(250, 215, 160,0.4)', text: "值",},
+ {id:10, fill: 'rgb(171, 235, 198)', boader: 'rgb(181, 222, 190)', highlight: 'rgba(171, 235, 198,0.4)', text: "症状变化",},
+ {id:11, fill: 'rgb(169, 223, 191)', boader: 'rgb(175, 220, 190)', highlight: 'rgba(169, 223, 191,0.4)', text: "其他修饰词"},
+ {id:12, fill: 'rgb(249, 231, 159)', boader: 'rgb(82, 190, 128)', highlight: 'rgba(249, 231, 159,0.4)', text: "时间",},
+];
+function run() {
+ document.querySelector('#con').innerHTML = '';
+ let contentInput: HTMLInputElement = document.querySelector('input#content') as HTMLInputElement;
+ let annotationInput: HTMLInputElement = document.querySelector('input#annotation') as HTMLInputElement;
+ Promise.all([loadContentOfFile(contentInput.files[0]), loadContentOfFile(annotationInput.files[0])])
+ .then(results=> {
+ let ann = new Annotator(document.querySelector('#con'));
+ let annotations = JSON.parse(results[1]);
+ let relations = [];
+ let labels = annotations['concepts'].map(concept=> {
+ concept['relations'] = concept['relations'] || [];
+ concept['relations'].forEach(relation=> {
+ if (relation['attribute_id'] != undefined) {
+ relations.push({
+ dst: concept['meta']['id'],
+ src: relation['attribute_id'],
+ text: relation['relation_type']
+ })
+ }
+ });
+ return {
+ 'category': Categories[concept['meta']['category']],
+ 'pos': [concept['meta']['start_index'], concept['meta']['end_index'] - 1],
+ 'id': concept['meta']['id']
+ }
+ }).filter(x=>!(x['category'] == undefined));
+ ann.import(results[0],categories, labels, relations)
+ })
+}
+document.querySelector('#run').addEventListener('click',()=>run());
\ No newline at end of file
diff --git a/node_modules/svgjs/.documentup.json b/node_modules/svgjs/.documentup.json
new file mode 100644
index 0000000..ccf71a6
--- /dev/null
+++ b/node_modules/svgjs/.documentup.json
@@ -0,0 +1,8 @@
+{
+ "twitter": [
+ "svg_js"
+ ],
+ "travis": false,
+ "issues": true,
+ "theme": "v1"
+}
\ No newline at end of file
diff --git a/node_modules/svgjs/.npmignore b/node_modules/svgjs/.npmignore
new file mode 100644
index 0000000..675a80c
--- /dev/null
+++ b/node_modules/svgjs/.npmignore
@@ -0,0 +1,10 @@
+.DS_Store
+.idea
+public
+site/
+bleed/
+docs/
+obsolete/
+test/
+src/index.js
+node_modules/
\ No newline at end of file
diff --git a/node_modules/svgjs/CHANGELOG.md b/node_modules/svgjs/CHANGELOG.md
new file mode 100644
index 0000000..22a84ee
--- /dev/null
+++ b/node_modules/svgjs/CHANGELOG.md
@@ -0,0 +1,248 @@
+# 3.0.0
+
+- make transform-methods relative as default (breaking change)
+- added `'random'` option and `randomize()` method to `SVG.Color` -> __TODO!__
+- added `enqueue()` method to `SVG.FX` -> __TODO!__
+- fixed a bug in clipping and masking where empty nodes persists after removal -> __TODO!__
+- fixed a bug in IE11 with `mouseenter` and `mouseleave` -> __TODO!__
+- added `precision()` method to round numeric element attributes -> __TODO!__
+- added specs for `SVG.FX` -> __TODO!__
+
+# 2.3.0
+- added `SVG.Point` which serves as Wrapper to the native `SVGPoint` (#437)
+- added `element.point(x,y)` which transforms a point from screen coordinates to the elements space (#403)
+- fixed `svgjs:data` attribute which was not set properly in all browsers (#428)
+
+# 2.2.5 (29/12/2015)
+- added check for existence of node (#431)
+- `group.move()` now allows string numbers as input (#433)
+- `matrixify()` will not apply the calculated matrix to the node anymore
+
+# 2.2.4 (12/12/2015)
+- fixed `transform()` which returns the matrix values (a-f) now, too (#423)
+- double newlines (\n\n) are correctly handled as blank line from `text()`
+- fixed use of scrollX vs pageXOffset in `rbox()` (#425)
+- fixed target array in mask and clip which was removed instead of reinitialized (#429)
+
+# 2.2.3 (30/11/2015)
+- fixed null check in image (see 2.2.2)
+- fixed bug related to the new path parser (see 2.2.2)
+- fixed amd loader (#412)
+
+# 2.2.2 (28/11/2015)
+- fixed leading point bug in path parsing (#416)
+- added null check in image onload callback (#415)
+- documentation rework (#407) [thanks @snowyplover]
+
+# 2.2.1 (18/11/2015)
+- added workaround for `SvgPathSeg` which is removed in Chrome 48 (#409)
+- added `gbox()` to group to get bbox with translation included (#405)
+- fixed dom data which was not cleaned up properly (#398)
+
+# 2.2.0 (06/11/2015)
+
+- fixed pattern and gradient animation (#385)
+- fixed mask animation in Firefox (#287)
+- fixed return value of `text()` after import/clone (#393)
+- svgjs now saves crucial data in the dom before export and restores them when element is adopted
+- added `ungroup()/flatten()` (#238), `toParent()` and `toDoc()`
+- added UMD-Wrapper with possibility to pass custom window object (#352)
+- added `morph()` method for paths via plugin [svg.pathmorphing.js](https://github.com/Fuzzyma/svg.pathmorphing.js)
+- added support for css selectors within the `parent()` method
+- added `parents()` method to get an array of all parenting elements
+
+# 2.1.1 (03/10/2015)
+
+- added custom context binding to event callback (default is the element the event is bound to)
+
+# 2.1.0 (20/09/2015)
+
+- added transform to pattern and gradients (#383)
+- fixed clone of textnodes (#369)
+- fixed transformlists in IE (#372)
+- fixed typo that leads to broken gradients (#370)
+- fixed animate radius for circles (#367)
+
+# 2.0.2 (22/06/2015)
+
+- Fixed zoom consideration in circle and ellipse
+
+# 2.0.1 (21/06/2015)
+
+- fixed bug with `doc()` which always should return root svg
+- removed target reference from use which caused bugs in `dmove()` and `use()` with external file
+- added possibility to remove all events from a certain namespace
+- fixed bug in `SVG.FX` when animating with `plot()`
+- removed scale consideration in `move()` duo to incompatibilities with other move-functions e.g. in `SVG.PointArray`
+
+# 2.0.0 (11/06/2015)
+
+- implemented an SVG adoption system to be able to manipulate existing SVG's not created with svg.js
+- changed `parent` reference on elements to `parent()` method
+- using `CustomEvent` instead of `Event` to be able to fire events with a `detail` object [thanks @Fuzzyma]
+- added polyfill for IE9 and IE10 custom events [thanks @Fuzzyma]
+- added DOM query selector with the `select()` method globally or on parent elements
+- added the intentionally neglected `SVG.Circle` element
+- fixed bug in `radius()` method when `y` value equals `0`
+- renamed `SVG.TSpan` class to `SVG.Tspan` to play nice with the adoption system
+- added `rx()` and `ry()` to `SVG.Rect`, `SVG.Circle`, `SVG.Ellispe` and `SVG.FX`
+- changed `array` reference to `array()` method on `SVG.Polyline`, `SVG.Polygon` and `SVG.Path`
+- completely reworked `clone()` method to use the adoption system
+- added support to clone manually built text elements
+- added `svg.wiml.js` plugin to plugins list
+- added `ctm()` method to for matrix-centric transformations
+- added `morph()` method to `SVG.Matrix`
+- added support for new matrix system to `SVG.FX`
+- completely reworked transformations to be chainable and more true to their nature
+- changed `lines` reference to `lines()` on `SVG.Text`
+- changed `track` reference to `track()` on `SVG.Text`
+- changed `textPath` reference to `textPath()` on `SVG.Text`
+- added raw svg import functionality with the `svg()` method
+- reworked sup-pixel offset implementation to be more compact
+- added `native()` method to elements and matrix to get to the native api
+- added `untransform()` method to remove all transformations
+- switched from Ruby's `rake` to Node's `gulp` for building [thanks to Alex Ewerlöf]
+- added coding style description to README
+- changed `to()` method to `at()` method in `SVG.FX`
+- added reverse functionality for animations
+- documented the `situation` object in `SVG.FX`
+- renamed `SVG.SetFX` to `SVG.FX.Set`
+- added distinction between relative and absolute matrix transformations
+- implemented the `element()` method using the `SVG.Bare` class to create elements that are not described by SVG.js
+- removed `SVG.Symbol` but kept the `symbol()` method using the new `element()` method
+- reworked `SVG.Number` to return new instances with calculations rather than itself
+- added `w` and `h` properties as shorthand for `width` and `height` to `SVG.BBox`
+- added `SVG.TBox` to get a bounding box that is affected by transformation values
+- reworked animatable matrix rotations
+- fixed a bug where events are not detached properly
+- added event-based or complete detaching of event listeners in `off()` method
+
+# 1.0.0-rc.9 (17/06/2014)
+
+- added `SVG.Marker`
+- added `SVG.Symbol`
+- added `first()` and `last()` methods to `SVG.Set`
+- added `length()` method to `SVG.Text` and `SVG.TSpan` to calculate total text length
+- `SVG.get()` will now also fetch elements with a `xlink:href="#elementId"` or `url(#elementId)` value given
+- added `reference()` method to get referenced elements from a given attribute value
+- fixed infinite loop in viewbox when element has a percentage width / height [thanks @shabegger]
+
+# 1.0.0-rc.8 (12/06/2014)
+
+- fixed bug in `SVG.off`
+- fixed offset by window scroll position in `rbox()` [thanks @bryhoyt]
+
+# 1.0.0-rc.7 (11/06/2014)
+
+- calling `after()` when calling `stop(true)` (fulfill flag) [thanks @vird]
+- added `classes()`, `hasClass()`, `addClass()`, `removeClass()` and `toggleClass()` [thanks @pklingem]
+- fixed a bug where `Element#style()` would not save empty values in IE11 [thanks @Shtong]
+- fixed `SVG is not defined error` [thanks @anvaka]
+- fixed a bug in `move()`on text elements with a string based value
+- binding events listeners to svg.js instance
+- text element fires `rebuild` event whenever the `rebuild()` method is called
+- fix for `text()` method on text element when acting as getter [thanks @Lochemage]
+- fix in `style()` method with a css string [thanks @TobiasHeckel]
+
+# 1.0.0-rc.6 (03/03/2014)
+
+- fine-tuned text element positioning
+- fixed a bug in text `dy()` method
+- added `leading()` method to `SVG.FX`
+- removed internal representation for `style`
+- added `reverse()` method to `SVG.Array` (and thereby also to `SVG.PointArray` and `SVG.PathArray`)
+- added `fulfill` option to `stop()` method in `SVG.FX` to finalise animations
+- calling `at()` method directly on morphable svg.js instances in `SVG.FX` module
+- moved most `_private` methods to local named functions
+- moved helpers to a separate file
+- added more output values to `bbox()` and `rbox()` methods
+
+# 1.0.0-rc.5 (14/02/2014)
+
+- added `plain()` method to `SVG.Text` element to add plain text content, without tspans
+- added `plain()` method to parent elements to create a text element without tspans
+- updated `SVG.TSpan` to accept nested tspan elements, not unlike the `text()` method in `SVG.Text`
+- removed the `relative()` method in favour of `dx()`, `dy()` and `dmove()`
+- switched form objects to arrays in `SVG.PathArray` for compatibility with other libraries and better performance on parsing and rendering (up-to 48% faster than 1.0.0-rc.4)
+- refined docs on element-specific methods and `SVG.PathArray` structure
+- added `build()` to enable/disable build mode
+- removed verbose style application to tspans
+- reworked `leading()` implementation to be more font-size "aware"
+- refactored the `attr` method on `SVG.Element`
+- applied Helvetica as default font
+- building `SVG.FX` class with `SVG.invent()` function
+
+# 1.0.0-rc.4 (04/02/2014)
+
+- switched to `MAJOR`.`MINOR`.`PATCH` versioning format to play nice with package managers
+- made svg.pattern.js part of the core library
+- automatic pattern creation by passing an image url or instance as `fill` attribute on elements
+- added `loaded()` method to image tag
+- fix in `animate('=').to()`
+- added `pointAt()` method to `SVG.Path`, wrapping the native `getPointAtLength()`
+- moved `length()` method to sugar module
+- fix for arcs in patharray `toString()` method [thanks @dotnetCarpenter]
+
+# v1.0rc3 (03/02/2014)
+
+- fix for html-less documents
+- added the `SVG.invent` function to ease invention of new elements
+- using `SVG.invent` to generate core shapes as well for leaner code
+- added second values for `animate('2s')`
+- fix for arcs in patharray `toString()` method
+- added `length()` mehtod to path, wrapping the native `getTotalLength()`
+
+# v1.0rc2 (01/02/2014)
+
+- added `index()` method to `SVG.Parent` and `SVG.Set`
+- modified `cx()` and `cy()` methods on elements with native `x`, `y`, `width` and `height` attributes for better performance
+- added `morph()` and `at()` methods to `SVG.Number` for unit morphing
+
+# v1.0rc1 (31/01/2014)
+
+- added `SVG.PathArray` for real path transformations
+- removed `unbiased` system for paths
+- enabled proportional resizing on `size()` method with `null` for either `width` or `height` values
+- moved data module to separate file
+- `data()` method now accepts object for for multiple key / value assignments
+- added `bbox()` method to `SVG.Set`
+- added `relative()` method for moves relative to the current position
+- added `morph()` and `at()` methods to `SVG.Color` for color morphing
+
+# v0.38 (28/01/2014)
+
+- added `loop()` method to `SVG.FX`
+- switched from `setInterval` to `requestAnimFrame` for animations
+
+# v0.37 (26/01/2014)
+
+- added `get()` to `SVG.Set`
+- moved `SVG.PointArray` to a separate file
+
+# v0.36 (25/01/2014)
+
+- added `linkTo()`, `addTo()` and `putIn()` methods on `SVG.Element`
+- provided more detailed documentation on parent elements
+
+# v0.35 (23/01/2014)
+
+- added `SVG.A` element with the `link()`
+
+# v0.34 (23/01/2014)
+
+- added `pause()` and `play()` to `SVG.FX`
+- storing animation values in `situation` object
+
+# v0.33 (22/01/2014)
+
+- added `has()` method to `SVG.Set`
+- added `width()` and `height()` as setter and getter methods on all shapes
+- moved sub-pixel offset fix to be an optional method (e.g. `SVG('drawing').fixSubPixelOffset()`)
+- added `replace()` method to elements
+- added `radius()` method to `SVG.Rect` and `SVG.Ellipse`
+- added reference to parent node in defs
+- merged plotable.js and path.js
+
+# v0.32
+
+- added library to [cdnjs](http://cdnjs.com)
\ No newline at end of file
diff --git a/node_modules/svgjs/LICENSE.txt b/node_modules/svgjs/LICENSE.txt
new file mode 100644
index 0000000..92730ed
--- /dev/null
+++ b/node_modules/svgjs/LICENSE.txt
@@ -0,0 +1,21 @@
+Copyright (c) 2012-2014 Wout Fierens
+http://svgjs.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/svgjs/README.md b/node_modules/svgjs/README.md
new file mode 100644
index 0000000..8a6c012
--- /dev/null
+++ b/node_modules/svgjs/README.md
@@ -0,0 +1,4014 @@
+The .js breaks es6 imports so I need to republish it...
+
+# SVG.js
+
+A lightweight library for manipulating and animating SVG.
+
+Svg.js has no dependencies and aims to be as small as possible.
+
+Svg.js is licensed under the terms of the MIT License.
+
+See [svgjs.com](http://svgjs.com) for an introduction, [documentation](http://documentup.com/wout/SVG.js) and [some action](http://svgjs.com/test).
+
+## Usage
+
+### Create an SVG document
+
+Use the `SVG()` function to create an SVG document within a given html element:
+
+```javascript
+var draw = SVG('drawing').size(300, 300)
+var rect = draw.rect(100, 100).attr({ fill: '#f06' })
+```
+The first argument can either be an id of the element or the selected element itself.
+This will generate the following output:
+
+```html
+