javafx @ eclipse · ‣l10n-dsl: if you java8, e4 and want dynamic language flipping ‣rrobot-dsl:...
TRANSCRIPT
JavaFX @ eclipse.org
Tom Schindl <[email protected]>
Twitter: @tomsontomBlog: http://tomsondev.bestsolution.atWebsite: http://www.bestsolution.at
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
About Me‣ CTO BestSolution.at Systemhaus GmbH
‣ Eclipse Committer
‣ e4
‣ Platform
‣ EMF
‣ Project lead
‣ e(fx)clipse
‣ Twitter: @tomsontom
‣ Blog: tomsondev.bestsolution.at
‣ Cooperate: http://bestsolution.at
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Tooling
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Tooling News 1.0 - 1.2‣ CSS-Editor - Add gradient editor
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Tooling News 1.0 - 1.2‣ CSS-Editor - Add gradient editor
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ CSS-Editor - Support for custom controls
Tooling News 1.0 - 1.2
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ Java-Editor - Wizard to generate JavaFX Getter/setters
Tooling News 1.0 - 1.2
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ Java-Editor - Wizard to generate JavaFX Getter/setters
Tooling News 1.0 - 1.2
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ FXML-Editor - Generating controller stub
Tooling News 1.0 - 1.2
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Reuseable Tooling
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping
‣ RRobot-DSL: allows you to describe eclipse-project setups
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping
‣ RRobot-DSL: allows you to describe eclipse-project setups
‣ LivePreview: Reuse the live preview to present your textual content in a visual way
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping
‣ RRobot-DSL: allows you to describe eclipse-project setups
‣ LivePreview: Reuse the live preview to present your textual content in a visual way
‣ CSSExt-DSL: allows you to define your custom CSS-Properties
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
l10n
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
l10n-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DSL to define translations
l10n-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DSL to define translations
‣ Uses Xtext
l10n-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DSL to define translations
‣ Uses Xtext
‣ Generates code and text files
l10n-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DSL to define translations
‣ Uses Xtext
‣ Generates code and text files
‣ Requires Java8
‣ Makes use of Java8 functional interfaces and method references
l10n-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
l10n-DSL‣ DSL to store language definitions
package sample.l10n.app.themes {bundle BasicMessages default en {
HelloWorld {en : '''Hello World''',de : '''Hallo Welt'''
}}bundle SamplePartMessages default en {
Button_title [ BasicMessages.HelloWorld ]Current_Date(DATE now) {
en : '''«now "MM/dd/yyyy"»''',de : '''«now "dd.MM.yyyy"»'''
}}
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
l10n-DSL‣ Generated artifacts
‣ ${bundle}.java: e4 message class
‣ ${bundle}.properties: Default transalations
‣ ${bundle}_${lang}.properties: Translations for the lang
‣ ${bundle}Registry.java: Registry to use for binding
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ Use in code (Sample JavaFX)
l10n-DSL
package sample.l10n.app.themes;
public class SamplePart {@InjectSamplePartMessagesRegistry messagesReg;
@PostConstructvoid init(BorderPane pane) {
Button b = new Button();messagesReg.register(b::setText, messagesReg::Button_title);pane.setCenter(b);
Label l = new Label();messagesReg.register(b::setText,
messagesReg.Current_Date_supplier(new Date()));pane.setTop(l);
}}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ Use in code (Sample SWT)
l10n-DSL
package sample.l10n.app.themes;
public class SamplePart {@InjectSamplePartMessagesRegistry messagesReg;
@PostConstructvoid init(Composite pane) {
Button b = new Button(pane,SWT.PUSH);messagesReg.register(b::setText, messagesReg::Button_title);
Label l = new Label(pane,SWT.NONE);messagesReg.register(b::setText,
messagesReg.Current_Date_supplier(new Date()));}
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo (Elementary)
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
RRobot-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
RRobot-DSL‣ DSL to describe Eclipse project setups
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
RRobot-DSL‣ DSL to describe Eclipse project setups
‣ Uses Xtext
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
RRobot-DSL‣ DSL to describe Eclipse project setups
‣ Uses Xtext
‣ Allows to setup
‣ JDT Projects
‣ PDE-Projects Bundles & Features
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
RRobot-DSLRobotTask {
// Variables to be used later onvariables = {
## Name of the bundleSTRING "BundleName" default "econsample"
}projects = {
BundleProject "${BundleName}" {manifest = ManifestFile "${BundleName}" "1.0.0" "JavaSE-1.8" {
bundlename = "${BundleName}"vendor = "BestSolution.at"
}build = BuildProperties {
}resources = {
Folder "src"}rootfragments = {
fragment "default-src" "src"}
}}
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo (Run Task)
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
LivePreview
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback
‣ Expects FXML passed
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback
‣ Expects FXML passed
‣ LivePreview requests FXML from editors who adapt to IFXMLProviderAdapter
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo (Elemenatry & Lego-DSL & FXML-
Viewer)
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
LivePreviewpublic class FXMLProviderAdapter implements IFXMLProviderAdapter {
private XtextEditor editor;
public FXMLProviderAdapter(XtextEditor editor) {this.editor = editor;
}
@Overridepublic IEditorPart getEditorPart() {
return editor;}
@Overridepublic String getPreviewFXML() {
return editor.getDocument().readOnly(new IUnitOfWork<String, XtextResource>() {
@Overridepublic String exec(XtextResource resource) throws Exception {
Injector injector = LegoActivator.getInstance().getInjector("at.bestsolution.lego.Lego");PreviewGenerator generator = injector.getInstance(PreviewGenerator.class);return generator.generatePreview((Model) resource.getContents().get(0)).toString();
}
});}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
CSSExt-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
CSSExt-DSL‣ CSS-Editor has NO hard coded properties
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
CSSExt-DSL‣ CSS-Editor has NO hard coded properties
‣ Properties available are defined in an extra file ending with .cssext
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
CSSExt-DSL‣ CSS-Editor has NO hard coded properties
‣ Properties available are defined in an extra file ending with .cssext
‣ CSS-Editor looks up .cssext-Files from projects classpath
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
package svg {prop_alignment-baseline = [ auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | inherit ];
/** * */tspan {
/** * Documentation */alignment-baseline <prop_alignment-baseline> default: auto;
}}
CSSExt-DSL
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo (SVG-CSS-Properties)
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Runtime
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Components for reuse
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DI-Extensions: @Log, @ContextValue, @Service
Components for reuse
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DI-Extensions: @Log, @ContextValue, @Service
‣ Filesystem-Service
Components for reuse
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ DI-Extensions: @Log, @ContextValue, @Service
‣ Filesystem-Service
‣ Controls
‣ Filesystem controls
‣ StyledText & JFace-Text-Port
Components for reuse
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API‣ Simple slf4j like API
‣ Used internally by e(fx)clipse runtime
‣ Implementation provided as an OSGi-Service/ServiceLoader
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API‣ Simple slf4j like API
‣ Used internally by e(fx)clipse runtime
‣ Implementation provided as an OSGi-Service/ServiceLoader
‣ Multiple ways to consume
‣ Through OSGi-Service-Registry
‣ Through a factory
‣ Through DI with @Log
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API
@Componentpublic class OSGiComponent {
private Logger logger;
@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {
this.logger = factory.createLogger(OSGiComponent.class.getName());}
}
OSGi-Component
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API
public class DIComponent {@Inject@Logprivate Logger logger;
}
Eclipse-DI
@Componentpublic class OSGiComponent {
private Logger logger;
@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {
this.logger = factory.createLogger(OSGiComponent.class.getName());}
}
OSGi-Component
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Log & Logger-API
public class DIComponent {@Inject@Logprivate Logger logger;
}
Eclipse-DI
public class PlainJava {private static Logger logger = LoggerCreator.createLogger(PlainJava.class);
}
Plain Java
@Componentpublic class OSGiComponent {
private Logger logger;
@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {
this.logger = factory.createLogger(OSGiComponent.class.getName());}
}
OSGi-Component
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ Current shipped backends
‣ java.util.logging (default)
‣ log4j
‣ slf4j
@Log & Logger-API
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@ContextValue‣ Allows you to abstract away IEclipseContext#modify
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@ContextValue‣ Allows you to abstract away IEclipseContext#modify
public class ValuePublisherComponent {
@Injectprivate IEclipseContext context;
public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));
}}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@ContextValue‣ Allows you to abstract away IEclipseContext#modify
public class ValuePublisherComponent {
@Injectprivate IEclipseContext context;
public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));
}}
public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private ContextBoundValue<String> value;
public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.publish(newVal));
}}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@ContextValue‣ Allows you to abstract away IEclipseContext#modify
public class ValuePublisherComponent {
@Injectprivate IEclipseContext context;
public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));
}}
public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private ContextBoundValue<String> value;
public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.publish(newVal));
}}
public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private Property<String> value;
public void publishContext() {ListView<String> values = new ListView<>();fxProperty.bind(values.getSelectionModel().selectedItemProperty());
}}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Service
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
@Service‣ Eclipse DI by default does NOT conform to OSGi-Service semantics
‣ Services can come and go
‣ Requestor of services is important if a ServiceFactory is used
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
public class DIServiceConsumer {@Injectpublic void setServices(@Service List<LoggerFactory> serviceList) {
}
@Injectpublic void setServices(@Service LoggerFactory serviceList) {
}}
@Service
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Fileystem Service‣ Service on top of NIO2 low level API
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Fileystem Service‣ Service on top of NIO2 low level API
public class FilesystemSample extends Application {
@Overridepublic void start(Stage primaryStage) throws Exception {
FilesystemService fs = Util.lookupService(FilesystemSample.class, FilesystemService.class);Subscription observePath = fs.observePath(Paths.get(URI.create("file:/Users/tomschindl")), (k,p) -> {
System.err.print("filesystem item '"+p+"' has been ");switch (k) {case CREATE:
System.err.println("created.");break;
case DELETE:System.err.println("deleted.");break;
default:System.err.println("modified.");break;
}});
// .....observePath.dispose();
}
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controls
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controlsFo
lder
Vie
wer
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controlsFo
lder
Vie
wer
Folder Content Viewer
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controlsFo
lder
Vie
wer
Folder Content Viewer
File
Con
tent
Vie
wer
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Non Editable Text: StyledLabel & StyledString
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Non Editable Text: StyledLabel & StyledString
StyledString s = new StyledString();s.appendSegment("Hello", "h1");s.appendSegment("World!", "h1","colorful");
StyledLabel label = new StyledLabel(s);
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Non Editable Text: StyledLabel & StyledString
StyledString s = new StyledString();s.appendSegment("Hello", "h1");s.appendSegment("World!", "h1","colorful");
StyledLabel label = new StyledLabel(s);.h1 {
-fx-font-size: 20pt;}
.colorful {-fx-font-weight: bold;-fx-fill: linear-gradient( from 0.0% 0.0% to 100.0% 100.0%, rgb(128,179,128)
0.0, rgb(255,179,102) 100.0);}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ StyledText in List/Table/TreeView
StyledText APIs
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ StyledText in List/Table/TreeView
StyledText APIs
public interface OutlineItem {public CharSequence getLabel();public Node getGraphic();public OutlineItem getParent();public ObservableList<OutlineItem> getChildren();
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
‣ StyledText in List/Table/TreeView
StyledText APIs
public interface OutlineItem {public CharSequence getLabel();public Node getGraphic();public OutlineItem getParent();public ObservableList<OutlineItem> getChildren();
}private TreeView<OutlineItem> createView() {TreeView<OutlineItem> outlineView = new TreeView<>();outlineView.setShowRoot(false);outlineView.setCellFactory(this::createCell);return outlineView;
}
TreeCell<OutlineItem> createCell(TreeView<OutlineItem> param) {return new SimpleTreeCell<OutlineItem>(i -> i.getLabel(), i -> i.getGraphic(), i -> Collections.emptyList());
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Editable StyledText
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Editable StyledText
StyledTextArea t = new StyledTextArea();t.getContent().setText("package test;\n\n…");t.setStyleRanges(new StyleRange("keyword",0,6,null,null),/* */);
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
StyledText APIs‣ Editable StyledText
StyledTextArea t = new StyledTextArea();t.getContent().setText("package test;\n\n…");t.setStyleRanges(new StyleRange("keyword",0,6,null,null),/* */);
.keyword {-styled-text-color: rgb(127, 0, 85);-fx-font-weight: bold;
}
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator‣ Mission 0: Must look slick!
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator‣ Mission 0: Must look slick!
‣ Mission 1: Create a simple source editor like Notepad++ who:
‣ Is process light-weight
‣ Makes it easy to add new language highlightings
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator‣ Mission 0: Must look slick!
‣ Mission 1: Create a simple source editor like Notepad++ who:
‣ Is process light-weight
‣ Makes it easy to add new language highlightings
‣ Mission 2: Allow the simple source editor to expand to a (simple) IDE:
‣ where Source-Editor, VCS (git), Ticketsystem (eg. github), CI (eg. travis) are core components fully integrated with each other
‣ Easy to integrate: Does not depend on core.resources
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo (Basic-Editor + Python
install)
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator - HSL+CSS
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Python { partition __dftl_partition_content_type partition __python_multiline_comment partition __python_singleline_comment partition __python_string rule_damager rule_damager __dftl_partition_content_type { default token python_default token python_string token python_operator token python_bracket token python_keyword_return token python_keyword keywords python_keyword_return [ "return" ] keywords python_keyword [ "and", "as", „assert", /* … */] } rule_damager __python_singleline_comment { default token python_single_line_comment } /* … */ rule_partitioner { single_line __python_string '"' => '"' single_line __python_singleline_comment "#" multi_line __python_multiline_comment "'''" => "'''" single_line __python_string "'" => "'" }} for "text/python"
Compensator - HSL+CSS
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Python { partition __dftl_partition_content_type partition __python_multiline_comment partition __python_singleline_comment partition __python_string rule_damager rule_damager __dftl_partition_content_type { default token python_default token python_string token python_operator token python_bracket token python_keyword_return token python_keyword keywords python_keyword_return [ "return" ] keywords python_keyword [ "and", "as", „assert", /* … */] } rule_damager __python_singleline_comment { default token python_single_line_comment } /* … */ rule_partitioner { single_line __python_string '"' => '"' single_line __python_singleline_comment "#" multi_line __python_multiline_comment "'''" => "'''" single_line __python_string "'" => "'" }} for "text/python"
Compensator - HSL+CSS
/* */.Python.styled-text-area .python_doc_default {
-styled-text-color: rgb(63, 95, 191);}
.Python.styled-text-area .python_single_line_comment {-styled-text-color: rgb(63, 127, 95);
}/* */
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Demo
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Compensator - Roadmap‣ Tighter integration with git workflow
‣ Improve Java autocomplete & Error Annotations
‣ Support for JavaScript auto-complete & error reporting
‣ Support for Xtext-Languages (their upcoming IntelliJ support should help us)
‣ Connect it to Flux to get a Flux Compensator