Skip to content

Commit

Permalink
Improved space management for text
Browse files Browse the repository at this point in the history
  • Loading branch information
subhash-halder committed Jul 4, 2023
1 parent f374f5c commit 4bb9c2f
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export class Orchestrator {
this.componentStore = {
title: getChartTitleComponent(chartConfig, chartData),
plot: getPlotComponent(chartConfig, chartData),
xAxis: getAxis(chartData.xAxis, chartConfig.xAxis),
yAxis: getAxis(chartData.yAxis, chartConfig.yAxis),
xAxis: getAxis(chartData.xAxis, chartConfig.xAxis, chartConfig.fontFamily),
yAxis: getAxis(chartData.yAxis, chartConfig.yAxis, chartConfig.fontFamily),
};
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Dimension } from './Interfaces.js';

export interface ITextDimensionCalculator {
getDimension(texts: string[], fontSize: number, fontFamily?: string ): Dimension;
getDimension(texts: string[], fontSize: number, fontFamily?: string): Dimension;
}

export class TextDimensionCalculator implements ITextDimensionCalculator {
Expand All @@ -13,3 +13,57 @@ export class TextDimensionCalculator implements ITextDimensionCalculator {
};
}
}

export class TextDimensionCalculatorWithFont implements ITextDimensionCalculator {
private container: HTMLSpanElement | null = null;
private hiddenElementId = 'mermaid-text-dimension-calculator';
constructor(fontFamily?: string) {
if (document) {
let parentContainer = document.getElementById(this.hiddenElementId);
if (!parentContainer) {
parentContainer = document.createElement('div');
parentContainer.id = this.hiddenElementId;
parentContainer.style.position = 'absolute';
parentContainer.style.top = '-100px';
parentContainer.style.left = '0px';
parentContainer.style.visibility = 'hidden';
document.body.append(parentContainer);
}
const fontClassName = `font-${fontFamily}`;
const prevContainerAvailable = parentContainer.getElementsByClassName(fontClassName);
if (prevContainerAvailable.length > 0) {
this.container = prevContainerAvailable.item(0) as HTMLSpanElement;
} else {
this.container = document.createElement('div');
this.container.className = fontClassName;
if (fontFamily) {
this.container.style.fontFamily = fontFamily;
}
parentContainer.append(this.container);
}
}
}
getDimension(texts: string[], fontSize: number): Dimension {
if (!this.container) {
return {
width: texts.reduce((acc, cur) => Math.max(cur.length, acc), 0) * fontSize,
height: fontSize,
};
}

const dimension: Dimension = {
width: 0,
height: 0,
};

this.container.style.fontSize = `${fontSize}px`;

for (let t of texts) {
this.container.innerHTML = t;
const bbox = this.container.getBoundingClientRect();
dimension.width = Math.max(dimension.width, bbox.width);
dimension.height = Math.max(dimension.height, bbox.height);
}
return dimension;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { ITextDimensionCalculator, TextDimensionCalculator } from '../TextDimensionCalculator.js';
import { XYChartConfig } from '../../../../config.type.js';
import {
XYChartData,
Dimension,
BoundingRect,
DrawableElem,
Point,
BoundingRect,
ChartComponent,
Dimension,
DrawableElem,
Point,
XYChartData,
} from '../Interfaces.js';
import { ChartComponent } from '../Interfaces.js';
import { XYChartConfig } from '../../../../config.type.js';
import { ITextDimensionCalculator, TextDimensionCalculatorWithFont } from '../TextDimensionCalculator.js';

export class ChartTitle implements ChartComponent {
private boundingRect: BoundingRect;
Expand Down Expand Up @@ -75,6 +75,6 @@ export function getChartTitleComponent(
chartConfig: XYChartConfig,
chartData: XYChartData
): ChartComponent {
const textDimensionCalculator = new TextDimensionCalculator();
const textDimensionCalculator = new TextDimensionCalculatorWithFont(chartConfig.fontFamily);
return new ChartTitle(textDimensionCalculator, chartConfig, chartData);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { XYChartAxisConfig } from '../../../../../config.type.js';
import {
AxisDataType,
ChartComponent,
isBandAxisData,
} from '../../Interfaces.js';
import { TextDimensionCalculator } from '../../TextDimensionCalculator.js';
import { ChartComponent } from '../../Interfaces.js';
import { TextDimensionCalculatorWithFont } from '../../TextDimensionCalculator.js';
import { BandAxis } from './BandAxis.js';
import { LinearAxis } from './LinearAxis.js';
import { XYChartAxisConfig } from '../../../../../config.type.js';

export type AxisPosition = 'left' | 'right' | 'top' | 'bottom';

Expand All @@ -18,8 +18,8 @@ export interface IAxis extends ChartComponent {
setRange(range: [number, number]): void;
}

export function getAxis(data: AxisDataType, axisConfig: XYChartAxisConfig): IAxis {
const textDimansionCalculator = new TextDimensionCalculator();
export function getAxis(data: AxisDataType, axisConfig: XYChartAxisConfig, fontFamily?: string): IAxis {
const textDimansionCalculator = new TextDimensionCalculatorWithFont(fontFamily);
if (isBandAxisData(data)) {
return new BandAxis(axisConfig, data.categories, data.title, textDimansionCalculator);
}
Expand Down

0 comments on commit 4bb9c2f

Please sign in to comment.