Skip to content

Commit

Permalink
feat: update code-to-image tool.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaywcjlove committed Sep 9, 2022
1 parent 43d07de commit c09da30
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 123 deletions.
5 changes: 1 addition & 4 deletions packages/code-to-image/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
"author": "Kenny Wong <wowohoo@qq.com>",
"license": "MIT",
"dependencies": {
"@uiw/codemirror-extensions-langs": "^4.12.2",
"@uiw/codemirror-themes-all": "^4.12.1",
"@wcj/tools-react-components": "1.9.4",
"dom-to-image-more": "^2.6.0"
"@wcj/code-image": "^1.0.4"
},
"peerDependencies": {
"react": ">=16.14.0",
Expand Down
126 changes: 7 additions & 119 deletions packages/code-to-image/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,124 +1,12 @@
import React, { useState, Fragment, useRef } from 'react';
import { Wrapper, StyledLayout, Button } from '@wcj/tools-react-components';
import CodeMirror from '@uiw/react-codemirror';
import { langs, langNames, LanguageName } from '@uiw/codemirror-extensions-langs';
import * as themes from '@uiw/codemirror-themes-all';
import styled from 'styled-components';
import { EditorView } from '@codemirror/view';
import domToImage from 'dom-to-image-more';
import React, { CSSProperties } from 'react';
import CodeImage from '@wcj/code-image';

const sample = `<h2>Web tool</h2>
<p>Hello World</p>
<pre><code class="language-css">body { color: 'red'; }
</code></pre>
`;
const style: CSSProperties = { position: 'relative', height: '100%' };

const Canvas = styled.div`
border: 3px dashed #e3ebf6;
display: inline-block;
&::before {
content: 'CANVAS';
top: -21px;
left: -4px;
position: absolute;
font-size: 0.8rem;
}
`;
const EditorWarpper = styled.div`
padding: 50px;
& > * {
box-shadow: rgb(0 0 0 / 55%) 0px 10px 30px 0px;
border-radius: 5px;
display: inline-block;
overflow: hidden;
}
`;

const HeaderTools = styled.div`
padding-bottom: 10px;
`;

export default function Html2Markdown() {
const $dom = useRef<HTMLDivElement>(null);
const [markdown, setMarkdown] = useState<string>(sample);
const [languge, setLanguge] = useState<LanguageName>('javascript');
const [theme, setTheme] = useState<keyof typeof themes>('githubDark');
const handleInput = () => setMarkdown(sample);
const handleChange = (value: string) => setMarkdown(value);
const borderRadius = EditorView.theme({
'.cm-scroller, &': {
borderRadius: '6px',
},
'& .cm-gutters': {
borderRight: '0',
},
});
const selectLangChange = (ev: React.ChangeEvent<HTMLSelectElement>) => {
setLanguge(ev.target.value as LanguageName);
};
const selectThemeChange = (ev: React.ChangeEvent<HTMLSelectElement>) => {
console.log('ev.target.value:::', ev.target.value);
setTheme(ev.target.value as keyof typeof themes);
};
const downloadHandel = () => {
const scale = 2;
const elm = $dom.current;
domToImage
.toPng($dom.current, {
height: elm!.offsetHeight * scale,
style: {
transform: `scale(${scale}) translate(${elm!.offsetWidth / 2 / scale}px, ${elm!.offsetHeight / 2 / scale}px)`,
},
width: elm!.offsetWidth * scale,
})
.then((dataUrl) => {
const link = document.createElement('a');
link.download = 'image.png';
link.href = dataUrl;
link.click();
});
};
const extensions = [borderRadius];
if (langs[languge]) {
extensions.push(langs[languge]());
}
export default function CodeToImage() {
return (
<Wrapper>
<StyledLayout
title="Code To Image"
extra={
<Fragment>
<Button onClick={handleInput}>Sample</Button>
<Button onClick={downloadHandel}>DownLoad</Button>
</Fragment>
}
>
<HeaderTools>
<select value={languge} onChange={selectLangChange}>
{langNames.sort().map((keyname, index) => {
return (
<option value={keyname} key={index}>
{keyname}
</option>
);
})}
</select>
<select value={theme} onChange={selectThemeChange}>
{Object.keys(themes).map((keyname, index) => {
return (
<option value={keyname} key={index}>
Theme: {keyname}
</option>
);
})}
</select>
</HeaderTools>
<Canvas>
<EditorWarpper ref={$dom}>
<CodeMirror theme={themes[theme]} value={markdown} extensions={extensions} onChange={handleChange} />
</EditorWarpper>
</Canvas>
</StyledLayout>
</Wrapper>
<div style={style}>
<CodeImage />
</div>
);
}
5 changes: 5 additions & 0 deletions website/src/app/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ const Sup = styled.sup`
const HeaderRight = styled.div`
display: flex;
align-items: center;
padding-right: 8px;
dark-mode {
font-size: 14px;
line-height: 12px;
}
`;

const Label = styled.span`
Expand Down

0 comments on commit c09da30

Please sign in to comment.