Skip to content

Commit

Permalink
Add php
Browse files Browse the repository at this point in the history
  • Loading branch information
intansemc2 committed Oct 4, 2024
1 parent 7f4f913 commit a871cf0
Show file tree
Hide file tree
Showing 18 changed files with 2,190 additions and 0 deletions.
76 changes: 76 additions & 0 deletions front-end/src/lib/monaco-editor/languages-config/php/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import * as vscode from 'vscode';
import getEditorServiceOverride from '@codingame/monaco-vscode-editor-service-override';
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
import '@codingame/monaco-vscode-php-default-extension';
import { type UserConfig } from 'monaco-editor-wrapper';
import { useOpenEditorStub } from 'monaco-editor-wrapper/vscode/services';
import { MonacoLanguageClient } from 'monaco-languageclient';
import { MONACO_DETAULT_USER_CONFIG } from '$lib/monaco-editor/constances';

function createPHPUserConfig(workspaceRoot: string, code: string, codeUri: string): UserConfig {
return {
languageClientConfig: {
languageId: 'php',
name: 'PHP Language Server',
options: {
$type: 'WebSocket',

/** For SSL */
// host: 'example.com',
// port: 443,
// path: 'language-server/php',
// extraParams: {
// authorization: 'UserAuth'
// },
// secured: true,

/** Localhost */
host: 'localhost',
port: 3005,
path: 'language-server/php',
extraParams: {
authorization: 'UserAuth'
},
secured: false
},
clientOptions: {
documentSelector: ['php'],
workspaceFolder: {
index: 0,
name: 'workspace',
uri: vscode.Uri.parse(workspaceRoot)
}
}
},
wrapperConfig: {
serviceConfig: {
userServices: {
...getEditorServiceOverride(useOpenEditorStub),
...getKeybindingsServiceOverride()
},
debugLogging: true
},
editorAppConfig: {
$type: 'extended',
codeResources: {
main: {
text: code,
uri: codeUri
}
},
userConfiguration: {
json: JSON.stringify({
...MONACO_DETAULT_USER_CONFIG
})
},
useDiffEditor: false
}
},
loggerConfig: {
enabled: true,
debugEnabled: true
}
};
}

export { createPHPUserConfig };
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<?php
echo 'Hello, World!';
?>
47 changes: 47 additions & 0 deletions front-end/src/lib/monaco-editor/languages-config/php/page.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import * as vscode from 'vscode';
import '@codingame/monaco-vscode-php-default-extension';
import {
RegisteredFileSystemProvider,
registerFileSystemOverlay,
RegisteredMemoryFile
} from '@codingame/monaco-vscode-files-service-override';
import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
import { useWorkerFactory } from 'monaco-editor-wrapper/workerFactory';
import { createPHPUserConfig } from './config';

function configureMonacoWorkers() {
useWorkerFactory({
ignoreMapping: true,
workerLoaders: {
editorWorkerService: () =>
new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), {
type: 'module'
})
}
});
}

const wrapper = new MonacoEditorLanguageClientWrapper();

async function initPHPWrapper() {
if (wrapper.isStarted()) {
console.warn('Editor was already started!');
} else {
const fileSystemProvider = new RegisteredFileSystemProvider(false);

registerFileSystemOverlay(1, fileSystemProvider);
const userConfig = createPHPUserConfig('/workspace', '', '/workspace/hello.php');
const htmlElement = document.getElementById('monaco-editor-root');

await wrapper.init(userConfig);
await wrapper.start(htmlElement);

wrapper.getModelRefs()?.modelRef?.object?.setLanguageId('php');
}
}

async function removePHPWrapper() {
await wrapper.dispose();
}

export { configureMonacoWorkers, initPHPWrapper, removePHPWrapper, wrapper };
8 changes: 8 additions & 0 deletions front-end/src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,13 @@
<img src="/images/javascript-logo.png" alt="" class="w-20 h-20" />
<div>Javascript</div>
</a>

<a
href="/php"
class="flex items-center flex-col gap-2 bg-base-100 p-3 select-none cursor-pointer border-transparent border-2 hover:border-base-200 hover:bg-base-300"
>
<img src="/images/php-logo.png" alt="" class="w-20 h-20" />
<div>PHP</div>
</a>
</div>
</div>
24 changes: 24 additions & 0 deletions front-end/src/routes/php/+page.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<script lang="ts">
import {
configureMonacoWorkers,
initPHPWrapper,
removePHPWrapper,
wrapper
} from '$lib/monaco-editor/languages-config/php/page';
import PHPHelloWorld from '$lib/monaco-editor/languages-config/php/example-code.php?raw';
import { WrapperSessionId } from '$lib';
// Constances
const JUDGE0_LANGUAGE_NAME = 'PHP (7.4.1)';
const LANGUAGE_CODE = 'php';
</script>

<WrapperSessionId
{configureMonacoWorkers}
initLanguageWrapper={initPHPWrapper}
removeLanguageWrapper={removePHPWrapper}
{wrapper}
languageCodeExample={PHPHelloWorld}
judge0LanguageName={JUDGE0_LANGUAGE_NAME}
languageCode={LANGUAGE_CODE}
/>
Binary file added front-end/static/images/php-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions language-server-php/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
40 changes: 40 additions & 0 deletions language-server-php/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
FROM ubuntu:22.04

# Install Node
RUN apt update && \
apt upgrade -y && \
apt install -y ca-certificates curl gnupg unzip

RUN mkdir -p /etc/apt/keyrings && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \
apt update && \
apt install -y nodejs

# INSTALL PHP
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y php libapache2-mod-php php-cli php-cgi php-mysql php-pgsql

WORKDIR /root

# INSTALL COMPOSER
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

# COPY CODES
COPY src ./src
RUN mkdir /workspace

# LANGUAGE SERVER
RUN chmod a+x ./src/phpactor/phpactor.phar

# BACK_END CODE
COPY package.json .
COPY tsconfig.json .

RUN npm i

CMD ["npm", "run", "start:server:php"]
127 changes: 127 additions & 0 deletions language-server-php/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
{
"name": "monaco-languageclient-examples",
"version": "2024.6.1",
"description": "Monaco Language client examples",
"author": {
"name": "TypeFox GmbH",
"url": "http://www.typefox.io"
},
"homepage": "https://github.com/TypeFox/monaco-languageclient/blob/main/packages/examples/README.md",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/TypeFox/monaco-languageclient.git",
"directory": "packages/examples"
},
"bugs": {
"url": "https://github.com/TypeFox/monaco-languageclient/issues"
},
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"./node": {
"types": "./dist/node.d.ts",
"default": "./dist/node.js"
},
"./json-client": {
"types": "./dist/json/client/wrapperWs.d.ts",
"default": "./dist/json/client/wrapperWs.js"
},
"./python-client": {
"types": "./dist/python/client/main.d.ts",
"default": "./dist/python/client/main.js"
}
},
"typesVersions": {
"*": {
".": [
"dist/index"
],
"node": [
"dist/node"
],
"json-client": [
"dist/json/client/wrapperWs"
],
"python-client": [
"dist/python/client/main"
]
}
},
"dependencies": {
"@codingame/monaco-vscode-configuration-service-override": "~5.2.0",
"@codingame/monaco-vscode-editor-service-override": "^5.2.0",
"@codingame/monaco-vscode-files-service-override": "~5.2.0",
"@codingame/monaco-vscode-groovy-default-extension": "~5.2.0",
"@codingame/monaco-vscode-javascript-default-extension": "~5.2.0",
"@codingame/monaco-vscode-json-default-extension": "~5.2.0",
"@codingame/monaco-vscode-keybindings-service-override": "~5.2.0",
"@codingame/monaco-vscode-lifecycle-service-override": "~5.2.0",
"@codingame/monaco-vscode-localization-service-override": "~5.2.0",
"@codingame/monaco-vscode-python-default-extension": "~5.2.0",
"@codingame/monaco-vscode-standalone-json-language-features": "~5.2.0",
"@codingame/monaco-vscode-standalone-languages": "~5.2.0",
"@codingame/monaco-vscode-standalone-typescript-language-features": "~5.2.0",
"@codingame/monaco-vscode-textmate-service-override": "~5.2.0",
"@codingame/monaco-vscode-theme-defaults-default-extension": "~5.2.0",
"@codingame/monaco-vscode-theme-service-override": "~5.2.0",
"@codingame/monaco-vscode-typescript-basics-default-extension": "~5.2.0",
"@codingame/monaco-vscode-typescript-language-features-default-extension": "~5.2.0",
"@typefox/monaco-editor-react": "~4.2.0",
"express": "~4.19.2",
"langium": "~3.0.0",
"monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~5.2.0",
"monaco-editor-wrapper": "~5.2.0",
"monaco-languageclient": "~8.5.0",
"pyright": "~1.1.365",
"react": "~18.3.1",
"react-dom": "~18.3.1",
"request-light": "~0.7.0",
"vscode": "npm:@codingame/monaco-vscode-api@~5.2.0",
"vscode-json-languageservice": "~5.3.11",
"vscode-languageclient": "~9.0.1",
"vscode-languageserver": "~9.0.1",
"vscode-uri": "~3.0.8",
"vscode-ws-jsonrpc": "~3.3.2",
"ws": "~8.17.0"
},
"devDependencies": {
"@types/express": "~4.17.21",
"@types/ws": "~8.5.10",
"langium-cli": "3.0.3",
"ts-node": "~10.9.1",
"vscode-languageserver-types": "~3.17.5",
"vite-node": "1.6.0"
},
"volta": {
"node": "20.14.0",
"npm": "10.7.0"
},
"files": [
"dist",
"src",
"*.html",
"*.ts",
"README.md",
"CHANGELOG.md",
"LICENSE"
],
"scripts": {
"clean": "vite-node ../../scripts/clean.ts --relativePath packages/examples --recursive --paths dist *.tsbuildinfo resources/vsix",
"compile": "tsc --build tsconfig.src.json",
"resources:download": "vite-node ./build/downloadResources.mts",
"build:msg": "echo Building main examples:",
"build": "npm run build:msg && npm run clean && npm run resources:download && npm run compile",
"build:bundle": "vite --config vite.bundle.config.ts build",
"start:server:json": "node --loader ts-node/esm src/json/server/direct.ts",
"start:server:python": "node --loader ts-node/esm src/python/server/direct.ts",
"start:server:groovy": "node --watch --loader ts-node/esm src/groovy/server/direct.ts",
"langium:generate": "langium generate --file ./src/langium/statemachine/config/langium-config.json",
"start:server:php": "npx vite-node src/php/server/direct.ts"
}
}
Loading

0 comments on commit a871cf0

Please sign in to comment.