# all files / Github/bpmn-js/lib/draw/ TextRenderer.js

100% Statements 20/20
100% Branches 8/8
100% Functions 6/6
100% Lines 20/20

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116

    1×
    1×

    1×

    1294×

    1294×

    1294×

    1294×

    1294×

    2822×

    2822×

    1294×

    2×

    2×

    1294×
    9889×

    1294×
    268×

    1294×
    3240×

    1×

     import { assign } from 'min-dash';

    import TextUtil from 'diagram-js/lib/util/Text';

    var DEFAULT_FONT_SIZE = 12;
    var LINE_HEIGHT_RATIO = 1.2;

    var MIN_TEXT_ANNOTATION_HEIGHT = 30;

    export default function TextRenderer(config) {

      var defaultStyle = assign({
        fontFamily: 'Arial, sans-serif',
        fontSize: DEFAULT_FONT_SIZE,
        fontWeight: 'normal',
        lineHeight: LINE_HEIGHT_RATIO
      }, config && config.defaultStyle || {});

      var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;

      var externalStyle = assign({}, defaultStyle, {
        fontSize: fontSize
      }, config && config.externalStyle || {});

      var textUtil = new TextUtil({
        style: defaultStyle
      });

      /**
       * Get the new bounds of an externally rendered,
       * layouted label.
       *
       * @param  {Bounds} bounds
       * @param  {String} text
       *
       * @return {Bounds}
       */
      this.getExternalLabelBounds = function(bounds, text) {

        var layoutedDimensions = textUtil.getDimensions(text, {
          box: {
            width: 90,
            height: 30,
            x: bounds.width / 2 + bounds.x,
            y: bounds.height / 2 + bounds.y
          },
          style: externalStyle
        });

        // resize label shape to fit label text
        return {
          x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),
          y: Math.round(bounds.y),
          width: Math.ceil(layoutedDimensions.width),
          height: Math.ceil(layoutedDimensions.height)
        };

      };

      /**
       * Get the new bounds of text annotation.
       *
       * @param  {Bounds} bounds
       * @param  {String} text
       *
       * @return {Bounds}
       */
      this.getTextAnnotationBounds = function(bounds, text) {

        var layoutedDimensions = textUtil.getDimensions(text, {
          box: bounds,
          style: defaultStyle,
          align: 'left-top',
          padding: 5
        });

        return {
          x: bounds.x,
          y: bounds.y,
          width: bounds.width,
          height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))
        };
      };

      /**
       * Create a layouted text element.
       *
       * @param {String} text
       * @param {Object} [options]
       *
       * @return {SVGElement} rendered text
       */
      this.createText = function(text, options) {
        return textUtil.createText(text, options || {});
      };

      /**
       * Get default text style.
       */
      this.getDefaultStyle = function() {
        return defaultStyle;
      };

      /**
       * Get the external text style.
       */
      this.getExternalStyle = function() {
        return externalStyle;
      };

    }

    TextRenderer.$inject = [
      'config.textRenderer'
    ];