mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 05:25:50 +01:00
Merge branch 'master' into feature-tasklist
This commit is contained in:
14
README.md
14
README.md
@@ -1,12 +1,15 @@
|
|||||||
GitBucket
|
GitBucket [](https://gitter.im/takezoe/gitbucket) [](https://buildhive.cloudbees.com/job/takezoe/job/gitbucket/)
|
||||||
=========
|
=========
|
||||||
|
|
||||||
GitBucket is the easily installable Github clone written with Scala.
|
GitBucket is the easily installable Github clone written with Scala.
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
The current version of GitBucket provides a basic features below:
|
The current version of GitBucket provides a basic features below:
|
||||||
|
|
||||||
- Public / Private Git repository (http access only)
|
- Public / Private Git repository (http access only)
|
||||||
- Repository viewer (some advanced features such as online file editing are not implemented)
|
- Repository viewer and online file editing
|
||||||
- Repository search (Code and Issues)
|
- Repository search (Code and Issues)
|
||||||
- Wiki
|
- Wiki
|
||||||
- Issues
|
- Issues
|
||||||
@@ -20,7 +23,6 @@ The current version of GitBucket provides a basic features below:
|
|||||||
|
|
||||||
Following features are not implemented, but we will make them in the future release!
|
Following features are not implemented, but we will make them in the future release!
|
||||||
|
|
||||||
- File editing in repository viewer
|
|
||||||
- Comment for the changeset
|
- Comment for the changeset
|
||||||
- Network graph
|
- Network graph
|
||||||
- Statistics
|
- Statistics
|
||||||
@@ -78,6 +80,12 @@ Run the following commands in `Terminal` to
|
|||||||
|
|
||||||
Release Notes
|
Release Notes
|
||||||
--------
|
--------
|
||||||
|
### 1.13 - 29 Apr 2014
|
||||||
|
- Direct file editing in the repository viewer using AceEditor
|
||||||
|
- File attachment for issues
|
||||||
|
- Atom feed of user activity
|
||||||
|
- Fix some bugs
|
||||||
|
|
||||||
### 1.12 - 29 Mar 2014
|
### 1.12 - 29 Mar 2014
|
||||||
- SSH repository access is available
|
- SSH repository access is available
|
||||||
- Allow users can create and management their groups
|
- Allow users can create and management their groups
|
||||||
|
|||||||
@@ -37,16 +37,14 @@ object MyBuild extends Build {
|
|||||||
"org.apache.commons" % "commons-compress" % "1.5",
|
"org.apache.commons" % "commons-compress" % "1.5",
|
||||||
"org.apache.commons" % "commons-email" % "1.3.1",
|
"org.apache.commons" % "commons-email" % "1.3.1",
|
||||||
"org.apache.httpcomponents" % "httpclient" % "4.3",
|
"org.apache.httpcomponents" % "httpclient" % "4.3",
|
||||||
"org.apache.sshd" % "apache-sshd" % "0.10.0",
|
"org.apache.sshd" % "apache-sshd" % "0.11.0",
|
||||||
"com.typesafe.slick" %% "slick" % "1.0.1",
|
"com.typesafe.slick" %% "slick" % "1.0.1",
|
||||||
"com.novell.ldap" % "jldap" % "2009-10-07",
|
"com.novell.ldap" % "jldap" % "2009-10-07",
|
||||||
"com.h2database" % "h2" % "1.3.173",
|
"com.h2database" % "h2" % "1.3.173",
|
||||||
"ch.qos.logback" % "logback-classic" % "1.0.13" % "runtime",
|
"ch.qos.logback" % "logback-classic" % "1.0.13" % "runtime",
|
||||||
"org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container;provided",
|
"org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container;provided",
|
||||||
"org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts Artifact("javax.servlet", "jar", "jar"),
|
"org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts Artifact("javax.servlet", "jar", "jar"),
|
||||||
"junit" % "junit" % "4.11" % "test",
|
"junit" % "junit" % "4.11" % "test"
|
||||||
"org.asciidoctor" % "asciidoctor-java-integration" % "0.1.4",
|
|
||||||
"net.sourceforge.htmlcleaner" % "htmlcleaner" % "2.7"
|
|
||||||
),
|
),
|
||||||
EclipseKeys.withSource := true,
|
EclipseKeys.withSource := true,
|
||||||
javacOptions in compile ++= Seq("-target", "6", "-source", "6"),
|
javacOptions in compile ++= Seq("-target", "6", "-source", "6"),
|
||||||
|
|||||||
1
src/main/resources/update/1_13.sql
Normal file
1
src/main/resources/update/1_13.sql
Normal file
@@ -0,0 +1 @@
|
|||||||
|
DROP TABLE COMMIT_LOG;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import _root_.servlet.{BasicAuthenticationFilter, TransactionFilter}
|
import _root_.servlet.{BasicAuthenticationFilter, TransactionFilter}
|
||||||
import app._
|
import app._
|
||||||
import jp.sf.amateras.scalatra.forms.ValidationJavaScriptProvider
|
//import jp.sf.amateras.scalatra.forms.ValidationJavaScriptProvider
|
||||||
import org.scalatra._
|
import org.scalatra._
|
||||||
import javax.servlet._
|
import javax.servlet._
|
||||||
import java.util.EnumSet
|
import java.util.EnumSet
|
||||||
@@ -28,7 +28,6 @@ class ScalatraBootstrap extends LifeCycle {
|
|||||||
context.mount(new IssuesController, "/*")
|
context.mount(new IssuesController, "/*")
|
||||||
context.mount(new PullRequestsController, "/*")
|
context.mount(new PullRequestsController, "/*")
|
||||||
context.mount(new RepositorySettingsController, "/*")
|
context.mount(new RepositorySettingsController, "/*")
|
||||||
context.mount(new ValidationJavaScriptProvider, "/assets/common/js/*")
|
|
||||||
|
|
||||||
// Create GITBUCKET_HOME directory if it does not exist
|
// Create GITBUCKET_HOME directory if it does not exist
|
||||||
val dir = new java.io.File(_root_.util.Directory.GitBucketHome)
|
val dir = new java.io.File(_root_.util.Directory.GitBucketHome)
|
||||||
|
|||||||
@@ -112,13 +112,19 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
val members = getGroupMembers(account.userName)
|
val members = getGroupMembers(account.userName)
|
||||||
_root_.account.html.repositories(account,
|
_root_.account.html.repositories(account,
|
||||||
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
||||||
getVisibleRepositories(context.loginAccount, baseUrl, Some(userName)),
|
getVisibleRepositories(context.loginAccount, context.baseUrl, Some(userName)),
|
||||||
context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }))
|
context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get("/:userName.atom") {
|
||||||
|
val userName = params("userName")
|
||||||
|
contentType = "application/atom+xml; type=feed"
|
||||||
|
helper.xml.feed(getActivitiesByUser(userName, true))
|
||||||
|
}
|
||||||
|
|
||||||
get("/:userName/_avatar"){
|
get("/:userName/_avatar"){
|
||||||
val userName = params("userName")
|
val userName = params("userName")
|
||||||
getAccountByUserName(userName).flatMap(_.image).map { image =>
|
getAccountByUserName(userName).flatMap(_.image).map { image =>
|
||||||
@@ -286,7 +292,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
*/
|
*/
|
||||||
post("/new", newRepositoryForm)(usersOnly { form =>
|
post("/new", newRepositoryForm)(usersOnly { form =>
|
||||||
LockUtil.lock(s"${form.owner}/${form.name}/create"){
|
LockUtil.lock(s"${form.owner}/${form.name}/create"){
|
||||||
if(getRepository(form.owner, form.name, baseUrl).isEmpty){
|
if(getRepository(form.owner, form.name, context.baseUrl).isEmpty){
|
||||||
val ownerAccount = getAccountByUserName(form.owner).get
|
val ownerAccount = getAccountByUserName(form.owner).get
|
||||||
val loginAccount = context.loginAccount.get
|
val loginAccount = context.loginAccount.get
|
||||||
val loginUserName = loginAccount.userName
|
val loginUserName = loginAccount.userName
|
||||||
@@ -385,20 +391,6 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
getWikiRepositoryDir(repository.owner, repository.name),
|
getWikiRepositoryDir(repository.owner, repository.name),
|
||||||
getWikiRepositoryDir(loginUserName, repository.name))
|
getWikiRepositoryDir(loginUserName, repository.name))
|
||||||
|
|
||||||
// insert commit id
|
|
||||||
using(Git.open(getRepositoryDir(loginUserName, repository.name))){ git =>
|
|
||||||
JGitUtil.getRepositoryInfo(loginUserName, repository.name, baseUrl).branchList.foreach { branch =>
|
|
||||||
JGitUtil.getCommitLog(git, branch) match {
|
|
||||||
case Right((commits, _)) => commits.foreach { commit =>
|
|
||||||
if(!existsCommitId(loginUserName, repository.name, commit.id)){
|
|
||||||
insertCommitId(loginUserName, repository.name, commit.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case Left(_) => ???
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record activity
|
// Record activity
|
||||||
recordForkActivity(repository.owner, repository.name, loginUserName)
|
recordForkActivity(repository.owner, repository.name, loginUserName)
|
||||||
// redirect to the repository
|
// redirect to the repository
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ import jp.sf.amateras.scalatra.forms._
|
|||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
import model.Account
|
import model.Account
|
||||||
import service.{SystemSettingsService, AccountService}
|
import service.{SystemSettingsService, AccountService}
|
||||||
import javax.servlet.http.{HttpServletResponse, HttpSession, HttpServletRequest}
|
import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import javax.servlet.{FilterChain, ServletResponse, ServletRequest}
|
import javax.servlet.{FilterChain, ServletResponse, ServletRequest}
|
||||||
import org.scalatra.i18n._
|
import org.scalatra.i18n._
|
||||||
|
|
||||||
@@ -139,9 +138,10 @@ abstract class ControllerBase extends ScalatraFilter
|
|||||||
*/
|
*/
|
||||||
case class Context(settings: SystemSettingsService.SystemSettings, loginAccount: Option[Account], request: HttpServletRequest){
|
case class Context(settings: SystemSettingsService.SystemSettings, loginAccount: Option[Account], request: HttpServletRequest){
|
||||||
|
|
||||||
lazy val path = settings.baseUrl.getOrElse(request.getServletContext.getContextPath)
|
val path = settings.baseUrl.getOrElse(request.getContextPath)
|
||||||
|
val currentPath = request.getRequestURI.substring(request.getContextPath.length)
|
||||||
lazy val currentPath = request.getRequestURI.substring(request.getContextPath.length)
|
val baseUrl = settings.baseUrl(request)
|
||||||
|
val host = new java.net.URL(baseUrl).getHost
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get object from cache.
|
* Get object from cache.
|
||||||
@@ -163,7 +163,7 @@ case class Context(settings: SystemSettingsService.SystemSettings, loginAccount:
|
|||||||
/**
|
/**
|
||||||
* Base trait for controllers which manages account information.
|
* Base trait for controllers which manages account information.
|
||||||
*/
|
*/
|
||||||
trait AccountManagementControllerBase extends ControllerBase with FileUploadControllerBase {
|
trait AccountManagementControllerBase extends ControllerBase {
|
||||||
self: AccountService =>
|
self: AccountService =>
|
||||||
|
|
||||||
protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit =
|
protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit =
|
||||||
@@ -174,9 +174,9 @@ trait AccountManagementControllerBase extends ControllerBase with FileUploadCont
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fileId.map { fileId =>
|
fileId.map { fileId =>
|
||||||
val filename = "avatar." + FileUtil.getExtension(getUploadedFilename(fileId).get)
|
val filename = "avatar." + FileUtil.getExtension(session.getAndRemove(Keys.Session.Upload(fileId)).get)
|
||||||
FileUtils.moveFile(
|
FileUtils.moveFile(
|
||||||
getTemporaryFile(fileId),
|
new java.io.File(getTemporaryDir(session.getId), fileId),
|
||||||
new java.io.File(getUserUploadDir(userName), filename)
|
new java.io.File(getUserUploadDir(userName), filename)
|
||||||
)
|
)
|
||||||
updateAvatarImage(userName, Some(filename))
|
updateAvatarImage(userName, Some(filename))
|
||||||
@@ -196,28 +196,3 @@ trait AccountManagementControllerBase extends ControllerBase with FileUploadCont
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Base trait for controllers which needs file uploading feature.
|
|
||||||
*/
|
|
||||||
trait FileUploadControllerBase {
|
|
||||||
|
|
||||||
def generateFileId: String =
|
|
||||||
new SimpleDateFormat("yyyyMMddHHmmSSsss").format(new java.util.Date(System.currentTimeMillis))
|
|
||||||
|
|
||||||
def TemporaryDir(implicit session: HttpSession): java.io.File =
|
|
||||||
new java.io.File(GitBucketHome, s"tmp/_upload/${session.getId}")
|
|
||||||
|
|
||||||
def getTemporaryFile(fileId: String)(implicit session: HttpSession): java.io.File =
|
|
||||||
new java.io.File(TemporaryDir, fileId)
|
|
||||||
|
|
||||||
// def removeTemporaryFile(fileId: String)(implicit session: HttpSession): Unit =
|
|
||||||
// getTemporaryFile(fileId).delete()
|
|
||||||
|
|
||||||
def removeTemporaryFiles()(implicit session: HttpSession): Unit =
|
|
||||||
FileUtils.deleteDirectory(TemporaryDir)
|
|
||||||
|
|
||||||
def getUploadedFilename(fileId: String)(implicit session: HttpSession): Option[String] =
|
|
||||||
session.getAndRemove[String](Keys.Session.Upload(fileId))
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -49,7 +49,7 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
val userName = context.loginAccount.get.userName
|
val userName = context.loginAccount.get.userName
|
||||||
val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name)
|
val repositories = getUserRepositories(userName, context.baseUrl).map(repo => repo.owner -> repo.name)
|
||||||
val filterUser = Map(filter -> userName)
|
val filterUser = Map(filter -> userName)
|
||||||
val page = IssueSearchCondition.page(request)
|
val page = IssueSearchCondition.page(request)
|
||||||
//
|
//
|
||||||
@@ -80,7 +80,7 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
}.copy(repo = repository))
|
}.copy(repo = repository))
|
||||||
|
|
||||||
val userName = context.loginAccount.get.userName
|
val userName = context.loginAccount.get.userName
|
||||||
val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name)
|
val repositories = getUserRepositories(userName, context.baseUrl).map(repo => repo.owner -> repo.name)
|
||||||
val filterUser = Map(filter -> userName)
|
val filterUser = Map(filter -> userName)
|
||||||
val page = IssueSearchCondition.page(request)
|
val page = IssueSearchCondition.page(request)
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +1,42 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import _root_.util.{Keys, FileUtil}
|
import util.{Keys, FileUtil}
|
||||||
import util.ControlUtil._
|
import util.ControlUtil._
|
||||||
|
import util.Directory._
|
||||||
import org.scalatra._
|
import org.scalatra._
|
||||||
import org.scalatra.servlet.{MultipartConfig, FileUploadSupport}
|
import org.scalatra.servlet.{MultipartConfig, FileUploadSupport, FileItem}
|
||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides Ajax based file upload functionality.
|
* Provides Ajax based file upload functionality.
|
||||||
*
|
*
|
||||||
* This servlet saves uploaded file as temporary file and returns the unique id.
|
* This servlet saves uploaded file.
|
||||||
* You can get uploaded file using [[app.FileUploadControllerBase#getTemporaryFile()]] with this id.
|
|
||||||
*/
|
*/
|
||||||
class FileUploadController extends ScalatraServlet with FileUploadSupport with FileUploadControllerBase {
|
class FileUploadController extends ScalatraServlet with FileUploadSupport {
|
||||||
|
|
||||||
configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024)))
|
configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024)))
|
||||||
|
|
||||||
post("/image"){
|
post("/image"){
|
||||||
fileParams.get("file") match {
|
execute { (file, fileId) =>
|
||||||
case Some(file) if(FileUtil.isImage(file.name)) => defining(generateFileId){ fileId =>
|
FileUtils.writeByteArrayToFile(new java.io.File(getTemporaryDir(session.getId), fileId), file.get)
|
||||||
FileUtils.writeByteArrayToFile(getTemporaryFile(fileId), file.get)
|
|
||||||
session += Keys.Session.Upload(fileId) -> file.name
|
session += Keys.Session.Upload(fileId) -> file.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post("/image/:owner/:repository"){
|
||||||
|
execute { (file, fileId) =>
|
||||||
|
FileUtils.writeByteArrayToFile(new java.io.File(getAttachedDir(params("owner"), params("repository")), fileId), file.get)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private def execute(f: (FileItem, String) => Unit) = fileParams.get("file") match {
|
||||||
|
case Some(file) if(FileUtil.isImage(file.name)) =>
|
||||||
|
defining(FileUtil.generateFileId){ fileId =>
|
||||||
|
f(file, fileId)
|
||||||
|
|
||||||
Ok(fileId)
|
Ok(fileId)
|
||||||
}
|
}
|
||||||
case None => BadRequest
|
case _ => BadRequest
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ trait IndexControllerBase extends ControllerBase {
|
|||||||
val loginAccount = context.loginAccount
|
val loginAccount = context.loginAccount
|
||||||
|
|
||||||
html.index(getRecentActivities(),
|
html.index(getRecentActivities(),
|
||||||
getVisibleRepositories(loginAccount, baseUrl),
|
getVisibleRepositories(loginAccount, context.baseUrl),
|
||||||
loginAccount.map{ account => getUserRepositories(account.userName, baseUrl) }.getOrElse(Nil)
|
loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl) }.getOrElse(Nil)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +46,11 @@ trait IndexControllerBase extends ControllerBase {
|
|||||||
redirect("/")
|
redirect("/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get("/activities.atom"){
|
||||||
|
contentType = "application/atom+xml; type=feed"
|
||||||
|
helper.xml.feed(getRecentActivities())
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set account information into HttpSession and redirect.
|
* Set account information into HttpSession and redirect.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
Notifier().toNotify(repository, issueId, form.content.getOrElse("")){
|
Notifier().toNotify(repository, issueId, form.content.getOrElse("")){
|
||||||
Notifier.msgIssue(s"${baseUrl}/${owner}/${name}/issues/${issueId}")
|
Notifier.msgIssue(s"${context.baseUrl}/${owner}/${name}/issues/${issueId}")
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect(s"/${owner}/${name}/issues/${issueId}")
|
redirect(s"/${owner}/${name}/issues/${issueId}")
|
||||||
@@ -273,6 +273,15 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
get("/:owner/:repository/_attached/:file")(referrersOnly { repository =>
|
||||||
|
defining(new java.io.File(Directory.getAttachedDir(repository.owner, repository.name), params("file"))){ file =>
|
||||||
|
if(file.exists) {
|
||||||
|
contentType = FileUtil.getMimeType(file)
|
||||||
|
file
|
||||||
|
} else NotFound
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
val assignedUserName = (key: String) => params.get(key) filter (_.trim != "")
|
val assignedUserName = (key: String) => params.get(key) filter (_.trim != "")
|
||||||
val milestoneId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt)
|
val milestoneId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt)
|
||||||
|
|
||||||
@@ -342,13 +351,13 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
case f =>
|
case f =>
|
||||||
content foreach {
|
content foreach {
|
||||||
f.toNotify(repository, issueId, _){
|
f.toNotify(repository, issueId, _){
|
||||||
Notifier.msgComment(s"${baseUrl}/${owner}/${name}/${
|
Notifier.msgComment(s"${context.baseUrl}/${owner}/${name}/${
|
||||||
if(issue.isPullRequest) "pull" else "issues"}/${issueId}#comment-${commentId}")
|
if(issue.isPullRequest) "pull" else "issues"}/${issueId}#comment-${commentId}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
action foreach {
|
action foreach {
|
||||||
f.toNotify(repository, issueId, _){
|
f.toNotify(repository, issueId, _){
|
||||||
Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/issues/${issueId}")
|
Notifier.msgStatus(s"${context.baseUrl}/${owner}/${name}/issues/${issueId}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
pulls.html.mergeguide(
|
pulls.html.mergeguide(
|
||||||
checkConflictInPullRequest(owner, name, pullreq.branch, pullreq.requestUserName, name, pullreq.requestBranch, issueId),
|
checkConflictInPullRequest(owner, name, pullreq.branch, pullreq.requestUserName, name, pullreq.requestBranch, issueId),
|
||||||
pullreq,
|
pullreq,
|
||||||
s"${baseUrl}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git")
|
s"${context.baseUrl}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git")
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
})
|
})
|
||||||
@@ -111,7 +111,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
val userName = context.loginAccount.get.userName
|
val userName = context.loginAccount.get.userName
|
||||||
if(repository.repository.defaultBranch != branchName){
|
if(repository.repository.defaultBranch != branchName){
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
git.branchDelete().setBranchNames(branchName).call()
|
git.branchDelete().setForce(true).setBranchNames(branchName).call()
|
||||||
recordDeleteBranchActivity(repository.owner, repository.name, userName, branchName)
|
recordDeleteBranchActivity(repository.owner, repository.name, userName, branchName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,14 +177,8 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
val (commits, _) = getRequestCompareInfo(owner, name, pullreq.commitIdFrom,
|
val (commits, _) = getRequestCompareInfo(owner, name, pullreq.commitIdFrom,
|
||||||
pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo)
|
pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo)
|
||||||
|
|
||||||
commits.flatten.foreach { commit =>
|
|
||||||
if(!existsCommitId(owner, name, commit.id)){
|
|
||||||
insertCommitId(owner, name, commit.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// close issue by content of pull request
|
// close issue by content of pull request
|
||||||
val defaultBranch = getRepository(owner, name, baseUrl).get.repository.defaultBranch
|
val defaultBranch = getRepository(owner, name, context.baseUrl).get.repository.defaultBranch
|
||||||
if(pullreq.branch == defaultBranch){
|
if(pullreq.branch == defaultBranch){
|
||||||
commits.flatten.foreach { commit =>
|
commits.flatten.foreach { commit =>
|
||||||
closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name)
|
closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name)
|
||||||
@@ -207,7 +201,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
Notifier().toNotify(repository, issueId, "merge"){
|
Notifier().toNotify(repository, issueId, "merge"){
|
||||||
Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/pull/${issueId}")
|
Notifier.msgStatus(s"${context.baseUrl}/${owner}/${name}/pull/${issueId}")
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect(s"/${owner}/${name}/pull/${issueId}")
|
redirect(s"/${owner}/${name}/pull/${issueId}")
|
||||||
@@ -220,7 +214,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
||||||
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
||||||
case (Some(originUserName), Some(originRepositoryName)) => {
|
case (Some(originUserName), Some(originRepositoryName)) => {
|
||||||
getRepository(originUserName, originRepositoryName, baseUrl).map { originRepository =>
|
getRepository(originUserName, originRepositoryName, context.baseUrl).map { originRepository =>
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(originUserName, originRepositoryName)),
|
Git.open(getRepositoryDir(originUserName, originRepositoryName)),
|
||||||
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
||||||
@@ -257,7 +251,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
originRepository <- getRepository(originOwner, originRepositoryName, baseUrl)
|
originRepository <- getRepository(originOwner, originRepositoryName, context.baseUrl)
|
||||||
) yield {
|
) yield {
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
||||||
@@ -266,7 +260,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
||||||
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
||||||
|
|
||||||
val forkedId = getForkedCommitId(oldGit, newGit,
|
val forkedId = JGitUtil.getForkedCommitId(oldGit, newGit,
|
||||||
originRepository.owner, originRepository.name, originBranch,
|
originRepository.owner, originRepository.name, originBranch,
|
||||||
forkedRepository.owner, forkedRepository.name, forkedBranch)
|
forkedRepository.owner, forkedRepository.name, forkedBranch)
|
||||||
|
|
||||||
@@ -309,7 +303,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
originRepository <- getRepository(originOwner, originRepositoryName, baseUrl)
|
originRepository <- getRepository(originOwner, originRepositoryName, context.baseUrl)
|
||||||
) yield {
|
) yield {
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
||||||
@@ -362,7 +356,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
Notifier().toNotify(repository, issueId, form.content.getOrElse("")){
|
Notifier().toNotify(repository, issueId, form.content.getOrElse("")){
|
||||||
Notifier.msgPullRequest(s"${baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}")
|
Notifier.msgPullRequest(s"${context.baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}")
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect(s"/${repository.owner}/${repository.name}/pull/${issueId}")
|
redirect(s"/${repository.owner}/${repository.name}/pull/${issueId}")
|
||||||
@@ -438,24 +432,8 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
(defaultOwner, value)
|
(defaultOwner, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts all repository names from [[service.RepositoryService.RepositoryTreeNode]] as flat list.
|
|
||||||
*/
|
|
||||||
private def getRepositoryNames(node: RepositoryTreeNode): List[String] =
|
|
||||||
node.owner :: node.children.map { child => getRepositoryNames(child) }.flatten
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the identifier of the root commit (or latest merge commit) of the specified branch.
|
|
||||||
*/
|
|
||||||
private def getForkedCommitId(oldGit: Git, newGit: Git, userName: String, repositoryName: String, branch: String,
|
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): String =
|
|
||||||
JGitUtil.getCommitLogs(newGit, requestBranch, true){ commit =>
|
|
||||||
existsCommitId(userName, repositoryName, commit.getName) && JGitUtil.getBranchesOfCommit(oldGit, commit.getName).contains(branch)
|
|
||||||
}.head.id
|
|
||||||
|
|
||||||
private def getRequestCompareInfo(userName: String, repositoryName: String, branch: String,
|
private def getRequestCompareInfo(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestCommitId: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = {
|
requestUserName: String, requestRepositoryName: String, requestCommitId: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) =
|
||||||
|
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(userName, repositoryName)),
|
Git.open(getRepositoryDir(userName, repositoryName)),
|
||||||
Git.open(getRepositoryDir(requestUserName, requestRepositoryName))
|
Git.open(getRepositoryDir(requestUserName, requestRepositoryName))
|
||||||
@@ -473,7 +451,6 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
(commits, diffs)
|
(commits, diffs)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private def searchPullRequests(userName: Option[String], repository: RepositoryService.RepositoryInfo) =
|
private def searchPullRequests(userName: Option[String], repository: RepositoryService.RepositoryInfo) =
|
||||||
defining(repository.owner, repository.name){ case (owner, repoName) =>
|
defining(repository.owner, repository.name){ case (owner, repoName) =>
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
|
import _root_.util.JGitUtil.CommitInfo
|
||||||
import util.Directory._
|
import util.Directory._
|
||||||
import util.Implicits._
|
import util.Implicits._
|
||||||
import util.ControlUtil._
|
import _root_.util.ControlUtil._
|
||||||
import _root_.util._
|
import _root_.util._
|
||||||
import service._
|
import service._
|
||||||
import org.scalatra._
|
import org.scalatra._
|
||||||
@@ -12,7 +13,9 @@ import org.eclipse.jgit.lib._
|
|||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
import org.eclipse.jgit.treewalk._
|
import org.eclipse.jgit.treewalk._
|
||||||
import java.util.zip.{ZipEntry, ZipOutputStream}
|
import java.util.zip.{ZipEntry, ZipOutputStream}
|
||||||
import scala.Some
|
import jp.sf.amateras.scalatra.forms._
|
||||||
|
import org.eclipse.jgit.dircache.DirCache
|
||||||
|
import org.eclipse.jgit.revwalk.{RevCommit, RevWalk}
|
||||||
|
|
||||||
class RepositoryViewerController extends RepositoryViewerControllerBase
|
class RepositoryViewerController extends RepositoryViewerControllerBase
|
||||||
with RepositoryService with AccountService with ActivityService with ReferrerAuthenticator with CollaboratorsAuthenticator
|
with RepositoryService with AccountService with ActivityService with ReferrerAuthenticator with CollaboratorsAuthenticator
|
||||||
@@ -23,6 +26,40 @@ class RepositoryViewerController extends RepositoryViewerControllerBase
|
|||||||
trait RepositoryViewerControllerBase extends ControllerBase {
|
trait RepositoryViewerControllerBase extends ControllerBase {
|
||||||
self: RepositoryService with AccountService with ActivityService with ReferrerAuthenticator with CollaboratorsAuthenticator =>
|
self: RepositoryService with AccountService with ActivityService with ReferrerAuthenticator with CollaboratorsAuthenticator =>
|
||||||
|
|
||||||
|
case class EditorForm(
|
||||||
|
branch: String,
|
||||||
|
path: String,
|
||||||
|
content: String,
|
||||||
|
message: Option[String],
|
||||||
|
charset: String,
|
||||||
|
newFileName: String,
|
||||||
|
oldFileName: Option[String]
|
||||||
|
)
|
||||||
|
|
||||||
|
case class DeleteForm(
|
||||||
|
branch: String,
|
||||||
|
path: String,
|
||||||
|
message: Option[String],
|
||||||
|
fileName: String
|
||||||
|
)
|
||||||
|
|
||||||
|
val editorForm = mapping(
|
||||||
|
"branch" -> trim(label("Branch", text(required))),
|
||||||
|
"path" -> trim(label("Path", text())),
|
||||||
|
"content" -> trim(label("Content", text(required))),
|
||||||
|
"message" -> trim(label("Message", optional(text()))),
|
||||||
|
"charset" -> trim(label("Charset", text(required))),
|
||||||
|
"newFileName" -> trim(label("Filename", text(required))),
|
||||||
|
"oldFileName" -> trim(label("Old filename", optional(text())))
|
||||||
|
)(EditorForm.apply)
|
||||||
|
|
||||||
|
val deleteForm = mapping(
|
||||||
|
"branch" -> trim(label("Branch", text(required))),
|
||||||
|
"path" -> trim(label("Path", text())),
|
||||||
|
"message" -> trim(label("Message", optional(text()))),
|
||||||
|
"fileName" -> trim(label("Filename", text(required)))
|
||||||
|
)(DeleteForm.apply)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns converted HTML from Markdown for preview.
|
* Returns converted HTML from Markdown for preview.
|
||||||
*/
|
*/
|
||||||
@@ -72,6 +109,68 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
get("/:owner/:repository/new/*")(collaboratorsOnly { repository =>
|
||||||
|
val (branch, path) = splitPath(repository, multiParams("splat").head)
|
||||||
|
repo.html.editor(branch, repository, if(path.length == 0) Nil else path.split("/").toList,
|
||||||
|
None, JGitUtil.ContentInfo("text", None, Some("UTF-8")))
|
||||||
|
})
|
||||||
|
|
||||||
|
get("/:owner/:repository/edit/*")(collaboratorsOnly { repository =>
|
||||||
|
val (branch, path) = splitPath(repository, multiParams("splat").head)
|
||||||
|
|
||||||
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
|
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(branch))
|
||||||
|
|
||||||
|
getPathObjectId(git, path, revCommit).map { objectId =>
|
||||||
|
val paths = path.split("/")
|
||||||
|
repo.html.editor(branch, repository, paths.take(paths.size - 1).toList, Some(paths.last),
|
||||||
|
JGitUtil.getContentInfo(git, path, objectId))
|
||||||
|
} getOrElse NotFound
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
get("/:owner/:repository/remove/*")(collaboratorsOnly { repository =>
|
||||||
|
val (branch, path) = splitPath(repository, multiParams("splat").head)
|
||||||
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
|
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(branch))
|
||||||
|
|
||||||
|
getPathObjectId(git, path, revCommit).map { objectId =>
|
||||||
|
val paths = path.split("/")
|
||||||
|
repo.html.delete(branch, repository, paths.take(paths.size - 1).toList, paths.last,
|
||||||
|
JGitUtil.getContentInfo(git, path, objectId))
|
||||||
|
} getOrElse NotFound
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
post("/:owner/:repository/create", editorForm)(collaboratorsOnly { (form, repository) =>
|
||||||
|
commitFile(repository, form.branch, form.path, Some(form.newFileName), None, form.content, form.charset,
|
||||||
|
form.message.getOrElse(s"Create ${form.newFileName}"))
|
||||||
|
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/blob/${form.branch}/${
|
||||||
|
if(form.path.length == 0) form.newFileName else s"${form.path}/${form.newFileName}"
|
||||||
|
}")
|
||||||
|
})
|
||||||
|
|
||||||
|
post("/:owner/:repository/update", editorForm)(collaboratorsOnly { (form, repository) =>
|
||||||
|
commitFile(repository, form.branch, form.path, Some(form.newFileName), form.oldFileName, form.content, form.charset,
|
||||||
|
if(form.oldFileName.exists(_ == form.newFileName)){
|
||||||
|
form.message.getOrElse(s"Update ${form.newFileName}")
|
||||||
|
} else {
|
||||||
|
form.message.getOrElse(s"Rename ${form.oldFileName.get} to ${form.newFileName}")
|
||||||
|
})
|
||||||
|
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/blob/${form.branch}/${
|
||||||
|
if(form.path.length == 0) form.newFileName else s"${form.path}/${form.newFileName}"
|
||||||
|
}")
|
||||||
|
})
|
||||||
|
|
||||||
|
post("/:owner/:repository/remove", deleteForm)(collaboratorsOnly { (form, repository) =>
|
||||||
|
commitFile(repository, form.branch, form.path, None, Some(form.fileName), "", "",
|
||||||
|
form.message.getOrElse(s"Delete ${form.fileName}"))
|
||||||
|
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/tree/${form.branch}${if(form.path.length == 0) "" else form.path}")
|
||||||
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the file content of the specified branch or commit.
|
* Displays the file content of the specified branch or commit.
|
||||||
*/
|
*/
|
||||||
@@ -81,19 +180,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
||||||
|
getPathObjectId(git, path, revCommit).map { objectId =>
|
||||||
@scala.annotation.tailrec
|
|
||||||
def getPathObjectId(path: String, walk: TreeWalk): Option[ObjectId] = walk.next match {
|
|
||||||
case true if(walk.getPathString == path) => Some(walk.getObjectId(0))
|
|
||||||
case true => getPathObjectId(path, walk)
|
|
||||||
case false => None
|
|
||||||
}
|
|
||||||
|
|
||||||
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
|
||||||
treeWalk.addTree(revCommit.getTree)
|
|
||||||
treeWalk.setRecursive(true)
|
|
||||||
getPathObjectId(path, treeWalk)
|
|
||||||
} map { objectId =>
|
|
||||||
if(raw){
|
if(raw){
|
||||||
// Download
|
// Download
|
||||||
defining(JGitUtil.getContentFromId(git, objectId, false).get){ bytes =>
|
defining(JGitUtil.getContentFromId(git, objectId, false).get){ bytes =>
|
||||||
@@ -101,25 +188,8 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
bytes
|
bytes
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Viewer
|
repo.html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId),
|
||||||
val large = FileUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize)
|
new JGitUtil.CommitInfo(revCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
val viewer = if(FileUtil.isImage(path)) "image" else if(large) "large" else "other"
|
|
||||||
val bytes = if(viewer == "other") JGitUtil.getContentFromId(git, objectId, false) else None
|
|
||||||
|
|
||||||
val content = if(viewer == "other"){
|
|
||||||
if(bytes.isDefined && FileUtil.isText(bytes.get)){
|
|
||||||
// text
|
|
||||||
JGitUtil.ContentInfo("text", bytes.map(StringUtil.convertFromByteArray))
|
|
||||||
} else {
|
|
||||||
// binary
|
|
||||||
JGitUtil.ContentInfo("binary", None)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// image or large
|
|
||||||
JGitUtil.ContentInfo(viewer, None)
|
|
||||||
}
|
|
||||||
|
|
||||||
repo.html.blob(id, repository, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit))
|
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
@@ -165,7 +235,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
val userName = context.loginAccount.get.userName
|
val userName = context.loginAccount.get.userName
|
||||||
if(repository.repository.defaultBranch != branchName){
|
if(repository.repository.defaultBranch != branchName){
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
git.branchDelete().setBranchNames(branchName).call()
|
git.branchDelete().setForce(true).setBranchNames(branchName).call()
|
||||||
recordDeleteBranchActivity(repository.owner, repository.name, userName, branchName)
|
recordDeleteBranchActivity(repository.owner, repository.name, userName, branchName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,7 +305,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
getRepository(
|
getRepository(
|
||||||
repository.repository.originUserName.getOrElse(repository.owner),
|
repository.repository.originUserName.getOrElse(repository.owner),
|
||||||
repository.repository.originRepositoryName.getOrElse(repository.name),
|
repository.repository.originRepositoryName.getOrElse(repository.name),
|
||||||
baseUrl),
|
context.baseUrl),
|
||||||
getForkedRepositories(
|
getForkedRepositories(
|
||||||
repository.repository.originUserName.getOrElse(repository.owner),
|
repository.repository.originUserName.getOrElse(repository.owner),
|
||||||
repository.repository.originRepositoryName.getOrElse(repository.name)),
|
repository.repository.originRepositoryName.getOrElse(repository.name)),
|
||||||
@@ -265,7 +335,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
*/
|
*/
|
||||||
private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = {
|
private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = {
|
||||||
if(repository.commitCount == 0){
|
if(repository.commitCount == 0){
|
||||||
repo.html.guide(repository)
|
repo.html.guide(repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
} else {
|
} else {
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
//val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head)
|
//val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head)
|
||||||
@@ -287,11 +357,77 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
repo.html.files(revision, repository,
|
repo.html.files(revision, repository,
|
||||||
if(path == ".") Nil else path.split("/").toList, // current path
|
if(path == ".") Nil else path.split("/").toList, // current path
|
||||||
new JGitUtil.CommitInfo(revCommit), // latest commit
|
new JGitUtil.CommitInfo(revCommit), // latest commit
|
||||||
files, readme)
|
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def commitFile(repository: service.RepositoryService.RepositoryInfo,
|
||||||
|
branch: String, path: String, newFileName: Option[String], oldFileName: Option[String],
|
||||||
|
content: String, charset: String, message: String) = {
|
||||||
|
|
||||||
|
val newPath = newFileName.map { newFileName => if(path.length == 0) newFileName else s"${path}/${newFileName}" }
|
||||||
|
val oldPath = oldFileName.map { oldFileName => if(path.length == 0) oldFileName else s"${path}/${oldFileName}" }
|
||||||
|
|
||||||
|
LockUtil.lock(s"${repository.owner}/${repository.name}"){
|
||||||
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
|
val loginAccount = context.loginAccount.get
|
||||||
|
val builder = DirCache.newInCore.builder()
|
||||||
|
val inserter = git.getRepository.newObjectInserter()
|
||||||
|
val headName = s"refs/heads/${branch}"
|
||||||
|
val headTip = git.getRepository.resolve(s"refs/heads/${branch}")
|
||||||
|
|
||||||
|
JGitUtil.processTree(git, headTip){ (path, tree) =>
|
||||||
|
if(!newPath.exists(_ == path) && !oldPath.exists(_ == path)){
|
||||||
|
builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newPath.foreach { newPath =>
|
||||||
|
builder.add(JGitUtil.createDirCacheEntry(newPath, FileMode.REGULAR_FILE,
|
||||||
|
inserter.insert(Constants.OBJ_BLOB, content.getBytes(charset))))
|
||||||
|
}
|
||||||
|
builder.finish()
|
||||||
|
|
||||||
|
val commitId = JGitUtil.createNewCommit(git, inserter, headTip, builder.getDirCache.writeTree(inserter),
|
||||||
|
loginAccount.fullName, loginAccount.mailAddress, message)
|
||||||
|
|
||||||
|
inserter.flush()
|
||||||
|
inserter.release()
|
||||||
|
|
||||||
|
// update refs
|
||||||
|
val refUpdate = git.getRepository.updateRef(headName)
|
||||||
|
refUpdate.setNewObjectId(commitId)
|
||||||
|
refUpdate.setForceUpdate(false)
|
||||||
|
refUpdate.setRefLogIdent(new PersonIdent(loginAccount.fullName, loginAccount.mailAddress))
|
||||||
|
//refUpdate.setRefLogMessage("merged", true)
|
||||||
|
refUpdate.update()
|
||||||
|
|
||||||
|
// record activity
|
||||||
|
recordPushActivity(repository.owner, repository.name, loginAccount.userName, branch,
|
||||||
|
List(new CommitInfo(JGitUtil.getRevCommitFromId(git, commitId))))
|
||||||
|
|
||||||
|
// TODO invoke hook
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private def getPathObjectId(git: Git, path: String, revCommit: RevCommit): Option[ObjectId] = {
|
||||||
|
@scala.annotation.tailrec
|
||||||
|
def _getPathObjectId(path: String, walk: TreeWalk): Option[ObjectId] = walk.next match {
|
||||||
|
case true if(walk.getPathString == path) => Some(walk.getObjectId(0))
|
||||||
|
case true => _getPathObjectId(path, walk)
|
||||||
|
case false => None
|
||||||
|
}
|
||||||
|
|
||||||
|
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
||||||
|
treeWalk.addTree(revCommit.getTree)
|
||||||
|
treeWalk.setRecursive(true)
|
||||||
|
_getPathObjectId(path, treeWalk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,12 +13,6 @@ object Activities extends Table[Activity]("ACTIVITY") with BasicTemplate {
|
|||||||
def autoInc = userName ~ repositoryName ~ activityUserName ~ activityType ~ message ~ additionalInfo.? ~ activityDate returning activityId
|
def autoInc = userName ~ repositoryName ~ activityUserName ~ activityType ~ message ~ additionalInfo.? ~ activityDate returning activityId
|
||||||
}
|
}
|
||||||
|
|
||||||
object CommitLog extends Table[(String, String, String)]("COMMIT_LOG") with BasicTemplate {
|
|
||||||
def commitId = column[String]("COMMIT_ID")
|
|
||||||
def * = userName ~ repositoryName ~ commitId
|
|
||||||
def byPrimaryKey(userName: String, repositoryName: String, commitId: String) = byRepository(userName, repositoryName) && (this.commitId is commitId.bind)
|
|
||||||
}
|
|
||||||
|
|
||||||
case class Activity(
|
case class Activity(
|
||||||
activityId: Int,
|
activityId: Int,
|
||||||
userName: String,
|
userName: String,
|
||||||
|
|||||||
@@ -153,19 +153,6 @@ trait ActivityService {
|
|||||||
Some(message),
|
Some(message),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def insertCommitId(userName: String, repositoryName: String, commitId: String) = {
|
|
||||||
CommitLog insert (userName, repositoryName, commitId)
|
|
||||||
}
|
|
||||||
|
|
||||||
def insertAllCommitIds(userName: String, repositoryName: String, commitIds: List[String]) =
|
|
||||||
CommitLog insertAll (commitIds.map(commitId => (userName, repositoryName, commitId)): _*)
|
|
||||||
|
|
||||||
def getAllCommitIds(userName: String, repositoryName: String): List[String] =
|
|
||||||
Query(CommitLog).filter(_.byRepository(userName, repositoryName)).map(_.commitId).list
|
|
||||||
|
|
||||||
def existsCommitId(userName: String, repositoryName: String, commitId: String): Boolean =
|
|
||||||
Query(CommitLog).filter(_.byPrimaryKey(userName, repositoryName, commitId)).firstOption.isDefined
|
|
||||||
|
|
||||||
private def cut(value: String, length: Int): String =
|
private def cut(value: String, length: Int): String =
|
||||||
if(value.length > length) value.substring(0, length) + "..." else value
|
if(value.length > length) value.substring(0, length) + "..." else value
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package service
|
|||||||
import scala.slick.driver.H2Driver.simple._
|
import scala.slick.driver.H2Driver.simple._
|
||||||
import Database.threadLocalSession
|
import Database.threadLocalSession
|
||||||
import model._
|
import model._
|
||||||
import util.ControlUtil._
|
|
||||||
|
|
||||||
trait PullRequestService { self: IssuesService =>
|
trait PullRequestService { self: IssuesService =>
|
||||||
import PullRequestService._
|
import PullRequestService._
|
||||||
@@ -15,8 +14,10 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def updateCommitIdTo(owner: String, repository: String, issueId: Int, commitIdTo: String): Unit =
|
def updateCommitId(owner: String, repository: String, issueId: Int, commitIdTo: String, commitIdFrom: String): Unit =
|
||||||
Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).map(_.commitIdTo).update(commitIdTo)
|
Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId))
|
||||||
|
.map(pr => pr.commitIdTo ~ pr.commitIdFrom)
|
||||||
|
.update((commitIdTo, commitIdFrom))
|
||||||
|
|
||||||
def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] =
|
def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] =
|
||||||
Query(PullRequests)
|
Query(PullRequests)
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ trait RepositoryService { self: AccountService =>
|
|||||||
val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val commitLog = Query(CommitLog ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
|
||||||
val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
|
||||||
Repositories.filter { t =>
|
Repositories.filter { t =>
|
||||||
@@ -78,7 +77,6 @@ trait RepositoryService { self: AccountService =>
|
|||||||
Labels .insertAll(labels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
Labels .insertAll(labels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
IssueLabels .insertAll(issueLabels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
IssueLabels .insertAll(issueLabels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
Collaborators .insertAll(collaborators .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
Collaborators .insertAll(collaborators .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
CommitLog .insertAll(commitLog .map(_.copy(_1 = newUserName, _2 = newRepositoryName)) :_*)
|
|
||||||
Activities .insertAll(activities .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
Activities .insertAll(activities .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
|
||||||
// Update activity messages
|
// Update activity messages
|
||||||
@@ -102,7 +100,6 @@ trait RepositoryService { self: AccountService =>
|
|||||||
|
|
||||||
def deleteRepository(userName: String, repositoryName: String): Unit = {
|
def deleteRepository(userName: String, repositoryName: String): Unit = {
|
||||||
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
CommitLog .filter(_.byRepository(userName, repositoryName)).delete
|
|
||||||
Collaborators .filter(_.byRepository(userName, repositoryName)).delete
|
Collaborators .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
IssueLabels .filter(_.byRepository(userName, repositoryName)).delete
|
IssueLabels .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
Labels .filter(_.byRepository(userName, repositoryName)).delete
|
Labels .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
|
|||||||
@@ -7,11 +7,7 @@ import javax.servlet.http.HttpServletRequest
|
|||||||
|
|
||||||
trait SystemSettingsService {
|
trait SystemSettingsService {
|
||||||
|
|
||||||
def baseUrl(implicit request: HttpServletRequest): String = loadSystemSettings().baseUrl.getOrElse {
|
def baseUrl(implicit request: HttpServletRequest): String = loadSystemSettings().baseUrl(request)
|
||||||
defining(request.getRequestURL.toString){ url =>
|
|
||||||
url.substring(0, url.length - (request.getRequestURI.length - request.getContextPath.length))
|
|
||||||
}
|
|
||||||
}.replaceFirst("/$", "")
|
|
||||||
|
|
||||||
def saveSystemSettings(settings: SystemSettings): Unit = {
|
def saveSystemSettings(settings: SystemSettings): Unit = {
|
||||||
defining(new java.util.Properties()){ props =>
|
defining(new java.util.Properties()){ props =>
|
||||||
@@ -110,7 +106,13 @@ object SystemSettingsService {
|
|||||||
sshPort: Option[Int],
|
sshPort: Option[Int],
|
||||||
smtp: Option[Smtp],
|
smtp: Option[Smtp],
|
||||||
ldapAuthentication: Boolean,
|
ldapAuthentication: Boolean,
|
||||||
ldap: Option[Ldap])
|
ldap: Option[Ldap]){
|
||||||
|
def baseUrl(request: HttpServletRequest): String = baseUrl.getOrElse {
|
||||||
|
defining(request.getRequestURL.toString){ url =>
|
||||||
|
url.substring(0, url.length - (request.getRequestURI.length - request.getContextPath.length))
|
||||||
|
}
|
||||||
|
}.replaceFirst("/$", "")
|
||||||
|
}
|
||||||
|
|
||||||
case class Ldap(
|
case class Ldap(
|
||||||
host: String,
|
host: String,
|
||||||
|
|||||||
@@ -175,19 +175,11 @@ trait WikiService {
|
|||||||
val inserter = git.getRepository.newObjectInserter()
|
val inserter = git.getRepository.newObjectInserter()
|
||||||
val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}")
|
val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}")
|
||||||
|
|
||||||
using(new RevWalk(git.getRepository)){ revWalk =>
|
JGitUtil.processTree(git, headId){ (path, tree) =>
|
||||||
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
|
||||||
val index = treeWalk.addTree(revWalk.parseTree(headId))
|
|
||||||
treeWalk.setRecursive(true)
|
|
||||||
while(treeWalk.next){
|
|
||||||
val path = treeWalk.getPathString
|
|
||||||
val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser])
|
|
||||||
if(revertInfo.find(x => x.filePath == path).isEmpty){
|
if(revertInfo.find(x => x.filePath == path).isEmpty){
|
||||||
builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId))
|
builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
revertInfo.filter(_.operation == "ADD").foreach { x =>
|
revertInfo.filter(_.operation == "ADD").foreach { x =>
|
||||||
builder.add(JGitUtil.createDirCacheEntry(x.filePath, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, x.source.getBytes("UTF-8"))))
|
builder.add(JGitUtil.createDirCacheEntry(x.filePath, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, x.source.getBytes("UTF-8"))))
|
||||||
@@ -226,13 +218,7 @@ trait WikiService {
|
|||||||
var removed = false
|
var removed = false
|
||||||
|
|
||||||
if(headId != null){
|
if(headId != null){
|
||||||
using(new RevWalk(git.getRepository)){ revWalk =>
|
JGitUtil.processTree(git, headId){ (path, tree) =>
|
||||||
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
|
||||||
val index = treeWalk.addTree(revWalk.parseTree(headId))
|
|
||||||
treeWalk.setRecursive(true)
|
|
||||||
while(treeWalk.next){
|
|
||||||
val path = treeWalk.getPathString
|
|
||||||
val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser])
|
|
||||||
if(path == currentPageName + ".md" && currentPageName != newPageName){
|
if(path == currentPageName + ".md" && currentPageName != newPageName){
|
||||||
removed = true
|
removed = true
|
||||||
} else if(path != newPageName + ".md"){
|
} else if(path != newPageName + ".md"){
|
||||||
@@ -243,8 +229,6 @@ trait WikiService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(created || updated || removed){
|
if(created || updated || removed){
|
||||||
builder.add(JGitUtil.createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8"))))
|
builder.add(JGitUtil.createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8"))))
|
||||||
@@ -262,7 +246,7 @@ trait WikiService {
|
|||||||
message
|
message
|
||||||
})
|
})
|
||||||
|
|
||||||
Some(newHeadId)
|
Some(newHeadId.getName)
|
||||||
} else None
|
} else None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -280,21 +264,13 @@ trait WikiService {
|
|||||||
val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}")
|
val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}")
|
||||||
var removed = false
|
var removed = false
|
||||||
|
|
||||||
using(new RevWalk(git.getRepository)){ revWalk =>
|
JGitUtil.processTree(git, headId){ (path, tree) =>
|
||||||
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
|
||||||
val index = treeWalk.addTree(revWalk.parseTree(headId))
|
|
||||||
treeWalk.setRecursive(true)
|
|
||||||
while(treeWalk.next){
|
|
||||||
val path = treeWalk.getPathString
|
|
||||||
val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser])
|
|
||||||
if(path != pageName + ".md"){
|
if(path != pageName + ".md"){
|
||||||
builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId))
|
builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId))
|
||||||
} else {
|
} else {
|
||||||
removed = true
|
removed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(removed){
|
if(removed){
|
||||||
builder.finish()
|
builder.finish()
|
||||||
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer, mailAddress, message)
|
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer, mailAddress, message)
|
||||||
@@ -302,6 +278,5 @@ trait WikiService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ object AutoUpdate {
|
|||||||
* The history of versions. A head of this sequence is the current BitBucket version.
|
* The history of versions. A head of this sequence is the current BitBucket version.
|
||||||
*/
|
*/
|
||||||
val versions = Seq(
|
val versions = Seq(
|
||||||
|
Version(1, 13),
|
||||||
Version(1, 12),
|
Version(1, 12),
|
||||||
Version(1, 11),
|
Version(1, 11),
|
||||||
Version(1, 10),
|
Version(1, 10),
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package servlet
|
|||||||
import javax.servlet._
|
import javax.servlet._
|
||||||
import javax.servlet.http._
|
import javax.servlet.http._
|
||||||
import service.{SystemSettingsService, AccountService, RepositoryService}
|
import service.{SystemSettingsService, AccountService, RepositoryService}
|
||||||
|
import model.Account
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import util.Implicits._
|
import util.Implicits._
|
||||||
import util.ControlUtil._
|
import util.ControlUtil._
|
||||||
@@ -38,10 +39,13 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
|
|||||||
request.getHeader("Authorization") match {
|
request.getHeader("Authorization") match {
|
||||||
case null => requireAuth(response)
|
case null => requireAuth(response)
|
||||||
case auth => decodeAuthHeader(auth).split(":") match {
|
case auth => decodeAuthHeader(auth).split(":") match {
|
||||||
case Array(username, password) if(isWritableUser(username, password, repository)) => {
|
case Array(username, password) => getWritableUser(username, password, repository) match {
|
||||||
request.setAttribute(Keys.Request.UserName, username)
|
case Some(account) => {
|
||||||
|
request.setAttribute(Keys.Request.UserName, account.userName)
|
||||||
chain.doFilter(req, wrappedResponse)
|
chain.doFilter(req, wrappedResponse)
|
||||||
}
|
}
|
||||||
|
case None => requireAuth(response)
|
||||||
|
}
|
||||||
case _ => requireAuth(response)
|
case _ => requireAuth(response)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,10 +65,10 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def isWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo): Boolean =
|
private def getWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo): Option[Account] =
|
||||||
authenticate(loadSystemSettings(), username, password) match {
|
authenticate(loadSystemSettings(), username, password) match {
|
||||||
case Some(account) => hasWritePermission(repository.owner, repository.name, Some(account))
|
case x @ Some(account) if(hasWritePermission(repository.owner, repository.name, x)) => x
|
||||||
case None => false
|
case _ => None
|
||||||
}
|
}
|
||||||
|
|
||||||
private def requireAuth(response: HttpServletResponse): Unit = {
|
private def requireAuth(response: HttpServletResponse): Unit = {
|
||||||
|
|||||||
@@ -81,7 +81,9 @@ class GitBucketReceivePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
logger.debug("repository:" + owner + "/" + repository)
|
logger.debug("repository:" + owner + "/" + repository)
|
||||||
|
|
||||||
if(!repository.endsWith(".wiki")){
|
if(!repository.endsWith(".wiki")){
|
||||||
receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, pusher, baseUrl(request)))
|
val hook = new CommitLogHook(owner, repository, pusher, baseUrl(request))
|
||||||
|
receivePack.setPreReceiveHook(hook)
|
||||||
|
receivePack.setPostReceiveHook(hook)
|
||||||
}
|
}
|
||||||
receivePack
|
receivePack
|
||||||
}
|
}
|
||||||
@@ -90,10 +92,24 @@ class GitBucketReceivePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
|
|
||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
|
|
||||||
class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl: String) extends PostReceiveHook
|
class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl: String) extends PostReceiveHook with PreReceiveHook
|
||||||
with RepositoryService with AccountService with IssuesService with ActivityService with PullRequestService with WebHookService {
|
with RepositoryService with AccountService with IssuesService with ActivityService with PullRequestService with WebHookService {
|
||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
||||||
|
private var existIds: Seq[String] = Nil
|
||||||
|
|
||||||
|
def onPreReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = {
|
||||||
|
try {
|
||||||
|
using(Git.open(Directory.getRepositoryDir(owner, repository))) { git =>
|
||||||
|
existIds = JGitUtil.getAllCommitIds(git)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
case ex: Exception => {
|
||||||
|
logger.error(ex.toString, ex)
|
||||||
|
throw ex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = {
|
def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = {
|
||||||
try {
|
try {
|
||||||
@@ -117,29 +133,14 @@ class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl:
|
|||||||
countIssue(IssueSearchCondition(state = "closed"), Map.empty, false, owner -> repository)
|
countIssue(IssueSearchCondition(state = "closed"), Map.empty, false, owner -> repository)
|
||||||
|
|
||||||
// Extract new commit and apply issue comment
|
// Extract new commit and apply issue comment
|
||||||
val newCommits = if(commits.size > 1000){
|
val newCommits = commits.flatMap { commit =>
|
||||||
val existIds = getAllCommitIds(owner, repository)
|
if (!existIds.contains(commit.id)) {
|
||||||
commits.flatMap { commit =>
|
if (issueCount > 0) {
|
||||||
if(!existIds.contains(commit.id)){
|
|
||||||
if(issueCount > 0) {
|
|
||||||
createIssueComment(commit)
|
createIssueComment(commit)
|
||||||
}
|
}
|
||||||
Some(commit)
|
Some(commit)
|
||||||
} else None
|
} else None
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
commits.flatMap { commit =>
|
|
||||||
if(!existsCommitId(owner, repository, commit.id)){
|
|
||||||
if(issueCount > 0) {
|
|
||||||
createIssueComment(commit)
|
|
||||||
}
|
|
||||||
Some(commit)
|
|
||||||
} else None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// batch insert all new commit id
|
|
||||||
insertAllCommitIds(owner, repository, newCommits.map(_.id))
|
|
||||||
|
|
||||||
// record activity
|
// record activity
|
||||||
if(refName(1) == "heads"){
|
if(refName(1) == "heads"){
|
||||||
@@ -217,14 +218,18 @@ class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl:
|
|||||||
private def updatePullRequests(branch: String) =
|
private def updatePullRequests(branch: String) =
|
||||||
getPullRequestsByRequest(owner, repository, branch, false).foreach { pullreq =>
|
getPullRequestsByRequest(owner, repository, branch, false).foreach { pullreq =>
|
||||||
if(getRepository(pullreq.userName, pullreq.repositoryName, baseUrl).isDefined){
|
if(getRepository(pullreq.userName, pullreq.repositoryName, baseUrl).isDefined){
|
||||||
using(Git.open(Directory.getRepositoryDir(pullreq.userName, pullreq.repositoryName))){ git =>
|
using(Git.open(Directory.getRepositoryDir(pullreq.userName, pullreq.repositoryName)),
|
||||||
git.fetch
|
Git.open(Directory.getRepositoryDir(pullreq.requestUserName, pullreq.requestRepositoryName))){ (oldGit, newGit) =>
|
||||||
|
oldGit.fetch
|
||||||
.setRemote(Directory.getRepositoryDir(owner, repository).toURI.toString)
|
.setRemote(Directory.getRepositoryDir(owner, repository).toURI.toString)
|
||||||
.setRefSpecs(new RefSpec(s"refs/heads/${branch}:refs/pull/${pullreq.issueId}/head").setForceUpdate(true))
|
.setRefSpecs(new RefSpec(s"refs/heads/${branch}:refs/pull/${pullreq.issueId}/head").setForceUpdate(true))
|
||||||
.call
|
.call
|
||||||
|
|
||||||
val commitIdTo = git.getRepository.resolve(s"refs/pull/${pullreq.issueId}/head").getName
|
val commitIdTo = oldGit.getRepository.resolve(s"refs/pull/${pullreq.issueId}/head").getName
|
||||||
updateCommitIdTo(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo)
|
val commitIdFrom = JGitUtil.getForkedCommitId(oldGit, newGit,
|
||||||
|
pullreq.userName, pullreq.repositoryName, pullreq.branch,
|
||||||
|
pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)
|
||||||
|
updateCommitId(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo, commitIdFrom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
package servlet
|
package servlet
|
||||||
|
|
||||||
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
|
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
|
||||||
import app.FileUploadControllerBase
|
import org.apache.commons.io.FileUtils
|
||||||
|
import util.Directory._
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes session associated temporary files when session is destroyed.
|
* Removes session associated temporary files when session is destroyed.
|
||||||
*/
|
*/
|
||||||
class SessionCleanupListener extends HttpSessionListener with FileUploadControllerBase {
|
class SessionCleanupListener extends HttpSessionListener {
|
||||||
|
|
||||||
def sessionCreated(se: HttpSessionEvent): Unit = {}
|
def sessionCreated(se: HttpSessionEvent): Unit = {}
|
||||||
|
|
||||||
def sessionDestroyed(se: HttpSessionEvent): Unit = removeTemporaryFiles()(se.getSession)
|
def sessionDestroyed(se: HttpSessionEvent): Unit = FileUtils.deleteDirectory(getTemporaryDir(se.getSession.getId))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,9 @@ class GitReceivePack(context: ServletContext, owner: String, repoName: String, b
|
|||||||
val repository = git.getRepository
|
val repository = git.getRepository
|
||||||
val receive = new ReceivePack(repository)
|
val receive = new ReceivePack(repository)
|
||||||
if(!repoName.endsWith(".wiki")){
|
if(!repoName.endsWith(".wiki")){
|
||||||
receive.setPostReceiveHook(new CommitLogHook(owner, repoName, user, baseUrl))
|
val hook = new CommitLogHook(owner, repoName, user, baseUrl)
|
||||||
|
receive.setPreReceiveHook(hook)
|
||||||
|
receive.setPostReceiveHook(hook)
|
||||||
}
|
}
|
||||||
receive.receive(in, out, err)
|
receive.receive(in, out, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,15 +37,4 @@ object ControlUtil {
|
|||||||
def using[T](treeWalk: TreeWalk)(f: TreeWalk => T): T =
|
def using[T](treeWalk: TreeWalk)(f: TreeWalk => T): T =
|
||||||
try f(treeWalk) finally treeWalk.release()
|
try f(treeWalk) finally treeWalk.release()
|
||||||
|
|
||||||
|
|
||||||
// def withTmpRefSpec[T](ref: RefSpec, git: Git)(f: RefSpec => T): T = {
|
|
||||||
// try {
|
|
||||||
// f(ref)
|
|
||||||
// } finally {
|
|
||||||
// val refUpdate = git.getRepository.updateRef(ref.getDestination)
|
|
||||||
// refUpdate.setForceUpdate(true)
|
|
||||||
// refUpdate.delete()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,31 +34,29 @@ object Directory {
|
|||||||
|
|
||||||
val DatabaseHome = s"${GitBucketHome}/data"
|
val DatabaseHome = s"${GitBucketHome}/data"
|
||||||
|
|
||||||
/**
|
|
||||||
* Repository names of the specified user.
|
|
||||||
*/
|
|
||||||
def getRepositories(owner: String): List[String] =
|
|
||||||
defining(new File(s"${RepositoryHome}/${owner}")){ dir =>
|
|
||||||
if(dir.exists){
|
|
||||||
dir.listFiles.filter { file =>
|
|
||||||
file.isDirectory && !file.getName.endsWith(".wiki.git")
|
|
||||||
}.map(_.getName.replaceFirst("\\.git$", "")).toList
|
|
||||||
} else {
|
|
||||||
Nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Substance directory of the repository.
|
* Substance directory of the repository.
|
||||||
*/
|
*/
|
||||||
def getRepositoryDir(owner: String, repository: String): File =
|
def getRepositoryDir(owner: String, repository: String): File =
|
||||||
new File(s"${RepositoryHome}/${owner}/${repository}.git")
|
new File(s"${RepositoryHome}/${owner}/${repository}.git")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directory for files which are attached to issue.
|
||||||
|
*/
|
||||||
|
def getAttachedDir(owner: String, repository: String): File =
|
||||||
|
new File(s"${RepositoryHome}/${owner}/${repository}/issues")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directory for uploaded files by the specified user.
|
* Directory for uploaded files by the specified user.
|
||||||
*/
|
*/
|
||||||
def getUserUploadDir(userName: String): File = new File(s"${GitBucketHome}/data/${userName}/files")
|
def getUserUploadDir(userName: String): File = new File(s"${GitBucketHome}/data/${userName}/files")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Root of temporary directories for the upload file.
|
||||||
|
*/
|
||||||
|
def getTemporaryDir(sessionId: String): File =
|
||||||
|
new File(s"${GitBucketHome}/tmp/_upload/${sessionId}")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Root of temporary directories for the specified repository.
|
* Root of temporary directories for the specified repository.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,9 +4,14 @@ import org.apache.commons.io.FileUtils
|
|||||||
import java.net.URLConnection
|
import java.net.URLConnection
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import util.ControlUtil._
|
import util.ControlUtil._
|
||||||
|
import scala.util.Random
|
||||||
|
import eu.medsea.mimeutil.{MimeUtil2, MimeType}
|
||||||
|
|
||||||
object FileUtil {
|
object FileUtil {
|
||||||
|
|
||||||
|
private val mimeUtil = new MimeUtil2()
|
||||||
|
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector")
|
||||||
|
|
||||||
def getMimeType(name: String): String =
|
def getMimeType(name: String): String =
|
||||||
defining(URLConnection.getFileNameMap()){ fileNameMap =>
|
defining(URLConnection.getFileNameMap()){ fileNameMap =>
|
||||||
fileNameMap.getContentTypeFor(name) match {
|
fileNameMap.getContentTypeFor(name) match {
|
||||||
@@ -15,6 +20,16 @@ object FileUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns mime type detected by file content.
|
||||||
|
*
|
||||||
|
* @param file File object
|
||||||
|
* @return mime type String
|
||||||
|
*/
|
||||||
|
def getMimeType(file: File): String = {
|
||||||
|
MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file, new MimeType("application/octet-stream"))).toString
|
||||||
|
}
|
||||||
|
|
||||||
def getContentType(name: String, bytes: Array[Byte]): String = {
|
def getContentType(name: String, bytes: Array[Byte]): String = {
|
||||||
defining(getMimeType(name)){ mimeType =>
|
defining(getMimeType(name)){ mimeType =>
|
||||||
if(mimeType == "application/octet-stream" && isText(bytes)){
|
if(mimeType == "application/octet-stream" && isText(bytes)){
|
||||||
@@ -31,27 +46,7 @@ object FileUtil {
|
|||||||
|
|
||||||
def isText(content: Array[Byte]): Boolean = !content.contains(0)
|
def isText(content: Array[Byte]): Boolean = !content.contains(0)
|
||||||
|
|
||||||
// def createZipFile(dest: File, dir: File): Unit = {
|
def generateFileId: String = System.currentTimeMillis + Random.alphanumeric.take(10).mkString
|
||||||
// def addDirectoryToZip(out: ZipArchiveOutputStream, dir: File, path: String): Unit = {
|
|
||||||
// dir.listFiles.map { file =>
|
|
||||||
// if(file.isFile){
|
|
||||||
// out.putArchiveEntry(new ZipArchiveEntry(path + "/" + file.getName))
|
|
||||||
// out.write(FileUtils.readFileToByteArray(file))
|
|
||||||
// out.closeArchiveEntry
|
|
||||||
// } else if(file.isDirectory){
|
|
||||||
// addDirectoryToZip(out, file, path + "/" + file.getName)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// using(new ZipArchiveOutputStream(dest)){ out =>
|
|
||||||
// addDirectoryToZip(out, dir, dir.getName)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
def getFileName(path: String): String = defining(path.lastIndexOf('/')){ i =>
|
|
||||||
if(i >= 0) path.substring(i + 1) else path
|
|
||||||
}
|
|
||||||
|
|
||||||
def getExtension(name: String): String =
|
def getExtension(name: String): String =
|
||||||
name.lastIndexOf('.') match {
|
name.lastIndexOf('.') match {
|
||||||
|
|||||||
@@ -92,8 +92,9 @@ object JGitUtil {
|
|||||||
*
|
*
|
||||||
* @param viewType "image", "large" or "other"
|
* @param viewType "image", "large" or "other"
|
||||||
* @param content the string content
|
* @param content the string content
|
||||||
|
* @param charset the character encoding
|
||||||
*/
|
*/
|
||||||
case class ContentInfo(viewType: String, content: Option[String])
|
case class ContentInfo(viewType: String, content: Option[String], charset: Option[String])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tag data.
|
* The tag data.
|
||||||
@@ -137,7 +138,7 @@ object JGitUtil {
|
|||||||
using(Git.open(getRepositoryDir(owner, repository))){ git =>
|
using(Git.open(getRepositoryDir(owner, repository))){ git =>
|
||||||
try {
|
try {
|
||||||
// get commit count
|
// get commit count
|
||||||
val commitCount = git.log.all.call.iterator.asScala.map(_ => 1).take(10000).sum
|
val commitCount = git.log.all.call.iterator.asScala.map(_ => 1).take(10001).sum
|
||||||
|
|
||||||
RepositoryInfo(
|
RepositoryInfo(
|
||||||
owner, repository, s"${baseUrl}/git/${owner}/${repository}.git",
|
owner, repository, s"${baseUrl}/git/${owner}/${repository}.git",
|
||||||
@@ -480,7 +481,7 @@ object JGitUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId,
|
def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId,
|
||||||
fullName: String, mailAddress: String, message: String): String = {
|
fullName: String, mailAddress: String, message: String): ObjectId = {
|
||||||
val newCommit = new CommitBuilder()
|
val newCommit = new CommitBuilder()
|
||||||
newCommit.setCommitter(new PersonIdent(fullName, mailAddress))
|
newCommit.setCommitter(new PersonIdent(fullName, mailAddress))
|
||||||
newCommit.setAuthor(new PersonIdent(fullName, mailAddress))
|
newCommit.setAuthor(new PersonIdent(fullName, mailAddress))
|
||||||
@@ -498,7 +499,7 @@ object JGitUtil {
|
|||||||
refUpdate.setNewObjectId(newHeadId)
|
refUpdate.setNewObjectId(newHeadId)
|
||||||
refUpdate.update()
|
refUpdate.update()
|
||||||
|
|
||||||
newHeadId.getName
|
newHeadId
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -549,6 +550,26 @@ object JGitUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getContentInfo(git: Git, path: String, objectId: ObjectId): ContentInfo = {
|
||||||
|
// Viewer
|
||||||
|
val large = FileUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize)
|
||||||
|
val viewer = if(FileUtil.isImage(path)) "image" else if(large) "large" else "other"
|
||||||
|
val bytes = if(viewer == "other") JGitUtil.getContentFromId(git, objectId, false) else None
|
||||||
|
|
||||||
|
if(viewer == "other"){
|
||||||
|
if(bytes.isDefined && FileUtil.isText(bytes.get)){
|
||||||
|
// text
|
||||||
|
ContentInfo("text", Some(StringUtil.convertFromByteArray(bytes.get)), Some(StringUtil.detectEncoding(bytes.get)))
|
||||||
|
} else {
|
||||||
|
// binary
|
||||||
|
ContentInfo("binary", None, None)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// image or large
|
||||||
|
ContentInfo(viewer, None, None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get object content of the given object id as byte array from the Git repository.
|
* Get object content of the given object id as byte array from the Git repository.
|
||||||
*
|
*
|
||||||
@@ -570,4 +591,42 @@ object JGitUtil {
|
|||||||
case e: MissingObjectException => None
|
case e: MissingObjectException => None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all commit id in the specified repository.
|
||||||
|
*/
|
||||||
|
def getAllCommitIds(git: Git): Seq[String] = if(isEmpty(git)) {
|
||||||
|
Nil
|
||||||
|
} else {
|
||||||
|
val existIds = new scala.collection.mutable.ListBuffer[String]()
|
||||||
|
val i = git.log.all.call.iterator
|
||||||
|
while(i.hasNext){
|
||||||
|
existIds += i.next.name
|
||||||
|
}
|
||||||
|
existIds.toSeq
|
||||||
|
}
|
||||||
|
|
||||||
|
def processTree(git: Git, id: ObjectId)(f: (String, CanonicalTreeParser) => Unit) = {
|
||||||
|
using(new RevWalk(git.getRepository)){ revWalk =>
|
||||||
|
using(new TreeWalk(git.getRepository)){ treeWalk =>
|
||||||
|
val index = treeWalk.addTree(revWalk.parseTree(id))
|
||||||
|
treeWalk.setRecursive(true)
|
||||||
|
while(treeWalk.next){
|
||||||
|
f(treeWalk.getPathString, treeWalk.getTree(index, classOf[CanonicalTreeParser]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the identifier of the root commit (or latest merge commit) of the specified branch.
|
||||||
|
*/
|
||||||
|
def getForkedCommitId(oldGit: Git, newGit: Git,
|
||||||
|
userName: String, repositoryName: String, branch: String,
|
||||||
|
requestUserName: String, requestRepositoryName: String, requestBranch: String): String =
|
||||||
|
defining(getAllCommitIds(oldGit)){ existIds =>
|
||||||
|
getCommitLogs(newGit, requestBranch, true) { commit =>
|
||||||
|
existIds.contains(commit.name) && getBranchesOfCommit(oldGit, commit.getName).contains(branch)
|
||||||
|
}.head.id
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
package view
|
|
||||||
|
|
||||||
import org.asciidoctor.Asciidoctor
|
|
||||||
import org.asciidoctor.AttributesBuilder
|
|
||||||
import org.asciidoctor.OptionsBuilder
|
|
||||||
import org.asciidoctor.SafeMode
|
|
||||||
import org.htmlcleaner.HtmlCleaner
|
|
||||||
import org.htmlcleaner.HtmlNode
|
|
||||||
import org.htmlcleaner.SimpleHtmlSerializer
|
|
||||||
import org.htmlcleaner.TagNode
|
|
||||||
import org.htmlcleaner.TagNodeVisitor
|
|
||||||
|
|
||||||
object Asciidoc {
|
|
||||||
|
|
||||||
private[this] lazy val asciidoctor = Asciidoctor.Factory.create()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts Markdown of Wiki pages to HTML.
|
|
||||||
*/
|
|
||||||
def toHtml(filePath: List[String], asciidoc: String, branch: String, repository: service.RepositoryService.RepositoryInfo,
|
|
||||||
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): String = {
|
|
||||||
|
|
||||||
val options = OptionsBuilder.options()
|
|
||||||
options.safe(SafeMode.SECURE)
|
|
||||||
val attributes = AttributesBuilder.attributes()
|
|
||||||
attributes.showTitle(true)
|
|
||||||
options.attributes(attributes.get())
|
|
||||||
val rendered = asciidoctor.render(asciidoc, options)
|
|
||||||
|
|
||||||
val path = filePath.reverse.tail.reverse match {
|
|
||||||
case Nil => ""
|
|
||||||
case p => p.mkString("", "/", "/")
|
|
||||||
}
|
|
||||||
val relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/${path}"
|
|
||||||
prefixRelativeUrls(rendered, relativeUrlPrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
private[this] val exceptionPrefixes = Seq("#", "/", "http://", "https://")
|
|
||||||
|
|
||||||
def prefixRelativeUrls(html: String, urlPrefix: String): String = {
|
|
||||||
val cleaner = new HtmlCleaner()
|
|
||||||
val node = cleaner.clean(html)
|
|
||||||
node.traverse(new TagNodeVisitor() {
|
|
||||||
override def visit(tagNode: TagNode, htmlNode: HtmlNode): Boolean = {
|
|
||||||
htmlNode match {
|
|
||||||
case tag: TagNode if tag.getName == "a" =>
|
|
||||||
Option(tag.getAttributeByName("href")) foreach { href =>
|
|
||||||
if (exceptionPrefixes.forall(p => !href.startsWith(p))) {
|
|
||||||
tag.addAttribute("href", s"${urlPrefix}${href}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
// continue traversal
|
|
||||||
true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
new SimpleHtmlSerializer(cleaner.getProperties()).getAsString(node)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ trait AvatarImageProvider { self: RequestCache =>
|
|||||||
// by user name
|
// by user name
|
||||||
getAccountByUserName(userName).map { account =>
|
getAccountByUserName(userName).map { account =>
|
||||||
if(account.image.isEmpty && context.settings.gravatar){
|
if(account.image.isEmpty && context.settings.gravatar){
|
||||||
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}"""
|
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}&d=retro&r=g"""
|
||||||
} else {
|
} else {
|
||||||
s"""${context.path}/${account.userName}/_avatar"""
|
s"""${context.path}/${account.userName}/_avatar"""
|
||||||
}
|
}
|
||||||
@@ -28,13 +28,13 @@ trait AvatarImageProvider { self: RequestCache =>
|
|||||||
// by mail address
|
// by mail address
|
||||||
getAccountByMailAddress(mailAddress).map { account =>
|
getAccountByMailAddress(mailAddress).map { account =>
|
||||||
if(account.image.isEmpty && context.settings.gravatar){
|
if(account.image.isEmpty && context.settings.gravatar){
|
||||||
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}"""
|
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}&d=retro&r=g"""
|
||||||
} else {
|
} else {
|
||||||
s"""${context.path}/${account.userName}/_avatar"""
|
s"""${context.path}/${account.userName}/_avatar"""
|
||||||
}
|
}
|
||||||
} getOrElse {
|
} getOrElse {
|
||||||
if(context.settings.gravatar){
|
if(context.settings.gravatar){
|
||||||
s"""https://www.gravatar.com/avatar/${StringUtil.md5(mailAddress.toLowerCase)}?s=${size}"""
|
s"""https://www.gravatar.com/avatar/${StringUtil.md5(mailAddress.toLowerCase)}?s=${size}&d=retro&r=g"""
|
||||||
} else {
|
} else {
|
||||||
s"""${context.path}/_unknown/_avatar"""
|
s"""${context.path}/_unknown/_avatar"""
|
||||||
}
|
}
|
||||||
@@ -42,9 +42,9 @@ trait AvatarImageProvider { self: RequestCache =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(tooltip){
|
if(tooltip){
|
||||||
Html(s"""<img src="${src}" class="avatar" style="width: ${size}px; height: ${size}px;" data-toggle="tooltip" title="${userName}"/>""")
|
Html(s"""<img src="${src}" class="${if(size > 20){"avatar"} else {"avatar-mini"}}" style="width: ${size}px; height: ${size}px;" data-toggle="tooltip" title="${userName}"/>""")
|
||||||
} else {
|
} else {
|
||||||
Html(s"""<img src="${src}" class="avatar" style="width: ${size}px; height: ${size}px;" />""")
|
Html(s"""<img src="${src}" class="${if(size > 20){"avatar"} else {"avatar-mini"}}" style="width: ${size}px; height: ${size}px;" />""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,8 @@ class GitBucketHtmlSerializer(
|
|||||||
) with RepositoryService with LinkConverter with RequestCache {
|
) with RepositoryService with LinkConverter with RequestCache {
|
||||||
|
|
||||||
override protected def printImageTag(imageNode: SuperNode, url: String): Unit =
|
override protected def printImageTag(imageNode: SuperNode, url: String): Unit =
|
||||||
printer.print("<img src=\"").print(fixUrl(url)).print("\" alt=\"").printEncoded(printChildrenToString(imageNode)).print("\"/>")
|
printer.print("<a target=\"_blank\" href=\"").print(fixUrl(url)).print("\">")
|
||||||
|
.print("<img src=\"").print(fixUrl(url)).print("\" alt=\"").printEncoded(printChildrenToString(imageNode)).print("\"/></a>")
|
||||||
|
|
||||||
override protected def printLink(rendering: LinkRenderer.Rendering): Unit = {
|
override protected def printLink(rendering: LinkRenderer.Rendering): Unit = {
|
||||||
printer.print('<').print('a')
|
printer.print('<').print('a')
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
|
|||||||
*/
|
*/
|
||||||
def datetime(date: Date): String = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)
|
def datetime(date: Date): String = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format java.util.Date to "yyyy-MM-dd'T'hh:mm:ss'Z'".
|
||||||
|
*/
|
||||||
|
def datetimeRFC3339(date: Date): String = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'").format(date).replaceAll("(\\d\\d)(\\d\\d)$","$1:$2")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format java.util.Date to "yyyy-MM-dd".
|
* Format java.util.Date to "yyyy-MM-dd".
|
||||||
*/
|
*/
|
||||||
@@ -30,9 +35,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
|
|||||||
private[this] val renderersBySuffix: Seq[(String, (List[String], String, String, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] =
|
private[this] val renderersBySuffix: Seq[(String, (List[String], String, String, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] =
|
||||||
Seq(
|
Seq(
|
||||||
".md" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
|
".md" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
|
||||||
".markdown" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
|
".markdown" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context))
|
||||||
".adoc" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)),
|
|
||||||
".asciidoc" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink)(context))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def renderableSuffixes: Seq[String] = renderersBySuffix.map(_._1)
|
def renderableSuffixes: Seq[String] = renderersBySuffix.map(_._1)
|
||||||
@@ -59,10 +62,6 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def asciidoc(filePath: List[String], value: String, branch: String, repository: service.RepositoryService.RepositoryInfo,
|
|
||||||
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html =
|
|
||||||
Html(Asciidoc.toHtml(filePath, value, branch, repository, enableWikiLink, enableRefsLink))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns <img> which displays the avatar icon for the given user name.
|
* Returns <img> which displays the avatar icon for the given user name.
|
||||||
* This method looks up Gravatar if avatar icon has not been configured in user settings.
|
* This method looks up Gravatar if avatar icon has not been configured in user settings.
|
||||||
@@ -164,6 +163,45 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
|
|||||||
*/
|
*/
|
||||||
def isPast(date: Date): Boolean = System.currentTimeMillis > date.getTime
|
def isPast(date: Date): Boolean = System.currentTimeMillis > date.getTime
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns file type for AceEditor.
|
||||||
|
*/
|
||||||
|
def editorType(fileName: String): String = {
|
||||||
|
fileName.toLowerCase match {
|
||||||
|
case x if(x.endsWith(".bat")) => "batchfile"
|
||||||
|
case x if(x.endsWith(".java")) => "java"
|
||||||
|
case x if(x.endsWith(".scala")) => "scala"
|
||||||
|
case x if(x.endsWith(".js")) => "javascript"
|
||||||
|
case x if(x.endsWith(".css")) => "css"
|
||||||
|
case x if(x.endsWith(".md")) => "markdown"
|
||||||
|
case x if(x.endsWith(".html")) => "html"
|
||||||
|
case x if(x.endsWith(".xml")) => "xml"
|
||||||
|
case x if(x.endsWith(".c")) => "c_cpp"
|
||||||
|
case x if(x.endsWith(".cpp")) => "c_cpp"
|
||||||
|
case x if(x.endsWith(".coffee")) => "coffee"
|
||||||
|
case x if(x.endsWith(".ejs")) => "ejs"
|
||||||
|
case x if(x.endsWith(".hs")) => "haskell"
|
||||||
|
case x if(x.endsWith(".json")) => "json"
|
||||||
|
case x if(x.endsWith(".jsp")) => "jsp"
|
||||||
|
case x if(x.endsWith(".jsx")) => "jsx"
|
||||||
|
case x if(x.endsWith(".cl")) => "lisp"
|
||||||
|
case x if(x.endsWith(".clojure")) => "lisp"
|
||||||
|
case x if(x.endsWith(".lua")) => "lua"
|
||||||
|
case x if(x.endsWith(".php")) => "php"
|
||||||
|
case x if(x.endsWith(".py")) => "python"
|
||||||
|
case x if(x.endsWith(".rdoc")) => "rdoc"
|
||||||
|
case x if(x.endsWith(".rhtml")) => "rhtml"
|
||||||
|
case x if(x.endsWith(".ruby")) => "ruby"
|
||||||
|
case x if(x.endsWith(".sh")) => "sh"
|
||||||
|
case x if(x.endsWith(".sql")) => "sql"
|
||||||
|
case x if(x.endsWith(".tcl")) => "tcl"
|
||||||
|
case x if(x.endsWith(".vbs")) => "vbscript"
|
||||||
|
case x if(x.endsWith(".tcl")) => "tcl"
|
||||||
|
case x if(x.endsWith(".yml")) => "yaml"
|
||||||
|
case _ => "plain_text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implicit conversion to add mkHtml() to Seq[Html].
|
* Implicit conversion to add mkHtml() to Seq[Html].
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,5 +2,8 @@
|
|||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@main(account, groupNames, "activity"){
|
@main(account, groupNames, "activity"){
|
||||||
|
<div class="pull-right">
|
||||||
|
<a href="@path/@{account.userName}.atom"><img src="@assets/common/images/feed.png" alt="activities"></a>
|
||||||
|
</div>
|
||||||
@helper.html.activities(activities)
|
@helper.html.activities(activities)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="span8">
|
<div class="span8">
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs" style="margin-bottom: 5px;">
|
||||||
<li@if(active == "repositories"){ class="active"}><a href="@url(account.userName)?tab=repositories">Repositories</a></li>
|
<li@if(active == "repositories"){ class="active"}><a href="@url(account.userName)?tab=repositories">Repositories</a></li>
|
||||||
@if(account.isGroupAccount){
|
@if(account.isGroupAccount){
|
||||||
<li@if(active == "members"){ class="active"}><a href="@url(account.userName)?tab=members">Members</a></li>
|
<li@if(active == "members"){ class="active"}><a href="@url(account.userName)?tab=members">Members</a></li>
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
} else {
|
} else {
|
||||||
@repositories.map { repository =>
|
@repositories.map { repository =>
|
||||||
<div class="block">
|
<div class="block">
|
||||||
|
<div class="repository-icon">
|
||||||
|
@helper.html.repositoryicon(repository, true)
|
||||||
|
</div>
|
||||||
|
<div class="repository-content">
|
||||||
<div class="block-header">
|
<div class="block-header">
|
||||||
<a href="@url(repository)">@repository.name</a>
|
<a href="@url(repository)">@repository.name</a>
|
||||||
@if(repository.repository.isPrivate){
|
@if(repository.repository.isPrivate){
|
||||||
@@ -23,6 +27,7 @@
|
|||||||
}
|
}
|
||||||
<div><span class="muted small">Last updated: @datetime(repository.repository.lastActivityDate)</span></div>
|
<div><span class="muted small">Last updated: @datetime(repository.repository.lastActivityDate)</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
@(active: String = "")(implicit context: app.Context)
|
@(active: String = "")(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li@if(active == ""){ class="active"}><a href="@path/">News Feed</a></li>
|
<li@if(active == ""){ class="active"}><a href="@path/">News Feed</a></li>
|
||||||
@if(loginAccount.isDefined){
|
@if(loginAccount.isDefined){
|
||||||
<li@if(active == "pulls" ){ class="active"}><a href="@path/dashboard/pulls">Pull Requests</a></li>
|
<li@if(active == "pulls" ){ class="active"}><a href="@path/dashboard/pulls">Pull Requests</a></li>
|
||||||
<li@if(active == "issues"){ class="active"}><a href="@path/dashboard/issues/repos">Issues</a></li>
|
<li@if(active == "issues"){ class="active"}><a href="@path/dashboard/issues/repos">Issues</a></li>
|
||||||
}
|
}
|
||||||
|
@if(active == ""){
|
||||||
|
<li class="pull-right"><a href="@path/activities.atom"><img src="@assets/common/images/feed.png" alt="activities"></a></li>
|
||||||
|
}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -11,15 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="head">
|
<div class="head">
|
||||||
@if(repository.repository.isPrivate){
|
@helper.html.repositoryicon(repository, true)
|
||||||
<img src="@assets/common/images/repo_private_lg.png"/>
|
|
||||||
} else {
|
|
||||||
@if(repository.repository.originUserName.isDefined){
|
|
||||||
<img src="@assets/common/images/repo_fork_lg.png"/>
|
|
||||||
} else {
|
|
||||||
<img src="@assets/common/images/repo_public_lg.png"/>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<a href="@url(repository.owner)">@repository.owner</a> / <a href="@url(repository)" class="strong">@repository.name</a>
|
<a href="@url(repository.owner)">@repository.owner</a> / <a href="@url(repository)" class="strong">@repository.name</a>
|
||||||
|
|
||||||
@defining(repository.repository){ x =>
|
@defining(repository.repository){ x =>
|
||||||
|
|||||||
27
src/main/twirl/helper/attached.scala.html
Normal file
27
src/main/twirl/helper/attached.scala.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
@(owner: String, repository: String)(textarea: Html)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
<div class="muted attachable">
|
||||||
|
@textarea
|
||||||
|
<div class="clickable">Attach images by dragging & dropping, or selecting them.</div>
|
||||||
|
</div>
|
||||||
|
@defining("(id=\")([\\w\\-]*)(\")".r.findFirstMatchIn(textarea.body).map(_.group(2))){ textareaId =>
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
$([$('#@textareaId').closest('div')[0], $('#@textareaId').next('div')[0]]).dropzone({
|
||||||
|
url: '@path/upload/image/@owner/@repository',
|
||||||
|
maxFilesize: 10,
|
||||||
|
acceptedFiles: 'image/*',
|
||||||
|
dictInvalidFileType: 'Unfortunately, we don\'t support that file type. Try again with a PNG, GIF, or JPG.',
|
||||||
|
previewTemplate: "<div class=\"dz-preview\">\n <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress>Uploading your images...</span></div>\n <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n</div>",
|
||||||
|
success: function(file, id) {
|
||||||
|
var images = '\n![' + file.name.split('.')[0] + '](@baseUrl/@owner/@repository/_attached/' + id + ')';
|
||||||
|
$('#@textareaId').val($('#@textareaId').val() + images);
|
||||||
|
$(file.previewElement).prevAll('div.dz-preview').addBack().remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Adjust clickable area width
|
||||||
|
$('#@textareaId').next('div.clickable').css('width', ($('#@textareaId').width() + 8) + 'px');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
}
|
||||||
@@ -81,56 +81,7 @@
|
|||||||
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
||||||
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
||||||
<style type="text/css">
|
|
||||||
table.inlinediff {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.inlinediff thead {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.insert, td.equal, td.delete {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
<script>
|
||||||
function diffUsingJS(oldTextId, newTextId, outputId) {
|
|
||||||
// get the baseText and newText values from the two textboxes, and split them into lines
|
|
||||||
var oldText = document.getElementById(oldTextId).value;
|
|
||||||
if(oldText == ''){
|
|
||||||
var oldLines = [];
|
|
||||||
} else {
|
|
||||||
var oldLines = difflib.stringAsLines(oldText);
|
|
||||||
}
|
|
||||||
|
|
||||||
var newText = document.getElementById(newTextId).value
|
|
||||||
if(newText == ''){
|
|
||||||
var newLines = [];
|
|
||||||
} else {
|
|
||||||
var newLines = difflib.stringAsLines(newText);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a SequenceMatcher instance that diffs the two sets of lines
|
|
||||||
var sm = new difflib.SequenceMatcher(oldLines, newLines);
|
|
||||||
|
|
||||||
// get the opcodes from the SequenceMatcher instance
|
|
||||||
// opcodes is a list of 3-tuples describing what changes should be made to the base text
|
|
||||||
// in order to yield the new text
|
|
||||||
var opcodes = sm.get_opcodes();
|
|
||||||
var diffoutputdiv = document.getElementById(outputId);
|
|
||||||
while (diffoutputdiv.firstChild) diffoutputdiv.removeChild(diffoutputdiv.firstChild);
|
|
||||||
|
|
||||||
// build the diff view and add it to the current DOM
|
|
||||||
diffoutputdiv.appendChild(diffview.buildView({
|
|
||||||
baseTextLines: oldLines,
|
|
||||||
newTextLines: newLines,
|
|
||||||
opcodes: opcodes,
|
|
||||||
contextSize: 4,
|
|
||||||
viewType: 1
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
@if(showIndex){
|
@if(showIndex){
|
||||||
$('#toggle-file-list').click(function(){
|
$('#toggle-file-list').click(function(){
|
||||||
|
|||||||
27
src/main/twirl/helper/feed.scala.xml
Normal file
27
src/main/twirl/helper/feed.scala.xml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
@(activities: List[model.Activity])(implicit context: app.Context)<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
|
||||||
|
<id>tag:@context.host,2013:gitbucket</id>
|
||||||
|
<title>Gitbucket's activities</title>
|
||||||
|
<link type="application/atom+xml" rel="self" href="@context.baseUrl/activities.atom"/>
|
||||||
|
<author>
|
||||||
|
<name>Gitbucket</name>
|
||||||
|
<uri>@context.baseUrl</uri>
|
||||||
|
</author>
|
||||||
|
<updated>@datetimeRFC3339(if(activities.isEmpty) new java.util.Date else activities.map(_.activityDate).max)</updated>
|
||||||
|
@activities.map { activity =>
|
||||||
|
<entry>
|
||||||
|
<id>tag:@context.host,@date(activity.activityDate):activity:@activity.activityId</id>
|
||||||
|
<published>@datetimeRFC3339(activity.activityDate)</published>
|
||||||
|
<updated>@datetimeRFC3339(activity.activityDate)</updated>
|
||||||
|
<link type="text/html" rel="alternate" href="@context.baseUrl/@activity.userName/@activity.repositoryName" />
|
||||||
|
<title type="html">@activity.activityType</title>
|
||||||
|
<author>
|
||||||
|
<name>@activity.activityUserName</name>
|
||||||
|
<uri>@url(activity.activityUserName)</uri>
|
||||||
|
</author>
|
||||||
|
<content type="html">@activityMessage(activity.message)</content>
|
||||||
|
</entry>
|
||||||
|
}
|
||||||
|
</feed>
|
||||||
@@ -6,16 +6,18 @@
|
|||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="active"><a href="#tab1" data-toggle="tab">Write</a></li>
|
<li class="active"><a href="#tab1" data-toggle="tab">Write</a></li>
|
||||||
<li><a href="#tab2" data-toggle="tab" id="preview">Preview</a></li>
|
<li><a href="#tab2" data-toggle="tab" id="preview">Preview</a></li>
|
||||||
@*
|
|
||||||
<li class="pull-right">
|
|
||||||
<a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">Markdown Syntax Guide</a>
|
|
||||||
</li>
|
|
||||||
*@
|
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane active" id="tab1">
|
<div class="tab-pane active" id="tab1">
|
||||||
<span id="error-content" class="error"></span>
|
<span id="error-content" class="error"></span>
|
||||||
|
@textarea = {
|
||||||
<textarea id="content" name="content"@if(style.nonEmpty){ style="@style"} placeholder="@placeholder">@content</textarea>
|
<textarea id="content" name="content"@if(style.nonEmpty){ style="@style"} placeholder="@placeholder">@content</textarea>
|
||||||
|
}
|
||||||
|
@if(enableWikiLink){
|
||||||
|
@textarea
|
||||||
|
} else {
|
||||||
|
@helper.html.attached(repository.owner, repository.name)(textarea)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane" id="tab2">
|
<div class="tab-pane" id="tab2">
|
||||||
<div class="markdown-body" id="preview-area">
|
<div class="markdown-body" id="preview-area">
|
||||||
|
|||||||
12
src/main/twirl/helper/repositoryicon.scala.html
Normal file
12
src/main/twirl/helper/repositoryicon.scala.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
@(repository: service.RepositoryService.RepositoryInfo, large: Boolean)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@if(repository.repository.isPrivate){
|
||||||
|
<img src="@assets/common/images/repo_private@{if(large){"_lg"}}.png"/>
|
||||||
|
} else {
|
||||||
|
@if(repository.repository.originUserName.isDefined){
|
||||||
|
<img src="@assets/common/images/repo_fork@{if(large){"_lg"}}.png"/>
|
||||||
|
} else {
|
||||||
|
<img src="@assets/common/images/repo_public@{if(large){"_lg"}}.png"/>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,7 @@
|
|||||||
@if(account.nonEmpty && account.get.image.nonEmpty){
|
@if(account.nonEmpty && account.get.image.nonEmpty){
|
||||||
<img src="@path/@account.get.userName/_avatar" style="with: 120px; height: 120px;"/>
|
<img src="@path/@account.get.userName/_avatar" style="with: 120px; height: 120px;"/>
|
||||||
} else {
|
} else {
|
||||||
<div id="clickable">
|
<div id="clickable">Upload Image</div>
|
||||||
<a href="https://www.gravatar.com/" target="_blank">Gravatar</a> is used
|
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@if(account.nonEmpty && account.get.image.nonEmpty){
|
@if(account.nonEmpty && account.get.image.nonEmpty){
|
||||||
@@ -21,7 +19,6 @@ $(function(){
|
|||||||
var dropzone = new Dropzone('div#clickable', {
|
var dropzone = new Dropzone('div#clickable', {
|
||||||
url: '@path/upload/image',
|
url: '@path/upload/image',
|
||||||
previewsContainer: 'div#avatar',
|
previewsContainer: 'div#avatar',
|
||||||
paramName: 'file',
|
|
||||||
parallelUploads: 1,
|
parallelUploads: 1,
|
||||||
thumbnailWidth: 120,
|
thumbnailWidth: 120,
|
||||||
thumbnailHeight: 120
|
thumbnailHeight: 120
|
||||||
|
|||||||
@@ -30,15 +30,7 @@
|
|||||||
@userRepositories.map { repository =>
|
@userRepositories.map { repository =>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@if(repository.repository.isPrivate){
|
@helper.html.repositoryicon(repository, false)
|
||||||
<img src="@assets/common/images/repo_private.png"/>
|
|
||||||
} else {
|
|
||||||
@if(repository.repository.originUserName.isDefined){
|
|
||||||
<img src="@assets/common/images/repo_fork.png"/>
|
|
||||||
} else {
|
|
||||||
<img src="@assets/common/images/repo_public.png"/>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@if(repository.owner == loginAccount.get.userName){
|
@if(repository.owner == loginAccount.get.userName){
|
||||||
<a href="@url(repository)"><span class="strong">@repository.name</span></a>
|
<a href="@url(repository)"><span class="strong">@repository.name</span></a>
|
||||||
} else {
|
} else {
|
||||||
@@ -57,7 +49,7 @@
|
|||||||
Recent updated repositories
|
Recent updated repositories
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
@if(recentRepositories.isEmpty){
|
@if(recentRepositories.isEmpty){2
|
||||||
<tr>
|
<tr>
|
||||||
<td>No repositories</td>
|
<td>No repositories</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -65,15 +57,7 @@
|
|||||||
@recentRepositories.map { repository =>
|
@recentRepositories.map { repository =>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@if(repository.repository.isPrivate){
|
@helper.html.repositoryicon(repository, false)
|
||||||
<img src="@assets/common/images/repo_private.png"/>
|
|
||||||
} else {
|
|
||||||
@if(repository.repository.originUserName.isDefined){
|
|
||||||
<img src="@assets/common/images/repo_fork.png"/>
|
|
||||||
} else {
|
|
||||||
<img src="@assets/common/images/repo_public.png"/>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<a href="@url(repository)">@repository.owner/<span class="strong">@repository.name</span></a>
|
<a href="@url(repository)">@repository.owner/<span class="strong">@repository.name</span></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
@(content: String, commentId: Int, owner: String, repository: String)(implicit context: app.Context)
|
@(content: String, commentId: Int, owner: String, repository: String)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
<span id="error-edit-content-@commentId" class="error"></span>
|
<span id="error-edit-content-@commentId" class="error"></span>
|
||||||
<textarea style="width: 680px; height: 100px;" id="edit-content-@commentId">@content</textarea>
|
@helper.html.attached(owner, repository){
|
||||||
|
<textarea style="width: 680px; height: 100px;" id="edit-content-@commentId">@content</textarea>
|
||||||
|
}
|
||||||
<div>
|
<div>
|
||||||
<input type="button" id="update-comment-@commentId" class="btn btn-small" value="Update Comment"/>
|
<input type="button" id="update-comment-@commentId" class="btn btn-small" value="Update Comment"/>
|
||||||
<input type="button" id="cancel-comment-@commentId" class="btn btn-small btn-danger pull-right" value="Cancel"/>
|
<input type="button" id="cancel-comment-@commentId" class="btn btn-small btn-danger pull-right" value="Cancel"/>
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
@import context._
|
@import context._
|
||||||
<span id="error-edit-title" class="error"></span>
|
<span id="error-edit-title" class="error"></span>
|
||||||
<input type="text" style="width: 680px;" id="edit-title" value="@title"/>
|
<input type="text" style="width: 680px;" id="edit-title" value="@title"/>
|
||||||
<textarea style="width: 680px; height: 100px; max-height: 300px;" id="edit-content">@content.getOrElse("")</textarea>
|
@helper.html.attached(owner, repository){
|
||||||
|
<textarea style="width: 680px; height: 100px; max-height: 300px;" id="edit-content">@content.getOrElse("")</textarea>
|
||||||
|
}
|
||||||
<div>
|
<div>
|
||||||
<input type="button" id="update" class="btn btn-small" value="Update Issue"/>
|
<input type="button" id="update" class="btn btn-small" value="Update Issue"/>
|
||||||
<input type="button" id="cancel" class="btn btn-small btn-danger pull-right" value="Cancel"/>
|
<input type="button" id="cancel" class="btn btn-small btn-danger pull-right" value="Cancel"/>
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
repository: service.RepositoryService.RepositoryInfo,
|
repository: service.RepositoryService.RepositoryInfo,
|
||||||
pathList: List[String],
|
pathList: List[String],
|
||||||
content: util.JGitUtil.ContentInfo,
|
content: util.JGitUtil.ContentInfo,
|
||||||
latestCommit: util.JGitUtil.CommitInfo)(implicit context: app.Context)
|
latestCommit: util.JGitUtil.CommitInfo,
|
||||||
|
hasWritePermission: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
@@ -29,8 +30,14 @@
|
|||||||
<a href="@url(repository)/commit/@latestCommit.id" class="commit-message">@link(latestCommit.summary, repository)</a>
|
<a href="@url(repository)/commit/@latestCommit.id" class="commit-message">@link(latestCommit.summary, repository)</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group pull-right">
|
<div class="btn-group pull-right">
|
||||||
<a class="btn btn-mini" href="?raw=true">Raw</a>
|
@if(hasWritePermission){
|
||||||
<a class="btn btn-mini" href="@url(repository)/commits/@encodeRefName(branch)/@pathList.mkString("/")">History</a>
|
<a class="btn" href="@url(repository)/edit/@encodeRefName(branch)/@pathList.mkString("/")">Edit</a>
|
||||||
|
}
|
||||||
|
<a class="btn" href="?raw=true">Raw</a>
|
||||||
|
<a class="btn" href="@url(repository)/commits/@encodeRefName(branch)/@pathList.mkString("/")">History</a>
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a class="btn btn-danger" href="@url(repository)/remove/@encodeRefName(branch)/@pathList.mkString("/")">Delete</a>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
61
src/main/twirl/repo/delete.scala.html
Normal file
61
src/main/twirl/repo/delete.scala.html
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
@(branch: String,
|
||||||
|
repository: service.RepositoryService.RepositoryInfo,
|
||||||
|
pathList: List[String],
|
||||||
|
fileName: String,
|
||||||
|
content: util.JGitUtil.ContentInfo)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@html.main(s"Deleting ${path} at ${fileName} - ${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
|
@html.header("code", repository)
|
||||||
|
@tab(branch, repository, "files")
|
||||||
|
<form method="POST" action="@url(repository)/remove" validate="true">
|
||||||
|
<div class="head">
|
||||||
|
<a href="@url(repository)/tree/@encodeRefName(branch)">@repository.name</a> /
|
||||||
|
@pathList.zipWithIndex.map { case (section, i) =>
|
||||||
|
<a href="@url(repository)/tree/@encodeRefName(branch)/@pathList.take(i + 1).mkString("/")">@section</a> /
|
||||||
|
}
|
||||||
|
@fileName
|
||||||
|
<input type="hidden" name="fileName" id="fileName" value="@fileName"/>
|
||||||
|
<input type="hidden" name="branch" id="branch" value="@branch"/>
|
||||||
|
<input type="hidden" name="path" id="path" value="@pathList.mkString("/")"/>
|
||||||
|
</div>
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<th style="font-weight: normal;" class="box-header">
|
||||||
|
@fileName
|
||||||
|
<div class="pull-right align-right">
|
||||||
|
<a href="@url(repository)/blob/@branch/@{(pathList ::: List(fileName)).mkString("/")}" class="btn btn-small">View</a>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="diffText"></div>
|
||||||
|
<textarea id="newText" style="display: none;"></textarea>
|
||||||
|
<textarea id="oldText" style="display: none;">@content.content</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="issue-avatar-image">@avatar(loginAccount.get.userName, 48)</div>
|
||||||
|
<div class="box issue-comment-box">
|
||||||
|
<div class="box-content">
|
||||||
|
<div>
|
||||||
|
<strong>Commit changes</strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="text" name="message" style="width: 98%;"/>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: right;">
|
||||||
|
<a href="@url(repository)/blob/@encodeRefName(branch)/@pathList.mkString("/")" class="btn btn-danger">Cancel</a>
|
||||||
|
<input type="submit" id="commit" class="btn btn-success" value="Commit changes"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
||||||
|
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
||||||
|
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
diffUsingJS('oldText', 'newText', 'diffText');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
107
src/main/twirl/repo/editor.scala.html
Normal file
107
src/main/twirl/repo/editor.scala.html
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
@(branch: String,
|
||||||
|
repository: service.RepositoryService.RepositoryInfo,
|
||||||
|
pathList: List[String],
|
||||||
|
fileName: Option[String],
|
||||||
|
content: util.JGitUtil.ContentInfo)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@html.main(if(fileName.isEmpty) "New File" else s"Editing ${path} at ${fileName} - ${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
|
@html.header("code", repository)
|
||||||
|
@tab(branch, repository, "files")
|
||||||
|
<form method="POST" action="@url(repository)/@if(fileName.isEmpty){create}else{update}" validate="true">
|
||||||
|
<span class="error" id="error-newFileName"></span>
|
||||||
|
<div class="head">
|
||||||
|
<a href="@url(repository)/tree/@encodeRefName(branch)">@repository.name</a> /
|
||||||
|
@pathList.zipWithIndex.map { case (section, i) =>
|
||||||
|
<a href="@url(repository)/tree/@encodeRefName(branch)/@pathList.take(i + 1).mkString("/")">@section</a> /
|
||||||
|
}
|
||||||
|
<input type="text" name="newFileName" id="newFileName" placeholder="Name your file..." value="@fileName"/>
|
||||||
|
<input type="hidden" name="oldFileName" id="oldFileName" value="@fileName"/>
|
||||||
|
<input type="hidden" name="branch" id="branch" value="@branch"/>
|
||||||
|
<input type="hidden" name="path" id="path" value="@pathList.mkString("/")"/>
|
||||||
|
</div>
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<div class="pull-right">
|
||||||
|
<select id="wrap" class="input-medium" style="margin-bottom: 0px;">
|
||||||
|
<optgroup label="Line Wrap Mode">
|
||||||
|
<option value="false">No wrap</option>
|
||||||
|
<option value="true">Soft wrap</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="editor" style="width: 100%; height: 600px;"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="issue-avatar-image">@avatar(loginAccount.get.userName, 48)</div>
|
||||||
|
<div class="box issue-comment-box">
|
||||||
|
<div class="box-content">
|
||||||
|
<div>
|
||||||
|
<strong>Commit changes</strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="text" name="message" style="width: 98%;"/>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: right;">
|
||||||
|
@if(fileName.isEmpty){
|
||||||
|
<a href="@url(repository)/tree/@encodeRefName(branch)/@{pathList.mkString("/")}" class="btn btn-danger">Cancel</a>
|
||||||
|
} else {
|
||||||
|
<a href="@url(repository)/blob/@encodeRefName(branch)/@{(pathList ++ Seq(fileName.get)).mkString("/")}" class="btn btn-danger">Cancel</a>
|
||||||
|
}
|
||||||
|
<input type="submit" id="commit" class="btn btn-success" value="Commit changes" disabled="true"/>
|
||||||
|
<input type="hidden" id="charset" name="charset" value="@content.charset"/>
|
||||||
|
<input type="hidden" id="content" name="content" value=""/>
|
||||||
|
<input type="hidden" id="initial" value="@content.content"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
<script src="@assets/ace/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
$('#editor').text($('#initial').val());
|
||||||
|
var editor = ace.edit("editor");
|
||||||
|
editor.setTheme("ace/theme/monokai");
|
||||||
|
//editor.getSession().setUseWrapMode(false);
|
||||||
|
|
||||||
|
@if(fileName.isDefined){
|
||||||
|
editor.getSession().setMode("ace/mode/@editorType(fileName.get)");
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.on('change', function(){
|
||||||
|
updateCommitButtonStatus();
|
||||||
|
});
|
||||||
|
|
||||||
|
function updateCommitButtonStatus(){
|
||||||
|
if(editor.getValue() == $('#initial').val() && $('#newFileName').val() == $('#oldFileName').val()){
|
||||||
|
$('#commit').attr('disabled', true);
|
||||||
|
} else {
|
||||||
|
$('#commit').attr('disabled', false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#wrap').change(function(){
|
||||||
|
console.log($('#wrap option:selected').val());
|
||||||
|
if($('#wrap option:selected').val() == 'true'){
|
||||||
|
editor.getSession().setUseWrapMode(true);
|
||||||
|
} else {
|
||||||
|
editor.getSession().setUseWrapMode(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#newFileName').watch(function(){
|
||||||
|
updateCommitButtonStatus();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#commit').click(function(){
|
||||||
|
$('#content').val(editor.getValue());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
pathList: List[String],
|
pathList: List[String],
|
||||||
latestCommit: util.JGitUtil.CommitInfo,
|
latestCommit: util.JGitUtil.CommitInfo,
|
||||||
files: List[util.JGitUtil.FileInfo],
|
files: List[util.JGitUtil.FileInfo],
|
||||||
readme: Option[(List[String], String)])(implicit context: app.Context)
|
readme: Option[(List[String], String)],
|
||||||
|
hasWritePermission: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
@@ -12,13 +13,16 @@
|
|||||||
<div class="head">
|
<div class="head">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
@defining(repository.commitCount){ commitCount =>
|
@defining(repository.commitCount){ commitCount =>
|
||||||
<a href="@url(repository)/commits/@encodeRefName(branch)">@if(commitCount > 10000){ @commitCount+ } else { @commitCount } @plural(commitCount, "commit")</a>
|
<a href="@url(repository)/commits/@encodeRefName(branch)">@if(commitCount > 10000){ 10000+ } else { @commitCount } @plural(commitCount, "commit")</a>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<a href="@url(repository)/tree/@encodeRefName(branch)">@repository.name</a> /
|
<a href="@url(repository)/tree/@encodeRefName(branch)">@repository.name</a> /
|
||||||
@pathList.zipWithIndex.map { case (section, i) =>
|
@pathList.zipWithIndex.map { case (section, i) =>
|
||||||
<a href="@url(repository)/tree/@encodeRefName(branch)/@pathList.take(i + 1).mkString("/")">@section</a> /
|
<a href="@url(repository)/tree/@encodeRefName(branch)/@pathList.take(i + 1).mkString("/")">@section</a> /
|
||||||
}
|
}
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a href="@url(repository)/new/@encodeRefName(branch)/@pathList.mkString("/")"><img src="@assets/common/images/newfile.png"/></a>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<table class="table table-file-list" style="border: 1px solid silver;">
|
<table class="table table-file-list" style="border: 1px solid silver;">
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
@(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
@(repository: service.RepositoryService.RepositoryInfo,
|
||||||
|
hasWritePermission: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
@html.header("code", repository)
|
@html.header("code", repository)
|
||||||
<h3 style="margin-top: 30px;">Create a new repository on the command line</h3>
|
@if(!hasWritePermission){
|
||||||
<pre>
|
<h3>This is an empty repository</h3>
|
||||||
touch README.md
|
} else {
|
||||||
git init
|
<h3 style="margin-top: 30px;">Create a new repository on the command line</h3>
|
||||||
git add README.md
|
<pre>
|
||||||
git commit -m "first commit"
|
touch README.md
|
||||||
git remote add origin @repository.httpUrl
|
git init
|
||||||
git push -u origin master
|
git add README.md
|
||||||
</pre>
|
git commit -m "first commit"
|
||||||
|
git remote add origin @repository.httpUrl
|
||||||
|
git push -u origin master
|
||||||
|
</pre>
|
||||||
|
|
||||||
<h3 style="margin-top: 30px;">Push an existing repository from the command line</h3>
|
<h3 style="margin-top: 30px;">Push an existing repository from the command line</h3>
|
||||||
<pre>
|
<pre>
|
||||||
git remote add origin @repository.httpUrl
|
git remote add origin @repository.httpUrl
|
||||||
git push -u origin master
|
git push -u origin master
|
||||||
</pre>
|
</pre>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
17629
src/main/webapp/assets/ace/ace.js
Normal file
17629
src/main/webapp/assets/ace/ace.js
Normal file
File diff suppressed because it is too large
Load Diff
360
src/main/webapp/assets/ace/ext-beautify.js
Normal file
360
src/main/webapp/assets/ace/ext-beautify.js
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/beautify', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/ext/beautify/php_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = require("ace/token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
var phpTransform = require("./beautify/php_rules").transform;
|
||||||
|
|
||||||
|
exports.beautify = function(session) {
|
||||||
|
var iterator = new TokenIterator(session, 0, 0);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
|
||||||
|
var context = session.$modeId.split("/").pop();
|
||||||
|
|
||||||
|
var code = phpTransform(iterator, context);
|
||||||
|
session.doc.setValue(code);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.commands = [{
|
||||||
|
name: "beautify",
|
||||||
|
exec: function(editor) {
|
||||||
|
exports.beautify(editor.session);
|
||||||
|
},
|
||||||
|
bindKey: "Ctrl-Shift-B"
|
||||||
|
}]
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/beautify/php_rules', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = require("ace/token_iterator").TokenIterator;
|
||||||
|
exports.newLines = [{
|
||||||
|
type: 'support.php_tag',
|
||||||
|
value: '<?php'
|
||||||
|
}, {
|
||||||
|
type: 'support.php_tag',
|
||||||
|
value: '<?'
|
||||||
|
}, {
|
||||||
|
type: 'support.php_tag',
|
||||||
|
value: '?>'
|
||||||
|
}, {
|
||||||
|
type: 'paren.lparen',
|
||||||
|
value: '{',
|
||||||
|
indent: true
|
||||||
|
}, {
|
||||||
|
type: 'paren.rparen',
|
||||||
|
breakBefore: true,
|
||||||
|
value: '}',
|
||||||
|
indent: false
|
||||||
|
}, {
|
||||||
|
type: 'paren.rparen',
|
||||||
|
breakBefore: true,
|
||||||
|
value: '})',
|
||||||
|
indent: false,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'comment'
|
||||||
|
}, {
|
||||||
|
type: 'text',
|
||||||
|
value: ';'
|
||||||
|
}, {
|
||||||
|
type: 'text',
|
||||||
|
value: ':',
|
||||||
|
context: 'php'
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'case',
|
||||||
|
indent: true,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'default',
|
||||||
|
indent: true,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'break',
|
||||||
|
indent: false,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'punctuation.doctype.end',
|
||||||
|
value: '>'
|
||||||
|
}, {
|
||||||
|
type: 'meta.tag.punctuation.end',
|
||||||
|
value: '>'
|
||||||
|
}, {
|
||||||
|
type: 'meta.tag.punctuation.begin',
|
||||||
|
value: '<',
|
||||||
|
blockTag: true,
|
||||||
|
indent: true,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'meta.tag.punctuation.begin',
|
||||||
|
value: '</',
|
||||||
|
indent: false,
|
||||||
|
breakBefore: true,
|
||||||
|
dontBreak: true
|
||||||
|
}, {
|
||||||
|
type: 'punctuation.operator',
|
||||||
|
value: ';'
|
||||||
|
}];
|
||||||
|
|
||||||
|
exports.spaces = [{
|
||||||
|
type: 'xml-pe',
|
||||||
|
prepend: true
|
||||||
|
},{
|
||||||
|
type: 'entity.other.attribute-name',
|
||||||
|
prepend: true
|
||||||
|
}, {
|
||||||
|
type: 'storage.type',
|
||||||
|
value: 'var',
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'storage.type',
|
||||||
|
value: 'function',
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword.operator',
|
||||||
|
value: '='
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'as',
|
||||||
|
prepend: true,
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'function',
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'support.function',
|
||||||
|
next: /[^\(]/,
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'or',
|
||||||
|
append: true,
|
||||||
|
prepend: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'and',
|
||||||
|
append: true,
|
||||||
|
prepend: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword',
|
||||||
|
value: 'case',
|
||||||
|
append: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword.operator',
|
||||||
|
value: '||',
|
||||||
|
append: true,
|
||||||
|
prepend: true
|
||||||
|
}, {
|
||||||
|
type: 'keyword.operator',
|
||||||
|
value: '&&',
|
||||||
|
append: true,
|
||||||
|
prepend: true
|
||||||
|
}];
|
||||||
|
exports.singleTags = ['!doctype','area','base','br','hr','input','img','link','meta'];
|
||||||
|
|
||||||
|
exports.transform = function(iterator, maxPos, context) {
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
|
||||||
|
var newLines = exports.newLines;
|
||||||
|
var spaces = exports.spaces;
|
||||||
|
var singleTags = exports.singleTags;
|
||||||
|
|
||||||
|
var code = '';
|
||||||
|
|
||||||
|
var indentation = 0;
|
||||||
|
var dontBreak = false;
|
||||||
|
var tag;
|
||||||
|
var lastTag;
|
||||||
|
var lastToken = {};
|
||||||
|
var nextTag;
|
||||||
|
var nextToken = {};
|
||||||
|
var breakAdded = false;
|
||||||
|
var value = '';
|
||||||
|
|
||||||
|
while (token!==null) {
|
||||||
|
console.log(token);
|
||||||
|
|
||||||
|
if( !token ){
|
||||||
|
token = iterator.stepForward();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( token.type == 'support.php_tag' && token.value != '?>' ){
|
||||||
|
context = 'php';
|
||||||
|
}
|
||||||
|
else if( token.type == 'support.php_tag' && token.value == '?>' ){
|
||||||
|
context = 'html';
|
||||||
|
}
|
||||||
|
else if( token.type == 'meta.tag.name.style' && context != 'css' ){
|
||||||
|
context = 'css';
|
||||||
|
}
|
||||||
|
else if( token.type == 'meta.tag.name.style' && context == 'css' ){
|
||||||
|
context = 'html';
|
||||||
|
}
|
||||||
|
else if( token.type == 'meta.tag.name.script' && context != 'js' ){
|
||||||
|
context = 'js';
|
||||||
|
}
|
||||||
|
else if( token.type == 'meta.tag.name.script' && context == 'js' ){
|
||||||
|
context = 'html';
|
||||||
|
}
|
||||||
|
|
||||||
|
nextToken = iterator.stepForward();
|
||||||
|
if (nextToken && nextToken.type.indexOf('meta.tag.name') == 0) {
|
||||||
|
nextTag = nextToken.value;
|
||||||
|
}
|
||||||
|
if ( lastToken.type == 'support.php_tag' && lastToken.value == '<?=') {
|
||||||
|
dontBreak = true;
|
||||||
|
}
|
||||||
|
if (token.type == 'meta.tag.name') {
|
||||||
|
token.value = token.value.toLowerCase();
|
||||||
|
}
|
||||||
|
if (token.type == 'text') {
|
||||||
|
token.value = token.value.trim();
|
||||||
|
}
|
||||||
|
if (!token.value) {
|
||||||
|
token = nextToken;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
value = token.value;
|
||||||
|
for (var i in spaces) {
|
||||||
|
if (
|
||||||
|
token.type == spaces[i].type &&
|
||||||
|
(!spaces[i].value || token.value == spaces[i].value) &&
|
||||||
|
(
|
||||||
|
nextToken &&
|
||||||
|
(!spaces[i].next || spaces[i].next.test(nextToken.value))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if (spaces[i].prepend) {
|
||||||
|
value = ' ' + token.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spaces[i].append) {
|
||||||
|
value += ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (token.type.indexOf('meta.tag.name') == 0) {
|
||||||
|
tag = token.value;
|
||||||
|
}
|
||||||
|
breakAdded = false;
|
||||||
|
for (i in newLines) {
|
||||||
|
if (
|
||||||
|
token.type == newLines[i].type &&
|
||||||
|
(
|
||||||
|
!newLines[i].value ||
|
||||||
|
token.value == newLines[i].value
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
!newLines[i].blockTag ||
|
||||||
|
singleTags.indexOf(nextTag) === -1
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
!newLines[i].context ||
|
||||||
|
newLines[i].context === context
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if (newLines[i].indent === false) {
|
||||||
|
indentation--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
newLines[i].breakBefore &&
|
||||||
|
( !newLines[i].prev || newLines[i].prev.test(lastToken.value) )
|
||||||
|
) {
|
||||||
|
code += "\n";
|
||||||
|
breakAdded = true;
|
||||||
|
for (i = 0; i < indentation; i++) {
|
||||||
|
code += "\t";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dontBreak===false) {
|
||||||
|
for (i in newLines) {
|
||||||
|
if (
|
||||||
|
lastToken.type == newLines[i].type &&
|
||||||
|
(
|
||||||
|
!newLines[i].value || lastToken.value == newLines[i].value
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
!newLines[i].blockTag ||
|
||||||
|
singleTags.indexOf(tag) === -1
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
!newLines[i].context ||
|
||||||
|
newLines[i].context === context
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if (newLines[i].indent === true) {
|
||||||
|
indentation++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newLines[i].dontBreak && !breakAdded) {
|
||||||
|
code += "\n";
|
||||||
|
for (i = 0; i < indentation; i++) {
|
||||||
|
code += "\t";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code += value;
|
||||||
|
if ( lastToken.type == 'support.php_tag' && lastToken.value == '?>' ) {
|
||||||
|
dontBreak = false;
|
||||||
|
}
|
||||||
|
lastTag = tag;
|
||||||
|
|
||||||
|
lastToken = token;
|
||||||
|
|
||||||
|
token = nextToken;
|
||||||
|
|
||||||
|
if (token===null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
537
src/main/webapp/assets/ace/ext-chromevox.js
Normal file
537
src/main/webapp/assets/ace/ext-chromevox.js
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
ace.define('ace/ext/chromevox', ['require', 'exports', 'module' , 'ace/editor', 'ace/config'], function(require, exports, module) {
|
||||||
|
var cvoxAce = {};
|
||||||
|
cvoxAce.SpeechProperty;
|
||||||
|
cvoxAce.Cursor;
|
||||||
|
cvoxAce.Token;
|
||||||
|
cvoxAce.Annotation;
|
||||||
|
var CONSTANT_PROP = {
|
||||||
|
'rate': 0.8,
|
||||||
|
'pitch': 0.4,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var DEFAULT_PROP = {
|
||||||
|
'rate': 1,
|
||||||
|
'pitch': 0.5,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var ENTITY_PROP = {
|
||||||
|
'rate': 0.8,
|
||||||
|
'pitch': 0.8,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var KEYWORD_PROP = {
|
||||||
|
'rate': 0.8,
|
||||||
|
'pitch': 0.3,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var STORAGE_PROP = {
|
||||||
|
'rate': 0.8,
|
||||||
|
'pitch': 0.7,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var VARIABLE_PROP = {
|
||||||
|
'rate': 0.8,
|
||||||
|
'pitch': 0.8,
|
||||||
|
'volume': 0.9
|
||||||
|
};
|
||||||
|
var DELETED_PROP = {
|
||||||
|
'punctuationEcho': 'none',
|
||||||
|
'relativePitch': -0.6
|
||||||
|
};
|
||||||
|
var ERROR_EARCON = 'ALERT_NONMODAL';
|
||||||
|
var MODE_SWITCH_EARCON = 'ALERT_MODAL';
|
||||||
|
var NO_MATCH_EARCON = 'INVALID_KEYPRESS';
|
||||||
|
var INSERT_MODE_STATE = 'insertMode';
|
||||||
|
var COMMAND_MODE_STATE = 'start';
|
||||||
|
|
||||||
|
var REPLACE_LIST = [
|
||||||
|
{
|
||||||
|
substr: ';',
|
||||||
|
newSubstr: ' semicolon '
|
||||||
|
},
|
||||||
|
{
|
||||||
|
substr: ':',
|
||||||
|
newSubstr: ' colon '
|
||||||
|
}
|
||||||
|
];
|
||||||
|
var Command = {
|
||||||
|
SPEAK_ANNOT: 'annots',
|
||||||
|
SPEAK_ALL_ANNOTS: 'all_annots',
|
||||||
|
TOGGLE_LOCATION: 'toggle_location',
|
||||||
|
SPEAK_MODE: 'mode',
|
||||||
|
SPEAK_ROW_COL: 'row_col',
|
||||||
|
TOGGLE_DISPLACEMENT: 'toggle_displacement',
|
||||||
|
FOCUS_TEXT: 'focus_text'
|
||||||
|
};
|
||||||
|
var KEY_PREFIX = 'CONTROL + SHIFT ';
|
||||||
|
cvoxAce.editor = null;
|
||||||
|
var lastCursor = null;
|
||||||
|
var annotTable = {};
|
||||||
|
var shouldSpeakRowLocation = false;
|
||||||
|
var shouldSpeakDisplacement = false;
|
||||||
|
var changed = false;
|
||||||
|
var vimState = null;
|
||||||
|
var keyCodeToShortcutMap = {};
|
||||||
|
var cmdToShortcutMap = {};
|
||||||
|
var getKeyShortcutString = function(keyCode) {
|
||||||
|
return KEY_PREFIX + String.fromCharCode(keyCode);
|
||||||
|
};
|
||||||
|
var isVimMode = function() {
|
||||||
|
var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler();
|
||||||
|
return keyboardHandler.$id === 'ace/keyboard/vim';
|
||||||
|
};
|
||||||
|
var getCurrentToken = function(cursor) {
|
||||||
|
return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1);
|
||||||
|
};
|
||||||
|
var getCurrentLine = function(cursor) {
|
||||||
|
return cvoxAce.editor.getSession().getLine(cursor.row);
|
||||||
|
};
|
||||||
|
var onRowChange = function(currCursor) {
|
||||||
|
if (annotTable[currCursor.row]) {
|
||||||
|
cvox.Api.playEarcon(ERROR_EARCON);
|
||||||
|
}
|
||||||
|
if (shouldSpeakRowLocation) {
|
||||||
|
cvox.Api.stop();
|
||||||
|
speakChar(currCursor);
|
||||||
|
speakTokenQueue(getCurrentToken(currCursor));
|
||||||
|
speakLine(currCursor.row, 1);
|
||||||
|
} else {
|
||||||
|
speakLine(currCursor.row, 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var isWord = function(cursor) {
|
||||||
|
var line = getCurrentLine(cursor);
|
||||||
|
var lineSuffix = line.substr(cursor.column - 1);
|
||||||
|
if (cursor.column === 0) {
|
||||||
|
lineSuffix = ' ' + line;
|
||||||
|
}
|
||||||
|
var firstWordRegExp = /^\W(\w+)/;
|
||||||
|
var words = firstWordRegExp.exec(lineSuffix);
|
||||||
|
return words !== null;
|
||||||
|
};
|
||||||
|
var rules = {
|
||||||
|
'constant': {
|
||||||
|
prop: CONSTANT_PROP
|
||||||
|
},
|
||||||
|
'entity': {
|
||||||
|
prop: ENTITY_PROP
|
||||||
|
},
|
||||||
|
'keyword': {
|
||||||
|
prop: KEYWORD_PROP
|
||||||
|
},
|
||||||
|
'storage': {
|
||||||
|
prop: STORAGE_PROP
|
||||||
|
},
|
||||||
|
'variable': {
|
||||||
|
prop: VARIABLE_PROP
|
||||||
|
},
|
||||||
|
'meta': {
|
||||||
|
prop: DEFAULT_PROP,
|
||||||
|
replace: [
|
||||||
|
{
|
||||||
|
substr: '</',
|
||||||
|
newSubstr: ' closing tag '
|
||||||
|
},
|
||||||
|
{
|
||||||
|
substr: '/>',
|
||||||
|
newSubstr: ' close tag '
|
||||||
|
},
|
||||||
|
{
|
||||||
|
substr: '<',
|
||||||
|
newSubstr: ' tag start '
|
||||||
|
},
|
||||||
|
{
|
||||||
|
substr: '>',
|
||||||
|
newSubstr: ' tag end '
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var DEFAULT_RULE = {
|
||||||
|
prop: DEFAULT_RULE
|
||||||
|
};
|
||||||
|
var expand = function(value, replaceRules) {
|
||||||
|
var newValue = value;
|
||||||
|
for (var i = 0; i < replaceRules.length; i++) {
|
||||||
|
var replaceRule = replaceRules[i];
|
||||||
|
var regexp = new RegExp(replaceRule.substr, 'g');
|
||||||
|
newValue = newValue.replace(regexp, replaceRule.newSubstr);
|
||||||
|
}
|
||||||
|
return newValue;
|
||||||
|
};
|
||||||
|
var mergeTokens = function(tokens, start, end) {
|
||||||
|
var newToken = {};
|
||||||
|
newToken.value = '';
|
||||||
|
newToken.type = tokens[start].type;
|
||||||
|
for (var j = start; j < end; j++) {
|
||||||
|
newToken.value += tokens[j].value;
|
||||||
|
}
|
||||||
|
return newToken;
|
||||||
|
};
|
||||||
|
var mergeLikeTokens = function(tokens) {
|
||||||
|
if (tokens.length <= 1) {
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
var newTokens = [];
|
||||||
|
var lastLikeIndex = 0;
|
||||||
|
for (var i = 1; i < tokens.length; i++) {
|
||||||
|
var lastLikeToken = tokens[lastLikeIndex];
|
||||||
|
var currToken = tokens[i];
|
||||||
|
if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) {
|
||||||
|
newTokens.push(mergeTokens(tokens, lastLikeIndex, i));
|
||||||
|
lastLikeIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length));
|
||||||
|
return newTokens;
|
||||||
|
};
|
||||||
|
var isRowWhiteSpace = function(row) {
|
||||||
|
var line = cvoxAce.editor.getSession().getLine(row);
|
||||||
|
var whiteSpaceRegexp = /^\s*$/;
|
||||||
|
return whiteSpaceRegexp.exec(line) !== null;
|
||||||
|
};
|
||||||
|
var speakLine = function(row, queue) {
|
||||||
|
var tokens = cvoxAce.editor.getSession().getTokens(row);
|
||||||
|
if (tokens.length === 0 || isRowWhiteSpace(row)) {
|
||||||
|
cvox.Api.playEarcon('EDITABLE_TEXT');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tokens = mergeLikeTokens(tokens);
|
||||||
|
var firstToken = tokens[0];
|
||||||
|
tokens = tokens.filter(function(token) {
|
||||||
|
return token !== firstToken;
|
||||||
|
});
|
||||||
|
speakToken_(firstToken, queue);
|
||||||
|
tokens.forEach(speakTokenQueue);
|
||||||
|
};
|
||||||
|
var speakTokenFlush = function(token) {
|
||||||
|
speakToken_(token, 0);
|
||||||
|
};
|
||||||
|
var speakTokenQueue = function(token) {
|
||||||
|
speakToken_(token, 1);
|
||||||
|
};
|
||||||
|
var getTokenRule = function(token) {
|
||||||
|
if (!token || !token.type) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var split = token.type.split('.');
|
||||||
|
if (split.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var type = split[0];
|
||||||
|
var rule = rules[type];
|
||||||
|
if (!rule) {
|
||||||
|
return DEFAULT_RULE;
|
||||||
|
}
|
||||||
|
return rule;
|
||||||
|
};
|
||||||
|
var speakToken_ = function(token, queue) {
|
||||||
|
var rule = getTokenRule(token);
|
||||||
|
var value = expand(token.value, REPLACE_LIST);
|
||||||
|
if (rule.replace) {
|
||||||
|
value = expand(value, rule.replace);
|
||||||
|
}
|
||||||
|
cvox.Api.speak(value, queue, rule.prop);
|
||||||
|
};
|
||||||
|
var speakChar = function(cursor) {
|
||||||
|
var line = getCurrentLine(cursor);
|
||||||
|
cvox.Api.speak(line[cursor.column], 1);
|
||||||
|
};
|
||||||
|
var speakDisplacement = function(lastCursor, currCursor) {
|
||||||
|
var line = getCurrentLine(currCursor);
|
||||||
|
var displace = line.substring(lastCursor.column, currCursor.column);
|
||||||
|
displace = displace.replace(/ /g, ' space ');
|
||||||
|
cvox.Api.speak(displace);
|
||||||
|
};
|
||||||
|
var speakCharOrWordOrLine = function(lastCursor, currCursor) {
|
||||||
|
if (Math.abs(lastCursor.column - currCursor.column) !== 1) {
|
||||||
|
var currLineLength = getCurrentLine(currCursor).length;
|
||||||
|
if (currCursor.column === 0 || currCursor.column === currLineLength) {
|
||||||
|
speakLine(currCursor.row, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isWord(currCursor)) {
|
||||||
|
cvox.Api.stop();
|
||||||
|
speakTokenQueue(getCurrentToken(currCursor));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
speakChar(currCursor);
|
||||||
|
};
|
||||||
|
var onColumnChange = function(lastCursor, currCursor) {
|
||||||
|
if (!cvoxAce.editor.selection.isEmpty()) {
|
||||||
|
speakDisplacement(lastCursor, currCursor);
|
||||||
|
cvox.Api.speak('selected', 1);
|
||||||
|
}
|
||||||
|
else if (shouldSpeakDisplacement) {
|
||||||
|
speakDisplacement(lastCursor, currCursor);
|
||||||
|
} else {
|
||||||
|
speakCharOrWordOrLine(lastCursor, currCursor);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var onCursorChange = function(evt) {
|
||||||
|
if (changed) {
|
||||||
|
changed = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var currCursor = cvoxAce.editor.selection.getCursor();
|
||||||
|
if (currCursor.row !== lastCursor.row) {
|
||||||
|
onRowChange(currCursor);
|
||||||
|
} else {
|
||||||
|
onColumnChange(lastCursor, currCursor);
|
||||||
|
}
|
||||||
|
lastCursor = currCursor;
|
||||||
|
};
|
||||||
|
var onSelectionChange = function(evt) {
|
||||||
|
if (cvoxAce.editor.selection.isEmpty()) {
|
||||||
|
cvox.Api.speak('unselected');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var onChange = function(evt) {
|
||||||
|
var data = evt.data;
|
||||||
|
switch (data.action) {
|
||||||
|
case 'removeText':
|
||||||
|
cvox.Api.speak(data.text, 0, DELETED_PROP);
|
||||||
|
changed = true;
|
||||||
|
break;
|
||||||
|
case 'insertText':
|
||||||
|
cvox.Api.speak(data.text, 0);
|
||||||
|
changed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var isNewAnnotation = function(annot) {
|
||||||
|
var row = annot.row;
|
||||||
|
var col = annot.column;
|
||||||
|
return !annotTable[row] || !annotTable[row][col];
|
||||||
|
};
|
||||||
|
var populateAnnotations = function(annotations) {
|
||||||
|
annotTable = {};
|
||||||
|
for (var i = 0; i < annotations.length; i++) {
|
||||||
|
var annotation = annotations[i];
|
||||||
|
var row = annotation.row;
|
||||||
|
var col = annotation.column;
|
||||||
|
if (!annotTable[row]) {
|
||||||
|
annotTable[row] = {};
|
||||||
|
}
|
||||||
|
annotTable[row][col] = annotation;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var onAnnotationChange = function(evt) {
|
||||||
|
var annotations = cvoxAce.editor.getSession().getAnnotations();
|
||||||
|
var newAnnotations = annotations.filter(isNewAnnotation);
|
||||||
|
if (newAnnotations.length > 0) {
|
||||||
|
cvox.Api.playEarcon(ERROR_EARCON);
|
||||||
|
}
|
||||||
|
populateAnnotations(annotations);
|
||||||
|
};
|
||||||
|
var speakAnnot = function(annot) {
|
||||||
|
var annotText = annot.type + ' ' + annot.text + ' on ' +
|
||||||
|
rowColToString(annot.row, annot.column);
|
||||||
|
annotText = annotText.replace(';', 'semicolon');
|
||||||
|
cvox.Api.speak(annotText, 1);
|
||||||
|
};
|
||||||
|
var speakAnnotsByRow = function(row) {
|
||||||
|
var annots = annotTable[row];
|
||||||
|
for (var col in annots) {
|
||||||
|
speakAnnot(annots[col]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var rowColToString = function(row, col) {
|
||||||
|
return 'row ' + (row + 1) + ' column ' + (col + 1);
|
||||||
|
};
|
||||||
|
var speakCurrRowAndCol = function() {
|
||||||
|
cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column));
|
||||||
|
};
|
||||||
|
var speakAllAnnots = function() {
|
||||||
|
for (var row in annotTable) {
|
||||||
|
speakAnnotsByRow(row);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var speakMode = function() {
|
||||||
|
if (!isVimMode()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (cvoxAce.editor.keyBinding.$data.state) {
|
||||||
|
case INSERT_MODE_STATE:
|
||||||
|
cvox.Api.speak('Insert mode');
|
||||||
|
break;
|
||||||
|
case COMMAND_MODE_STATE:
|
||||||
|
cvox.Api.speak('Command mode');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var toggleSpeakRowLocation = function() {
|
||||||
|
shouldSpeakRowLocation = !shouldSpeakRowLocation;
|
||||||
|
if (shouldSpeakRowLocation) {
|
||||||
|
cvox.Api.speak('Speak location on row change enabled.');
|
||||||
|
} else {
|
||||||
|
cvox.Api.speak('Speak location on row change disabled.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var toggleSpeakDisplacement = function() {
|
||||||
|
shouldSpeakDisplacement = !shouldSpeakDisplacement;
|
||||||
|
if (shouldSpeakDisplacement) {
|
||||||
|
cvox.Api.speak('Speak displacement on column changes.');
|
||||||
|
} else {
|
||||||
|
cvox.Api.speak('Speak current character or word on column changes.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var onKeyDown = function(evt) {
|
||||||
|
if (evt.ctrlKey && evt.shiftKey) {
|
||||||
|
var shortcut = keyCodeToShortcutMap[evt.keyCode];
|
||||||
|
if (shortcut) {
|
||||||
|
shortcut.func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var onChangeStatus = function(evt, editor) {
|
||||||
|
if (!isVimMode()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var state = editor.keyBinding.$data.state;
|
||||||
|
if (state === vimState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (state) {
|
||||||
|
case INSERT_MODE_STATE:
|
||||||
|
cvox.Api.playEarcon(MODE_SWITCH_EARCON);
|
||||||
|
cvox.Api.setKeyEcho(true);
|
||||||
|
break;
|
||||||
|
case COMMAND_MODE_STATE:
|
||||||
|
cvox.Api.playEarcon(MODE_SWITCH_EARCON);
|
||||||
|
cvox.Api.setKeyEcho(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vimState = state;
|
||||||
|
};
|
||||||
|
var contextMenuHandler = function(evt) {
|
||||||
|
var cmd = evt.detail['customCommand'];
|
||||||
|
var shortcut = cmdToShortcutMap[cmd];
|
||||||
|
if (shortcut) {
|
||||||
|
shortcut.func();
|
||||||
|
cvoxAce.editor.focus();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var initContextMenu = function() {
|
||||||
|
var ACTIONS = SHORTCUTS.map(function(shortcut) {
|
||||||
|
return {
|
||||||
|
desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode),
|
||||||
|
cmd: shortcut.cmd
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var body = document.querySelector('body');
|
||||||
|
body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS));
|
||||||
|
body.addEventListener('ATCustomEvent', contextMenuHandler, true);
|
||||||
|
};
|
||||||
|
var onFindSearchbox = function(evt) {
|
||||||
|
if (evt.match) {
|
||||||
|
speakLine(lastCursor.row, 0);
|
||||||
|
} else {
|
||||||
|
cvox.Api.playEarcon(NO_MATCH_EARCON);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var focus = function() {
|
||||||
|
cvoxAce.editor.focus();
|
||||||
|
};
|
||||||
|
var SHORTCUTS = [
|
||||||
|
{
|
||||||
|
keyCode: 49,
|
||||||
|
func: function() {
|
||||||
|
speakAnnotsByRow(lastCursor.row);
|
||||||
|
},
|
||||||
|
cmd: Command.SPEAK_ANNOT,
|
||||||
|
desc: 'Speak annotations on line'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 50,
|
||||||
|
func: speakAllAnnots,
|
||||||
|
cmd: Command.SPEAK_ALL_ANNOTS,
|
||||||
|
desc: 'Speak all annotations'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 51,
|
||||||
|
func: speakMode,
|
||||||
|
cmd: Command.SPEAK_MODE,
|
||||||
|
desc: 'Speak Vim mode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 52,
|
||||||
|
func: toggleSpeakRowLocation,
|
||||||
|
cmd: Command.TOGGLE_LOCATION,
|
||||||
|
desc: 'Toggle speak row location'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 53,
|
||||||
|
func: speakCurrRowAndCol,
|
||||||
|
cmd: Command.SPEAK_ROW_COL,
|
||||||
|
desc: 'Speak row and column'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 54,
|
||||||
|
func: toggleSpeakDisplacement,
|
||||||
|
cmd: Command.TOGGLE_DISPLACEMENT,
|
||||||
|
desc: 'Toggle speak displacement'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keyCode: 55,
|
||||||
|
func: focus,
|
||||||
|
cmd: Command.FOCUS_TEXT,
|
||||||
|
desc: 'Focus text'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
var onFocus = function() {
|
||||||
|
cvoxAce.editor = editor;
|
||||||
|
editor.getSession().selection.on('changeCursor', onCursorChange);
|
||||||
|
editor.getSession().selection.on('changeSelection', onSelectionChange);
|
||||||
|
editor.getSession().on('change', onChange);
|
||||||
|
editor.getSession().on('changeAnnotation', onAnnotationChange);
|
||||||
|
editor.on('changeStatus', onChangeStatus);
|
||||||
|
editor.on('findSearchBox', onFindSearchbox);
|
||||||
|
editor.container.addEventListener('keydown', onKeyDown);
|
||||||
|
|
||||||
|
lastCursor = editor.selection.getCursor();
|
||||||
|
};
|
||||||
|
var init = function(editor) {
|
||||||
|
onFocus();
|
||||||
|
SHORTCUTS.forEach(function(shortcut) {
|
||||||
|
keyCodeToShortcutMap[shortcut.keyCode] = shortcut;
|
||||||
|
cmdToShortcutMap[shortcut.cmd] = shortcut;
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('focus', onFocus);
|
||||||
|
if (isVimMode()) {
|
||||||
|
cvox.Api.setKeyEcho(false);
|
||||||
|
}
|
||||||
|
initContextMenu();
|
||||||
|
};
|
||||||
|
function cvoxApiExists() {
|
||||||
|
return (typeof(cvox) !== 'undefined') && cvox && cvox.Api;
|
||||||
|
}
|
||||||
|
var tries = 0;
|
||||||
|
var MAX_TRIES = 15;
|
||||||
|
function watchForCvoxLoad(editor) {
|
||||||
|
if (cvoxApiExists()) {
|
||||||
|
init(editor);
|
||||||
|
} else {
|
||||||
|
tries++;
|
||||||
|
if (tries >= MAX_TRIES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.setTimeout(watchForCvoxLoad, 500, editor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var Editor = require('../editor').Editor;
|
||||||
|
require('../config').defineOptions(Editor.prototype, 'editor', {
|
||||||
|
enableChromevoxEnhancements: {
|
||||||
|
set: function(val) {
|
||||||
|
if (val) {
|
||||||
|
watchForCvoxLoad(this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
value: true // turn it on by default or check for window.cvox
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
301
src/main/webapp/assets/ace/ext-elastic_tabstops_lite.js
Normal file
301
src/main/webapp/assets/ace/ext-elastic_tabstops_lite.js
Normal file
@@ -0,0 +1,301 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/elastic_tabstops_lite', ['require', 'exports', 'module' , 'ace/editor', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var ElasticTabstopsLite = function(editor) {
|
||||||
|
this.$editor = editor;
|
||||||
|
var self = this;
|
||||||
|
var changedRows = [];
|
||||||
|
var recordChanges = false;
|
||||||
|
this.onAfterExec = function() {
|
||||||
|
recordChanges = false;
|
||||||
|
self.processRows(changedRows);
|
||||||
|
changedRows = [];
|
||||||
|
};
|
||||||
|
this.onExec = function() {
|
||||||
|
recordChanges = true;
|
||||||
|
};
|
||||||
|
this.onChange = function(e) {
|
||||||
|
var range = e.data.range
|
||||||
|
if (recordChanges) {
|
||||||
|
if (changedRows.indexOf(range.start.row) == -1)
|
||||||
|
changedRows.push(range.start.row);
|
||||||
|
if (range.end.row != range.start.row)
|
||||||
|
changedRows.push(range.end.row);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.processRows = function(rows) {
|
||||||
|
this.$inChange = true;
|
||||||
|
var checkedRows = [];
|
||||||
|
|
||||||
|
for (var r = 0, rowCount = rows.length; r < rowCount; r++) {
|
||||||
|
var row = rows[r];
|
||||||
|
|
||||||
|
if (checkedRows.indexOf(row) > -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var cellWidthObj = this.$findCellWidthsForBlock(row);
|
||||||
|
var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths);
|
||||||
|
var rowIndex = cellWidthObj.firstRow;
|
||||||
|
|
||||||
|
for (var w = 0, l = cellWidths.length; w < l; w++) {
|
||||||
|
var widths = cellWidths[w];
|
||||||
|
checkedRows.push(rowIndex);
|
||||||
|
this.$adjustRow(rowIndex, widths);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$inChange = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findCellWidthsForBlock = function(row) {
|
||||||
|
var cellWidths = [], widths;
|
||||||
|
var rowIter = row;
|
||||||
|
while (rowIter >= 0) {
|
||||||
|
widths = this.$cellWidthsForRow(rowIter);
|
||||||
|
if (widths.length == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
cellWidths.unshift(widths);
|
||||||
|
rowIter--;
|
||||||
|
}
|
||||||
|
var firstRow = rowIter + 1;
|
||||||
|
rowIter = row;
|
||||||
|
var numRows = this.$editor.session.getLength();
|
||||||
|
|
||||||
|
while (rowIter < numRows - 1) {
|
||||||
|
rowIter++;
|
||||||
|
|
||||||
|
widths = this.$cellWidthsForRow(rowIter);
|
||||||
|
if (widths.length == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
cellWidths.push(widths);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { cellWidths: cellWidths, firstRow: firstRow };
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$cellWidthsForRow = function(row) {
|
||||||
|
var selectionColumns = this.$selectionColumnsForRow(row);
|
||||||
|
|
||||||
|
var tabs = [-1].concat(this.$tabsForRow(row));
|
||||||
|
var widths = tabs.map(function(el) { return 0; } ).slice(1);
|
||||||
|
var line = this.$editor.session.getLine(row);
|
||||||
|
|
||||||
|
for (var i = 0, len = tabs.length - 1; i < len; i++) {
|
||||||
|
var leftEdge = tabs[i]+1;
|
||||||
|
var rightEdge = tabs[i+1];
|
||||||
|
|
||||||
|
var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge);
|
||||||
|
var cell = line.substring(leftEdge, rightEdge);
|
||||||
|
widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge);
|
||||||
|
}
|
||||||
|
|
||||||
|
return widths;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$selectionColumnsForRow = function(row) {
|
||||||
|
var selections = [], cursor = this.$editor.getCursorPosition();
|
||||||
|
if (this.$editor.session.getSelection().isEmpty()) {
|
||||||
|
if (row == cursor.row)
|
||||||
|
selections.push(cursor.column);
|
||||||
|
}
|
||||||
|
|
||||||
|
return selections;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$setBlockCellWidthsToMax = function(cellWidths) {
|
||||||
|
var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth;
|
||||||
|
var columnInfo = this.$izip_longest(cellWidths);
|
||||||
|
|
||||||
|
for (var c = 0, l = columnInfo.length; c < l; c++) {
|
||||||
|
var column = columnInfo[c];
|
||||||
|
if (!column.push) {
|
||||||
|
console.error(column);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
column.push(NaN);
|
||||||
|
|
||||||
|
for (var r = 0, s = column.length; r < s; r++) {
|
||||||
|
var width = column[r];
|
||||||
|
if (startingNewBlock) {
|
||||||
|
blockStartRow = r;
|
||||||
|
maxWidth = 0;
|
||||||
|
startingNewBlock = false;
|
||||||
|
}
|
||||||
|
if (isNaN(width)) {
|
||||||
|
blockEndRow = r;
|
||||||
|
|
||||||
|
for (var j = blockStartRow; j < blockEndRow; j++) {
|
||||||
|
cellWidths[j][c] = maxWidth;
|
||||||
|
}
|
||||||
|
startingNewBlock = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxWidth = Math.max(maxWidth, width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cellWidths;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) {
|
||||||
|
var rightmost = 0;
|
||||||
|
|
||||||
|
if (selectionColumns.length) {
|
||||||
|
var lengths = [];
|
||||||
|
for (var s = 0, length = selectionColumns.length; s < length; s++) {
|
||||||
|
if (selectionColumns[s] <= cellRightEdge)
|
||||||
|
lengths.push(s);
|
||||||
|
else
|
||||||
|
lengths.push(0);
|
||||||
|
}
|
||||||
|
rightmost = Math.max.apply(Math, lengths);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rightmost;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$tabsForRow = function(row) {
|
||||||
|
var rowTabs = [], line = this.$editor.session.getLine(row),
|
||||||
|
re = /\t/g, match;
|
||||||
|
|
||||||
|
while ((match = re.exec(line)) != null) {
|
||||||
|
rowTabs.push(match.index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rowTabs;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$adjustRow = function(row, widths) {
|
||||||
|
var rowTabs = this.$tabsForRow(row);
|
||||||
|
|
||||||
|
if (rowTabs.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var bias = 0, location = -1;
|
||||||
|
var expandedSet = this.$izip(widths, rowTabs);
|
||||||
|
|
||||||
|
for (var i = 0, l = expandedSet.length; i < l; i++) {
|
||||||
|
var w = expandedSet[i][0], it = expandedSet[i][1];
|
||||||
|
location += 1 + w;
|
||||||
|
it += bias;
|
||||||
|
var difference = location - it;
|
||||||
|
|
||||||
|
if (difference == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var partialLine = this.$editor.session.getLine(row).substr(0, it );
|
||||||
|
var strippedPartialLine = partialLine.replace(/\s*$/g, "");
|
||||||
|
var ispaces = partialLine.length - strippedPartialLine.length;
|
||||||
|
|
||||||
|
if (difference > 0) {
|
||||||
|
this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t");
|
||||||
|
this.$editor.session.getDocument().removeInLine(row, it, it + 1);
|
||||||
|
|
||||||
|
bias += difference;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (difference < 0 && ispaces >= -difference) {
|
||||||
|
this.$editor.session.getDocument().removeInLine(row, it + difference, it);
|
||||||
|
bias += difference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.$izip_longest = function(iterables) {
|
||||||
|
if (!iterables[0])
|
||||||
|
return [];
|
||||||
|
var longest = iterables[0].length;
|
||||||
|
var iterablesLength = iterables.length;
|
||||||
|
|
||||||
|
for (var i = 1; i < iterablesLength; i++) {
|
||||||
|
var iLength = iterables[i].length;
|
||||||
|
if (iLength > longest)
|
||||||
|
longest = iLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
var expandedSet = [];
|
||||||
|
|
||||||
|
for (var l = 0; l < longest; l++) {
|
||||||
|
var set = [];
|
||||||
|
for (var i = 0; i < iterablesLength; i++) {
|
||||||
|
if (iterables[i][l] === "")
|
||||||
|
set.push(NaN);
|
||||||
|
else
|
||||||
|
set.push(iterables[i][l]);
|
||||||
|
}
|
||||||
|
|
||||||
|
expandedSet.push(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return expandedSet;
|
||||||
|
};
|
||||||
|
this.$izip = function(widths, tabs) {
|
||||||
|
var size = widths.length >= tabs.length ? tabs.length : widths.length;
|
||||||
|
|
||||||
|
var expandedSet = [];
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
var set = [ widths[i], tabs[i] ];
|
||||||
|
expandedSet.push(set);
|
||||||
|
}
|
||||||
|
return expandedSet;
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(ElasticTabstopsLite.prototype);
|
||||||
|
|
||||||
|
exports.ElasticTabstopsLite = ElasticTabstopsLite;
|
||||||
|
|
||||||
|
var Editor = require("../editor").Editor;
|
||||||
|
require("../config").defineOptions(Editor.prototype, "editor", {
|
||||||
|
useElasticTabstops: {
|
||||||
|
set: function(val) {
|
||||||
|
if (val) {
|
||||||
|
if (!this.elasticTabstops)
|
||||||
|
this.elasticTabstops = new ElasticTabstopsLite(this);
|
||||||
|
this.commands.on("afterExec", this.elasticTabstops.onAfterExec);
|
||||||
|
this.commands.on("exec", this.elasticTabstops.onExec);
|
||||||
|
this.on("change", this.elasticTabstops.onChange);
|
||||||
|
} else if (this.elasticTabstops) {
|
||||||
|
this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec);
|
||||||
|
this.commands.removeListener("exec", this.elasticTabstops.onExec);
|
||||||
|
this.removeListener("change", this.elasticTabstops.onChange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
1113
src/main/webapp/assets/ace/ext-emmet.js
Normal file
1113
src/main/webapp/assets/ace/ext-emmet.js
Normal file
File diff suppressed because it is too large
Load Diff
0
src/main/webapp/assets/ace/ext-error_marker.js
Normal file
0
src/main/webapp/assets/ace/ext-error_marker.js
Normal file
207
src/main/webapp/assets/ace/ext-keybinding_menu.js
Normal file
207
src/main/webapp/assets/ace/ext-keybinding_menu.js
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Contributed to Ajax.org under the BSD license.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/keybinding_menu', ['require', 'exports', 'module' , 'ace/editor', 'ace/ext/menu_tools/overlay_page', 'ace/ext/menu_tools/get_editor_keyboard_shortcuts'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var Editor = require("ace/editor").Editor;
|
||||||
|
function showKeyboardShortcuts (editor) {
|
||||||
|
if(!document.getElementById('kbshortcutmenu')) {
|
||||||
|
var overlayPage = require('./menu_tools/overlay_page').overlayPage;
|
||||||
|
var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
|
||||||
|
var kb = getEditorKeybordShortcuts(editor);
|
||||||
|
var el = document.createElement('div');
|
||||||
|
var commands = kb.reduce(function(previous, current) {
|
||||||
|
return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
|
||||||
|
+ current.command + '</span> : '
|
||||||
|
+ '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
|
||||||
|
}, '');
|
||||||
|
|
||||||
|
el.id = 'kbshortcutmenu';
|
||||||
|
el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
|
||||||
|
overlayPage(editor, el, '0', '0', '0', null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
module.exports.init = function(editor) {
|
||||||
|
Editor.prototype.showKeyboardShortcuts = function() {
|
||||||
|
showKeyboardShortcuts(this);
|
||||||
|
};
|
||||||
|
editor.commands.addCommands([{
|
||||||
|
name: "showKeyboardShortcuts",
|
||||||
|
bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
|
||||||
|
exec: function(editor, line) {
|
||||||
|
editor.showKeyboardShortcuts();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var dom = require("../../lib/dom");
|
||||||
|
var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
|
||||||
|
background-color: #F7F7F7;\
|
||||||
|
color: black;\
|
||||||
|
box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\
|
||||||
|
padding: 1em 0.5em 2em 1em;\
|
||||||
|
overflow: auto;\
|
||||||
|
position: absolute;\
|
||||||
|
margin: 0;\
|
||||||
|
bottom: 0;\
|
||||||
|
right: 0;\
|
||||||
|
top: 0;\
|
||||||
|
z-index: 9991;\
|
||||||
|
cursor: default;\
|
||||||
|
}\
|
||||||
|
.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\
|
||||||
|
box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\
|
||||||
|
background-color: rgba(255, 255, 255, 0.6);\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuEntry:hover {\
|
||||||
|
background-color: rgba(100, 100, 100, 0.1);\
|
||||||
|
-webkit-transition: all 0.5s;\
|
||||||
|
transition: all 0.3s\
|
||||||
|
}\
|
||||||
|
.ace_closeButton {\
|
||||||
|
background: rgba(245, 146, 146, 0.5);\
|
||||||
|
border: 1px solid #F48A8A;\
|
||||||
|
border-radius: 50%;\
|
||||||
|
padding: 7px;\
|
||||||
|
position: absolute;\
|
||||||
|
right: -8px;\
|
||||||
|
top: -8px;\
|
||||||
|
z-index: 1000;\
|
||||||
|
}\
|
||||||
|
.ace_closeButton{\
|
||||||
|
background: rgba(245, 146, 146, 0.9);\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuKey {\
|
||||||
|
color: darkslateblue;\
|
||||||
|
font-weight: bold;\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuCommand {\
|
||||||
|
color: darkcyan;\
|
||||||
|
font-weight: normal;\
|
||||||
|
}";
|
||||||
|
dom.importCssString(cssText);
|
||||||
|
module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) {
|
||||||
|
top = top ? 'top: ' + top + ';' : '';
|
||||||
|
bottom = bottom ? 'bottom: ' + bottom + ';' : '';
|
||||||
|
right = right ? 'right: ' + right + ';' : '';
|
||||||
|
left = left ? 'left: ' + left + ';' : '';
|
||||||
|
|
||||||
|
var closer = document.createElement('div');
|
||||||
|
var contentContainer = document.createElement('div');
|
||||||
|
|
||||||
|
function documentEscListener(e) {
|
||||||
|
if (e.keyCode === 27) {
|
||||||
|
closer.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closer.style.cssText = 'margin: 0; padding: 0; ' +
|
||||||
|
'position: fixed; top:0; bottom:0; left:0; right:0;' +
|
||||||
|
'z-index: 9990; ' +
|
||||||
|
'background-color: rgba(0, 0, 0, 0.3);';
|
||||||
|
closer.addEventListener('click', function() {
|
||||||
|
document.removeEventListener('keydown', documentEscListener);
|
||||||
|
closer.parentNode.removeChild(closer);
|
||||||
|
editor.focus();
|
||||||
|
closer = null;
|
||||||
|
});
|
||||||
|
document.addEventListener('keydown', documentEscListener);
|
||||||
|
|
||||||
|
contentContainer.style.cssText = top + right + bottom + left;
|
||||||
|
contentContainer.addEventListener('click', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
var wrapper = dom.createElement("div");
|
||||||
|
wrapper.style.position = "relative";
|
||||||
|
|
||||||
|
var closeButton = dom.createElement("div");
|
||||||
|
closeButton.className = "ace_closeButton";
|
||||||
|
closeButton.addEventListener('click', function() {
|
||||||
|
closer.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
wrapper.appendChild(closeButton);
|
||||||
|
contentContainer.appendChild(wrapper);
|
||||||
|
|
||||||
|
contentContainer.appendChild(contentElement);
|
||||||
|
closer.appendChild(contentContainer);
|
||||||
|
document.body.appendChild(closer);
|
||||||
|
editor.blur();
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/get_editor_keyboard_shortcuts', ['require', 'exports', 'module' , 'ace/lib/keys'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var keys = require("../../lib/keys");
|
||||||
|
module.exports.getEditorKeybordShortcuts = function(editor) {
|
||||||
|
var KEY_MODS = keys.KEY_MODS;
|
||||||
|
var keybindings = [];
|
||||||
|
var commandMap = {};
|
||||||
|
editor.keyBinding.$handlers.forEach(function(handler) {
|
||||||
|
var ckb = handler.commandKeyBinding;
|
||||||
|
for (var i in ckb) {
|
||||||
|
var modifier = parseInt(i);
|
||||||
|
if (modifier == -1) {
|
||||||
|
modifier = "";
|
||||||
|
} else if(isNaN(modifier)) {
|
||||||
|
modifier = i;
|
||||||
|
} else {
|
||||||
|
modifier = "" +
|
||||||
|
(modifier & KEY_MODS.command ? "Cmd-" : "") +
|
||||||
|
(modifier & KEY_MODS.ctrl ? "Ctrl-" : "") +
|
||||||
|
(modifier & KEY_MODS.alt ? "Alt-" : "") +
|
||||||
|
(modifier & KEY_MODS.shift ? "Shift-" : "");
|
||||||
|
}
|
||||||
|
for (var key in ckb[i]) {
|
||||||
|
var command = ckb[i][key]
|
||||||
|
if (typeof command != "string")
|
||||||
|
command = command.name
|
||||||
|
if (commandMap[command]) {
|
||||||
|
commandMap[command].key += "|" + modifier + key;
|
||||||
|
} else {
|
||||||
|
commandMap[command] = {key: modifier+key, command: command};
|
||||||
|
keybindings.push(commandMap[command]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return keybindings;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
1756
src/main/webapp/assets/ace/ext-language_tools.js
Normal file
1756
src/main/webapp/assets/ace/ext-language_tools.js
Normal file
File diff suppressed because it is too large
Load Diff
171
src/main/webapp/assets/ace/ext-modelist.js
Normal file
171
src/main/webapp/assets/ace/ext-modelist.js
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
ace.define('ace/ext/modelist', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var modes = [];
|
||||||
|
function getModeForPath(path) {
|
||||||
|
var mode = modesByName.text;
|
||||||
|
var fileName = path.split(/[\/\\]/).pop();
|
||||||
|
for (var i = 0; i < modes.length; i++) {
|
||||||
|
if (modes[i].supportsFile(fileName)) {
|
||||||
|
mode = modes[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
var Mode = function(name, caption, extensions) {
|
||||||
|
this.name = name;
|
||||||
|
this.caption = caption;
|
||||||
|
this.mode = "ace/mode/" + name;
|
||||||
|
this.extensions = extensions;
|
||||||
|
if (/\^/.test(extensions)) {
|
||||||
|
var re = extensions.replace(/\|(\^)?/g, function(a, b){
|
||||||
|
return "$|" + (b ? "^" : "^.*\\.");
|
||||||
|
}) + "$";
|
||||||
|
} else {
|
||||||
|
var re = "^.*\\.(" + extensions + ")$";
|
||||||
|
}
|
||||||
|
|
||||||
|
this.extRe = new RegExp(re, "gi");
|
||||||
|
};
|
||||||
|
|
||||||
|
Mode.prototype.supportsFile = function(filename) {
|
||||||
|
return filename.match(this.extRe);
|
||||||
|
};
|
||||||
|
var supportedModes = {
|
||||||
|
ABAP: ["abap"],
|
||||||
|
ActionScript:["as"],
|
||||||
|
ADA: ["ada|adb"],
|
||||||
|
Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"],
|
||||||
|
AsciiDoc: ["asciidoc"],
|
||||||
|
Assembly_x86:["asm"],
|
||||||
|
AutoHotKey: ["ahk"],
|
||||||
|
BatchFile: ["bat|cmd"],
|
||||||
|
C9Search: ["c9search_results"],
|
||||||
|
C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp"],
|
||||||
|
Cirru: ["cirru|cr"],
|
||||||
|
Clojure: ["clj"],
|
||||||
|
Cobol: ["CBL|COB"],
|
||||||
|
coffee: ["coffee|cf|cson|^Cakefile"],
|
||||||
|
ColdFusion: ["cfm"],
|
||||||
|
CSharp: ["cs"],
|
||||||
|
CSS: ["css"],
|
||||||
|
Curly: ["curly"],
|
||||||
|
D: ["d|di"],
|
||||||
|
Dart: ["dart"],
|
||||||
|
Diff: ["diff|patch"],
|
||||||
|
Dot: ["dot"],
|
||||||
|
Erlang: ["erl|hrl"],
|
||||||
|
EJS: ["ejs"],
|
||||||
|
Forth: ["frt|fs|ldr"],
|
||||||
|
FTL: ["ftl"],
|
||||||
|
Gherkin: ["feature"],
|
||||||
|
Glsl: ["glsl|frag|vert"],
|
||||||
|
golang: ["go"],
|
||||||
|
Groovy: ["groovy"],
|
||||||
|
HAML: ["haml"],
|
||||||
|
Handlebars: ["hbs|handlebars|tpl|mustache"],
|
||||||
|
Haskell: ["hs"],
|
||||||
|
haXe: ["hx"],
|
||||||
|
HTML: ["html|htm|xhtml"],
|
||||||
|
HTML_Ruby: ["erb|rhtml|html.erb"],
|
||||||
|
INI: ["ini|conf|cfg|prefs"],
|
||||||
|
Jack: ["jack"],
|
||||||
|
Jade: ["jade"],
|
||||||
|
Java: ["java"],
|
||||||
|
JavaScript: ["js|jsm"],
|
||||||
|
JSON: ["json"],
|
||||||
|
JSONiq: ["jq"],
|
||||||
|
JSP: ["jsp"],
|
||||||
|
JSX: ["jsx"],
|
||||||
|
Julia: ["jl"],
|
||||||
|
LaTeX: ["tex|latex|ltx|bib"],
|
||||||
|
LESS: ["less"],
|
||||||
|
Liquid: ["liquid"],
|
||||||
|
Lisp: ["lisp"],
|
||||||
|
LiveScript: ["ls"],
|
||||||
|
LogiQL: ["logic|lql"],
|
||||||
|
LSL: ["lsl"],
|
||||||
|
Lua: ["lua"],
|
||||||
|
LuaPage: ["lp"],
|
||||||
|
Lucene: ["lucene"],
|
||||||
|
Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],
|
||||||
|
MATLAB: ["matlab"],
|
||||||
|
Markdown: ["md|markdown"],
|
||||||
|
MEL: ["mel"],
|
||||||
|
MySQL: ["mysql"],
|
||||||
|
MUSHCode: ["mc|mush"],
|
||||||
|
Nix: ["nix"],
|
||||||
|
ObjectiveC: ["m|mm"],
|
||||||
|
OCaml: ["ml|mli"],
|
||||||
|
Pascal: ["pas|p"],
|
||||||
|
Perl: ["pl|pm"],
|
||||||
|
pgSQL: ["pgsql"],
|
||||||
|
PHP: ["php|phtml"],
|
||||||
|
Powershell: ["ps1"],
|
||||||
|
Prolog: ["plg|prolog"],
|
||||||
|
Properties: ["properties"],
|
||||||
|
Protobuf: ["proto"],
|
||||||
|
Python: ["py"],
|
||||||
|
R: ["r"],
|
||||||
|
RDoc: ["Rd"],
|
||||||
|
RHTML: ["Rhtml"],
|
||||||
|
Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],
|
||||||
|
Rust: ["rs"],
|
||||||
|
SASS: ["sass"],
|
||||||
|
SCAD: ["scad"],
|
||||||
|
Scala: ["scala"],
|
||||||
|
Smarty: ["smarty|tpl"],
|
||||||
|
Scheme: ["scm|rkt"],
|
||||||
|
SCSS: ["scss"],
|
||||||
|
SH: ["sh|bash|^.bashrc"],
|
||||||
|
SJS: ["sjs"],
|
||||||
|
Space: ["space"],
|
||||||
|
snippets: ["snippets"],
|
||||||
|
Soy_Template:["soy"],
|
||||||
|
SQL: ["sql"],
|
||||||
|
Stylus: ["styl|stylus"],
|
||||||
|
SVG: ["svg"],
|
||||||
|
Tcl: ["tcl"],
|
||||||
|
Tex: ["tex"],
|
||||||
|
Text: ["txt"],
|
||||||
|
Textile: ["textile"],
|
||||||
|
Toml: ["toml"],
|
||||||
|
Twig: ["twig"],
|
||||||
|
Typescript: ["ts|typescript|str"],
|
||||||
|
VBScript: ["vbs"],
|
||||||
|
Velocity: ["vm"],
|
||||||
|
Verilog: ["v|vh|sv|svh"],
|
||||||
|
XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"],
|
||||||
|
XQuery: ["xq"],
|
||||||
|
YAML: ["yaml|yml"]
|
||||||
|
};
|
||||||
|
|
||||||
|
var nameOverrides = {
|
||||||
|
ObjectiveC: "Objective-C",
|
||||||
|
CSharp: "C#",
|
||||||
|
golang: "Go",
|
||||||
|
C_Cpp: "C/C++",
|
||||||
|
coffee: "CoffeeScript",
|
||||||
|
HTML_Ruby: "HTML (Ruby)",
|
||||||
|
FTL: "FreeMarker"
|
||||||
|
};
|
||||||
|
var modesByName = {};
|
||||||
|
for (var name in supportedModes) {
|
||||||
|
var data = supportedModes[name];
|
||||||
|
var displayName = (nameOverrides[name] || name).replace(/_/g, " ");
|
||||||
|
var filename = name.toLowerCase();
|
||||||
|
var mode = new Mode(filename, displayName, data[0]);
|
||||||
|
modesByName[filename] = mode;
|
||||||
|
modes.push(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getModeForPath: getModeForPath,
|
||||||
|
modes: modes,
|
||||||
|
modesByName: modesByName
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
506
src/main/webapp/assets/ace/ext-old_ie.js
Normal file
506
src/main/webapp/assets/ace/ext-old_ie.js
Normal file
@@ -0,0 +1,506 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/old_ie', ['require', 'exports', 'module' , 'ace/lib/useragent', 'ace/tokenizer', 'ace/ext/searchbox', 'ace/mode/text'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var MAX_TOKEN_COUNT = 1000;
|
||||||
|
var useragent = require("../lib/useragent");
|
||||||
|
var TokenizerModule = require("../tokenizer");
|
||||||
|
|
||||||
|
function patch(obj, name, regexp, replacement) {
|
||||||
|
eval("obj['" + name + "']=" + obj[name].toString().replace(
|
||||||
|
regexp, replacement
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useragent.isIE && useragent.isIE < 10 && window.top.document.compatMode === "BackCompat")
|
||||||
|
useragent.isOldIE = true;
|
||||||
|
|
||||||
|
if (typeof document != "undefined" && !document.documentElement.querySelector) {
|
||||||
|
useragent.isOldIE = true;
|
||||||
|
var qs = function(el, selector) {
|
||||||
|
if (selector.charAt(0) == ".") {
|
||||||
|
var classNeme = selector.slice(1);
|
||||||
|
} else {
|
||||||
|
var m = selector.match(/(\w+)=(\w+)/);
|
||||||
|
var attr = m && m[1];
|
||||||
|
var attrVal = m && m[2];
|
||||||
|
}
|
||||||
|
for (var i = 0; i < el.all.length; i++) {
|
||||||
|
var ch = el.all[i];
|
||||||
|
if (classNeme) {
|
||||||
|
if (ch.className.indexOf(classNeme) != -1)
|
||||||
|
return ch;
|
||||||
|
} else if (attr) {
|
||||||
|
if (ch.getAttribute(attr) == attrVal)
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var sb = require("./searchbox").SearchBox.prototype;
|
||||||
|
patch(
|
||||||
|
sb, "$initElements",
|
||||||
|
/([^\s=]*).querySelector\((".*?")\)/g,
|
||||||
|
"qs($1, $2)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var compliantExecNpcg = /()??/.exec("")[1] === undefined;
|
||||||
|
if (compliantExecNpcg)
|
||||||
|
return;
|
||||||
|
var proto = TokenizerModule.Tokenizer.prototype;
|
||||||
|
TokenizerModule.Tokenizer_orig = TokenizerModule.Tokenizer;
|
||||||
|
proto.getLineTokens_orig = proto.getLineTokens;
|
||||||
|
|
||||||
|
patch(
|
||||||
|
TokenizerModule, "Tokenizer",
|
||||||
|
"ruleRegExps.push(adjustedregex);\n",
|
||||||
|
function(m) {
|
||||||
|
return m + '\
|
||||||
|
if (state[i].next && RegExp(adjustedregex).test(""))\n\
|
||||||
|
rule._qre = RegExp(adjustedregex, "g");\n\
|
||||||
|
';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
TokenizerModule.Tokenizer.prototype = proto;
|
||||||
|
patch(
|
||||||
|
proto, "getLineTokens",
|
||||||
|
/if \(match\[i \+ 1\] === undefined\)\s*continue;/,
|
||||||
|
"if (!match[i + 1]) {\n\
|
||||||
|
if (value)continue;\n\
|
||||||
|
var qre = state[mapping[i]]._qre;\n\
|
||||||
|
if (!qre) continue;\n\
|
||||||
|
qre.lastIndex = lastIndex;\n\
|
||||||
|
if (!qre.exec(line) || qre.lastIndex != lastIndex)\n\
|
||||||
|
continue;\n\
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
|
||||||
|
patch(
|
||||||
|
require("../mode/text").Mode.prototype, "getTokenizer",
|
||||||
|
/Tokenizer/,
|
||||||
|
"TokenizerModule.Tokenizer"
|
||||||
|
);
|
||||||
|
|
||||||
|
useragent.isOldIE = true;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/searchbox', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var dom = require("../lib/dom");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var event = require("../lib/event");
|
||||||
|
var searchboxCss = "\
|
||||||
|
/* ------------------------------------------------------------------------------------------\
|
||||||
|
* Editor Search Form\
|
||||||
|
* --------------------------------------------------------------------------------------- */\
|
||||||
|
.ace_search {\
|
||||||
|
background-color: #ddd;\
|
||||||
|
border: 1px solid #cbcbcb;\
|
||||||
|
border-top: 0 none;\
|
||||||
|
max-width: 297px;\
|
||||||
|
overflow: hidden;\
|
||||||
|
margin: 0;\
|
||||||
|
padding: 4px;\
|
||||||
|
padding-right: 6px;\
|
||||||
|
padding-bottom: 0;\
|
||||||
|
position: absolute;\
|
||||||
|
top: 0px;\
|
||||||
|
z-index: 99;\
|
||||||
|
white-space: normal;\
|
||||||
|
}\
|
||||||
|
.ace_search.left {\
|
||||||
|
border-left: 0 none;\
|
||||||
|
border-radius: 0px 0px 5px 0px;\
|
||||||
|
left: 0;\
|
||||||
|
}\
|
||||||
|
.ace_search.right {\
|
||||||
|
border-radius: 0px 0px 0px 5px;\
|
||||||
|
border-right: 0 none;\
|
||||||
|
right: 0;\
|
||||||
|
}\
|
||||||
|
.ace_search_form, .ace_replace_form {\
|
||||||
|
border-radius: 3px;\
|
||||||
|
border: 1px solid #cbcbcb;\
|
||||||
|
float: left;\
|
||||||
|
margin-bottom: 4px;\
|
||||||
|
overflow: hidden;\
|
||||||
|
}\
|
||||||
|
.ace_search_form.ace_nomatch {\
|
||||||
|
outline: 1px solid red;\
|
||||||
|
}\
|
||||||
|
.ace_search_field {\
|
||||||
|
background-color: white;\
|
||||||
|
border-right: 1px solid #cbcbcb;\
|
||||||
|
border: 0 none;\
|
||||||
|
-webkit-box-sizing: border-box;\
|
||||||
|
-moz-box-sizing: border-box;\
|
||||||
|
box-sizing: border-box;\
|
||||||
|
display: block;\
|
||||||
|
float: left;\
|
||||||
|
height: 22px;\
|
||||||
|
outline: 0;\
|
||||||
|
padding: 0 7px;\
|
||||||
|
width: 214px;\
|
||||||
|
margin: 0;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn,\
|
||||||
|
.ace_replacebtn {\
|
||||||
|
background: #fff;\
|
||||||
|
border: 0 none;\
|
||||||
|
border-left: 1px solid #dcdcdc;\
|
||||||
|
cursor: pointer;\
|
||||||
|
display: block;\
|
||||||
|
float: left;\
|
||||||
|
height: 22px;\
|
||||||
|
margin: 0;\
|
||||||
|
padding: 0;\
|
||||||
|
position: relative;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn:last-child,\
|
||||||
|
.ace_replacebtn:last-child {\
|
||||||
|
border-top-right-radius: 3px;\
|
||||||
|
border-bottom-right-radius: 3px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn:disabled {\
|
||||||
|
background: none;\
|
||||||
|
cursor: default;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn {\
|
||||||
|
background-position: 50% 50%;\
|
||||||
|
background-repeat: no-repeat;\
|
||||||
|
width: 27px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn.prev {\
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); \
|
||||||
|
}\
|
||||||
|
.ace_searchbtn.next {\
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); \
|
||||||
|
}\
|
||||||
|
.ace_searchbtn_close {\
|
||||||
|
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\
|
||||||
|
border-radius: 50%;\
|
||||||
|
border: 0 none;\
|
||||||
|
color: #656565;\
|
||||||
|
cursor: pointer;\
|
||||||
|
display: block;\
|
||||||
|
float: right;\
|
||||||
|
font-family: Arial;\
|
||||||
|
font-size: 16px;\
|
||||||
|
height: 14px;\
|
||||||
|
line-height: 16px;\
|
||||||
|
margin: 5px 1px 9px 5px;\
|
||||||
|
padding: 0;\
|
||||||
|
text-align: center;\
|
||||||
|
width: 14px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn_close:hover {\
|
||||||
|
background-color: #656565;\
|
||||||
|
background-position: 50% 100%;\
|
||||||
|
color: white;\
|
||||||
|
}\
|
||||||
|
.ace_replacebtn.prev {\
|
||||||
|
width: 54px\
|
||||||
|
}\
|
||||||
|
.ace_replacebtn.next {\
|
||||||
|
width: 27px\
|
||||||
|
}\
|
||||||
|
.ace_button {\
|
||||||
|
margin-left: 2px;\
|
||||||
|
cursor: pointer;\
|
||||||
|
-webkit-user-select: none;\
|
||||||
|
-moz-user-select: none;\
|
||||||
|
-o-user-select: none;\
|
||||||
|
-ms-user-select: none;\
|
||||||
|
user-select: none;\
|
||||||
|
overflow: hidden;\
|
||||||
|
opacity: 0.7;\
|
||||||
|
border: 1px solid rgba(100,100,100,0.23);\
|
||||||
|
padding: 1px;\
|
||||||
|
-moz-box-sizing: border-box;\
|
||||||
|
box-sizing: border-box;\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace_button:hover {\
|
||||||
|
background-color: #eee;\
|
||||||
|
opacity:1;\
|
||||||
|
}\
|
||||||
|
.ace_button:active {\
|
||||||
|
background-color: #ddd;\
|
||||||
|
}\
|
||||||
|
.ace_button.checked {\
|
||||||
|
border-color: #3399ff;\
|
||||||
|
opacity:1;\
|
||||||
|
}\
|
||||||
|
.ace_search_options{\
|
||||||
|
margin-bottom: 3px;\
|
||||||
|
text-align: right;\
|
||||||
|
-webkit-user-select: none;\
|
||||||
|
-moz-user-select: none;\
|
||||||
|
-o-user-select: none;\
|
||||||
|
-ms-user-select: none;\
|
||||||
|
user-select: none;\
|
||||||
|
}";
|
||||||
|
var HashHandler = require("../keyboard/hash_handler").HashHandler;
|
||||||
|
var keyUtil = require("../lib/keys");
|
||||||
|
|
||||||
|
dom.importCssString(searchboxCss, "ace_searchbox");
|
||||||
|
|
||||||
|
var html = '<div class="ace_search right">\
|
||||||
|
<button type="button" action="hide" class="ace_searchbtn_close"></button>\
|
||||||
|
<div class="ace_search_form">\
|
||||||
|
<input class="ace_search_field" placeholder="Search for" spellcheck="false"></input>\
|
||||||
|
<button type="button" action="findNext" class="ace_searchbtn next"></button>\
|
||||||
|
<button type="button" action="findPrev" class="ace_searchbtn prev"></button>\
|
||||||
|
</div>\
|
||||||
|
<div class="ace_replace_form">\
|
||||||
|
<input class="ace_search_field" placeholder="Replace with" spellcheck="false"></input>\
|
||||||
|
<button type="button" action="replaceAndFindNext" class="ace_replacebtn">Replace</button>\
|
||||||
|
<button type="button" action="replaceAll" class="ace_replacebtn">All</button>\
|
||||||
|
</div>\
|
||||||
|
<div class="ace_search_options">\
|
||||||
|
<span action="toggleRegexpMode" class="ace_button" title="RegExp Search">.*</span>\
|
||||||
|
<span action="toggleCaseSensitive" class="ace_button" title="CaseSensitive Search">Aa</span>\
|
||||||
|
<span action="toggleWholeWords" class="ace_button" title="Whole Word Search">\\b</span>\
|
||||||
|
</div>\
|
||||||
|
</div>'.replace(/>\s+/g, ">");
|
||||||
|
|
||||||
|
var SearchBox = function(editor, range, showReplaceForm) {
|
||||||
|
var div = dom.createElement("div");
|
||||||
|
div.innerHTML = html;
|
||||||
|
this.element = div.firstChild;
|
||||||
|
|
||||||
|
this.$init();
|
||||||
|
this.setEditor(editor);
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.setEditor = function(editor) {
|
||||||
|
editor.searchBox = this;
|
||||||
|
editor.container.appendChild(this.element);
|
||||||
|
this.editor = editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$initElements = function(sb) {
|
||||||
|
this.searchBox = sb.querySelector(".ace_search_form");
|
||||||
|
this.replaceBox = sb.querySelector(".ace_replace_form");
|
||||||
|
this.searchOptions = sb.querySelector(".ace_search_options");
|
||||||
|
this.regExpOption = sb.querySelector("[action=toggleRegexpMode]");
|
||||||
|
this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]");
|
||||||
|
this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]");
|
||||||
|
this.searchInput = this.searchBox.querySelector(".ace_search_field");
|
||||||
|
this.replaceInput = this.replaceBox.querySelector(".ace_search_field");
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$init = function() {
|
||||||
|
var sb = this.element;
|
||||||
|
|
||||||
|
this.$initElements(sb);
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
event.addListener(sb, "mousedown", function(e) {
|
||||||
|
setTimeout(function(){
|
||||||
|
_this.activeInput.focus();
|
||||||
|
}, 0);
|
||||||
|
event.stopPropagation(e);
|
||||||
|
});
|
||||||
|
event.addListener(sb, "click", function(e) {
|
||||||
|
var t = e.target || e.srcElement;
|
||||||
|
var action = t.getAttribute("action");
|
||||||
|
if (action && _this[action])
|
||||||
|
_this[action]();
|
||||||
|
else if (_this.$searchBarKb.commands[action])
|
||||||
|
_this.$searchBarKb.commands[action].exec(_this);
|
||||||
|
event.stopPropagation(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addCommandKeyListener(sb, function(e, hashId, keyCode) {
|
||||||
|
var keyString = keyUtil.keyCodeToString(keyCode);
|
||||||
|
var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);
|
||||||
|
if (command && command.exec) {
|
||||||
|
command.exec(_this);
|
||||||
|
event.stopEvent(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$onChange = lang.delayedCall(function() {
|
||||||
|
_this.find(false, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addListener(this.searchInput, "input", function() {
|
||||||
|
_this.$onChange.schedule(20);
|
||||||
|
});
|
||||||
|
event.addListener(this.searchInput, "focus", function() {
|
||||||
|
_this.activeInput = _this.searchInput;
|
||||||
|
_this.searchInput.value && _this.highlight();
|
||||||
|
});
|
||||||
|
event.addListener(this.replaceInput, "focus", function() {
|
||||||
|
_this.activeInput = _this.replaceInput;
|
||||||
|
_this.searchInput.value && _this.highlight();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.$closeSearchBarKb = new HashHandler([{
|
||||||
|
bindKey: "Esc",
|
||||||
|
name: "closeSearchBar",
|
||||||
|
exec: function(editor) {
|
||||||
|
editor.searchBox.hide();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
this.$searchBarKb = new HashHandler();
|
||||||
|
this.$searchBarKb.bindKeys({
|
||||||
|
"Ctrl-f|Command-f|Ctrl-H|Command-Option-F": function(sb) {
|
||||||
|
var isReplace = sb.isReplace = !sb.isReplace;
|
||||||
|
sb.replaceBox.style.display = isReplace ? "" : "none";
|
||||||
|
sb[isReplace ? "replaceInput" : "searchInput"].focus();
|
||||||
|
},
|
||||||
|
"Ctrl-G|Command-G": function(sb) {
|
||||||
|
sb.findNext();
|
||||||
|
},
|
||||||
|
"Ctrl-Shift-G|Command-Shift-G": function(sb) {
|
||||||
|
sb.findPrev();
|
||||||
|
},
|
||||||
|
"esc": function(sb) {
|
||||||
|
setTimeout(function() { sb.hide();});
|
||||||
|
},
|
||||||
|
"Return": function(sb) {
|
||||||
|
if (sb.activeInput == sb.replaceInput)
|
||||||
|
sb.replace();
|
||||||
|
sb.findNext();
|
||||||
|
},
|
||||||
|
"Shift-Return": function(sb) {
|
||||||
|
if (sb.activeInput == sb.replaceInput)
|
||||||
|
sb.replace();
|
||||||
|
sb.findPrev();
|
||||||
|
},
|
||||||
|
"Tab": function(sb) {
|
||||||
|
(sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$searchBarKb.addCommands([{
|
||||||
|
name: "toggleRegexpMode",
|
||||||
|
bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.regExpOption.checked = !sb.regExpOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "toggleCaseSensitive",
|
||||||
|
bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "toggleWholeWords",
|
||||||
|
bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.wholeWordOption.checked = !sb.wholeWordOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
this.$syncOptions = function() {
|
||||||
|
dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked);
|
||||||
|
dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked);
|
||||||
|
dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked);
|
||||||
|
this.find(false, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.highlight = function(re) {
|
||||||
|
this.editor.session.highlight(re || this.editor.$search.$options.re);
|
||||||
|
this.editor.renderer.updateBackMarkers()
|
||||||
|
};
|
||||||
|
this.find = function(skipCurrent, backwards) {
|
||||||
|
var range = this.editor.find(this.searchInput.value, {
|
||||||
|
skipCurrent: skipCurrent,
|
||||||
|
backwards: backwards,
|
||||||
|
wrap: true,
|
||||||
|
regExp: this.regExpOption.checked,
|
||||||
|
caseSensitive: this.caseSensitiveOption.checked,
|
||||||
|
wholeWord: this.wholeWordOption.checked
|
||||||
|
});
|
||||||
|
var noMatch = !range && this.searchInput.value;
|
||||||
|
dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);
|
||||||
|
this.editor._emit("findSearchBox", { match: !noMatch });
|
||||||
|
this.highlight();
|
||||||
|
};
|
||||||
|
this.findNext = function() {
|
||||||
|
this.find(true, false);
|
||||||
|
};
|
||||||
|
this.findPrev = function() {
|
||||||
|
this.find(true, true);
|
||||||
|
};
|
||||||
|
this.replace = function() {
|
||||||
|
if (!this.editor.getReadOnly())
|
||||||
|
this.editor.replace(this.replaceInput.value);
|
||||||
|
};
|
||||||
|
this.replaceAndFindNext = function() {
|
||||||
|
if (!this.editor.getReadOnly()) {
|
||||||
|
this.editor.replace(this.replaceInput.value);
|
||||||
|
this.findNext()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.replaceAll = function() {
|
||||||
|
if (!this.editor.getReadOnly())
|
||||||
|
this.editor.replaceAll(this.replaceInput.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hide = function() {
|
||||||
|
this.element.style.display = "none";
|
||||||
|
this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);
|
||||||
|
this.editor.focus();
|
||||||
|
};
|
||||||
|
this.show = function(value, isReplace) {
|
||||||
|
this.element.style.display = "";
|
||||||
|
this.replaceBox.style.display = isReplace ? "" : "none";
|
||||||
|
|
||||||
|
this.isReplace = isReplace;
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
this.searchInput.value = value;
|
||||||
|
this.searchInput.focus();
|
||||||
|
this.searchInput.select();
|
||||||
|
|
||||||
|
this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(SearchBox.prototype);
|
||||||
|
|
||||||
|
exports.SearchBox = SearchBox;
|
||||||
|
|
||||||
|
exports.Search = function(editor, isReplace) {
|
||||||
|
var sb = editor.searchBox || new SearchBox(editor);
|
||||||
|
sb.show(editor.session.getTextRange(), isReplace);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
421
src/main/webapp/assets/ace/ext-searchbox.js
Normal file
421
src/main/webapp/assets/ace/ext-searchbox.js
Normal file
@@ -0,0 +1,421 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/searchbox', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var dom = require("../lib/dom");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var event = require("../lib/event");
|
||||||
|
var searchboxCss = "\
|
||||||
|
/* ------------------------------------------------------------------------------------------\
|
||||||
|
* Editor Search Form\
|
||||||
|
* --------------------------------------------------------------------------------------- */\
|
||||||
|
.ace_search {\
|
||||||
|
background-color: #ddd;\
|
||||||
|
border: 1px solid #cbcbcb;\
|
||||||
|
border-top: 0 none;\
|
||||||
|
max-width: 297px;\
|
||||||
|
overflow: hidden;\
|
||||||
|
margin: 0;\
|
||||||
|
padding: 4px;\
|
||||||
|
padding-right: 6px;\
|
||||||
|
padding-bottom: 0;\
|
||||||
|
position: absolute;\
|
||||||
|
top: 0px;\
|
||||||
|
z-index: 99;\
|
||||||
|
white-space: normal;\
|
||||||
|
}\
|
||||||
|
.ace_search.left {\
|
||||||
|
border-left: 0 none;\
|
||||||
|
border-radius: 0px 0px 5px 0px;\
|
||||||
|
left: 0;\
|
||||||
|
}\
|
||||||
|
.ace_search.right {\
|
||||||
|
border-radius: 0px 0px 0px 5px;\
|
||||||
|
border-right: 0 none;\
|
||||||
|
right: 0;\
|
||||||
|
}\
|
||||||
|
.ace_search_form, .ace_replace_form {\
|
||||||
|
border-radius: 3px;\
|
||||||
|
border: 1px solid #cbcbcb;\
|
||||||
|
float: left;\
|
||||||
|
margin-bottom: 4px;\
|
||||||
|
overflow: hidden;\
|
||||||
|
}\
|
||||||
|
.ace_search_form.ace_nomatch {\
|
||||||
|
outline: 1px solid red;\
|
||||||
|
}\
|
||||||
|
.ace_search_field {\
|
||||||
|
background-color: white;\
|
||||||
|
border-right: 1px solid #cbcbcb;\
|
||||||
|
border: 0 none;\
|
||||||
|
-webkit-box-sizing: border-box;\
|
||||||
|
-moz-box-sizing: border-box;\
|
||||||
|
box-sizing: border-box;\
|
||||||
|
display: block;\
|
||||||
|
float: left;\
|
||||||
|
height: 22px;\
|
||||||
|
outline: 0;\
|
||||||
|
padding: 0 7px;\
|
||||||
|
width: 214px;\
|
||||||
|
margin: 0;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn,\
|
||||||
|
.ace_replacebtn {\
|
||||||
|
background: #fff;\
|
||||||
|
border: 0 none;\
|
||||||
|
border-left: 1px solid #dcdcdc;\
|
||||||
|
cursor: pointer;\
|
||||||
|
display: block;\
|
||||||
|
float: left;\
|
||||||
|
height: 22px;\
|
||||||
|
margin: 0;\
|
||||||
|
padding: 0;\
|
||||||
|
position: relative;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn:last-child,\
|
||||||
|
.ace_replacebtn:last-child {\
|
||||||
|
border-top-right-radius: 3px;\
|
||||||
|
border-bottom-right-radius: 3px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn:disabled {\
|
||||||
|
background: none;\
|
||||||
|
cursor: default;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn {\
|
||||||
|
background-position: 50% 50%;\
|
||||||
|
background-repeat: no-repeat;\
|
||||||
|
width: 27px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn.prev {\
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); \
|
||||||
|
}\
|
||||||
|
.ace_searchbtn.next {\
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); \
|
||||||
|
}\
|
||||||
|
.ace_searchbtn_close {\
|
||||||
|
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\
|
||||||
|
border-radius: 50%;\
|
||||||
|
border: 0 none;\
|
||||||
|
color: #656565;\
|
||||||
|
cursor: pointer;\
|
||||||
|
display: block;\
|
||||||
|
float: right;\
|
||||||
|
font-family: Arial;\
|
||||||
|
font-size: 16px;\
|
||||||
|
height: 14px;\
|
||||||
|
line-height: 16px;\
|
||||||
|
margin: 5px 1px 9px 5px;\
|
||||||
|
padding: 0;\
|
||||||
|
text-align: center;\
|
||||||
|
width: 14px;\
|
||||||
|
}\
|
||||||
|
.ace_searchbtn_close:hover {\
|
||||||
|
background-color: #656565;\
|
||||||
|
background-position: 50% 100%;\
|
||||||
|
color: white;\
|
||||||
|
}\
|
||||||
|
.ace_replacebtn.prev {\
|
||||||
|
width: 54px\
|
||||||
|
}\
|
||||||
|
.ace_replacebtn.next {\
|
||||||
|
width: 27px\
|
||||||
|
}\
|
||||||
|
.ace_button {\
|
||||||
|
margin-left: 2px;\
|
||||||
|
cursor: pointer;\
|
||||||
|
-webkit-user-select: none;\
|
||||||
|
-moz-user-select: none;\
|
||||||
|
-o-user-select: none;\
|
||||||
|
-ms-user-select: none;\
|
||||||
|
user-select: none;\
|
||||||
|
overflow: hidden;\
|
||||||
|
opacity: 0.7;\
|
||||||
|
border: 1px solid rgba(100,100,100,0.23);\
|
||||||
|
padding: 1px;\
|
||||||
|
-moz-box-sizing: border-box;\
|
||||||
|
box-sizing: border-box;\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace_button:hover {\
|
||||||
|
background-color: #eee;\
|
||||||
|
opacity:1;\
|
||||||
|
}\
|
||||||
|
.ace_button:active {\
|
||||||
|
background-color: #ddd;\
|
||||||
|
}\
|
||||||
|
.ace_button.checked {\
|
||||||
|
border-color: #3399ff;\
|
||||||
|
opacity:1;\
|
||||||
|
}\
|
||||||
|
.ace_search_options{\
|
||||||
|
margin-bottom: 3px;\
|
||||||
|
text-align: right;\
|
||||||
|
-webkit-user-select: none;\
|
||||||
|
-moz-user-select: none;\
|
||||||
|
-o-user-select: none;\
|
||||||
|
-ms-user-select: none;\
|
||||||
|
user-select: none;\
|
||||||
|
}";
|
||||||
|
var HashHandler = require("../keyboard/hash_handler").HashHandler;
|
||||||
|
var keyUtil = require("../lib/keys");
|
||||||
|
|
||||||
|
dom.importCssString(searchboxCss, "ace_searchbox");
|
||||||
|
|
||||||
|
var html = '<div class="ace_search right">\
|
||||||
|
<button type="button" action="hide" class="ace_searchbtn_close"></button>\
|
||||||
|
<div class="ace_search_form">\
|
||||||
|
<input class="ace_search_field" placeholder="Search for" spellcheck="false"></input>\
|
||||||
|
<button type="button" action="findNext" class="ace_searchbtn next"></button>\
|
||||||
|
<button type="button" action="findPrev" class="ace_searchbtn prev"></button>\
|
||||||
|
</div>\
|
||||||
|
<div class="ace_replace_form">\
|
||||||
|
<input class="ace_search_field" placeholder="Replace with" spellcheck="false"></input>\
|
||||||
|
<button type="button" action="replaceAndFindNext" class="ace_replacebtn">Replace</button>\
|
||||||
|
<button type="button" action="replaceAll" class="ace_replacebtn">All</button>\
|
||||||
|
</div>\
|
||||||
|
<div class="ace_search_options">\
|
||||||
|
<span action="toggleRegexpMode" class="ace_button" title="RegExp Search">.*</span>\
|
||||||
|
<span action="toggleCaseSensitive" class="ace_button" title="CaseSensitive Search">Aa</span>\
|
||||||
|
<span action="toggleWholeWords" class="ace_button" title="Whole Word Search">\\b</span>\
|
||||||
|
</div>\
|
||||||
|
</div>'.replace(/>\s+/g, ">");
|
||||||
|
|
||||||
|
var SearchBox = function(editor, range, showReplaceForm) {
|
||||||
|
var div = dom.createElement("div");
|
||||||
|
div.innerHTML = html;
|
||||||
|
this.element = div.firstChild;
|
||||||
|
|
||||||
|
this.$init();
|
||||||
|
this.setEditor(editor);
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.setEditor = function(editor) {
|
||||||
|
editor.searchBox = this;
|
||||||
|
editor.container.appendChild(this.element);
|
||||||
|
this.editor = editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$initElements = function(sb) {
|
||||||
|
this.searchBox = sb.querySelector(".ace_search_form");
|
||||||
|
this.replaceBox = sb.querySelector(".ace_replace_form");
|
||||||
|
this.searchOptions = sb.querySelector(".ace_search_options");
|
||||||
|
this.regExpOption = sb.querySelector("[action=toggleRegexpMode]");
|
||||||
|
this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]");
|
||||||
|
this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]");
|
||||||
|
this.searchInput = this.searchBox.querySelector(".ace_search_field");
|
||||||
|
this.replaceInput = this.replaceBox.querySelector(".ace_search_field");
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$init = function() {
|
||||||
|
var sb = this.element;
|
||||||
|
|
||||||
|
this.$initElements(sb);
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
event.addListener(sb, "mousedown", function(e) {
|
||||||
|
setTimeout(function(){
|
||||||
|
_this.activeInput.focus();
|
||||||
|
}, 0);
|
||||||
|
event.stopPropagation(e);
|
||||||
|
});
|
||||||
|
event.addListener(sb, "click", function(e) {
|
||||||
|
var t = e.target || e.srcElement;
|
||||||
|
var action = t.getAttribute("action");
|
||||||
|
if (action && _this[action])
|
||||||
|
_this[action]();
|
||||||
|
else if (_this.$searchBarKb.commands[action])
|
||||||
|
_this.$searchBarKb.commands[action].exec(_this);
|
||||||
|
event.stopPropagation(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addCommandKeyListener(sb, function(e, hashId, keyCode) {
|
||||||
|
var keyString = keyUtil.keyCodeToString(keyCode);
|
||||||
|
var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);
|
||||||
|
if (command && command.exec) {
|
||||||
|
command.exec(_this);
|
||||||
|
event.stopEvent(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$onChange = lang.delayedCall(function() {
|
||||||
|
_this.find(false, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addListener(this.searchInput, "input", function() {
|
||||||
|
_this.$onChange.schedule(20);
|
||||||
|
});
|
||||||
|
event.addListener(this.searchInput, "focus", function() {
|
||||||
|
_this.activeInput = _this.searchInput;
|
||||||
|
_this.searchInput.value && _this.highlight();
|
||||||
|
});
|
||||||
|
event.addListener(this.replaceInput, "focus", function() {
|
||||||
|
_this.activeInput = _this.replaceInput;
|
||||||
|
_this.searchInput.value && _this.highlight();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.$closeSearchBarKb = new HashHandler([{
|
||||||
|
bindKey: "Esc",
|
||||||
|
name: "closeSearchBar",
|
||||||
|
exec: function(editor) {
|
||||||
|
editor.searchBox.hide();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
this.$searchBarKb = new HashHandler();
|
||||||
|
this.$searchBarKb.bindKeys({
|
||||||
|
"Ctrl-f|Command-f|Ctrl-H|Command-Option-F": function(sb) {
|
||||||
|
var isReplace = sb.isReplace = !sb.isReplace;
|
||||||
|
sb.replaceBox.style.display = isReplace ? "" : "none";
|
||||||
|
sb[isReplace ? "replaceInput" : "searchInput"].focus();
|
||||||
|
},
|
||||||
|
"Ctrl-G|Command-G": function(sb) {
|
||||||
|
sb.findNext();
|
||||||
|
},
|
||||||
|
"Ctrl-Shift-G|Command-Shift-G": function(sb) {
|
||||||
|
sb.findPrev();
|
||||||
|
},
|
||||||
|
"esc": function(sb) {
|
||||||
|
setTimeout(function() { sb.hide();});
|
||||||
|
},
|
||||||
|
"Return": function(sb) {
|
||||||
|
if (sb.activeInput == sb.replaceInput)
|
||||||
|
sb.replace();
|
||||||
|
sb.findNext();
|
||||||
|
},
|
||||||
|
"Shift-Return": function(sb) {
|
||||||
|
if (sb.activeInput == sb.replaceInput)
|
||||||
|
sb.replace();
|
||||||
|
sb.findPrev();
|
||||||
|
},
|
||||||
|
"Tab": function(sb) {
|
||||||
|
(sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$searchBarKb.addCommands([{
|
||||||
|
name: "toggleRegexpMode",
|
||||||
|
bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.regExpOption.checked = !sb.regExpOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "toggleCaseSensitive",
|
||||||
|
bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "toggleWholeWords",
|
||||||
|
bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"},
|
||||||
|
exec: function(sb) {
|
||||||
|
sb.wholeWordOption.checked = !sb.wholeWordOption.checked;
|
||||||
|
sb.$syncOptions();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
this.$syncOptions = function() {
|
||||||
|
dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked);
|
||||||
|
dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked);
|
||||||
|
dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked);
|
||||||
|
this.find(false, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.highlight = function(re) {
|
||||||
|
this.editor.session.highlight(re || this.editor.$search.$options.re);
|
||||||
|
this.editor.renderer.updateBackMarkers()
|
||||||
|
};
|
||||||
|
this.find = function(skipCurrent, backwards) {
|
||||||
|
var range = this.editor.find(this.searchInput.value, {
|
||||||
|
skipCurrent: skipCurrent,
|
||||||
|
backwards: backwards,
|
||||||
|
wrap: true,
|
||||||
|
regExp: this.regExpOption.checked,
|
||||||
|
caseSensitive: this.caseSensitiveOption.checked,
|
||||||
|
wholeWord: this.wholeWordOption.checked
|
||||||
|
});
|
||||||
|
var noMatch = !range && this.searchInput.value;
|
||||||
|
dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);
|
||||||
|
this.editor._emit("findSearchBox", { match: !noMatch });
|
||||||
|
this.highlight();
|
||||||
|
};
|
||||||
|
this.findNext = function() {
|
||||||
|
this.find(true, false);
|
||||||
|
};
|
||||||
|
this.findPrev = function() {
|
||||||
|
this.find(true, true);
|
||||||
|
};
|
||||||
|
this.replace = function() {
|
||||||
|
if (!this.editor.getReadOnly())
|
||||||
|
this.editor.replace(this.replaceInput.value);
|
||||||
|
};
|
||||||
|
this.replaceAndFindNext = function() {
|
||||||
|
if (!this.editor.getReadOnly()) {
|
||||||
|
this.editor.replace(this.replaceInput.value);
|
||||||
|
this.findNext()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.replaceAll = function() {
|
||||||
|
if (!this.editor.getReadOnly())
|
||||||
|
this.editor.replaceAll(this.replaceInput.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hide = function() {
|
||||||
|
this.element.style.display = "none";
|
||||||
|
this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);
|
||||||
|
this.editor.focus();
|
||||||
|
};
|
||||||
|
this.show = function(value, isReplace) {
|
||||||
|
this.element.style.display = "";
|
||||||
|
this.replaceBox.style.display = isReplace ? "" : "none";
|
||||||
|
|
||||||
|
this.isReplace = isReplace;
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
this.searchInput.value = value;
|
||||||
|
this.searchInput.focus();
|
||||||
|
this.searchInput.select();
|
||||||
|
|
||||||
|
this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(SearchBox.prototype);
|
||||||
|
|
||||||
|
exports.SearchBox = SearchBox;
|
||||||
|
|
||||||
|
exports.Search = function(editor, isReplace) {
|
||||||
|
var sb = editor.searchBox || new SearchBox(editor);
|
||||||
|
sb.show(editor.session.getTextRange(), isReplace);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
636
src/main/webapp/assets/ace/ext-settings_menu.js
Normal file
636
src/main/webapp/assets/ace/ext-settings_menu.js
Normal file
@@ -0,0 +1,636 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Contributed to Ajax.org under the BSD license.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/settings_menu', ['require', 'exports', 'module' , 'ace/ext/menu_tools/generate_settings_menu', 'ace/ext/menu_tools/overlay_page', 'ace/editor'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var generateSettingsMenu = require('./menu_tools/generate_settings_menu').generateSettingsMenu;
|
||||||
|
var overlayPage = require('./menu_tools/overlay_page').overlayPage;
|
||||||
|
function showSettingsMenu(editor) {
|
||||||
|
var sm = document.getElementById('ace_settingsmenu');
|
||||||
|
if (!sm)
|
||||||
|
overlayPage(editor, generateSettingsMenu(editor), '0', '0', '0');
|
||||||
|
}
|
||||||
|
module.exports.init = function(editor) {
|
||||||
|
var Editor = require("ace/editor").Editor;
|
||||||
|
Editor.prototype.showSettingsMenu = function() {
|
||||||
|
showSettingsMenu(this);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/generate_settings_menu', ['require', 'exports', 'module' , 'ace/ext/menu_tools/element_generator', 'ace/ext/menu_tools/add_editor_menu_options', 'ace/ext/menu_tools/get_set_functions'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var egen = require('./element_generator');
|
||||||
|
var addEditorMenuOptions = require('./add_editor_menu_options').addEditorMenuOptions;
|
||||||
|
var getSetFunctions = require('./get_set_functions').getSetFunctions;
|
||||||
|
module.exports.generateSettingsMenu = function generateSettingsMenu (editor) {
|
||||||
|
var elements = [];
|
||||||
|
function cleanupElementsList() {
|
||||||
|
elements.sort(function(a, b) {
|
||||||
|
var x = a.getAttribute('contains');
|
||||||
|
var y = b.getAttribute('contains');
|
||||||
|
return x.localeCompare(y);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function wrapElements() {
|
||||||
|
var topmenu = document.createElement('div');
|
||||||
|
topmenu.setAttribute('id', 'ace_settingsmenu');
|
||||||
|
elements.forEach(function(element) {
|
||||||
|
topmenu.appendChild(element);
|
||||||
|
});
|
||||||
|
return topmenu;
|
||||||
|
}
|
||||||
|
function createNewEntry(obj, clss, item, val) {
|
||||||
|
var el;
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.setAttribute('contains', item);
|
||||||
|
div.setAttribute('class', 'ace_optionsMenuEntry');
|
||||||
|
div.setAttribute('style', 'clear: both;');
|
||||||
|
|
||||||
|
div.appendChild(egen.createLabel(
|
||||||
|
item.replace(/^set/, '').replace(/([A-Z])/g, ' $1').trim(),
|
||||||
|
item
|
||||||
|
));
|
||||||
|
|
||||||
|
if (Array.isArray(val)) {
|
||||||
|
el = egen.createSelection(item, val, clss);
|
||||||
|
el.addEventListener('change', function(e) {
|
||||||
|
try{
|
||||||
|
editor.menuOptions[e.target.id].forEach(function(x) {
|
||||||
|
if(x.textContent !== e.target.textContent) {
|
||||||
|
delete x.selected;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
obj[e.target.id](e.target.value);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if(typeof val === 'boolean') {
|
||||||
|
el = egen.createCheckbox(item, val, clss);
|
||||||
|
el.addEventListener('change', function(e) {
|
||||||
|
try{
|
||||||
|
obj[e.target.id](!!e.target.checked);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
el = egen.createInput(item, val, clss);
|
||||||
|
el.addEventListener('change', function(e) {
|
||||||
|
try{
|
||||||
|
if(e.target.value === 'true') {
|
||||||
|
obj[e.target.id](true);
|
||||||
|
} else if(e.target.value === 'false') {
|
||||||
|
obj[e.target.id](false);
|
||||||
|
} else {
|
||||||
|
obj[e.target.id](e.target.value);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
el.style.cssText = 'float:right;';
|
||||||
|
div.appendChild(el);
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
function makeDropdown(item, esr, clss, fn) {
|
||||||
|
var val = editor.menuOptions[item];
|
||||||
|
var currentVal = esr[fn]();
|
||||||
|
if (typeof currentVal == 'object')
|
||||||
|
currentVal = currentVal.$id;
|
||||||
|
val.forEach(function(valuex) {
|
||||||
|
if (valuex.value === currentVal)
|
||||||
|
valuex.selected = 'selected';
|
||||||
|
});
|
||||||
|
return createNewEntry(esr, clss, item, val);
|
||||||
|
}
|
||||||
|
function handleSet(setObj) {
|
||||||
|
var item = setObj.functionName;
|
||||||
|
var esr = setObj.parentObj;
|
||||||
|
var clss = setObj.parentName;
|
||||||
|
var val;
|
||||||
|
var fn = item.replace(/^set/, 'get');
|
||||||
|
if(editor.menuOptions[item] !== undefined) {
|
||||||
|
elements.push(makeDropdown(item, esr, clss, fn));
|
||||||
|
} else if(typeof esr[fn] === 'function') {
|
||||||
|
try {
|
||||||
|
val = esr[fn]();
|
||||||
|
if(typeof val === 'object') {
|
||||||
|
val = val.$id;
|
||||||
|
}
|
||||||
|
elements.push(
|
||||||
|
createNewEntry(esr, clss, item, val)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addEditorMenuOptions(editor);
|
||||||
|
getSetFunctions(editor).forEach(function(setObj) {
|
||||||
|
handleSet(setObj);
|
||||||
|
});
|
||||||
|
cleanupElementsList();
|
||||||
|
return wrapElements();
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/element_generator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
module.exports.createOption = function createOption (obj) {
|
||||||
|
var attribute;
|
||||||
|
var el = document.createElement('option');
|
||||||
|
for(attribute in obj) {
|
||||||
|
if(obj.hasOwnProperty(attribute)) {
|
||||||
|
if(attribute === 'selected') {
|
||||||
|
el.setAttribute(attribute, obj[attribute]);
|
||||||
|
} else {
|
||||||
|
el[attribute] = obj[attribute];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
module.exports.createCheckbox = function createCheckbox (id, checked, clss) {
|
||||||
|
var el = document.createElement('input');
|
||||||
|
el.setAttribute('type', 'checkbox');
|
||||||
|
el.setAttribute('id', id);
|
||||||
|
el.setAttribute('name', id);
|
||||||
|
el.setAttribute('value', checked);
|
||||||
|
el.setAttribute('class', clss);
|
||||||
|
if(checked) {
|
||||||
|
el.setAttribute('checked', 'checked');
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
module.exports.createInput = function createInput (id, value, clss) {
|
||||||
|
var el = document.createElement('input');
|
||||||
|
el.setAttribute('type', 'text');
|
||||||
|
el.setAttribute('id', id);
|
||||||
|
el.setAttribute('name', id);
|
||||||
|
el.setAttribute('value', value);
|
||||||
|
el.setAttribute('class', clss);
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
module.exports.createLabel = function createLabel (text, labelFor) {
|
||||||
|
var el = document.createElement('label');
|
||||||
|
el.setAttribute('for', labelFor);
|
||||||
|
el.textContent = text;
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
module.exports.createSelection = function createSelection (id, values, clss) {
|
||||||
|
var el = document.createElement('select');
|
||||||
|
el.setAttribute('id', id);
|
||||||
|
el.setAttribute('name', id);
|
||||||
|
el.setAttribute('class', clss);
|
||||||
|
values.forEach(function(item) {
|
||||||
|
el.appendChild(module.exports.createOption(item));
|
||||||
|
});
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/add_editor_menu_options', ['require', 'exports', 'module' , 'ace/ext/modelist', 'ace/ext/themelist'], function(require, exports, module) {
|
||||||
|
module.exports.addEditorMenuOptions = function addEditorMenuOptions (editor) {
|
||||||
|
var modelist = require('../modelist');
|
||||||
|
var themelist = require('../themelist');
|
||||||
|
editor.menuOptions = {
|
||||||
|
"setNewLineMode" : [{
|
||||||
|
"textContent" : "unix",
|
||||||
|
"value" : "unix"
|
||||||
|
}, {
|
||||||
|
"textContent" : "windows",
|
||||||
|
"value" : "windows"
|
||||||
|
}, {
|
||||||
|
"textContent" : "auto",
|
||||||
|
"value" : "auto"
|
||||||
|
}],
|
||||||
|
"setTheme" : [],
|
||||||
|
"setMode" : [],
|
||||||
|
"setKeyboardHandler": [{
|
||||||
|
"textContent" : "ace",
|
||||||
|
"value" : ""
|
||||||
|
}, {
|
||||||
|
"textContent" : "vim",
|
||||||
|
"value" : "ace/keyboard/vim"
|
||||||
|
}, {
|
||||||
|
"textContent" : "emacs",
|
||||||
|
"value" : "ace/keyboard/emacs"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.menuOptions.setTheme = themelist.themes.map(function(theme) {
|
||||||
|
return {
|
||||||
|
'textContent' : theme.caption,
|
||||||
|
'value' : theme.theme
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.menuOptions.setMode = modelist.modes.map(function(mode) {
|
||||||
|
return {
|
||||||
|
'textContent' : mode.name,
|
||||||
|
'value' : mode.mode
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
ace.define('ace/ext/modelist', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var modes = [];
|
||||||
|
function getModeForPath(path) {
|
||||||
|
var mode = modesByName.text;
|
||||||
|
var fileName = path.split(/[\/\\]/).pop();
|
||||||
|
for (var i = 0; i < modes.length; i++) {
|
||||||
|
if (modes[i].supportsFile(fileName)) {
|
||||||
|
mode = modes[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
var Mode = function(name, caption, extensions) {
|
||||||
|
this.name = name;
|
||||||
|
this.caption = caption;
|
||||||
|
this.mode = "ace/mode/" + name;
|
||||||
|
this.extensions = extensions;
|
||||||
|
if (/\^/.test(extensions)) {
|
||||||
|
var re = extensions.replace(/\|(\^)?/g, function(a, b){
|
||||||
|
return "$|" + (b ? "^" : "^.*\\.");
|
||||||
|
}) + "$";
|
||||||
|
} else {
|
||||||
|
var re = "^.*\\.(" + extensions + ")$";
|
||||||
|
}
|
||||||
|
|
||||||
|
this.extRe = new RegExp(re, "gi");
|
||||||
|
};
|
||||||
|
|
||||||
|
Mode.prototype.supportsFile = function(filename) {
|
||||||
|
return filename.match(this.extRe);
|
||||||
|
};
|
||||||
|
var supportedModes = {
|
||||||
|
ABAP: ["abap"],
|
||||||
|
ActionScript:["as"],
|
||||||
|
ADA: ["ada|adb"],
|
||||||
|
Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"],
|
||||||
|
AsciiDoc: ["asciidoc"],
|
||||||
|
Assembly_x86:["asm"],
|
||||||
|
AutoHotKey: ["ahk"],
|
||||||
|
BatchFile: ["bat|cmd"],
|
||||||
|
C9Search: ["c9search_results"],
|
||||||
|
C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp"],
|
||||||
|
Cirru: ["cirru|cr"],
|
||||||
|
Clojure: ["clj"],
|
||||||
|
Cobol: ["CBL|COB"],
|
||||||
|
coffee: ["coffee|cf|cson|^Cakefile"],
|
||||||
|
ColdFusion: ["cfm"],
|
||||||
|
CSharp: ["cs"],
|
||||||
|
CSS: ["css"],
|
||||||
|
Curly: ["curly"],
|
||||||
|
D: ["d|di"],
|
||||||
|
Dart: ["dart"],
|
||||||
|
Diff: ["diff|patch"],
|
||||||
|
Dot: ["dot"],
|
||||||
|
Erlang: ["erl|hrl"],
|
||||||
|
EJS: ["ejs"],
|
||||||
|
Forth: ["frt|fs|ldr"],
|
||||||
|
FTL: ["ftl"],
|
||||||
|
Gherkin: ["feature"],
|
||||||
|
Glsl: ["glsl|frag|vert"],
|
||||||
|
golang: ["go"],
|
||||||
|
Groovy: ["groovy"],
|
||||||
|
HAML: ["haml"],
|
||||||
|
Handlebars: ["hbs|handlebars|tpl|mustache"],
|
||||||
|
Haskell: ["hs"],
|
||||||
|
haXe: ["hx"],
|
||||||
|
HTML: ["html|htm|xhtml"],
|
||||||
|
HTML_Ruby: ["erb|rhtml|html.erb"],
|
||||||
|
INI: ["ini|conf|cfg|prefs"],
|
||||||
|
Jack: ["jack"],
|
||||||
|
Jade: ["jade"],
|
||||||
|
Java: ["java"],
|
||||||
|
JavaScript: ["js|jsm"],
|
||||||
|
JSON: ["json"],
|
||||||
|
JSONiq: ["jq"],
|
||||||
|
JSP: ["jsp"],
|
||||||
|
JSX: ["jsx"],
|
||||||
|
Julia: ["jl"],
|
||||||
|
LaTeX: ["tex|latex|ltx|bib"],
|
||||||
|
LESS: ["less"],
|
||||||
|
Liquid: ["liquid"],
|
||||||
|
Lisp: ["lisp"],
|
||||||
|
LiveScript: ["ls"],
|
||||||
|
LogiQL: ["logic|lql"],
|
||||||
|
LSL: ["lsl"],
|
||||||
|
Lua: ["lua"],
|
||||||
|
LuaPage: ["lp"],
|
||||||
|
Lucene: ["lucene"],
|
||||||
|
Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],
|
||||||
|
MATLAB: ["matlab"],
|
||||||
|
Markdown: ["md|markdown"],
|
||||||
|
MEL: ["mel"],
|
||||||
|
MySQL: ["mysql"],
|
||||||
|
MUSHCode: ["mc|mush"],
|
||||||
|
Nix: ["nix"],
|
||||||
|
ObjectiveC: ["m|mm"],
|
||||||
|
OCaml: ["ml|mli"],
|
||||||
|
Pascal: ["pas|p"],
|
||||||
|
Perl: ["pl|pm"],
|
||||||
|
pgSQL: ["pgsql"],
|
||||||
|
PHP: ["php|phtml"],
|
||||||
|
Powershell: ["ps1"],
|
||||||
|
Prolog: ["plg|prolog"],
|
||||||
|
Properties: ["properties"],
|
||||||
|
Protobuf: ["proto"],
|
||||||
|
Python: ["py"],
|
||||||
|
R: ["r"],
|
||||||
|
RDoc: ["Rd"],
|
||||||
|
RHTML: ["Rhtml"],
|
||||||
|
Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],
|
||||||
|
Rust: ["rs"],
|
||||||
|
SASS: ["sass"],
|
||||||
|
SCAD: ["scad"],
|
||||||
|
Scala: ["scala"],
|
||||||
|
Smarty: ["smarty|tpl"],
|
||||||
|
Scheme: ["scm|rkt"],
|
||||||
|
SCSS: ["scss"],
|
||||||
|
SH: ["sh|bash|^.bashrc"],
|
||||||
|
SJS: ["sjs"],
|
||||||
|
Space: ["space"],
|
||||||
|
snippets: ["snippets"],
|
||||||
|
Soy_Template:["soy"],
|
||||||
|
SQL: ["sql"],
|
||||||
|
Stylus: ["styl|stylus"],
|
||||||
|
SVG: ["svg"],
|
||||||
|
Tcl: ["tcl"],
|
||||||
|
Tex: ["tex"],
|
||||||
|
Text: ["txt"],
|
||||||
|
Textile: ["textile"],
|
||||||
|
Toml: ["toml"],
|
||||||
|
Twig: ["twig"],
|
||||||
|
Typescript: ["ts|typescript|str"],
|
||||||
|
VBScript: ["vbs"],
|
||||||
|
Velocity: ["vm"],
|
||||||
|
Verilog: ["v|vh|sv|svh"],
|
||||||
|
XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"],
|
||||||
|
XQuery: ["xq"],
|
||||||
|
YAML: ["yaml|yml"]
|
||||||
|
};
|
||||||
|
|
||||||
|
var nameOverrides = {
|
||||||
|
ObjectiveC: "Objective-C",
|
||||||
|
CSharp: "C#",
|
||||||
|
golang: "Go",
|
||||||
|
C_Cpp: "C/C++",
|
||||||
|
coffee: "CoffeeScript",
|
||||||
|
HTML_Ruby: "HTML (Ruby)",
|
||||||
|
FTL: "FreeMarker"
|
||||||
|
};
|
||||||
|
var modesByName = {};
|
||||||
|
for (var name in supportedModes) {
|
||||||
|
var data = supportedModes[name];
|
||||||
|
var displayName = (nameOverrides[name] || name).replace(/_/g, " ");
|
||||||
|
var filename = name.toLowerCase();
|
||||||
|
var mode = new Mode(filename, displayName, data[0]);
|
||||||
|
modesByName[filename] = mode;
|
||||||
|
modes.push(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getModeForPath: getModeForPath,
|
||||||
|
modes: modes,
|
||||||
|
modesByName: modesByName
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/themelist', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers'], function(require, exports, module) {
|
||||||
|
|
||||||
|
require("ace/lib/fixoldbrowsers");
|
||||||
|
|
||||||
|
var themeData = [
|
||||||
|
["Chrome" ],
|
||||||
|
["Clouds" ],
|
||||||
|
["Crimson Editor" ],
|
||||||
|
["Dawn" ],
|
||||||
|
["Dreamweaver" ],
|
||||||
|
["Eclipse" ],
|
||||||
|
["GitHub" ],
|
||||||
|
["Solarized Light"],
|
||||||
|
["TextMate" ],
|
||||||
|
["Tomorrow" ],
|
||||||
|
["XCode" ],
|
||||||
|
["Kuroir"],
|
||||||
|
["KatzenMilch"],
|
||||||
|
["Ambiance" ,"ambiance" , "dark"],
|
||||||
|
["Chaos" ,"chaos" , "dark"],
|
||||||
|
["Clouds Midnight" ,"clouds_midnight" , "dark"],
|
||||||
|
["Cobalt" ,"cobalt" , "dark"],
|
||||||
|
["idle Fingers" ,"idle_fingers" , "dark"],
|
||||||
|
["krTheme" ,"kr_theme" , "dark"],
|
||||||
|
["Merbivore" ,"merbivore" , "dark"],
|
||||||
|
["Merbivore Soft" ,"merbivore_soft" , "dark"],
|
||||||
|
["Mono Industrial" ,"mono_industrial" , "dark"],
|
||||||
|
["Monokai" ,"monokai" , "dark"],
|
||||||
|
["Pastel on dark" ,"pastel_on_dark" , "dark"],
|
||||||
|
["Solarized Dark" ,"solarized_dark" , "dark"],
|
||||||
|
["Terminal" ,"terminal" , "dark"],
|
||||||
|
["Tomorrow Night" ,"tomorrow_night" , "dark"],
|
||||||
|
["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"],
|
||||||
|
["Tomorrow Night Bright","tomorrow_night_bright" , "dark"],
|
||||||
|
["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"],
|
||||||
|
["Twilight" ,"twilight" , "dark"],
|
||||||
|
["Vibrant Ink" ,"vibrant_ink" , "dark"]
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
exports.themesByName = {};
|
||||||
|
exports.themes = themeData.map(function(data) {
|
||||||
|
var name = data[1] || data[0].replace(/ /g, "_").toLowerCase();
|
||||||
|
var theme = {
|
||||||
|
caption: data[0],
|
||||||
|
theme: "ace/theme/" + name,
|
||||||
|
isDark: data[2] == "dark",
|
||||||
|
name: name
|
||||||
|
};
|
||||||
|
exports.themesByName[name] = theme;
|
||||||
|
return theme;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/get_set_functions', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
module.exports.getSetFunctions = function getSetFunctions (editor) {
|
||||||
|
var out = [];
|
||||||
|
var my = {
|
||||||
|
'editor' : editor,
|
||||||
|
'session' : editor.session,
|
||||||
|
'renderer' : editor.renderer
|
||||||
|
};
|
||||||
|
var opts = [];
|
||||||
|
var skip = [
|
||||||
|
'setOption',
|
||||||
|
'setUndoManager',
|
||||||
|
'setDocument',
|
||||||
|
'setValue',
|
||||||
|
'setBreakpoints',
|
||||||
|
'setScrollTop',
|
||||||
|
'setScrollLeft',
|
||||||
|
'setSelectionStyle',
|
||||||
|
'setWrapLimitRange'
|
||||||
|
];
|
||||||
|
['renderer', 'session', 'editor'].forEach(function(esra) {
|
||||||
|
var esr = my[esra];
|
||||||
|
var clss = esra;
|
||||||
|
for(var fn in esr) {
|
||||||
|
if(skip.indexOf(fn) === -1) {
|
||||||
|
if(/^set/.test(fn) && opts.indexOf(fn) === -1) {
|
||||||
|
opts.push(fn);
|
||||||
|
out.push({
|
||||||
|
'functionName' : fn,
|
||||||
|
'parentObj' : esr,
|
||||||
|
'parentName' : clss
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return out;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var dom = require("../../lib/dom");
|
||||||
|
var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
|
||||||
|
background-color: #F7F7F7;\
|
||||||
|
color: black;\
|
||||||
|
box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\
|
||||||
|
padding: 1em 0.5em 2em 1em;\
|
||||||
|
overflow: auto;\
|
||||||
|
position: absolute;\
|
||||||
|
margin: 0;\
|
||||||
|
bottom: 0;\
|
||||||
|
right: 0;\
|
||||||
|
top: 0;\
|
||||||
|
z-index: 9991;\
|
||||||
|
cursor: default;\
|
||||||
|
}\
|
||||||
|
.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\
|
||||||
|
box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\
|
||||||
|
background-color: rgba(255, 255, 255, 0.6);\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuEntry:hover {\
|
||||||
|
background-color: rgba(100, 100, 100, 0.1);\
|
||||||
|
-webkit-transition: all 0.5s;\
|
||||||
|
transition: all 0.3s\
|
||||||
|
}\
|
||||||
|
.ace_closeButton {\
|
||||||
|
background: rgba(245, 146, 146, 0.5);\
|
||||||
|
border: 1px solid #F48A8A;\
|
||||||
|
border-radius: 50%;\
|
||||||
|
padding: 7px;\
|
||||||
|
position: absolute;\
|
||||||
|
right: -8px;\
|
||||||
|
top: -8px;\
|
||||||
|
z-index: 1000;\
|
||||||
|
}\
|
||||||
|
.ace_closeButton{\
|
||||||
|
background: rgba(245, 146, 146, 0.9);\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuKey {\
|
||||||
|
color: darkslateblue;\
|
||||||
|
font-weight: bold;\
|
||||||
|
}\
|
||||||
|
.ace_optionsMenuCommand {\
|
||||||
|
color: darkcyan;\
|
||||||
|
font-weight: normal;\
|
||||||
|
}";
|
||||||
|
dom.importCssString(cssText);
|
||||||
|
module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) {
|
||||||
|
top = top ? 'top: ' + top + ';' : '';
|
||||||
|
bottom = bottom ? 'bottom: ' + bottom + ';' : '';
|
||||||
|
right = right ? 'right: ' + right + ';' : '';
|
||||||
|
left = left ? 'left: ' + left + ';' : '';
|
||||||
|
|
||||||
|
var closer = document.createElement('div');
|
||||||
|
var contentContainer = document.createElement('div');
|
||||||
|
|
||||||
|
function documentEscListener(e) {
|
||||||
|
if (e.keyCode === 27) {
|
||||||
|
closer.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closer.style.cssText = 'margin: 0; padding: 0; ' +
|
||||||
|
'position: fixed; top:0; bottom:0; left:0; right:0;' +
|
||||||
|
'z-index: 9990; ' +
|
||||||
|
'background-color: rgba(0, 0, 0, 0.3);';
|
||||||
|
closer.addEventListener('click', function() {
|
||||||
|
document.removeEventListener('keydown', documentEscListener);
|
||||||
|
closer.parentNode.removeChild(closer);
|
||||||
|
editor.focus();
|
||||||
|
closer = null;
|
||||||
|
});
|
||||||
|
document.addEventListener('keydown', documentEscListener);
|
||||||
|
|
||||||
|
contentContainer.style.cssText = top + right + bottom + left;
|
||||||
|
contentContainer.addEventListener('click', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
var wrapper = dom.createElement("div");
|
||||||
|
wrapper.style.position = "relative";
|
||||||
|
|
||||||
|
var closeButton = dom.createElement("div");
|
||||||
|
closeButton.className = "ace_closeButton";
|
||||||
|
closeButton.addEventListener('click', function() {
|
||||||
|
closer.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
wrapper.appendChild(closeButton);
|
||||||
|
contentContainer.appendChild(wrapper);
|
||||||
|
|
||||||
|
contentContainer.appendChild(contentElement);
|
||||||
|
closer.appendChild(contentContainer);
|
||||||
|
document.body.appendChild(closer);
|
||||||
|
editor.blur();
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
68
src/main/webapp/assets/ace/ext-spellcheck.js
Normal file
68
src/main/webapp/assets/ace/ext-spellcheck.js
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
ace.define('ace/ext/spellcheck', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/editor', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var event = require("../lib/event");
|
||||||
|
|
||||||
|
exports.contextMenuHandler = function(e){
|
||||||
|
var host = e.target;
|
||||||
|
var text = host.textInput.getElement();
|
||||||
|
if (!host.selection.isEmpty())
|
||||||
|
return;
|
||||||
|
var c = host.getCursorPosition();
|
||||||
|
var r = host.session.getWordRange(c.row, c.column);
|
||||||
|
var w = host.session.getTextRange(r);
|
||||||
|
|
||||||
|
host.session.tokenRe.lastIndex = 0;
|
||||||
|
if (!host.session.tokenRe.test(w))
|
||||||
|
return;
|
||||||
|
var PLACEHOLDER = "\x01\x01";
|
||||||
|
var value = w + " " + PLACEHOLDER;
|
||||||
|
text.value = value;
|
||||||
|
text.setSelectionRange(w.length, w.length + 1);
|
||||||
|
text.setSelectionRange(0, 0);
|
||||||
|
text.setSelectionRange(0, w.length);
|
||||||
|
|
||||||
|
var afterKeydown = false;
|
||||||
|
event.addListener(text, "keydown", function onKeydown() {
|
||||||
|
event.removeListener(text, "keydown", onKeydown);
|
||||||
|
afterKeydown = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
host.textInput.setInputHandler(function(newVal) {
|
||||||
|
console.log(newVal , value, text.selectionStart, text.selectionEnd)
|
||||||
|
if (newVal == value)
|
||||||
|
return '';
|
||||||
|
if (newVal.lastIndexOf(value, 0) === 0)
|
||||||
|
return newVal.slice(value.length);
|
||||||
|
if (newVal.substr(text.selectionEnd) == value)
|
||||||
|
return newVal.slice(0, -value.length);
|
||||||
|
if (newVal.slice(-2) == PLACEHOLDER) {
|
||||||
|
var val = newVal.slice(0, -2);
|
||||||
|
if (val.slice(-1) == " ") {
|
||||||
|
if (afterKeydown)
|
||||||
|
return val.substring(0, text.selectionEnd);
|
||||||
|
val = val.slice(0, -1);
|
||||||
|
host.session.replace(r, val);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newVal;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var Editor = require("../editor").Editor;
|
||||||
|
require("../config").defineOptions(Editor.prototype, "editor", {
|
||||||
|
spellcheck: {
|
||||||
|
set: function(val) {
|
||||||
|
var text = this.textInput.getElement();
|
||||||
|
text.spellcheck = !!val;
|
||||||
|
if (!val)
|
||||||
|
this.removeListener("nativecontextmenu", exports.contextMenuHandler);
|
||||||
|
else
|
||||||
|
this.on("nativecontextmenu", exports.contextMenuHandler);
|
||||||
|
},
|
||||||
|
value: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
271
src/main/webapp/assets/ace/ext-split.js
Normal file
271
src/main/webapp/assets/ace/ext-split.js
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/split', ['require', 'exports', 'module' , 'ace/split'], function(require, exports, module) {
|
||||||
|
module.exports = require("../split");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/split', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/editor', 'ace/virtual_renderer', 'ace/edit_session'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("./lib/oop");
|
||||||
|
var lang = require("./lib/lang");
|
||||||
|
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
||||||
|
|
||||||
|
var Editor = require("./editor").Editor;
|
||||||
|
var Renderer = require("./virtual_renderer").VirtualRenderer;
|
||||||
|
var EditSession = require("./edit_session").EditSession;
|
||||||
|
|
||||||
|
|
||||||
|
var Split = function(container, theme, splits) {
|
||||||
|
this.BELOW = 1;
|
||||||
|
this.BESIDE = 0;
|
||||||
|
|
||||||
|
this.$container = container;
|
||||||
|
this.$theme = theme;
|
||||||
|
this.$splits = 0;
|
||||||
|
this.$editorCSS = "";
|
||||||
|
this.$editors = [];
|
||||||
|
this.$orientation = this.BESIDE;
|
||||||
|
|
||||||
|
this.setSplits(splits || 1);
|
||||||
|
this.$cEditor = this.$editors[0];
|
||||||
|
|
||||||
|
|
||||||
|
this.on("focus", function(editor) {
|
||||||
|
this.$cEditor = editor;
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
oop.implement(this, EventEmitter);
|
||||||
|
|
||||||
|
this.$createEditor = function() {
|
||||||
|
var el = document.createElement("div");
|
||||||
|
el.className = this.$editorCSS;
|
||||||
|
el.style.cssText = "position: absolute; top:0px; bottom:0px";
|
||||||
|
this.$container.appendChild(el);
|
||||||
|
var editor = new Editor(new Renderer(el, this.$theme));
|
||||||
|
|
||||||
|
editor.on("focus", function() {
|
||||||
|
this._emit("focus", editor);
|
||||||
|
}.bind(this));
|
||||||
|
|
||||||
|
this.$editors.push(editor);
|
||||||
|
editor.setFontSize(this.$fontSize);
|
||||||
|
return editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.setSplits = function(splits) {
|
||||||
|
var editor;
|
||||||
|
if (splits < 1) {
|
||||||
|
throw "The number of splits have to be > 0!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (splits == this.$splits) {
|
||||||
|
return;
|
||||||
|
} else if (splits > this.$splits) {
|
||||||
|
while (this.$splits < this.$editors.length && this.$splits < splits) {
|
||||||
|
editor = this.$editors[this.$splits];
|
||||||
|
this.$container.appendChild(editor.container);
|
||||||
|
editor.setFontSize(this.$fontSize);
|
||||||
|
this.$splits ++;
|
||||||
|
}
|
||||||
|
while (this.$splits < splits) {
|
||||||
|
this.$createEditor();
|
||||||
|
this.$splits ++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while (this.$splits > splits) {
|
||||||
|
editor = this.$editors[this.$splits - 1];
|
||||||
|
this.$container.removeChild(editor.container);
|
||||||
|
this.$splits --;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.resize();
|
||||||
|
};
|
||||||
|
this.getSplits = function() {
|
||||||
|
return this.$splits;
|
||||||
|
};
|
||||||
|
this.getEditor = function(idx) {
|
||||||
|
return this.$editors[idx];
|
||||||
|
};
|
||||||
|
this.getCurrentEditor = function() {
|
||||||
|
return this.$cEditor;
|
||||||
|
};
|
||||||
|
this.focus = function() {
|
||||||
|
this.$cEditor.focus();
|
||||||
|
};
|
||||||
|
this.blur = function() {
|
||||||
|
this.$cEditor.blur();
|
||||||
|
};
|
||||||
|
this.setTheme = function(theme) {
|
||||||
|
this.$editors.forEach(function(editor) {
|
||||||
|
editor.setTheme(theme);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.setKeyboardHandler = function(keybinding) {
|
||||||
|
this.$editors.forEach(function(editor) {
|
||||||
|
editor.setKeyboardHandler(keybinding);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.forEach = function(callback, scope) {
|
||||||
|
this.$editors.forEach(callback, scope);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.$fontSize = "";
|
||||||
|
this.setFontSize = function(size) {
|
||||||
|
this.$fontSize = size;
|
||||||
|
this.forEach(function(editor) {
|
||||||
|
editor.setFontSize(size);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$cloneSession = function(session) {
|
||||||
|
var s = new EditSession(session.getDocument(), session.getMode());
|
||||||
|
|
||||||
|
var undoManager = session.getUndoManager();
|
||||||
|
if (undoManager) {
|
||||||
|
var undoManagerProxy = new UndoManagerProxy(undoManager, s);
|
||||||
|
s.setUndoManager(undoManagerProxy);
|
||||||
|
}
|
||||||
|
s.$informUndoManager = lang.delayedCall(function() { s.$deltas = []; });
|
||||||
|
s.setTabSize(session.getTabSize());
|
||||||
|
s.setUseSoftTabs(session.getUseSoftTabs());
|
||||||
|
s.setOverwrite(session.getOverwrite());
|
||||||
|
s.setBreakpoints(session.getBreakpoints());
|
||||||
|
s.setUseWrapMode(session.getUseWrapMode());
|
||||||
|
s.setUseWorker(session.getUseWorker());
|
||||||
|
s.setWrapLimitRange(session.$wrapLimitRange.min,
|
||||||
|
session.$wrapLimitRange.max);
|
||||||
|
s.$foldData = session.$cloneFoldData();
|
||||||
|
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
this.setSession = function(session, idx) {
|
||||||
|
var editor;
|
||||||
|
if (idx == null) {
|
||||||
|
editor = this.$cEditor;
|
||||||
|
} else {
|
||||||
|
editor = this.$editors[idx];
|
||||||
|
}
|
||||||
|
var isUsed = this.$editors.some(function(editor) {
|
||||||
|
return editor.session === session;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isUsed) {
|
||||||
|
session = this.$cloneSession(session);
|
||||||
|
}
|
||||||
|
editor.setSession(session);
|
||||||
|
return session;
|
||||||
|
};
|
||||||
|
this.getOrientation = function() {
|
||||||
|
return this.$orientation;
|
||||||
|
};
|
||||||
|
this.setOrientation = function(orientation) {
|
||||||
|
if (this.$orientation == orientation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.$orientation = orientation;
|
||||||
|
this.resize();
|
||||||
|
};
|
||||||
|
this.resize = function() {
|
||||||
|
var width = this.$container.clientWidth;
|
||||||
|
var height = this.$container.clientHeight;
|
||||||
|
var editor;
|
||||||
|
|
||||||
|
if (this.$orientation == this.BESIDE) {
|
||||||
|
var editorWidth = width / this.$splits;
|
||||||
|
for (var i = 0; i < this.$splits; i++) {
|
||||||
|
editor = this.$editors[i];
|
||||||
|
editor.container.style.width = editorWidth + "px";
|
||||||
|
editor.container.style.top = "0px";
|
||||||
|
editor.container.style.left = i * editorWidth + "px";
|
||||||
|
editor.container.style.height = height + "px";
|
||||||
|
editor.resize();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var editorHeight = height / this.$splits;
|
||||||
|
for (var i = 0; i < this.$splits; i++) {
|
||||||
|
editor = this.$editors[i];
|
||||||
|
editor.container.style.width = width + "px";
|
||||||
|
editor.container.style.top = i * editorHeight + "px";
|
||||||
|
editor.container.style.left = "0px";
|
||||||
|
editor.container.style.height = editorHeight + "px";
|
||||||
|
editor.resize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(Split.prototype);
|
||||||
|
|
||||||
|
|
||||||
|
function UndoManagerProxy(undoManager, session) {
|
||||||
|
this.$u = undoManager;
|
||||||
|
this.$doc = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.execute = function(options) {
|
||||||
|
this.$u.execute(options);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.undo = function() {
|
||||||
|
var selectionRange = this.$u.undo(true);
|
||||||
|
if (selectionRange) {
|
||||||
|
this.$doc.selection.setSelectionRange(selectionRange);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.redo = function() {
|
||||||
|
var selectionRange = this.$u.redo(true);
|
||||||
|
if (selectionRange) {
|
||||||
|
this.$doc.selection.setSelectionRange(selectionRange);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.reset = function() {
|
||||||
|
this.$u.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hasUndo = function() {
|
||||||
|
return this.$u.hasUndo();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hasRedo = function() {
|
||||||
|
return this.$u.hasRedo();
|
||||||
|
};
|
||||||
|
}).call(UndoManagerProxy.prototype);
|
||||||
|
|
||||||
|
exports.Split = Split;
|
||||||
|
});
|
||||||
178
src/main/webapp/assets/ace/ext-static_highlight.js
Normal file
178
src/main/webapp/assets/ace/ext-static_highlight.js
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/static_highlight', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/layer/text', 'ace/config', 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var EditSession = require("../edit_session").EditSession;
|
||||||
|
var TextLayer = require("../layer/text").Text;
|
||||||
|
var baseStyles = ".ace_static_highlight {\
|
||||||
|
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\
|
||||||
|
font-size: 12px;\
|
||||||
|
}\
|
||||||
|
.ace_static_highlight .ace_gutter {\
|
||||||
|
width: 25px !important;\
|
||||||
|
display: block;\
|
||||||
|
float: left;\
|
||||||
|
text-align: right;\
|
||||||
|
padding: 0 3px 0 0;\
|
||||||
|
margin-right: 3px;\
|
||||||
|
position: static !important;\
|
||||||
|
}\
|
||||||
|
.ace_static_highlight .ace_line { clear: both; }\
|
||||||
|
.ace_static_highlight .ace_gutter-cell {\
|
||||||
|
-moz-user-select: -moz-none;\
|
||||||
|
-khtml-user-select: none;\
|
||||||
|
-webkit-user-select: none;\
|
||||||
|
user-select: none;\
|
||||||
|
}\
|
||||||
|
.ace_static_highlight .ace_gutter-cell:before {\
|
||||||
|
content: counter(ace_line, decimal);\
|
||||||
|
counter-increment: ace_line;\
|
||||||
|
}\
|
||||||
|
.ace_static_highlight {\
|
||||||
|
counter-reset: ace_line;\
|
||||||
|
}\
|
||||||
|
";
|
||||||
|
var config = require("../config");
|
||||||
|
var dom = require("../lib/dom");
|
||||||
|
|
||||||
|
|
||||||
|
var highlight = function(el, opts, callback) {
|
||||||
|
var m = el.className.match(/lang-(\w+)/);
|
||||||
|
var mode = opts.mode || m && ("ace/mode/" + m[1]);
|
||||||
|
if (!mode)
|
||||||
|
return false;
|
||||||
|
var theme = opts.theme || "ace/theme/textmate";
|
||||||
|
|
||||||
|
var data = "";
|
||||||
|
var nodes = [];
|
||||||
|
|
||||||
|
if (el.firstElementChild) {
|
||||||
|
var textLen = 0;
|
||||||
|
for (var i = 0; i < el.childNodes.length; i++) {
|
||||||
|
var ch = el.childNodes[i];
|
||||||
|
if (ch.nodeType == 3) {
|
||||||
|
textLen += ch.data.length;
|
||||||
|
data += ch.data;
|
||||||
|
} else {
|
||||||
|
nodes.push(textLen, ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data = dom.getInnerText(el);
|
||||||
|
if (opts.trim)
|
||||||
|
data = data.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) {
|
||||||
|
dom.importCssString(highlighted.css, "ace_highlight");
|
||||||
|
el.innerHTML = highlighted.html;
|
||||||
|
var container = el.firstChild.firstChild;
|
||||||
|
for (var i = 0; i < nodes.length; i += 2) {
|
||||||
|
var pos = highlighted.session.doc.indexToPosition(nodes[i]);
|
||||||
|
var node = nodes[i + 1];
|
||||||
|
var lineEl = container.children[pos.row];
|
||||||
|
lineEl && lineEl.appendChild(node);
|
||||||
|
}
|
||||||
|
callback && callback();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) {
|
||||||
|
var waiting = 0;
|
||||||
|
var modeCache = EditSession.prototype.$modes;
|
||||||
|
if (typeof theme == "string") {
|
||||||
|
waiting++;
|
||||||
|
config.loadModule(['theme', theme], function(m) {
|
||||||
|
theme = m;
|
||||||
|
--waiting || done();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof mode == "string") {
|
||||||
|
waiting++;
|
||||||
|
config.loadModule(['mode', mode], function(m) {
|
||||||
|
if (!modeCache[mode]) modeCache[mode] = new m.Mode();
|
||||||
|
mode = modeCache[mode];
|
||||||
|
--waiting || done();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function done() {
|
||||||
|
var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter);
|
||||||
|
return callback ? callback(result) : result;
|
||||||
|
}
|
||||||
|
return waiting || done();
|
||||||
|
};
|
||||||
|
|
||||||
|
highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) {
|
||||||
|
lineStart = parseInt(lineStart || 1, 10);
|
||||||
|
|
||||||
|
var session = new EditSession("");
|
||||||
|
session.setUseWorker(false);
|
||||||
|
session.setMode(mode);
|
||||||
|
|
||||||
|
var textLayer = new TextLayer(document.createElement("div"));
|
||||||
|
textLayer.setSession(session);
|
||||||
|
textLayer.config = {
|
||||||
|
characterWidth: 10,
|
||||||
|
lineHeight: 20
|
||||||
|
};
|
||||||
|
|
||||||
|
session.setValue(input);
|
||||||
|
|
||||||
|
var stringBuilder = [];
|
||||||
|
var length = session.getLength();
|
||||||
|
|
||||||
|
for(var ix = 0; ix < length; ix++) {
|
||||||
|
stringBuilder.push("<div class='ace_line'>");
|
||||||
|
if (!disableGutter)
|
||||||
|
stringBuilder.push("<span class='ace_gutter ace_gutter-cell' unselectable='on'>" + /*(ix + lineStart) + */ "</span>");
|
||||||
|
textLayer.$renderLine(stringBuilder, ix, true, false);
|
||||||
|
stringBuilder.push("\n</div>");
|
||||||
|
}
|
||||||
|
var html = "<div class='" + theme.cssClass + "'>" +
|
||||||
|
"<div class='ace_static_highlight' style='counter-reset:ace_line " + (lineStart - 1) + "'>" +
|
||||||
|
stringBuilder.join("") +
|
||||||
|
"</div>" +
|
||||||
|
"</div>";
|
||||||
|
|
||||||
|
textLayer.destroy();
|
||||||
|
|
||||||
|
return {
|
||||||
|
css: baseStyles + theme.cssText,
|
||||||
|
html: html,
|
||||||
|
session: session
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = highlight;
|
||||||
|
module.exports.highlight =highlight;
|
||||||
|
});
|
||||||
47
src/main/webapp/assets/ace/ext-statusbar.js
Normal file
47
src/main/webapp/assets/ace/ext-statusbar.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
ace.define('ace/ext/statusbar', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
var dom = require("ace/lib/dom");
|
||||||
|
var lang = require("ace/lib/lang");
|
||||||
|
|
||||||
|
var StatusBar = function(editor, parentNode) {
|
||||||
|
this.element = dom.createElement("div");
|
||||||
|
this.element.className = "ace_status-indicator";
|
||||||
|
this.element.style.cssText = "display: inline-block;";
|
||||||
|
parentNode.appendChild(this.element);
|
||||||
|
|
||||||
|
var statusUpdate = lang.delayedCall(function(){
|
||||||
|
this.updateStatus(editor)
|
||||||
|
}.bind(this));
|
||||||
|
editor.on("changeStatus", function() {
|
||||||
|
statusUpdate.schedule(100);
|
||||||
|
});
|
||||||
|
editor.on("changeSelection", function() {
|
||||||
|
statusUpdate.schedule(100);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
this.updateStatus = function(editor) {
|
||||||
|
var status = [];
|
||||||
|
function add(str, separator) {
|
||||||
|
str && status.push(str, separator || "|");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor.$vimModeHandler)
|
||||||
|
add(editor.$vimModeHandler.getStatusText());
|
||||||
|
else if (editor.commands.recording)
|
||||||
|
add("REC");
|
||||||
|
|
||||||
|
var c = editor.selection.lead;
|
||||||
|
add(c.row + ":" + c.column, " ");
|
||||||
|
if (!editor.selection.isEmpty()) {
|
||||||
|
var r = editor.getSelectionRange();
|
||||||
|
add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")");
|
||||||
|
}
|
||||||
|
status.pop();
|
||||||
|
this.element.textContent = status.join("");
|
||||||
|
};
|
||||||
|
}).call(StatusBar.prototype);
|
||||||
|
|
||||||
|
exports.StatusBar = StatusBar;
|
||||||
|
|
||||||
|
});
|
||||||
478
src/main/webapp/assets/ace/ext-textarea.js
Normal file
478
src/main/webapp/assets/ace/ext-textarea.js
Normal file
@@ -0,0 +1,478 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/textarea', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/net', 'ace/ace', 'ace/theme/textmate', 'ace/mode/text'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var event = require("../lib/event");
|
||||||
|
var UA = require("../lib/useragent");
|
||||||
|
var net = require("../lib/net");
|
||||||
|
var ace = require("../ace");
|
||||||
|
|
||||||
|
require("../theme/textmate");
|
||||||
|
|
||||||
|
module.exports = exports = ace;
|
||||||
|
var getCSSProperty = function(element, container, property) {
|
||||||
|
var ret = element.style[property];
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
if (window.getComputedStyle) {
|
||||||
|
ret = window.getComputedStyle(element, '').getPropertyValue(property);
|
||||||
|
} else {
|
||||||
|
ret = element.currentStyle[property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret || ret == 'auto' || ret == 'intrinsic') {
|
||||||
|
ret = container.style[property];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
function applyStyles(elm, styles) {
|
||||||
|
for (var style in styles) {
|
||||||
|
elm.style[style] = styles[style];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupContainer(element, getValue) {
|
||||||
|
if (element.type != 'textarea') {
|
||||||
|
throw new Error("Textarea required!");
|
||||||
|
}
|
||||||
|
|
||||||
|
var parentNode = element.parentNode;
|
||||||
|
var container = document.createElement('div');
|
||||||
|
var resizeEvent = function() {
|
||||||
|
var style = 'position:relative;';
|
||||||
|
[
|
||||||
|
'margin-top', 'margin-left', 'margin-right', 'margin-bottom'
|
||||||
|
].forEach(function(item) {
|
||||||
|
style += item + ':' +
|
||||||
|
getCSSProperty(element, container, item) + ';';
|
||||||
|
});
|
||||||
|
var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px");
|
||||||
|
var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px");
|
||||||
|
style += 'height:' + height + ';width:' + width + ';';
|
||||||
|
style += 'display:inline-block;';
|
||||||
|
container.setAttribute('style', style);
|
||||||
|
};
|
||||||
|
event.addListener(window, 'resize', resizeEvent);
|
||||||
|
resizeEvent();
|
||||||
|
parentNode.insertBefore(container, element.nextSibling);
|
||||||
|
while (parentNode !== document) {
|
||||||
|
if (parentNode.tagName.toUpperCase() === 'FORM') {
|
||||||
|
var oldSumit = parentNode.onsubmit;
|
||||||
|
parentNode.onsubmit = function(evt) {
|
||||||
|
element.value = getValue();
|
||||||
|
if (oldSumit) {
|
||||||
|
oldSumit.call(this, evt);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
parentNode = parentNode.parentNode;
|
||||||
|
}
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.transformTextarea = function(element, loader) {
|
||||||
|
var session;
|
||||||
|
var container = setupContainer(element, function() {
|
||||||
|
return session.getValue();
|
||||||
|
});
|
||||||
|
element.style.display = 'none';
|
||||||
|
container.style.background = 'white';
|
||||||
|
var editorDiv = document.createElement("div");
|
||||||
|
applyStyles(editorDiv, {
|
||||||
|
top: "0px",
|
||||||
|
left: "0px",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
border: "1px solid gray",
|
||||||
|
position: "absolute"
|
||||||
|
});
|
||||||
|
container.appendChild(editorDiv);
|
||||||
|
|
||||||
|
var settingOpener = document.createElement("div");
|
||||||
|
applyStyles(settingOpener, {
|
||||||
|
position: "absolute",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
background: "red",
|
||||||
|
cursor: "nw-resize",
|
||||||
|
borderStyle: "solid",
|
||||||
|
borderWidth: "9px 8px 10px 9px",
|
||||||
|
width: "2px",
|
||||||
|
borderColor: "lightblue gray gray lightblue",
|
||||||
|
zIndex: 101
|
||||||
|
});
|
||||||
|
|
||||||
|
var settingDiv = document.createElement("div");
|
||||||
|
var settingDivStyles = {
|
||||||
|
top: "0px",
|
||||||
|
left: "20%",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
position: "absolute",
|
||||||
|
padding: "5px",
|
||||||
|
zIndex: 100,
|
||||||
|
color: "white",
|
||||||
|
display: "none",
|
||||||
|
overflow: "auto",
|
||||||
|
fontSize: "14px",
|
||||||
|
boxShadow: "-5px 2px 3px gray"
|
||||||
|
};
|
||||||
|
if (!UA.isOldIE) {
|
||||||
|
settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)";
|
||||||
|
} else {
|
||||||
|
settingDivStyles.backgroundColor = "#333";
|
||||||
|
}
|
||||||
|
|
||||||
|
applyStyles(settingDiv, settingDivStyles);
|
||||||
|
container.appendChild(settingDiv);
|
||||||
|
var options = {};
|
||||||
|
|
||||||
|
var editor = ace.edit(editorDiv);
|
||||||
|
session = editor.getSession();
|
||||||
|
|
||||||
|
session.setValue(element.value || element.innerHTML);
|
||||||
|
editor.focus();
|
||||||
|
container.appendChild(settingOpener);
|
||||||
|
setupApi(editor, editorDiv, settingDiv, ace, options, loader);
|
||||||
|
setupSettingPanel(settingDiv, settingOpener, editor, options);
|
||||||
|
|
||||||
|
var state = "";
|
||||||
|
event.addListener(settingOpener, "mousemove", function(e) {
|
||||||
|
var rect = this.getBoundingClientRect();
|
||||||
|
var x = e.clientX - rect.left, y = e.clientY - rect.top;
|
||||||
|
if (x + y < (rect.width + rect.height)/2) {
|
||||||
|
this.style.cursor = "pointer";
|
||||||
|
state = "toggle";
|
||||||
|
} else {
|
||||||
|
state = "resize";
|
||||||
|
this.style.cursor = "nw-resize";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addListener(settingOpener, "mousedown", function(e) {
|
||||||
|
if (state == "toggle") {
|
||||||
|
editor.setDisplaySettings();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
container.style.zIndex = 100000;
|
||||||
|
var rect = container.getBoundingClientRect();
|
||||||
|
var startX = rect.width + rect.left - e.clientX;
|
||||||
|
var startY = rect.height + rect.top - e.clientY;
|
||||||
|
event.capture(settingOpener, function(e) {
|
||||||
|
container.style.width = e.clientX - rect.left + startX + "px";
|
||||||
|
container.style.height = e.clientY - rect.top + startY + "px";
|
||||||
|
editor.resize();
|
||||||
|
}, function() {});
|
||||||
|
});
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
function load(url, module, callback) {
|
||||||
|
net.loadScript(url, function() {
|
||||||
|
require([module], callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupApi(editor, editorDiv, settingDiv, ace, options, loader) {
|
||||||
|
var session = editor.getSession();
|
||||||
|
var renderer = editor.renderer;
|
||||||
|
loader = loader || load;
|
||||||
|
|
||||||
|
function toBool(value) {
|
||||||
|
return value === "true" || value == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.setDisplaySettings = function(display) {
|
||||||
|
if (display == null)
|
||||||
|
display = settingDiv.style.display == "none";
|
||||||
|
if (display) {
|
||||||
|
settingDiv.style.display = "block";
|
||||||
|
settingDiv.hideButton.focus();
|
||||||
|
editor.on("focus", function onFocus() {
|
||||||
|
editor.removeListener("focus", onFocus);
|
||||||
|
settingDiv.style.display = "none";
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
editor.focus();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.$setOption = editor.setOption;
|
||||||
|
editor.setOption = function(key, value) {
|
||||||
|
if (options[key] == value) return;
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case "mode":
|
||||||
|
if (value != "text") {
|
||||||
|
loader("mode-" + value + ".js", "ace/mode/" + value, function() {
|
||||||
|
var aceMode = require("../mode/" + value).Mode;
|
||||||
|
session.setMode(new aceMode());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
session.setMode(new (require("../mode/text").Mode));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "theme":
|
||||||
|
if (value != "textmate") {
|
||||||
|
loader("theme-" + value + ".js", "ace/theme/" + value, function() {
|
||||||
|
editor.setTheme("ace/theme/" + value);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
editor.setTheme("ace/theme/textmate");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "fontSize":
|
||||||
|
editorDiv.style.fontSize = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "keybindings":
|
||||||
|
switch (value) {
|
||||||
|
case "vim":
|
||||||
|
editor.setKeyboardHandler("ace/keyboard/vim");
|
||||||
|
break;
|
||||||
|
case "emacs":
|
||||||
|
editor.setKeyboardHandler("ace/keyboard/emacs");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
editor.setKeyboardHandler(null);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "softWrap":
|
||||||
|
switch (value) {
|
||||||
|
case "off":
|
||||||
|
session.setUseWrapMode(false);
|
||||||
|
renderer.setPrintMarginColumn(80);
|
||||||
|
break;
|
||||||
|
case "40":
|
||||||
|
session.setUseWrapMode(true);
|
||||||
|
session.setWrapLimitRange(40, 40);
|
||||||
|
renderer.setPrintMarginColumn(40);
|
||||||
|
break;
|
||||||
|
case "80":
|
||||||
|
session.setUseWrapMode(true);
|
||||||
|
session.setWrapLimitRange(80, 80);
|
||||||
|
renderer.setPrintMarginColumn(80);
|
||||||
|
break;
|
||||||
|
case "free":
|
||||||
|
session.setUseWrapMode(true);
|
||||||
|
session.setWrapLimitRange(null, null);
|
||||||
|
renderer.setPrintMarginColumn(80);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
editor.$setOption(key, toBool(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
options[key] = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.getOption = function(key) {
|
||||||
|
return options[key];
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.getOptions = function() {
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.setOptions(exports.options);
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupSettingPanel(settingDiv, settingOpener, editor, options) {
|
||||||
|
var BOOL = null;
|
||||||
|
|
||||||
|
var desc = {
|
||||||
|
mode: "Mode:",
|
||||||
|
gutter: "Display Gutter:",
|
||||||
|
theme: "Theme:",
|
||||||
|
fontSize: "Font Size:",
|
||||||
|
softWrap: "Soft Wrap:",
|
||||||
|
keybindings: "Keyboard",
|
||||||
|
showPrintMargin: "Show Print Margin:",
|
||||||
|
useSoftTabs: "Use Soft Tabs:",
|
||||||
|
showInvisibles: "Show Invisibles"
|
||||||
|
};
|
||||||
|
|
||||||
|
var optionValues = {
|
||||||
|
mode: {
|
||||||
|
text: "Plain",
|
||||||
|
javascript: "JavaScript",
|
||||||
|
xml: "XML",
|
||||||
|
html: "HTML",
|
||||||
|
css: "CSS",
|
||||||
|
scss: "SCSS",
|
||||||
|
python: "Python",
|
||||||
|
php: "PHP",
|
||||||
|
java: "Java",
|
||||||
|
ruby: "Ruby",
|
||||||
|
c_cpp: "C/C++",
|
||||||
|
coffee: "CoffeeScript",
|
||||||
|
json: "json",
|
||||||
|
perl: "Perl",
|
||||||
|
clojure: "Clojure",
|
||||||
|
ocaml: "OCaml",
|
||||||
|
csharp: "C#",
|
||||||
|
haxe: "haXe",
|
||||||
|
svg: "SVG",
|
||||||
|
textile: "Textile",
|
||||||
|
groovy: "Groovy",
|
||||||
|
liquid: "Liquid",
|
||||||
|
Scala: "Scala"
|
||||||
|
},
|
||||||
|
theme: {
|
||||||
|
clouds: "Clouds",
|
||||||
|
clouds_midnight: "Clouds Midnight",
|
||||||
|
cobalt: "Cobalt",
|
||||||
|
crimson_editor: "Crimson Editor",
|
||||||
|
dawn: "Dawn",
|
||||||
|
eclipse: "Eclipse",
|
||||||
|
idle_fingers: "Idle Fingers",
|
||||||
|
kr_theme: "Kr Theme",
|
||||||
|
merbivore: "Merbivore",
|
||||||
|
merbivore_soft: "Merbivore Soft",
|
||||||
|
mono_industrial: "Mono Industrial",
|
||||||
|
monokai: "Monokai",
|
||||||
|
pastel_on_dark: "Pastel On Dark",
|
||||||
|
solarized_dark: "Solarized Dark",
|
||||||
|
solarized_light: "Solarized Light",
|
||||||
|
textmate: "Textmate",
|
||||||
|
twilight: "Twilight",
|
||||||
|
vibrant_ink: "Vibrant Ink"
|
||||||
|
},
|
||||||
|
gutter: BOOL,
|
||||||
|
fontSize: {
|
||||||
|
"10px": "10px",
|
||||||
|
"11px": "11px",
|
||||||
|
"12px": "12px",
|
||||||
|
"14px": "14px",
|
||||||
|
"16px": "16px"
|
||||||
|
},
|
||||||
|
softWrap: {
|
||||||
|
off: "Off",
|
||||||
|
40: "40",
|
||||||
|
80: "80",
|
||||||
|
free: "Free"
|
||||||
|
},
|
||||||
|
keybindings: {
|
||||||
|
ace: "ace",
|
||||||
|
vim: "vim",
|
||||||
|
emacs: "emacs"
|
||||||
|
},
|
||||||
|
showPrintMargin: BOOL,
|
||||||
|
useSoftTabs: BOOL,
|
||||||
|
showInvisibles: BOOL
|
||||||
|
};
|
||||||
|
|
||||||
|
var table = [];
|
||||||
|
table.push("<table><tr><th>Setting</th><th>Value</th></tr>");
|
||||||
|
|
||||||
|
function renderOption(builder, option, obj, cValue) {
|
||||||
|
if (!obj) {
|
||||||
|
builder.push(
|
||||||
|
"<input type='checkbox' title='", option, "' ",
|
||||||
|
cValue == "true" ? "checked='true'" : "",
|
||||||
|
"'></input>"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
builder.push("<select title='" + option + "'>");
|
||||||
|
for (var value in obj) {
|
||||||
|
builder.push("<option value='" + value + "' ");
|
||||||
|
|
||||||
|
if (cValue == value) {
|
||||||
|
builder.push(" selected ");
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.push(">",
|
||||||
|
obj[value],
|
||||||
|
"</option>");
|
||||||
|
}
|
||||||
|
builder.push("</select>");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var option in options) {
|
||||||
|
table.push("<tr><td>", desc[option], "</td>");
|
||||||
|
table.push("<td>");
|
||||||
|
renderOption(table, option, optionValues[option], options[option]);
|
||||||
|
table.push("</td></tr>");
|
||||||
|
}
|
||||||
|
table.push("</table>");
|
||||||
|
settingDiv.innerHTML = table.join("");
|
||||||
|
|
||||||
|
var onChange = function(e) {
|
||||||
|
var select = e.currentTarget;
|
||||||
|
editor.setOption(select.title, select.value);
|
||||||
|
};
|
||||||
|
var onClick = function(e) {
|
||||||
|
var cb = e.currentTarget;
|
||||||
|
editor.setOption(cb.title, cb.checked);
|
||||||
|
};
|
||||||
|
var selects = settingDiv.getElementsByTagName("select");
|
||||||
|
for (var i = 0; i < selects.length; i++)
|
||||||
|
selects[i].onchange = onChange;
|
||||||
|
var cbs = settingDiv.getElementsByTagName("input");
|
||||||
|
for (var i = 0; i < cbs.length; i++)
|
||||||
|
cbs[i].onclick = onClick;
|
||||||
|
|
||||||
|
|
||||||
|
var button = document.createElement("input");
|
||||||
|
button.type = "button";
|
||||||
|
button.value = "Hide";
|
||||||
|
event.addListener(button, "click", function() {
|
||||||
|
editor.setDisplaySettings(false);
|
||||||
|
});
|
||||||
|
settingDiv.appendChild(button);
|
||||||
|
settingDiv.hideButton = button;
|
||||||
|
}
|
||||||
|
exports.options = {
|
||||||
|
mode: "text",
|
||||||
|
theme: "textmate",
|
||||||
|
gutter: "false",
|
||||||
|
fontSize: "12px",
|
||||||
|
softWrap: "off",
|
||||||
|
keybindings: "ace",
|
||||||
|
showPrintMargin: "false",
|
||||||
|
useSoftTabs: "true",
|
||||||
|
showInvisibles: "false"
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
87
src/main/webapp/assets/ace/ext-themelist.js
Normal file
87
src/main/webapp/assets/ace/ext-themelist.js
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Contributed to Ajax.org under the BSD license.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/themelist', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers'], function(require, exports, module) {
|
||||||
|
|
||||||
|
require("ace/lib/fixoldbrowsers");
|
||||||
|
|
||||||
|
var themeData = [
|
||||||
|
["Chrome" ],
|
||||||
|
["Clouds" ],
|
||||||
|
["Crimson Editor" ],
|
||||||
|
["Dawn" ],
|
||||||
|
["Dreamweaver" ],
|
||||||
|
["Eclipse" ],
|
||||||
|
["GitHub" ],
|
||||||
|
["Solarized Light"],
|
||||||
|
["TextMate" ],
|
||||||
|
["Tomorrow" ],
|
||||||
|
["XCode" ],
|
||||||
|
["Kuroir"],
|
||||||
|
["KatzenMilch"],
|
||||||
|
["Ambiance" ,"ambiance" , "dark"],
|
||||||
|
["Chaos" ,"chaos" , "dark"],
|
||||||
|
["Clouds Midnight" ,"clouds_midnight" , "dark"],
|
||||||
|
["Cobalt" ,"cobalt" , "dark"],
|
||||||
|
["idle Fingers" ,"idle_fingers" , "dark"],
|
||||||
|
["krTheme" ,"kr_theme" , "dark"],
|
||||||
|
["Merbivore" ,"merbivore" , "dark"],
|
||||||
|
["Merbivore Soft" ,"merbivore_soft" , "dark"],
|
||||||
|
["Mono Industrial" ,"mono_industrial" , "dark"],
|
||||||
|
["Monokai" ,"monokai" , "dark"],
|
||||||
|
["Pastel on dark" ,"pastel_on_dark" , "dark"],
|
||||||
|
["Solarized Dark" ,"solarized_dark" , "dark"],
|
||||||
|
["Terminal" ,"terminal" , "dark"],
|
||||||
|
["Tomorrow Night" ,"tomorrow_night" , "dark"],
|
||||||
|
["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"],
|
||||||
|
["Tomorrow Night Bright","tomorrow_night_bright" , "dark"],
|
||||||
|
["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"],
|
||||||
|
["Twilight" ,"twilight" , "dark"],
|
||||||
|
["Vibrant Ink" ,"vibrant_ink" , "dark"]
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
exports.themesByName = {};
|
||||||
|
exports.themes = themeData.map(function(data) {
|
||||||
|
var name = data[1] || data[0].replace(/ /g, "_").toLowerCase();
|
||||||
|
var theme = {
|
||||||
|
caption: data[0],
|
||||||
|
theme: "ace/theme/" + name,
|
||||||
|
isDark: data[2] == "dark",
|
||||||
|
name: name
|
||||||
|
};
|
||||||
|
exports.themesByName[name] = theme;
|
||||||
|
return theme;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
209
src/main/webapp/assets/ace/ext-whitespace.js
Normal file
209
src/main/webapp/assets/ace/ext-whitespace.js
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/ext/whitespace', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
exports.$detectIndentation = function(lines, fallback) {
|
||||||
|
var stats = [];
|
||||||
|
var changes = [];
|
||||||
|
var tabIndents = 0;
|
||||||
|
var prevSpaces = 0;
|
||||||
|
var max = Math.min(lines.length, 1000);
|
||||||
|
for (var i = 0; i < max; i++) {
|
||||||
|
var line = lines[i];
|
||||||
|
if (!/^\s*[^*+\-\s]/.test(line))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var tabs = line.match(/^\t*/)[0].length;
|
||||||
|
if (line[0] == "\t")
|
||||||
|
tabIndents++;
|
||||||
|
|
||||||
|
var spaces = line.match(/^ */)[0].length;
|
||||||
|
if (spaces && line[spaces] != "\t") {
|
||||||
|
var diff = spaces - prevSpaces;
|
||||||
|
if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff))
|
||||||
|
changes[diff] = (changes[diff] || 0) + 1;
|
||||||
|
|
||||||
|
stats[spaces] = (stats[spaces] || 0) + 1;
|
||||||
|
}
|
||||||
|
prevSpaces = spaces;
|
||||||
|
while (i < max && line[line.length - 1] == "\\")
|
||||||
|
line = lines[i++];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stats.length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
function getScore(indent) {
|
||||||
|
var score = 0;
|
||||||
|
for (var i = indent; i < stats.length; i += indent)
|
||||||
|
score += stats[i] || 0;
|
||||||
|
return score;
|
||||||
|
}
|
||||||
|
|
||||||
|
var changesTotal = changes.reduce(function(a,b){return a+b}, 0);
|
||||||
|
|
||||||
|
var first = {score: 0, length: 0};
|
||||||
|
var spaceIndents = 0;
|
||||||
|
for (var i = 1; i < 12; i++) {
|
||||||
|
if (i == 1) {
|
||||||
|
spaceIndents = getScore(i);
|
||||||
|
var score = 1;
|
||||||
|
} else
|
||||||
|
var score = getScore(i) / spaceIndents;
|
||||||
|
|
||||||
|
if (changes[i]) {
|
||||||
|
score += changes[i] / changesTotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (score > first.score)
|
||||||
|
first = {score: score, length: i};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first.score && first.score > 1.4)
|
||||||
|
var tabLength = first.length;
|
||||||
|
|
||||||
|
if (tabIndents > spaceIndents + 1)
|
||||||
|
return {ch: "\t", length: tabLength};
|
||||||
|
|
||||||
|
if (spaceIndents + 1 > tabIndents)
|
||||||
|
return {ch: " ", length: tabLength};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.detectIndentation = function(session) {
|
||||||
|
var lines = session.getLines(0, 1000);
|
||||||
|
var indent = exports.$detectIndentation(lines) || {};
|
||||||
|
|
||||||
|
if (indent.ch)
|
||||||
|
session.setUseSoftTabs(indent.ch == " ");
|
||||||
|
|
||||||
|
if (indent.length)
|
||||||
|
session.setTabSize(indent.length);
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.trimTrailingSpace = function(session, trimEmpty) {
|
||||||
|
var doc = session.getDocument();
|
||||||
|
var lines = doc.getAllLines();
|
||||||
|
|
||||||
|
var min = trimEmpty ? -1 : 0;
|
||||||
|
|
||||||
|
for (var i = 0, l=lines.length; i < l; i++) {
|
||||||
|
var line = lines[i];
|
||||||
|
var index = line.search(/\s+$/);
|
||||||
|
|
||||||
|
if (index > min)
|
||||||
|
doc.removeInLine(i, index, line.length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.convertIndentation = function(session, ch, len) {
|
||||||
|
var oldCh = session.getTabString()[0];
|
||||||
|
var oldLen = session.getTabSize();
|
||||||
|
if (!len) len = oldLen;
|
||||||
|
if (!ch) ch = oldCh;
|
||||||
|
|
||||||
|
var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len);
|
||||||
|
|
||||||
|
var doc = session.doc;
|
||||||
|
var lines = doc.getAllLines();
|
||||||
|
|
||||||
|
var cache = {};
|
||||||
|
var spaceCache = {};
|
||||||
|
for (var i = 0, l=lines.length; i < l; i++) {
|
||||||
|
var line = lines[i];
|
||||||
|
var match = line.match(/^\s*/)[0];
|
||||||
|
if (match) {
|
||||||
|
var w = session.$getStringScreenWidth(match)[0];
|
||||||
|
var tabCount = Math.floor(w/oldLen);
|
||||||
|
var reminder = w%oldLen;
|
||||||
|
var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount));
|
||||||
|
toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder));
|
||||||
|
|
||||||
|
if (toInsert != match) {
|
||||||
|
doc.removeInLine(i, 0, match.length);
|
||||||
|
doc.insertInLine({row: i, column: 0}, toInsert);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
session.setTabSize(len);
|
||||||
|
session.setUseSoftTabs(ch == " ");
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.$parseStringArg = function(text) {
|
||||||
|
var indent = {};
|
||||||
|
if (/t/.test(text))
|
||||||
|
indent.ch = "\t";
|
||||||
|
else if (/s/.test(text))
|
||||||
|
indent.ch = " ";
|
||||||
|
var m = text.match(/\d+/);
|
||||||
|
if (m)
|
||||||
|
indent.length = parseInt(m[0], 10);
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.$parseArg = function(arg) {
|
||||||
|
if (!arg)
|
||||||
|
return {};
|
||||||
|
if (typeof arg == "string")
|
||||||
|
return exports.$parseStringArg(arg);
|
||||||
|
if (typeof arg.text == "string")
|
||||||
|
return exports.$parseStringArg(arg.text);
|
||||||
|
return arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.commands = [{
|
||||||
|
name: "detectIndentation",
|
||||||
|
exec: function(editor) {
|
||||||
|
exports.detectIndentation(editor.session);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "trimTrailingSpace",
|
||||||
|
exec: function(editor) {
|
||||||
|
exports.trimTrailingSpace(editor.session);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "convertIndentation",
|
||||||
|
exec: function(editor, arg) {
|
||||||
|
var indent = exports.$parseArg(arg);
|
||||||
|
exports.convertIndentation(editor.session, indent.ch, indent.length);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "setIndentation",
|
||||||
|
exec: function(editor, arg) {
|
||||||
|
var indent = exports.$parseArg(arg);
|
||||||
|
indent.length && editor.session.setTabSize(indent.length);
|
||||||
|
indent.ch && editor.session.setUseSoftTabs(indent.ch == " ");
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
});
|
||||||
1100
src/main/webapp/assets/ace/keybinding-emacs.js
Normal file
1100
src/main/webapp/assets/ace/keybinding-emacs.js
Normal file
File diff suppressed because it is too large
Load Diff
1764
src/main/webapp/assets/ace/keybinding-vim.js
Normal file
1764
src/main/webapp/assets/ace/keybinding-vim.js
Normal file
File diff suppressed because it is too large
Load Diff
260
src/main/webapp/assets/ace/mode-abap.js
Normal file
260
src/main/webapp/assets/ace/mode-abap.js
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/abap', ['require', 'exports', 'module' , 'ace/mode/abap_highlight_rules', 'ace/mode/folding/coffee', 'ace/range', 'ace/mode/text', 'ace/lib/oop'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Rules = require("./abap_highlight_rules").AbapHighlightRules;
|
||||||
|
var FoldMode = require("./folding/coffee").FoldMode;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
|
||||||
|
function Mode() {
|
||||||
|
this.HighlightRules = Rules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.toggleCommentLines = function(state, doc, startRow, endRow){
|
||||||
|
var range = new Range(0, 0, 0, 0);
|
||||||
|
for (var i = startRow; i <= endRow; ++i) {
|
||||||
|
var line = doc.getLine(i);
|
||||||
|
if (hereComment.test(line))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (commentLine.test(line))
|
||||||
|
line = line.replace(commentLine, '$1');
|
||||||
|
else
|
||||||
|
line = line.replace(indentation, '$&#');
|
||||||
|
|
||||||
|
range.end.row = range.start.row = i;
|
||||||
|
range.end.column = line.length + 1;
|
||||||
|
doc.replace(range, line);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/abap";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/abap_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var AbapHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"variable.language": "this",
|
||||||
|
"keyword":
|
||||||
|
"ADD ALIAS ALIASES ASSERT ASSIGN ASSIGNING AT BACK" +
|
||||||
|
" CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY" +
|
||||||
|
" DATA DEFINE DEFINITION DEFERRED DELETE DESCRIBE DETAIL DIVIDE DO" +
|
||||||
|
" ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT" +
|
||||||
|
" FETCH FIELDS FORM FORMAT FREE FROM FUNCTION" +
|
||||||
|
" GENERATE GET" +
|
||||||
|
" HIDE" +
|
||||||
|
" IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION" +
|
||||||
|
" LEAVE LIKE LINE LOAD LOCAL LOOP" +
|
||||||
|
" MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY" +
|
||||||
|
" ON OVERLAY OPTIONAL OTHERS" +
|
||||||
|
" PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT" +
|
||||||
|
" RAISE RANGES READ RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURNING ROLLBACK" +
|
||||||
|
" SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS" +
|
||||||
|
" TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES" +
|
||||||
|
" UNASSIGN ULINE UNPACK UPDATE" +
|
||||||
|
" WHEN WHILE WINDOW WRITE" +
|
||||||
|
" OCCURS STRUCTURE OBJECT PROPERTY" +
|
||||||
|
" CASTING APPEND RAISING VALUE COLOR" +
|
||||||
|
" CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT" +
|
||||||
|
" ID NUMBER FOR TITLE OUTPUT" +
|
||||||
|
" WITH EXIT USING" +
|
||||||
|
" INTO WHERE GROUP BY HAVING ORDER BY SINGLE" +
|
||||||
|
" APPENDING CORRESPONDING FIELDS OF TABLE" +
|
||||||
|
" LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS CONNECTING" +
|
||||||
|
" EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN",
|
||||||
|
"constant.language":
|
||||||
|
"TRUE FALSE NULL SPACE",
|
||||||
|
"support.type":
|
||||||
|
"c n i p f d t x string xstring decfloat16 decfloat34",
|
||||||
|
"keyword.operator":
|
||||||
|
"abs sign ceil floor trunc frac acos asin atan cos sin tan" +
|
||||||
|
" abapOperator cosh sinh tanh exp log log10 sqrt" +
|
||||||
|
" strlen xstrlen charlen numofchar dbmaxlen lines"
|
||||||
|
}, "text", true, " ");
|
||||||
|
|
||||||
|
var compoundKeywords = "WITH\\W+(?:HEADER\\W+LINE|FRAME|KEY)|NO\\W+STANDARD\\W+PAGE\\W+HEADING|"+
|
||||||
|
"EXIT\\W+FROM\\W+STEP\\W+LOOP|BEGIN\\W+OF\\W+(?:BLOCK|LINE)|BEGIN\\W+OF|"+
|
||||||
|
"END\\W+OF\\W+(?:BLOCK|LINE)|END\\W+OF|NO\\W+INTERVALS|"+
|
||||||
|
"RESPECTING\\W+BLANKS|SEPARATED\\W+BY|USING\\W+(?:EDIT\\W+MASK)|"+
|
||||||
|
"WHERE\\W+(?:LINE)|RADIOBUTTON\\W+GROUP|REF\\W+TO|"+
|
||||||
|
"(?:PUBLIC|PRIVATE|PROTECTED)(?:\\W+SECTION)?|DELETING\\W+(?:TRAILING|LEADING)"+
|
||||||
|
"(?:ALL\\W+OCCURRENCES)|(?:FIRST|LAST)\\W+OCCURRENCE|INHERITING\\W+FROM|"+
|
||||||
|
"LINE-COUNT|ADD-CORRESPONDING|AUTHORITY-CHECK|BREAK-POINT|CLASS-DATA|CLASS-METHODS|"+
|
||||||
|
"CLASS-METHOD|DIVIDE-CORRESPONDING|EDITOR-CALL|END-OF-DEFINITION|END-OF-PAGE|END-OF-SELECTION|"+
|
||||||
|
"FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|"+
|
||||||
|
"NEW-PAGE|NEW-SECTION|PRINT-CONTROL|RP-PROVIDE-FROM-LAST|SELECT-OPTIONS|SELECTION-SCREEN|"+
|
||||||
|
"START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYNTAX-TRACE|TOP-OF-PAGE|TYPE-POOL|"+
|
||||||
|
"TYPE-POOLS|LINE-SIZE|LINE-COUNT|MESSAGE-ID|DISPLAY-MODE|READ(?:-ONLY)?|"+
|
||||||
|
"IS\\W+(?:NOT\\W+)?(?:ASSIGNED|BOUND|INITIAL|SUPPLIED)";
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{token : "string", regex : "`", next : "string"},
|
||||||
|
{token : "string", regex : "'", next : "qstring"},
|
||||||
|
{token : "doc.comment", regex : /^\*.+/},
|
||||||
|
{token : "comment", regex : /".+$/},
|
||||||
|
{token : "invalid", regex: "\\.{2,}"},
|
||||||
|
{token : "keyword.operator", regex: /\W[\-+\%=<>*]\W|\*\*|[~:,\.&$]|->*?|=>/},
|
||||||
|
{token : "paren.lparen", regex : "[\\[({]"},
|
||||||
|
{token : "paren.rparen", regex : "[\\])}]"},
|
||||||
|
{token : "constant.numeric", regex: "[+-]?\\d+\\b"},
|
||||||
|
{token : "variable.parameter", regex : /sy|pa?\d\d\d\d\|t\d\d\d\.|innnn/},
|
||||||
|
{token : "keyword", regex : compoundKeywords},
|
||||||
|
{token : "variable.parameter", regex : /\w+-\w+(?:-\w+)*/},
|
||||||
|
{token : keywordMapper, regex : "\\b\\w+\\b"},
|
||||||
|
{caseInsensitive: true}
|
||||||
|
],
|
||||||
|
"qstring" : [
|
||||||
|
{token : "constant.language.escape", regex : "''"},
|
||||||
|
{token : "string", regex : "'", next : "start"},
|
||||||
|
{defaultToken : "string"}
|
||||||
|
],
|
||||||
|
"string" : [
|
||||||
|
{token : "constant.language.escape", regex : "``"},
|
||||||
|
{token : "string", regex : "`", next : "start"},
|
||||||
|
{defaultToken : "string"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(AbapHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.AbapHighlightRules = AbapHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var range = this.indentationBlock(session, row);
|
||||||
|
if (range)
|
||||||
|
return range;
|
||||||
|
|
||||||
|
var re = /\S/;
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startLevel = line.search(re);
|
||||||
|
if (startLevel == -1 || line[startLevel] != "#")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var startColumn = line.length;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var level = line.search(re);
|
||||||
|
|
||||||
|
if (level == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (line[level] != "#")
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
var next = session.getLine(row + 1);
|
||||||
|
var prev = session.getLine(row - 1);
|
||||||
|
var prevIndent = prev.search(/\S/);
|
||||||
|
var nextIndent = next.search(/\S/);
|
||||||
|
|
||||||
|
if (indent == -1) {
|
||||||
|
session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (prevIndent == -1) {
|
||||||
|
if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "start";
|
||||||
|
}
|
||||||
|
} else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
|
||||||
|
if (session.getLine(row - 2).search(/\S/) == -1) {
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prevIndent!= -1 && prevIndent < indent)
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
else
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
|
||||||
|
if (indent < nextIndent)
|
||||||
|
return "start";
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
256
src/main/webapp/assets/ace/mode-actionscript.js
Normal file
256
src/main/webapp/assets/ace/mode-actionscript.js
Normal file
File diff suppressed because one or more lines are too long
117
src/main/webapp/assets/ace/mode-ada.js
Normal file
117
src/main/webapp/assets/ace/mode-ada.js
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/ada', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/ada_highlight_rules', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var AdaHighlightRules = require("./ada_highlight_rules").AdaHighlightRules;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = AdaHighlightRules;
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = "--";
|
||||||
|
|
||||||
|
this.$id = "ace/mode/ada";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/ada_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var AdaHighlightRules = function() {
|
||||||
|
var keywords = "abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|" +
|
||||||
|
"access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|" +
|
||||||
|
"array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|" +
|
||||||
|
"body|private|then|if|procedure|type|case|in|protected|constant|interface|until|" +
|
||||||
|
"|is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor";
|
||||||
|
|
||||||
|
var builtinConstants = (
|
||||||
|
"true|false|null"
|
||||||
|
);
|
||||||
|
|
||||||
|
var builtinFunctions = (
|
||||||
|
"count|min|max|avg|sum|rank|now|coalesce|main"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"support.function": builtinFunctions,
|
||||||
|
"keyword": keywords,
|
||||||
|
"constant.language": builtinConstants
|
||||||
|
}, "identifier", true);
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment",
|
||||||
|
regex : "--.*$"
|
||||||
|
}, {
|
||||||
|
token : "string", // " string
|
||||||
|
regex : '".*?"'
|
||||||
|
}, {
|
||||||
|
token : "string", // ' string
|
||||||
|
regex : "'.*?'"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[\\(]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\)]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
} ]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(AdaHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.AdaHighlightRules = AdaHighlightRules;
|
||||||
|
});
|
||||||
345
src/main/webapp/assets/ace/mode-apache_conf.js
Normal file
345
src/main/webapp/assets/ace/mode-apache_conf.js
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/apache_conf', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/apache_conf_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var ApacheConfHighlightRules = require("./apache_conf_highlight_rules").ApacheConfHighlightRules;
|
||||||
|
var FoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = ApacheConfHighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "#";
|
||||||
|
this.$id = "ace/mode/apache_conf";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/apache_conf_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var ApacheConfHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = { start:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.comment.apacheconf',
|
||||||
|
'comment.line.hash.ini',
|
||||||
|
'comment.line.hash.ini' ],
|
||||||
|
regex: '^((?:\\s)*)(#)(.*$)' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.tag.apacheconf',
|
||||||
|
'entity.tag.apacheconf',
|
||||||
|
'text',
|
||||||
|
'string.value.apacheconf',
|
||||||
|
'punctuation.definition.tag.apacheconf' ],
|
||||||
|
regex: '(<)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(?:(\\s)(.+?))?(>)' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.tag.apacheconf',
|
||||||
|
'entity.tag.apacheconf',
|
||||||
|
'punctuation.definition.tag.apacheconf' ],
|
||||||
|
regex: '(</)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(>)' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.alias.apacheconf', 'text',
|
||||||
|
'string.regexp.apacheconf', 'text',
|
||||||
|
'string.replacement.apacheconf', 'text' ],
|
||||||
|
regex: '(Rewrite(?:Rule|Cond))(\\s+)(.+?)(\\s+)(.+?)($|\\s)' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.alias.apacheconf', 'text',
|
||||||
|
'entity.status.apacheconf', 'text',
|
||||||
|
'string.regexp.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text' ],
|
||||||
|
regex: '(RedirectMatch)(?:(\\s+)(\\d\\d\\d|permanent|temp|seeother|gone))?(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.alias.apacheconf', 'text',
|
||||||
|
'entity.status.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text' ],
|
||||||
|
regex: '(Redirect)(?:(\\s+)(\\d\\d\\d|permanent|temp|seeother|gone))?(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.alias.apacheconf', 'text',
|
||||||
|
'string.regexp.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text' ],
|
||||||
|
regex: '(ScriptAliasMatch|AliasMatch)(\\s+)(.+?)(\\s+)(?:(.+?)(\\s))?' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.alias.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text',
|
||||||
|
'string.path.apacheconf', 'text' ],
|
||||||
|
regex: '(RedirectPermanent|RedirectTemp|ScriptAlias|Alias)(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' },
|
||||||
|
{ token: 'keyword.core.apacheconf',
|
||||||
|
regex: '\\b(?:AcceptPathInfo|AccessFileName|AddDefaultCharset|AddOutputFilterByType|AllowEncodedSlashes|AllowOverride|AuthName|AuthType|CGIMapExtension|ContentDigest|DefaultType|DocumentRoot|EnableMMAP|EnableSendfile|ErrorDocument|ErrorLog|FileETag|ForceType|HostnameLookups|IdentityCheck|Include|KeepAlive|KeepAliveTimeout|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|LogLevel|MaxKeepAliveRequests|NameVirtualHost|Options|Require|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScriptInterpreterSource|ServerAdmin|ServerAlias|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|SetHandler|SetInputFilter|SetOutputFilter|TimeOut|TraceEnable|UseCanonicalName)\\b' },
|
||||||
|
{ token: 'keyword.mpm.apacheconf',
|
||||||
|
regex: '\\b(?:AcceptMutex|AssignUserID|BS2000Account|ChildPerUserID|CoreDumpDirectory|EnableExceptionHook|Group|Listen|ListenBacklog|LockFile|MaxClients|MaxMemFree|MaxRequestsPerChild|MaxRequestsPerThread|MaxSpareServers|MaxSpareThreads|MaxThreads|MaxThreadsPerChild|MinSpareServers|MinSpareThreads|NumServers|PidFile|ReceiveBufferSize|ScoreBoardFile|SendBufferSize|ServerLimit|StartServers|StartThreads|ThreadLimit|ThreadsPerChild|ThreadStackSize|User|Win32DisableAcceptEx)\\b' },
|
||||||
|
{ token: 'keyword.access.apacheconf',
|
||||||
|
regex: '\\b(?:Allow|Deny|Order)\\b' },
|
||||||
|
{ token: 'keyword.actions.apacheconf',
|
||||||
|
regex: '\\b(?:Action|Script)\\b' },
|
||||||
|
{ token: 'keyword.alias.apacheconf',
|
||||||
|
regex: '\\b(?:Alias|AliasMatch|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ScriptAlias|ScriptAliasMatch)\\b' },
|
||||||
|
{ token: 'keyword.auth.apacheconf',
|
||||||
|
regex: '\\b(?:AuthAuthoritative|AuthGroupFile|AuthUserFile)\\b' },
|
||||||
|
{ token: 'keyword.auth_anon.apacheconf',
|
||||||
|
regex: '\\b(?:Anonymous|Anonymous_Authoritative|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail)\\b' },
|
||||||
|
{ token: 'keyword.auth_dbm.apacheconf',
|
||||||
|
regex: '\\b(?:AuthDBMAuthoritative|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile)\\b' },
|
||||||
|
{ token: 'keyword.auth_digest.apacheconf',
|
||||||
|
regex: '\\b(?:AuthDigestAlgorithm|AuthDigestDomain|AuthDigestFile|AuthDigestGroupFile|AuthDigestNcCheck|AuthDigestNonceFormat|AuthDigestNonceLifetime|AuthDigestQop|AuthDigestShmemSize)\\b' },
|
||||||
|
{ token: 'keyword.auth_ldap.apacheconf',
|
||||||
|
regex: '\\b(?:AuthLDAPAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPEnabled|AuthLDAPFrontPageHack|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPRemoteUserIsDN|AuthLDAPUrl)\\b' },
|
||||||
|
{ token: 'keyword.autoindex.apacheconf',
|
||||||
|
regex: '\\b(?:AddAlt|AddAltByEncoding|AddAltByType|AddDescription|AddIcon|AddIconByEncoding|AddIconByType|DefaultIcon|HeaderName|IndexIgnore|IndexOptions|IndexOrderDefault|ReadmeName)\\b' },
|
||||||
|
{ token: 'keyword.cache.apacheconf',
|
||||||
|
regex: '\\b(?:CacheDefaultExpire|CacheDisable|CacheEnable|CacheForceCompletion|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheLastModifiedFactor|CacheMaxExpire)\\b' },
|
||||||
|
{ token: 'keyword.cern_meta.apacheconf',
|
||||||
|
regex: '\\b(?:MetaDir|MetaFiles|MetaSuffix)\\b' },
|
||||||
|
{ token: 'keyword.cgi.apacheconf',
|
||||||
|
regex: '\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength)\\b' },
|
||||||
|
{ token: 'keyword.cgid.apacheconf',
|
||||||
|
regex: '\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock)\\b' },
|
||||||
|
{ token: 'keyword.charset_lite.apacheconf',
|
||||||
|
regex: '\\b(?:CharsetDefault|CharsetOptions|CharsetSourceEnc)\\b' },
|
||||||
|
{ token: 'keyword.dav.apacheconf',
|
||||||
|
regex: '\\b(?:Dav|DavDepthInfinity|DavMinTimeout|DavLockDB)\\b' },
|
||||||
|
{ token: 'keyword.deflate.apacheconf',
|
||||||
|
regex: '\\b(?:DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateMemLevel|DeflateWindowSize)\\b' },
|
||||||
|
{ token: 'keyword.dir.apacheconf',
|
||||||
|
regex: '\\b(?:DirectoryIndex|DirectorySlash)\\b' },
|
||||||
|
{ token: 'keyword.disk_cache.apacheconf',
|
||||||
|
regex: '\\b(?:CacheDirLength|CacheDirLevels|CacheExpiryCheck|CacheGcClean|CacheGcDaily|CacheGcInterval|CacheGcMemUsage|CacheGcUnused|CacheMaxFileSize|CacheMinFileSize|CacheRoot|CacheSize|CacheTimeMargin)\\b' },
|
||||||
|
{ token: 'keyword.dumpio.apacheconf',
|
||||||
|
regex: '\\b(?:DumpIOInput|DumpIOOutput)\\b' },
|
||||||
|
{ token: 'keyword.env.apacheconf',
|
||||||
|
regex: '\\b(?:PassEnv|SetEnv|UnsetEnv)\\b' },
|
||||||
|
{ token: 'keyword.expires.apacheconf',
|
||||||
|
regex: '\\b(?:ExpiresActive|ExpiresByType|ExpiresDefault)\\b' },
|
||||||
|
{ token: 'keyword.ext_filter.apacheconf',
|
||||||
|
regex: '\\b(?:ExtFilterDefine|ExtFilterOptions)\\b' },
|
||||||
|
{ token: 'keyword.file_cache.apacheconf',
|
||||||
|
regex: '\\b(?:CacheFile|MMapFile)\\b' },
|
||||||
|
{ token: 'keyword.headers.apacheconf',
|
||||||
|
regex: '\\b(?:Header|RequestHeader)\\b' },
|
||||||
|
{ token: 'keyword.imap.apacheconf',
|
||||||
|
regex: '\\b(?:ImapBase|ImapDefault|ImapMenu)\\b' },
|
||||||
|
{ token: 'keyword.include.apacheconf',
|
||||||
|
regex: '\\b(?:SSIEndTag|SSIErrorMsg|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|XBitHack)\\b' },
|
||||||
|
{ token: 'keyword.isapi.apacheconf',
|
||||||
|
regex: '\\b(?:ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer)\\b' },
|
||||||
|
{ token: 'keyword.ldap.apacheconf',
|
||||||
|
regex: '\\b(?:LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionTimeout|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTrustedCA|LDAPTrustedCAType)\\b' },
|
||||||
|
{ token: 'keyword.log.apacheconf',
|
||||||
|
regex: '\\b(?:BufferedLogs|CookieLog|CustomLog|LogFormat|TransferLog|ForensicLog)\\b' },
|
||||||
|
{ token: 'keyword.mem_cache.apacheconf',
|
||||||
|
regex: '\\b(?:MCacheMaxObjectCount|MCacheMaxObjectSize|MCacheMaxStreamingBuffer|MCacheMinObjectSize|MCacheRemovalAlgorithm|MCacheSize)\\b' },
|
||||||
|
{ token: 'keyword.mime.apacheconf',
|
||||||
|
regex: '\\b(?:AddCharset|AddEncoding|AddHandler|AddInputFilter|AddLanguage|AddOutputFilter|AddType|DefaultLanguage|ModMimeUsePathInfo|MultiviewsMatch|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|TypesConfig)\\b' },
|
||||||
|
{ token: 'keyword.misc.apacheconf',
|
||||||
|
regex: '\\b(?:ProtocolEcho|Example|AddModuleInfo|MimeMagicFile|CheckSpelling|ExtendedStatus|SuexecUserGroup|UserDir)\\b' },
|
||||||
|
{ token: 'keyword.negotiation.apacheconf',
|
||||||
|
regex: '\\b(?:CacheNegotiatedDocs|ForceLanguagePriority|LanguagePriority)\\b' },
|
||||||
|
{ token: 'keyword.nw_ssl.apacheconf',
|
||||||
|
regex: '\\b(?:NWSSLTrustedCerts|NWSSLUpgradeable|SecureListen)\\b' },
|
||||||
|
{ token: 'keyword.proxy.apacheconf',
|
||||||
|
regex: '\\b(?:AllowCONNECT|NoProxy|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyFtpDirCharset|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassReverse|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxyTimeout|ProxyVia)\\b' },
|
||||||
|
{ token: 'keyword.rewrite.apacheconf',
|
||||||
|
regex: '\\b(?:RewriteBase|RewriteCond|RewriteEngine|RewriteLock|RewriteLog|RewriteLogLevel|RewriteMap|RewriteOptions|RewriteRule)\\b' },
|
||||||
|
{ token: 'keyword.setenvif.apacheconf',
|
||||||
|
regex: '\\b(?:BrowserMatch|BrowserMatchNoCase|SetEnvIf|SetEnvIfNoCase)\\b' },
|
||||||
|
{ token: 'keyword.so.apacheconf',
|
||||||
|
regex: '\\b(?:LoadFile|LoadModule)\\b' },
|
||||||
|
{ token: 'keyword.ssl.apacheconf',
|
||||||
|
regex: '\\b(?:SSLCACertificateFile|SSLCACertificatePath|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLEngine|SSLMutex|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLUserName|SSLVerifyClient|SSLVerifyDepth)\\b' },
|
||||||
|
{ token: 'keyword.usertrack.apacheconf',
|
||||||
|
regex: '\\b(?:CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking)\\b' },
|
||||||
|
{ token: 'keyword.vhost_alias.apacheconf',
|
||||||
|
regex: '\\b(?:VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP)\\b' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.php.apacheconf',
|
||||||
|
'text',
|
||||||
|
'entity.property.apacheconf',
|
||||||
|
'text',
|
||||||
|
'string.value.apacheconf',
|
||||||
|
'text' ],
|
||||||
|
regex: '\\b(php_value|php_flag)\\b(?:(\\s+)(.+?)(?:(\\s+)(.+?))?)?(\\s)' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.variable.apacheconf',
|
||||||
|
'variable.env.apacheconf',
|
||||||
|
'variable.misc.apacheconf',
|
||||||
|
'punctuation.variable.apacheconf' ],
|
||||||
|
regex: '(%\\{)(?:(HTTP_USER_AGENT|HTTP_REFERER|HTTP_COOKIE|HTTP_FORWARDED|HTTP_HOST|HTTP_PROXY_CONNECTION|HTTP_ACCEPT|REMOTE_ADDR|REMOTE_HOST|REMOTE_PORT|REMOTE_USER|REMOTE_IDENT|REQUEST_METHOD|SCRIPT_FILENAME|PATH_INFO|QUERY_STRING|AUTH_TYPE|DOCUMENT_ROOT|SERVER_ADMIN|SERVER_NAME|SERVER_ADDR|SERVER_PORT|SERVER_PROTOCOL|SERVER_SOFTWARE|TIME_YEAR|TIME_MON|TIME_DAY|TIME_HOUR|TIME_MIN|TIME_SEC|TIME_WDAY|TIME|API_VERSION|THE_REQUEST|REQUEST_URI|REQUEST_FILENAME|IS_SUBREQ|HTTPS)|(.*?))(\\})' },
|
||||||
|
{ token: [ 'entity.mime-type.apacheconf', 'text' ],
|
||||||
|
regex: '\\b((?:text|image|application|video|audio)/.+?)(\\s)' },
|
||||||
|
{ token: 'entity.helper.apacheconf',
|
||||||
|
regex: '\\b(?:from|unset|set|on|off)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'constant.integer.apacheconf', regex: '\\b\\d+\\b' },
|
||||||
|
{ token:
|
||||||
|
[ 'text',
|
||||||
|
'punctuation.definition.flag.apacheconf',
|
||||||
|
'string.flag.apacheconf',
|
||||||
|
'punctuation.definition.flag.apacheconf',
|
||||||
|
'text' ],
|
||||||
|
regex: '(\\s)(\\[)(.*?)(\\])(\\s)' } ] }
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
ApacheConfHighlightRules.metaData = { fileTypes:
|
||||||
|
[ 'conf',
|
||||||
|
'CONF',
|
||||||
|
'htaccess',
|
||||||
|
'HTACCESS',
|
||||||
|
'htgroups',
|
||||||
|
'HTGROUPS',
|
||||||
|
'htpasswd',
|
||||||
|
'HTPASSWD',
|
||||||
|
'.htaccess',
|
||||||
|
'.HTACCESS',
|
||||||
|
'.htgroups',
|
||||||
|
'.HTGROUPS',
|
||||||
|
'.htpasswd',
|
||||||
|
'.HTPASSWD' ],
|
||||||
|
name: 'Apache Conf',
|
||||||
|
scopeName: 'source.apacheconf' }
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(ApacheConfHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.ApacheConfHighlightRules = ApacheConfHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
372
src/main/webapp/assets/ace/mode-asciidoc.js
Normal file
372
src/main/webapp/assets/ace/mode-asciidoc.js
Normal file
@@ -0,0 +1,372 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/asciidoc', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/asciidoc_highlight_rules', 'ace/mode/folding/asciidoc'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var AsciidocHighlightRules = require("./asciidoc_highlight_rules").AsciidocHighlightRules;
|
||||||
|
var AsciidocFoldMode = require("./folding/asciidoc").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = AsciidocHighlightRules;
|
||||||
|
|
||||||
|
this.foldingRules = new AsciidocFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.type = "text";
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
if (state == "listblock") {
|
||||||
|
var match = /^((?:.+)?)([-+*][ ]+)/.exec(line);
|
||||||
|
if (match) {
|
||||||
|
return new Array(match[1].length + 1).join(" ") + match[2];
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return this.$getIndent(line);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.$id = "ace/mode/asciidoc";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/asciidoc_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var AsciidocHighlightRules = function() {
|
||||||
|
var identifierRe = "[a-zA-Z\u00a1-\uffff]+\\b";
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start": [
|
||||||
|
{token: "empty", regex: /$/},
|
||||||
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"},
|
||||||
|
{token: "literal", regex: /^-{4,}\s*$/, next: "literalBlock"},
|
||||||
|
{token: "string", regex: /^\+{4,}\s*$/, next: "passthroughBlock"},
|
||||||
|
{token: "keyword", regex: /^={4,}\s*$/},
|
||||||
|
{token: "text", regex: /^\s*$/},
|
||||||
|
{token: "empty", regex: "", next: "dissallowDelimitedBlock"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"dissallowDelimitedBlock": [
|
||||||
|
{include: "paragraphEnd"},
|
||||||
|
{token: "comment", regex: '^//.+$'},
|
||||||
|
{token: "keyword", regex: "^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):"},
|
||||||
|
|
||||||
|
{include: "listStart"},
|
||||||
|
{token: "literal", regex: /^\s+.+$/, next: "indentedBlock"},
|
||||||
|
{token: "empty", regex: "", next: "text"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"paragraphEnd": [
|
||||||
|
{token: "doc.comment", regex: /^\/{4,}\s*$/, next: "commentBlock"},
|
||||||
|
{token: "tableBlock", regex: /^\s*[|!]=+\s*$/, next: "tableBlock"},
|
||||||
|
{token: "keyword", regex: /^(?:--|''')\s*$/, next: "start"},
|
||||||
|
{token: "option", regex: /^\[.*\]\s*$/, next: "start"},
|
||||||
|
{token: "pageBreak", regex: /^>{3,}$/, next: "start"},
|
||||||
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"},
|
||||||
|
{token: "titleUnderline", regex: /^(?:={2,}|-{2,}|~{2,}|\^{2,}|\+{2,})\s*$/, next: "start"},
|
||||||
|
{token: "singleLineTitle", regex: /^={1,5}\s+\S.*$/, next: "start"},
|
||||||
|
|
||||||
|
{token: "otherBlock", regex: /^(?:\*{2,}|_{2,})\s*$/, next: "start"},
|
||||||
|
{token: "optionalTitle", regex: /^\.[^.\s].+$/, next: "start"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"listStart": [
|
||||||
|
{token: "keyword", regex: /^\s*(?:\d+\.|[a-zA-Z]\.|[ixvmIXVM]+\)|\*{1,5}|-|\.{1,5})\s/, next: "listText"},
|
||||||
|
{token: "meta.tag", regex: /^.+(?::{2,4}|;;)(?: |$)/, next: "listText"},
|
||||||
|
{token: "support.function.list.callout", regex: /^(?:<\d+>|\d+>|>) /, next: "text"},
|
||||||
|
{token: "keyword", regex: /^\+\s*$/, next: "start"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"text": [
|
||||||
|
{token: ["link", "variable.language"], regex: /((?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+)(\[.*?\])/},
|
||||||
|
{token: "link", regex: /(?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+/},
|
||||||
|
{token: "link", regex: /\b[\w\.\/\-]+@[\w\.\/\-]+\b/},
|
||||||
|
{include: "macros"},
|
||||||
|
{include: "paragraphEnd"},
|
||||||
|
{token: "literal", regex:/\+{3,}/, next:"smallPassthrough"},
|
||||||
|
{token: "escape", regex: /\((?:C|TM|R)\)|\.{3}|->|<-|=>|<=|&#(?:\d+|x[a-fA-F\d]+);|(?: |^)--(?=\s+\S)/},
|
||||||
|
{token: "escape", regex: /\\[_*'`+#]|\\{2}[_*'`+#]{2}/},
|
||||||
|
{token: "keyword", regex: /\s\+$/},
|
||||||
|
{token: "text", regex: identifierRe},
|
||||||
|
{token: ["keyword", "string", "keyword"],
|
||||||
|
regex: /(<<[\w\d\-$]+,)(.*?)(>>|$)/},
|
||||||
|
{token: "keyword", regex: /<<[\w\d\-$]+,?|>>/},
|
||||||
|
{token: "constant.character", regex: /\({2,3}.*?\){2,3}/},
|
||||||
|
{token: "keyword", regex: /\[\[.+?\]\]/},
|
||||||
|
{token: "support", regex: /^\[{3}[\w\d =\-]+\]{3}/},
|
||||||
|
|
||||||
|
{include: "quotes"},
|
||||||
|
{token: "empty", regex: /^\s*$/, next: "start"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"listText": [
|
||||||
|
{include: "listStart"},
|
||||||
|
{include: "text"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"indentedBlock": [
|
||||||
|
{token: "literal", regex: /^[\s\w].+$/, next: "indentedBlock"},
|
||||||
|
{token: "literal", regex: "", next: "start"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"listingBlock": [
|
||||||
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "constant.numeric", regex: '<\\d+>'},
|
||||||
|
{token: "literal", regex: '[^<]+'},
|
||||||
|
{token: "literal", regex: '<'}
|
||||||
|
],
|
||||||
|
"literalBlock": [
|
||||||
|
{token: "literal", regex: /^-{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "constant.numeric", regex: '<\\d+>'},
|
||||||
|
{token: "literal", regex: '[^<]+'},
|
||||||
|
{token: "literal", regex: '<'}
|
||||||
|
],
|
||||||
|
"passthroughBlock": [
|
||||||
|
{token: "literal", regex: /^\+{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "literal", regex: identifierRe + "|\\d+"},
|
||||||
|
{include: "macros"},
|
||||||
|
{token: "literal", regex: "."}
|
||||||
|
],
|
||||||
|
|
||||||
|
"smallPassthrough": [
|
||||||
|
{token: "literal", regex: /[+]{3,}/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "literal", regex: /^\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "literal", regex: identifierRe + "|\\d+"},
|
||||||
|
{include: "macros"}
|
||||||
|
],
|
||||||
|
|
||||||
|
"commentBlock": [
|
||||||
|
{token: "doc.comment", regex: /^\/{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "doc.comment", regex: '^.*$'}
|
||||||
|
],
|
||||||
|
"tableBlock": [
|
||||||
|
{token: "tableBlock", regex: /^\s*\|={3,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "innerTableBlock"},
|
||||||
|
{token: "tableBlock", regex: /\|/},
|
||||||
|
{include: "text", noEscape: true}
|
||||||
|
],
|
||||||
|
"innerTableBlock": [
|
||||||
|
{token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "tableBlock"},
|
||||||
|
{token: "tableBlock", regex: /^\s*|={3,}\s*$/, next: "dissallowDelimitedBlock"},
|
||||||
|
{token: "tableBlock", regex: /\!/}
|
||||||
|
],
|
||||||
|
"macros": [
|
||||||
|
{token: "macro", regex: /{[\w\-$]+}/},
|
||||||
|
{token: ["text", "string", "text", "constant.character", "text"], regex: /({)([\w\-$]+)(:)?(.+)?(})/},
|
||||||
|
{token: ["text", "markup.list.macro", "keyword", "string"], regex: /(\w+)(footnote(?:ref)?::?)([^\s\[]+)?(\[.*?\])?/},
|
||||||
|
{token: ["markup.list.macro", "keyword", "string"], regex: /([a-zA-Z\-][\w\.\/\-]*::?)([^\s\[]+)(\[.*?\])?/},
|
||||||
|
{token: ["markup.list.macro", "keyword"], regex: /([a-zA-Z\-][\w\.\/\-]+::?)(\[.*?\])/},
|
||||||
|
{token: "keyword", regex: /^:.+?:(?= |$)/}
|
||||||
|
],
|
||||||
|
|
||||||
|
"quotes": [
|
||||||
|
{token: "string.italic", regex: /__[^_\s].*?__/},
|
||||||
|
{token: "string.italic", regex: quoteRule("_")},
|
||||||
|
|
||||||
|
{token: "keyword.bold", regex: /\*\*[^*\s].*?\*\*/},
|
||||||
|
{token: "keyword.bold", regex: quoteRule("\\*")},
|
||||||
|
|
||||||
|
{token: "literal", regex: quoteRule("\\+")},
|
||||||
|
{token: "literal", regex: /\+\+[^+\s].*?\+\+/},
|
||||||
|
{token: "literal", regex: /\$\$.+?\$\$/},
|
||||||
|
{token: "literal", regex: quoteRule("`")},
|
||||||
|
|
||||||
|
{token: "keyword", regex: quoteRule("^")},
|
||||||
|
{token: "keyword", regex: quoteRule("~")},
|
||||||
|
{token: "keyword", regex: /##?/},
|
||||||
|
{token: "keyword", regex: /(?:\B|^)``|\b''/}
|
||||||
|
]
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
function quoteRule(ch) {
|
||||||
|
var prefix = /\w/.test(ch) ? "\\b" : "(?:\\B|^)";
|
||||||
|
return prefix + ch + "[^" + ch + "].*?" + ch + "(?![\\w*])";
|
||||||
|
}
|
||||||
|
|
||||||
|
var tokenMap = {
|
||||||
|
macro: "constant.character",
|
||||||
|
tableBlock: "doc.comment",
|
||||||
|
titleUnderline: "markup.heading",
|
||||||
|
singleLineTitle: "markup.heading",
|
||||||
|
pageBreak: "string",
|
||||||
|
option: "string.regexp",
|
||||||
|
otherBlock: "markup.list",
|
||||||
|
literal: "support.function",
|
||||||
|
optionalTitle: "constant.numeric",
|
||||||
|
escape: "constant.language.escape",
|
||||||
|
link: "markup.underline.list"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var state in this.$rules) {
|
||||||
|
var stateRules = this.$rules[state];
|
||||||
|
for (var i = stateRules.length; i--; ) {
|
||||||
|
var rule = stateRules[i];
|
||||||
|
if (rule.include || typeof rule == "string") {
|
||||||
|
var args = [i, 1].concat(this.$rules[rule.include || rule]);
|
||||||
|
if (rule.noEscape) {
|
||||||
|
args = args.filter(function(x) {
|
||||||
|
return !x.next;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
stateRules.splice.apply(stateRules, args);
|
||||||
|
} else if (rule.token in tokenMap) {
|
||||||
|
rule.token = tokenMap[rule.token];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(AsciidocHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.AsciidocHighlightRules = AsciidocHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/asciidoc', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.foldingStartMarker = /^(?:\|={10,}|[\.\/=\-~^+]{4,}\s*$|={1,5} )/;
|
||||||
|
this.singleLineHeadingRe = /^={1,5}(?=\s+\S)/;
|
||||||
|
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
if (!this.foldingStartMarker.test(line))
|
||||||
|
return ""
|
||||||
|
|
||||||
|
if (line[0] == "=") {
|
||||||
|
if (this.singleLineHeadingRe.test(line))
|
||||||
|
return "start";
|
||||||
|
if (session.getLine(row - 1).length != session.getLine(row).length)
|
||||||
|
return "";
|
||||||
|
return "start";
|
||||||
|
}
|
||||||
|
if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock")
|
||||||
|
return "end";
|
||||||
|
return "start";
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startColumn = line.length;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
if (!line.match(this.foldingStartMarker))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var token;
|
||||||
|
function getTokenType(row) {
|
||||||
|
token = session.getTokens(row)[0];
|
||||||
|
return token && token.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
var levels = ["=","-","~","^","+"];
|
||||||
|
var heading = "markup.heading";
|
||||||
|
var singleLineHeadingRe = this.singleLineHeadingRe;
|
||||||
|
function getLevel() {
|
||||||
|
var match = token.value.match(singleLineHeadingRe);
|
||||||
|
if (match)
|
||||||
|
return match[0].length;
|
||||||
|
var level = levels.indexOf(token.value[0]) + 1;
|
||||||
|
if (level == 1) {
|
||||||
|
if (session.getLine(row - 1).length != session.getLine(row).length)
|
||||||
|
return Infinity;
|
||||||
|
}
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getTokenType(row) == heading) {
|
||||||
|
var startHeadingLevel = getLevel();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
if (getTokenType(row) != heading)
|
||||||
|
continue;
|
||||||
|
var level = getLevel();
|
||||||
|
if (level <= startHeadingLevel)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var isSingleLineHeading = token && token.value.match(this.singleLineHeadingRe);
|
||||||
|
endRow = isSingleLineHeading ? row - 1 : row - 2;
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
while (endRow > startRow && (!getTokenType(endRow) || token.value[0] == "["))
|
||||||
|
endRow--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var state = session.bgTokenizer.getState(row);
|
||||||
|
if (state == "dissallowDelimitedBlock") {
|
||||||
|
while (row -- > 0) {
|
||||||
|
if (session.bgTokenizer.getState(row).lastIndexOf("Block") == -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
endRow = row + 1;
|
||||||
|
if (endRow < startRow) {
|
||||||
|
var endColumn = session.getLine(row).length;
|
||||||
|
return new Range(endRow, 5, startRow, startColumn - 5);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while (++row < maxRow) {
|
||||||
|
if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock")
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(row).length;
|
||||||
|
return new Range(startRow, 5, endRow, endColumn - 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
216
src/main/webapp/assets/ace/mode-assembly_x86.js
Normal file
216
src/main/webapp/assets/ace/mode-assembly_x86.js
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/assembly_x86', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/assembly_x86_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var AssemblyX86HighlightRules = require("./assembly_x86_highlight_rules").AssemblyX86HighlightRules;
|
||||||
|
var FoldMode = require("./folding/coffee").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = AssemblyX86HighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = ";";
|
||||||
|
this.$id = "ace/mode/assembly_x86";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/assembly_x86_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var AssemblyX86HighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = { start:
|
||||||
|
[ { token: 'keyword.control.assembly',
|
||||||
|
regex: '\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'variable.parameter.register.assembly',
|
||||||
|
regex: '\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'constant.character.decimal.assembly',
|
||||||
|
regex: '\\b[0-9]+\\b' },
|
||||||
|
{ token: 'constant.character.hexadecimal.assembly',
|
||||||
|
regex: '\\b0x[A-F0-9]+\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'constant.character.hexadecimal.assembly',
|
||||||
|
regex: '\\b[A-F0-9]+h\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'string.assembly', regex: /'([^\\']|\\.)*'/ },
|
||||||
|
{ token: 'string.assembly', regex: /"([^\\"]|\\.)*"/ },
|
||||||
|
{ token: 'support.function.directive.assembly',
|
||||||
|
regex: '^\\[',
|
||||||
|
push:
|
||||||
|
[ { token: 'support.function.directive.assembly',
|
||||||
|
regex: '\\]$',
|
||||||
|
next: 'pop' },
|
||||||
|
{ defaultToken: 'support.function.directive.assembly' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'support.function.directive.assembly',
|
||||||
|
'support.function.directive.assembly',
|
||||||
|
'entity.name.function.assembly' ],
|
||||||
|
regex: '(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)' },
|
||||||
|
{ token: 'support.function.directive.assembly',
|
||||||
|
regex: '^endstruc\\b' },
|
||||||
|
{ token:
|
||||||
|
[ 'support.function.directive.assembly',
|
||||||
|
'entity.name.function.assembly',
|
||||||
|
'support.function.directive.assembly',
|
||||||
|
'constant.character.assembly' ],
|
||||||
|
regex: '^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)' },
|
||||||
|
{ token: 'support.function.directive.assembly',
|
||||||
|
regex: '^%endmacro' },
|
||||||
|
{ token:
|
||||||
|
[ 'text',
|
||||||
|
'support.function.directive.assembly',
|
||||||
|
'text',
|
||||||
|
'entity.name.function.assembly' ],
|
||||||
|
regex: '(\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\$\\$|\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'support.function.directive.assembly',
|
||||||
|
regex: '\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'entity.name.function.assembly', regex: '^\\s*%%[\\w.]+?:$' },
|
||||||
|
{ token: 'entity.name.function.assembly', regex: '^\\s*%\\$[\\w.]+?:$' },
|
||||||
|
{ token: 'entity.name.function.assembly', regex: '^[\\w.]+?:' },
|
||||||
|
{ token: 'entity.name.function.assembly', regex: '^[\\w.]+?\\b' },
|
||||||
|
{ token: 'comment.assembly', regex: ';.*$' } ]
|
||||||
|
}
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
AssemblyX86HighlightRules.metaData = { fileTypes: [ 'asm' ],
|
||||||
|
name: 'Assembly x86',
|
||||||
|
scopeName: 'source.assembly' }
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(AssemblyX86HighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.AssemblyX86HighlightRules = AssemblyX86HighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var range = this.indentationBlock(session, row);
|
||||||
|
if (range)
|
||||||
|
return range;
|
||||||
|
|
||||||
|
var re = /\S/;
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startLevel = line.search(re);
|
||||||
|
if (startLevel == -1 || line[startLevel] != "#")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var startColumn = line.length;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var level = line.search(re);
|
||||||
|
|
||||||
|
if (level == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (line[level] != "#")
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
var next = session.getLine(row + 1);
|
||||||
|
var prev = session.getLine(row - 1);
|
||||||
|
var prevIndent = prev.search(/\S/);
|
||||||
|
var nextIndent = next.search(/\S/);
|
||||||
|
|
||||||
|
if (indent == -1) {
|
||||||
|
session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (prevIndent == -1) {
|
||||||
|
if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "start";
|
||||||
|
}
|
||||||
|
} else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
|
||||||
|
if (session.getLine(row - 2).search(/\S/) == -1) {
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prevIndent!= -1 && prevIndent < indent)
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
else
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
|
||||||
|
if (indent < nextIndent)
|
||||||
|
return "start";
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
224
src/main/webapp/assets/ace/mode-autohotkey.js
Normal file
224
src/main/webapp/assets/ace/mode-autohotkey.js
Normal file
File diff suppressed because one or more lines are too long
212
src/main/webapp/assets/ace/mode-batchfile.js
Normal file
212
src/main/webapp/assets/ace/mode-batchfile.js
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/batchfile', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/batchfile_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var BatchFileHighlightRules = require("./batchfile_highlight_rules").BatchFileHighlightRules;
|
||||||
|
var FoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = BatchFileHighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "::";
|
||||||
|
this.blockComment = "";
|
||||||
|
this.$id = "ace/mode/batchfile";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/batchfile_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var BatchFileHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = { start:
|
||||||
|
[ { token: 'keyword.command.dosbatch',
|
||||||
|
regex: '\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'keyword.control.statement.dosbatch',
|
||||||
|
regex: '\\b(?:goto|call|exit)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'keyword.control.conditional.if.dosbatch',
|
||||||
|
regex: '\\bif\\s+not\\s+(?:exist|defined|errorlevel|cmdextversion)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'keyword.control.conditional.dosbatch',
|
||||||
|
regex: '\\b(?:if|else)\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'keyword.control.repeat.dosbatch',
|
||||||
|
regex: '\\bfor\\b',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'keyword.operator.dosbatch',
|
||||||
|
regex: '\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\b' },
|
||||||
|
{ token: ['doc.comment', 'comment'],
|
||||||
|
regex: '(?:^|\\b)(rem)($|\\s.*$)',
|
||||||
|
caseInsensitive: true },
|
||||||
|
{ token: 'comment.line.colons.dosbatch',
|
||||||
|
regex: '::.*$' },
|
||||||
|
{ include: 'variable' },
|
||||||
|
{ token: 'punctuation.definition.string.begin.shell',
|
||||||
|
regex: '"',
|
||||||
|
push: [
|
||||||
|
{ token: 'punctuation.definition.string.end.shell', regex: '"', next: 'pop' },
|
||||||
|
{ include: 'variable' },
|
||||||
|
{ defaultToken: 'string.quoted.double.dosbatch' } ] },
|
||||||
|
{ token: 'keyword.operator.pipe.dosbatch', regex: '[|]' },
|
||||||
|
{ token: 'keyword.operator.redirect.shell',
|
||||||
|
regex: '&>|\\d*>&\\d*|\\d*(?:>>|>|<)|\\d*<&|\\d*<>' } ],
|
||||||
|
variable: [
|
||||||
|
{ token: 'constant.numeric', regex: '%%\\w+|%[*\\d]|%\\w+%'},
|
||||||
|
{ token: 'constant.numeric', regex: '%~\\d+'},
|
||||||
|
{ token: ['markup.list', 'constant.other', 'markup.list'],
|
||||||
|
regex: '(%)(\\w+)(%?)' }]}
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
BatchFileHighlightRules.metaData = { name: 'Batch File',
|
||||||
|
scopeName: 'source.dosbatch',
|
||||||
|
fileTypes: [ 'bat' ] }
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(BatchFileHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.BatchFileHighlightRules = BatchFileHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
307
src/main/webapp/assets/ace/mode-c9search.js
Normal file
307
src/main/webapp/assets/ace/mode-c9search.js
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/c9search_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/c9search'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var C9SearchHighlightRules = require("./c9search_highlight_rules").C9SearchHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var C9StyleFoldMode = require("./folding/c9search").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = C9SearchHighlightRules;
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.foldingRules = new C9StyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/c9search";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/c9search_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
function safeCreateRegexp(source, flag) {
|
||||||
|
try {
|
||||||
|
return new RegExp(source, flag);
|
||||||
|
} catch(e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
var C9SearchHighlightRules = function() {
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
tokenNames : ["c9searchresults.constant.numeric", "c9searchresults.text", "c9searchresults.text", "c9searchresults.keyword"],
|
||||||
|
regex : "(^\\s+[0-9]+)(:\\s)(.+)",
|
||||||
|
onMatch : function(val, state, stack) {
|
||||||
|
var values = this.splitRegex.exec(val);
|
||||||
|
var types = this.tokenNames;
|
||||||
|
var tokens = [{
|
||||||
|
type: types[0],
|
||||||
|
value: values[1]
|
||||||
|
},{
|
||||||
|
type: types[1],
|
||||||
|
value: values[2]
|
||||||
|
}];
|
||||||
|
|
||||||
|
var regex = stack[1];
|
||||||
|
var str = values[3];
|
||||||
|
|
||||||
|
var m;
|
||||||
|
var last = 0;
|
||||||
|
if (regex && regex.exec) {
|
||||||
|
regex.lastIndex = 0;
|
||||||
|
while (m = regex.exec(str)) {
|
||||||
|
var skipped = str.substring(last, m.index);
|
||||||
|
last = regex.lastIndex;
|
||||||
|
if (skipped)
|
||||||
|
tokens.push({type: types[2], value: skipped});
|
||||||
|
if (m[0])
|
||||||
|
tokens.push({type: types[3], value: m[0]});
|
||||||
|
else if (!skipped)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (last < str.length)
|
||||||
|
tokens.push({type: types[2], value: str.substr(last)});
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : ["string", "text"], // single line
|
||||||
|
regex : "(\\S.*)(:$)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regex : "Searching for .*$",
|
||||||
|
onMatch: function(val, state, stack) {
|
||||||
|
var parts = val.split("\x01");
|
||||||
|
if (parts.length < 3)
|
||||||
|
return "text";
|
||||||
|
|
||||||
|
var options, search, replace;
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var tokens = [{
|
||||||
|
value: parts[i++] + "'",
|
||||||
|
type: "text"
|
||||||
|
}, {
|
||||||
|
value: search = parts[i++],
|
||||||
|
type: "text" // "c9searchresults.keyword"
|
||||||
|
}, {
|
||||||
|
value: "'" + parts[i++],
|
||||||
|
type: "text"
|
||||||
|
}];
|
||||||
|
if (parts[2] !== " in") {
|
||||||
|
replace = parts[i];
|
||||||
|
tokens.push({
|
||||||
|
value: "'" + parts[i++] + "'",
|
||||||
|
type: "text"
|
||||||
|
}, {
|
||||||
|
value: parts[i++],
|
||||||
|
type: "text"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tokens.push({
|
||||||
|
value: " " + parts[i++] + " ",
|
||||||
|
type: "text"
|
||||||
|
});
|
||||||
|
if (parts[i+1]) {
|
||||||
|
options = parts[i+1];
|
||||||
|
tokens.push({
|
||||||
|
value: "(" + parts[i+1] + ")",
|
||||||
|
type: "text"
|
||||||
|
});
|
||||||
|
i += 1;
|
||||||
|
} else {
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
|
while (i++ < parts.length) {
|
||||||
|
parts[i] && tokens.push({
|
||||||
|
value: parts[i],
|
||||||
|
type: "text"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (replace) {
|
||||||
|
search = replace;
|
||||||
|
options = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search) {
|
||||||
|
if (!/regex/.test(options))
|
||||||
|
search = lang.escapeRegExp(search);
|
||||||
|
if (/whole/.test(options))
|
||||||
|
search = "\\b" + search + "\\b";
|
||||||
|
}
|
||||||
|
|
||||||
|
var regex = search && safeCreateRegexp(
|
||||||
|
"(" + search + ")",
|
||||||
|
/ sensitive/.test(options) ? "g" : "ig"
|
||||||
|
);
|
||||||
|
if (regex) {
|
||||||
|
stack[0] = state;
|
||||||
|
stack[1] = regex;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regex : "\\d+",
|
||||||
|
token: "constant.numeric"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(C9SearchHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.C9SearchHighlightRules = C9SearchHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /^(\S.*\:|Searching for.*)$/;
|
||||||
|
this.foldingStopMarker = /^(\s+|Found.*)$/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var lines = session.doc.getAllLines(row);
|
||||||
|
var line = lines[row];
|
||||||
|
var level1 = /^(Found.*|Searching for.*)$/;
|
||||||
|
var level2 = /^(\S.*\:|\s*)$/;
|
||||||
|
var re = level1.test(line) ? level1 : level2;
|
||||||
|
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
if (this.foldingStartMarker.test(line)) {
|
||||||
|
for (var i = row + 1, l = session.getLength(); i < l; i++) {
|
||||||
|
if (re.test(lines[i]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
endRow = i;
|
||||||
|
}
|
||||||
|
else if (this.foldingStopMarker.test(line)) {
|
||||||
|
for (var i = row - 1; i >= 0; i--) {
|
||||||
|
line = lines[i];
|
||||||
|
if (re.test(line))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
startRow = i;
|
||||||
|
}
|
||||||
|
if (startRow != endRow) {
|
||||||
|
var col = line.length;
|
||||||
|
if (re === level1)
|
||||||
|
col = line.search(/\(Found[^)]+\)$|$/);
|
||||||
|
return new Range(startRow, col, endRow, 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
815
src/main/webapp/assets/ace/mode-c_cpp.js
Normal file
815
src/main/webapp/assets/ace/mode-c_cpp.js
Normal file
@@ -0,0 +1,815 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
|
||||||
|
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = c_cppHighlightRules;
|
||||||
|
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.$behaviour = new CstyleBehaviour();
|
||||||
|
|
||||||
|
this.foldingRules = new CStyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = "//";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
var endState = tokenizedLine.state;
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
var match = line.match(/^.*[\{\(\[]\s*$/);
|
||||||
|
if (match) {
|
||||||
|
indent += tab;
|
||||||
|
}
|
||||||
|
} else if (state == "doc-start") {
|
||||||
|
if (endState == "start") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
var match = line.match(/^\s*(\/?)\*/);
|
||||||
|
if (match) {
|
||||||
|
if (match[1]) {
|
||||||
|
indent += " ";
|
||||||
|
}
|
||||||
|
indent += "* ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/c_cpp";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
ace.define('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b"
|
||||||
|
|
||||||
|
var c_cppHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywordControls = (
|
||||||
|
"break|case|continue|default|do|else|for|goto|if|_Pragma|" +
|
||||||
|
"return|switch|while|catch|operator|try|throw|using"
|
||||||
|
);
|
||||||
|
|
||||||
|
var storageType = (
|
||||||
|
"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" +
|
||||||
|
"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" +
|
||||||
|
"class|wchar_t|template"
|
||||||
|
);
|
||||||
|
|
||||||
|
var storageModifiers = (
|
||||||
|
"const|extern|register|restrict|static|volatile|inline|private:|" +
|
||||||
|
"protected:|public:|friend|explicit|virtual|export|mutable|typename"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordOperators = (
|
||||||
|
"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" +
|
||||||
|
"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace"
|
||||||
|
);
|
||||||
|
|
||||||
|
var builtinConstants = (
|
||||||
|
"NULL|true|false|TRUE|FALSE"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.$keywords = this.createKeywordMapper({
|
||||||
|
"keyword.control" : keywordControls,
|
||||||
|
"storage.type" : storageType,
|
||||||
|
"storage.modifier" : storageModifiers,
|
||||||
|
"keyword.operator" : keywordOperators,
|
||||||
|
"variable.language": "this",
|
||||||
|
"constant.language": builtinConstants
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\d\\$_\u00a1-\uffff]*\\b";
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\/\\/.*$"
|
||||||
|
},
|
||||||
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||||
|
{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
next : "comment"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : '["].*\\\\$',
|
||||||
|
next : "qqstring"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : "['].*\\\\$",
|
||||||
|
next : "qstring"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex
|
||||||
|
regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword", // pre-compiler directives
|
||||||
|
regex : "#\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\b",
|
||||||
|
next : "directive"
|
||||||
|
}, {
|
||||||
|
token : "keyword", // special case pre-compiler directive
|
||||||
|
regex : "(?:#\\s*endif)\\b"
|
||||||
|
}, {
|
||||||
|
token : "support.function.C99.c",
|
||||||
|
regex : cFunctions
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\?|\\:|\\,|\\;|\\."
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[[({]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\])}]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : ".*?\\*\\/",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment", // comment spanning whole line
|
||||||
|
regex : ".+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qqstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '.+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '.+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"directive" : [
|
||||||
|
{
|
||||||
|
token : "constant.other.multiline",
|
||||||
|
regex : /\\/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other.multiline",
|
||||||
|
regex : /.*\\/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other",
|
||||||
|
regex : "\\s*<.+?>",
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other", // single line
|
||||||
|
regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]',
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other", // single line
|
||||||
|
regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']",
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other",
|
||||||
|
regex : /[^\\\/]+/,
|
||||||
|
next : "start"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
||||||
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(c_cppHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.c_cppHighlightRules = c_cppHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DocCommentHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||||
|
}, {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "\\bTODO\\b"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment.doc"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getStartRule = function(start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // doc comment
|
||||||
|
regex : "\\/\\*(?=\\*)",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getEndRule = function (start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
|
||||||
|
var SAFE_INSERT_IN_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator"];
|
||||||
|
var SAFE_INSERT_BEFORE_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator", "comment"];
|
||||||
|
|
||||||
|
var context;
|
||||||
|
var contextCache = {}
|
||||||
|
var initContext = function(editor) {
|
||||||
|
var id = -1;
|
||||||
|
if (editor.multiSelect) {
|
||||||
|
id = editor.selection.id;
|
||||||
|
if (contextCache.rangeCount != editor.multiSelect.rangeCount)
|
||||||
|
contextCache = {rangeCount: editor.multiSelect.rangeCount};
|
||||||
|
}
|
||||||
|
if (contextCache[id])
|
||||||
|
return context = contextCache[id];
|
||||||
|
context = contextCache[id] = {
|
||||||
|
autoInsertedBrackets: 0,
|
||||||
|
autoInsertedRow: -1,
|
||||||
|
autoInsertedLineEnd: "",
|
||||||
|
maybeInsertedBrackets: 0,
|
||||||
|
maybeInsertedRow: -1,
|
||||||
|
maybeInsertedLineStart: "",
|
||||||
|
maybeInsertedLineEnd: ""
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var CstyleBehaviour = function() {
|
||||||
|
this.add("braces", "insertion", function(state, action, editor, session, text) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (text == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '{' + selected + '}',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "}");
|
||||||
|
return {
|
||||||
|
text: '{}',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
|
||||||
|
return {
|
||||||
|
text: '{',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == '}') {
|
||||||
|
initContext(editor);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == "\n" || text == "\r\n") {
|
||||||
|
initContext(editor);
|
||||||
|
var closing = "";
|
||||||
|
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
|
||||||
|
closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === '}') {
|
||||||
|
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
|
||||||
|
if (!openBracePos)
|
||||||
|
return null;
|
||||||
|
var next_indent = this.$getIndent(session.getLine(openBracePos.row));
|
||||||
|
} else if (closing) {
|
||||||
|
var next_indent = this.$getIndent(line);
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var indent = next_indent + session.getTabString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: '\n' + indent + '\n' + next_indent + closing,
|
||||||
|
selection: [1, indent.length, 1, indent.length]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("braces", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
} else {
|
||||||
|
context.maybeInsertedBrackets--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '(' + selected + ')',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, ")");
|
||||||
|
return {
|
||||||
|
text: '()',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ')') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '[' + selected + ']',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "]");
|
||||||
|
return {
|
||||||
|
text: '[]',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ']') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '"' || text == "'") {
|
||||||
|
initContext(editor);
|
||||||
|
var quote = text;
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: quote + selected + quote,
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var leftChar = line.substring(cursor.column-1, cursor.column);
|
||||||
|
if (leftChar == '\\') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tokens = session.getTokens(selection.start.row);
|
||||||
|
var col = 0, token;
|
||||||
|
var quotepos = -1; // Track whether we're inside an open quote.
|
||||||
|
|
||||||
|
for (var x = 0; x < tokens.length; x++) {
|
||||||
|
token = tokens[x];
|
||||||
|
if (token.type == "string") {
|
||||||
|
quotepos = -1;
|
||||||
|
} else if (quotepos < 0) {
|
||||||
|
quotepos = token.value.indexOf(quote);
|
||||||
|
}
|
||||||
|
if ((token.value.length + col) > selection.start.column) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
col += tokens[x].value.length;
|
||||||
|
}
|
||||||
|
if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
|
||||||
|
if (!CstyleBehaviour.isSaneInsertion(editor, session))
|
||||||
|
return;
|
||||||
|
return {
|
||||||
|
text: quote + quote,
|
||||||
|
selection: [1,1]
|
||||||
|
};
|
||||||
|
} else if (token && token.type === "string") {
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == quote) {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == selected) {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CstyleBehaviour.isSaneInsertion = function(editor, session) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
|
||||||
|
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
|
||||||
|
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
iterator.stepForward();
|
||||||
|
return iterator.getCurrentTokenRow() !== cursor.row ||
|
||||||
|
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.$matchTokenType = function(token, types) {
|
||||||
|
return types.indexOf(token.type || token) > -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
|
||||||
|
context.autoInsertedBrackets = 0;
|
||||||
|
context.autoInsertedRow = cursor.row;
|
||||||
|
context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
|
||||||
|
context.autoInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isMaybeInsertedClosing(cursor, line))
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = cursor.row;
|
||||||
|
context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
|
||||||
|
context.maybeInsertedLineEnd = line.substr(cursor.column);
|
||||||
|
context.maybeInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
|
||||||
|
return context.autoInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.autoInsertedRow &&
|
||||||
|
bracket === context.autoInsertedLineEnd[0] &&
|
||||||
|
line.substr(cursor.column) === context.autoInsertedLineEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
|
||||||
|
return context.maybeInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.maybeInsertedRow &&
|
||||||
|
line.substr(cursor.column) === context.maybeInsertedLineEnd &&
|
||||||
|
line.substr(0, cursor.column) == context.maybeInsertedLineStart;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing = function() {
|
||||||
|
context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
|
||||||
|
context.autoInsertedBrackets--;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing = function() {
|
||||||
|
if (context) {
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(CstyleBehaviour, Behaviour);
|
||||||
|
|
||||||
|
exports.CstyleBehaviour = CstyleBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
232
src/main/webapp/assets/ace/mode-cirru.js
Normal file
232
src/main/webapp/assets/ace/mode-cirru.js
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/cirru', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/cirru_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var CirruHighlightRules = require("./cirru_highlight_rules").CirruHighlightRules;
|
||||||
|
var CoffeeFoldMode = require("./folding/coffee").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = CirruHighlightRules;
|
||||||
|
this.foldingRules = new CoffeeFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "--";
|
||||||
|
this.$id = "ace/mode/cirru";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/cirru_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var CirruHighlightRules = function() {
|
||||||
|
this.$rules = {
|
||||||
|
start: [{
|
||||||
|
token: 'constant.numeric',
|
||||||
|
regex: /[\d\.]+/
|
||||||
|
}, {
|
||||||
|
token: 'comment.line.double-dash',
|
||||||
|
regex: /--/,
|
||||||
|
next: 'comment',
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\(/,
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\,/,
|
||||||
|
next: 'line',
|
||||||
|
}, {
|
||||||
|
token: 'support.function',
|
||||||
|
regex: /[^\(\)\"\s]+/,
|
||||||
|
next: 'line'
|
||||||
|
}, {
|
||||||
|
token: 'string.quoted.double',
|
||||||
|
regex: /"/,
|
||||||
|
next: 'string',
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\)/,
|
||||||
|
}],
|
||||||
|
comment: [{
|
||||||
|
token: 'comment.line.double-dash',
|
||||||
|
regex: /\ +[^\n]+/,
|
||||||
|
next: 'start',
|
||||||
|
}],
|
||||||
|
string: [{
|
||||||
|
token: 'string.quoted.double',
|
||||||
|
regex: /"/,
|
||||||
|
next: 'line',
|
||||||
|
}, {
|
||||||
|
token: 'constant.character.escape',
|
||||||
|
regex: /\\/,
|
||||||
|
next: 'escape',
|
||||||
|
}, {
|
||||||
|
token: 'string.quoted.double',
|
||||||
|
regex: /[^\\\"]+/,
|
||||||
|
}],
|
||||||
|
escape: [{
|
||||||
|
token: 'constant.character.escape',
|
||||||
|
regex: /./,
|
||||||
|
next: 'string',
|
||||||
|
}],
|
||||||
|
line: [{
|
||||||
|
token: 'constant.numeric',
|
||||||
|
regex: /[\d\.]+/
|
||||||
|
}, {
|
||||||
|
token: 'markup.raw',
|
||||||
|
regex: /^\s*/,
|
||||||
|
next: 'start',
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\$/,
|
||||||
|
next: 'start',
|
||||||
|
}, {
|
||||||
|
token: 'variable.parameter',
|
||||||
|
regex: /[^\(\)\"\s]+/
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\(/,
|
||||||
|
next: 'start'
|
||||||
|
}, {
|
||||||
|
token: 'storage.modifier',
|
||||||
|
regex: /\)/,
|
||||||
|
}, {
|
||||||
|
token: 'markup.raw',
|
||||||
|
regex: /^\ */,
|
||||||
|
next: 'start',
|
||||||
|
}, {
|
||||||
|
token: 'string.quoted.double',
|
||||||
|
regex: /"/,
|
||||||
|
next: 'string',
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(CirruHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.CirruHighlightRules = CirruHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var range = this.indentationBlock(session, row);
|
||||||
|
if (range)
|
||||||
|
return range;
|
||||||
|
|
||||||
|
var re = /\S/;
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startLevel = line.search(re);
|
||||||
|
if (startLevel == -1 || line[startLevel] != "#")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var startColumn = line.length;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var level = line.search(re);
|
||||||
|
|
||||||
|
if (level == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (line[level] != "#")
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
var next = session.getLine(row + 1);
|
||||||
|
var prev = session.getLine(row - 1);
|
||||||
|
var prevIndent = prev.search(/\S/);
|
||||||
|
var nextIndent = next.search(/\S/);
|
||||||
|
|
||||||
|
if (indent == -1) {
|
||||||
|
session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (prevIndent == -1) {
|
||||||
|
if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "start";
|
||||||
|
}
|
||||||
|
} else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
|
||||||
|
if (session.getLine(row - 2).search(/\S/) == -1) {
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prevIndent!= -1 && prevIndent < indent)
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
else
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
|
||||||
|
if (indent < nextIndent)
|
||||||
|
return "start";
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
299
src/main/webapp/assets/ace/mode-clojure.js
Normal file
299
src/main/webapp/assets/ace/mode-clojure.js
Normal file
@@ -0,0 +1,299 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/clojure', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/clojure_highlight_rules', 'ace/mode/matching_parens_outdent', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var ClojureHighlightRules = require("./clojure_highlight_rules").ClojureHighlightRules;
|
||||||
|
var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = ClojureHighlightRules;
|
||||||
|
this.$outdent = new MatchingParensOutdent();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = ";";
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
var match = line.match(/[\(\[]/);
|
||||||
|
if (match) {
|
||||||
|
indent += " ";
|
||||||
|
}
|
||||||
|
match = line.match(/[\)]/);
|
||||||
|
if (match) {
|
||||||
|
indent = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/clojure";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/clojure_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var ClojureHighlightRules = function() {
|
||||||
|
|
||||||
|
var builtinFunctions = (
|
||||||
|
'* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* ' +
|
||||||
|
'*command-line-args* *compile-files* *compile-path* *e *err* *file* ' +
|
||||||
|
'*flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* ' +
|
||||||
|
'*print-dup* *print-length* *print-level* *print-meta* *print-readably* ' +
|
||||||
|
'*read-eval* *source-path* *use-context-classloader* ' +
|
||||||
|
'*warn-on-reflection* + - -> ->> .. / < <= = ' +
|
||||||
|
'== > > >= >= accessor aclone ' +
|
||||||
|
'add-classpath add-watch agent agent-errors aget alength alias all-ns ' +
|
||||||
|
'alter alter-meta! alter-var-root amap ancestors and apply areduce ' +
|
||||||
|
'array-map aset aset-boolean aset-byte aset-char aset-double aset-float ' +
|
||||||
|
'aset-int aset-long aset-short assert assoc assoc! assoc-in associative? ' +
|
||||||
|
'atom await await-for await1 bases bean bigdec bigint binding bit-and ' +
|
||||||
|
'bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left ' +
|
||||||
|
'bit-shift-right bit-test bit-xor boolean boolean-array booleans ' +
|
||||||
|
'bound-fn bound-fn* butlast byte byte-array bytes cast char char-array ' +
|
||||||
|
'char-escape-string char-name-string char? chars chunk chunk-append ' +
|
||||||
|
'chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? ' +
|
||||||
|
'class class? clear-agent-errors clojure-version coll? comment commute ' +
|
||||||
|
'comp comparator compare compare-and-set! compile complement concat cond ' +
|
||||||
|
'condp conj conj! cons constantly construct-proxy contains? count ' +
|
||||||
|
'counted? create-ns create-struct cycle dec decimal? declare definline ' +
|
||||||
|
'defmacro defmethod defmulti defn defn- defonce defstruct delay delay? ' +
|
||||||
|
'deliver deref derive descendants destructure disj disj! dissoc dissoc! ' +
|
||||||
|
'distinct distinct? doall doc dorun doseq dosync dotimes doto double ' +
|
||||||
|
'double-array doubles drop drop-last drop-while empty empty? ensure ' +
|
||||||
|
'enumeration-seq eval even? every? false? ffirst file-seq filter find ' +
|
||||||
|
'find-doc find-ns find-var first float float-array float? floats flush ' +
|
||||||
|
'fn fn? fnext for force format future future-call future-cancel ' +
|
||||||
|
'future-cancelled? future-done? future? gen-class gen-interface gensym ' +
|
||||||
|
'get get-in get-method get-proxy-class get-thread-bindings get-validator ' +
|
||||||
|
'hash hash-map hash-set identical? identity if-let if-not ifn? import ' +
|
||||||
|
'in-ns inc init-proxy instance? int int-array integer? interleave intern ' +
|
||||||
|
'interpose into into-array ints io! isa? iterate iterator-seq juxt key ' +
|
||||||
|
'keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list ' +
|
||||||
|
'list* list? load load-file load-reader load-string loaded-libs locking ' +
|
||||||
|
'long long-array longs loop macroexpand macroexpand-1 make-array ' +
|
||||||
|
'make-hierarchy map map? mapcat max max-key memfn memoize merge ' +
|
||||||
|
'merge-with meta method-sig methods min min-key mod name namespace neg? ' +
|
||||||
|
'newline next nfirst nil? nnext not not-any? not-empty not-every? not= ' +
|
||||||
|
'ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ' +
|
||||||
|
'ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? ' +
|
||||||
|
'or parents partial partition pcalls peek persistent! pmap pop pop! ' +
|
||||||
|
'pop-thread-bindings pos? pr pr-str prefer-method prefers ' +
|
||||||
|
'primitives-classnames print print-ctor print-doc print-dup print-method ' +
|
||||||
|
'print-namespace-doc print-simple print-special-doc print-str printf ' +
|
||||||
|
'println println-str prn prn-str promise proxy proxy-call-with-super ' +
|
||||||
|
'proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot ' +
|
||||||
|
'rand rand-int range ratio? rational? rationalize re-find re-groups ' +
|
||||||
|
're-matcher re-matches re-pattern re-seq read read-line read-string ' +
|
||||||
|
'reduce ref ref-history-count ref-max-history ref-min-history ref-set ' +
|
||||||
|
'refer refer-clojure release-pending-sends rem remove remove-method ' +
|
||||||
|
'remove-ns remove-watch repeat repeatedly replace replicate require ' +
|
||||||
|
'reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq ' +
|
||||||
|
'rsubseq second select-keys send send-off seq seq? seque sequence ' +
|
||||||
|
'sequential? set set-validator! set? short short-array shorts ' +
|
||||||
|
'shutdown-agents slurp some sort sort-by sorted-map sorted-map-by ' +
|
||||||
|
'sorted-set sorted-set-by sorted? special-form-anchor special-symbol? ' +
|
||||||
|
'split-at split-with str stream? string? struct struct-map subs subseq ' +
|
||||||
|
'subvec supers swap! symbol symbol? sync syntax-symbol-anchor take ' +
|
||||||
|
'take-last take-nth take-while test the-ns time to-array to-array-2d ' +
|
||||||
|
'trampoline transient tree-seq true? type unchecked-add unchecked-dec ' +
|
||||||
|
'unchecked-divide unchecked-inc unchecked-multiply unchecked-negate ' +
|
||||||
|
'unchecked-remainder unchecked-subtract underive unquote ' +
|
||||||
|
'unquote-splicing update-in update-proxy use val vals var-get var-set ' +
|
||||||
|
'var? vary-meta vec vector vector? when when-first when-let when-not ' +
|
||||||
|
'while with-bindings with-bindings* with-in-str with-loading-context ' +
|
||||||
|
'with-local-vars with-meta with-open with-out-str with-precision xml-seq ' +
|
||||||
|
'zero? zipmap'
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywords = ('throw try var ' +
|
||||||
|
'def do fn if let loop monitor-enter monitor-exit new quote recur set!'
|
||||||
|
);
|
||||||
|
|
||||||
|
var buildinConstants = ("true false nil");
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"keyword": keywords,
|
||||||
|
"constant.language": buildinConstants,
|
||||||
|
"support.function": builtinFunctions
|
||||||
|
}, "identifier", false, " ");
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
token : "comment",
|
||||||
|
regex : ";.*$"
|
||||||
|
}, {
|
||||||
|
token : "keyword", //parens
|
||||||
|
regex : "[\\(|\\)]"
|
||||||
|
}, {
|
||||||
|
token : "keyword", //lists
|
||||||
|
regex : "[\\'\\(]"
|
||||||
|
}, {
|
||||||
|
token : "keyword", //vectors
|
||||||
|
regex : "[\\[|\\]]"
|
||||||
|
}, {
|
||||||
|
token : "keyword", //sets and maps
|
||||||
|
regex : "[\\{|\\}|\\#\\{|\\#\\}]"
|
||||||
|
}, {
|
||||||
|
token : "keyword", // ampersands
|
||||||
|
regex : '[\\&]'
|
||||||
|
}, {
|
||||||
|
token : "keyword", // metadata
|
||||||
|
regex : '[\\#\\^\\{]'
|
||||||
|
}, {
|
||||||
|
token : "keyword", // anonymous fn syntactic sugar
|
||||||
|
regex : '[\\%]'
|
||||||
|
}, {
|
||||||
|
token : "keyword", // deref reader macro
|
||||||
|
regex : '[@]'
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex
|
||||||
|
regex : "0[xX][0-9a-fA-F]+\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.language",
|
||||||
|
regex : '[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]'
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : '"',
|
||||||
|
next: "string"
|
||||||
|
}, {
|
||||||
|
token : "constant", // symbol
|
||||||
|
regex : /:[^()\[\]{}'"\^%`,;\s]+/
|
||||||
|
}, {
|
||||||
|
token : "string.regexp", //Regular Expressions
|
||||||
|
regex : '/#"(?:\\.|(?:\\\")|[^\""\n])*"/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
"string" : [
|
||||||
|
{
|
||||||
|
token : "constant.language.escape",
|
||||||
|
regex : "\\\\.|\\\\$"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '[^"\\\\]+'
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '"',
|
||||||
|
next : "start"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(ClojureHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.ClojureHighlightRules = ClojureHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_parens_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingParensOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\)/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\))/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
var match = line.match(/^(\s+)/);
|
||||||
|
if (match) {
|
||||||
|
return match[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingParensOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingParensOutdent = MatchingParensOutdent;
|
||||||
|
});
|
||||||
124
src/main/webapp/assets/ace/mode-cobol.js
Normal file
124
src/main/webapp/assets/ace/mode-cobol.js
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/cobol', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/cobol_highlight_rules', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var CobolHighlightRules = require("./cobol_highlight_rules").CobolHighlightRules;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = CobolHighlightRules;
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = "*";
|
||||||
|
|
||||||
|
this.$id = "ace/mode/cobol";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/cobol_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var CobolHighlightRules = function() {
|
||||||
|
var keywords = "ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|" +
|
||||||
|
"AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|" +
|
||||||
|
"ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|" +
|
||||||
|
"TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|" +
|
||||||
|
"UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|" +
|
||||||
|
"PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|" +
|
||||||
|
"CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|" +
|
||||||
|
"COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|" +
|
||||||
|
"RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|" +
|
||||||
|
"DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|" +
|
||||||
|
"ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|" +
|
||||||
|
"EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT";
|
||||||
|
|
||||||
|
var builtinConstants = (
|
||||||
|
"true|false|null"
|
||||||
|
);
|
||||||
|
|
||||||
|
var builtinFunctions = (
|
||||||
|
"count|min|max|avg|sum|rank|now|coalesce|main"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"support.function": builtinFunctions,
|
||||||
|
"keyword": keywords,
|
||||||
|
"constant.language": builtinConstants
|
||||||
|
}, "identifier", true);
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\*.*$"
|
||||||
|
}, {
|
||||||
|
token : "string", // " string
|
||||||
|
regex : '".*?"'
|
||||||
|
}, {
|
||||||
|
token : "string", // ' string
|
||||||
|
regex : "'.*?'"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[\\(]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\)]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
} ]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(CobolHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.CobolHighlightRules = CobolHighlightRules;
|
||||||
|
});
|
||||||
442
src/main/webapp/assets/ace/mode-coffee.js
Normal file
442
src/main/webapp/assets/ace/mode-coffee.js
Normal file
@@ -0,0 +1,442 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/coffee', ['require', 'exports', 'module' , 'ace/mode/coffee_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee', 'ace/range', 'ace/mode/text', 'ace/worker/worker_client', 'ace/lib/oop'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules;
|
||||||
|
var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var FoldMode = require("./folding/coffee").FoldMode;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var WorkerClient = require("../worker/worker_client").WorkerClient;
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
|
||||||
|
function Mode() {
|
||||||
|
this.HighlightRules = Rules;
|
||||||
|
this.$outdent = new Outdent();
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var indenter = /(?:[({[=:]|[-=]>|\b(?:else|try|(?:swi|ca)tch(?:\s+[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$|^\s*(else\b\s*)?(?:if|for|while|loop)\b(?!.*\bthen\b)/;
|
||||||
|
var commentLine = /^(\s*)#/;
|
||||||
|
var hereComment = /^\s*###(?!#)/;
|
||||||
|
var indentation = /^\s*/;
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
|
||||||
|
|
||||||
|
if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') &&
|
||||||
|
state === 'start' && indenter.test(line))
|
||||||
|
indent += tab;
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.toggleCommentLines = function(state, doc, startRow, endRow){
|
||||||
|
console.log("toggle");
|
||||||
|
var range = new Range(0, 0, 0, 0);
|
||||||
|
for (var i = startRow; i <= endRow; ++i) {
|
||||||
|
var line = doc.getLine(i);
|
||||||
|
if (hereComment.test(line))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (commentLine.test(line))
|
||||||
|
line = line.replace(commentLine, '$1');
|
||||||
|
else
|
||||||
|
line = line.replace(indentation, '$&#');
|
||||||
|
|
||||||
|
range.end.row = range.start.row = i;
|
||||||
|
range.end.column = line.length + 1;
|
||||||
|
doc.replace(range, line);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
var worker = new WorkerClient(["ace"], "ace/mode/coffee_worker", "Worker");
|
||||||
|
worker.attachToDocument(session.getDocument());
|
||||||
|
|
||||||
|
worker.on("error", function(e) {
|
||||||
|
session.setAnnotations([e.data]);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("ok", function(e) {
|
||||||
|
session.clearAnnotations();
|
||||||
|
});
|
||||||
|
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/coffee";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/coffee_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
oop.inherits(CoffeeHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
function CoffeeHighlightRules() {
|
||||||
|
var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*";
|
||||||
|
|
||||||
|
var keywords = (
|
||||||
|
"this|throw|then|try|typeof|super|switch|return|break|by|continue|" +
|
||||||
|
"catch|class|in|instanceof|is|isnt|if|else|extends|for|own|" +
|
||||||
|
"finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" +
|
||||||
|
"or|on|unless|until|and|yes"
|
||||||
|
);
|
||||||
|
|
||||||
|
var langConstant = (
|
||||||
|
"true|false|null|undefined|NaN|Infinity"
|
||||||
|
);
|
||||||
|
|
||||||
|
var illegal = (
|
||||||
|
"case|const|default|function|var|void|with|enum|export|implements|" +
|
||||||
|
"interface|let|package|private|protected|public|static|yield|" +
|
||||||
|
"__hasProp|slice|bind|indexOf"
|
||||||
|
);
|
||||||
|
|
||||||
|
var supportClass = (
|
||||||
|
"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" +
|
||||||
|
"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" +
|
||||||
|
"SyntaxError|TypeError|URIError|" +
|
||||||
|
"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
|
||||||
|
"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray"
|
||||||
|
);
|
||||||
|
|
||||||
|
var supportFunction = (
|
||||||
|
"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" +
|
||||||
|
"encodeURIComponent|decodeURI|decodeURIComponent|String|"
|
||||||
|
);
|
||||||
|
|
||||||
|
var variableLanguage = (
|
||||||
|
"window|arguments|prototype|document"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"keyword": keywords,
|
||||||
|
"constant.language": langConstant,
|
||||||
|
"invalid.illegal": illegal,
|
||||||
|
"language.support.class": supportClass,
|
||||||
|
"language.support.function": supportFunction,
|
||||||
|
"variable.language": variableLanguage
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
var functionRule = {
|
||||||
|
token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"],
|
||||||
|
regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()\"'\/])*?)(\))(\s*))?([\-=]>)/.source
|
||||||
|
};
|
||||||
|
|
||||||
|
var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
start : [
|
||||||
|
{
|
||||||
|
token : "constant.numeric",
|
||||||
|
regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"
|
||||||
|
}, {
|
||||||
|
stateName: "qdoc",
|
||||||
|
token : "string", regex : "'''", next : [
|
||||||
|
{token : "string", regex : "'''", next : "start"},
|
||||||
|
{token : "constant.language.escape", regex : stringEscape},
|
||||||
|
{defaultToken: "string"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
stateName: "qqdoc",
|
||||||
|
token : "string",
|
||||||
|
regex : '"""',
|
||||||
|
next : [
|
||||||
|
{token : "string", regex : '"""', next : "start"},
|
||||||
|
{token : "paren.string", regex : '#{', push : "start"},
|
||||||
|
{token : "constant.language.escape", regex : stringEscape},
|
||||||
|
{defaultToken: "string"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
stateName: "qstring",
|
||||||
|
token : "string", regex : "'", next : [
|
||||||
|
{token : "string", regex : "'", next : "start"},
|
||||||
|
{token : "constant.language.escape", regex : stringEscape},
|
||||||
|
{defaultToken: "string"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
stateName: "qqstring",
|
||||||
|
token : "string.start", regex : '"', next : [
|
||||||
|
{token : "string.end", regex : '"', next : "start"},
|
||||||
|
{token : "paren.string", regex : '#{', push : "start"},
|
||||||
|
{token : "constant.language.escape", regex : stringEscape},
|
||||||
|
{defaultToken: "string"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
stateName: "js",
|
||||||
|
token : "string", regex : "`", next : [
|
||||||
|
{token : "string", regex : "`", next : "start"},
|
||||||
|
{token : "constant.language.escape", regex : stringEscape},
|
||||||
|
{defaultToken: "string"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
regex: "[{}]", onMatch: function(val, state, stack) {
|
||||||
|
this.next = "";
|
||||||
|
if (val == "{" && stack.length) {
|
||||||
|
stack.unshift("start", state);
|
||||||
|
return "paren";
|
||||||
|
}
|
||||||
|
if (val == "}" && stack.length) {
|
||||||
|
stack.shift();
|
||||||
|
this.next = stack.shift();
|
||||||
|
if (this.next.indexOf("string") != -1)
|
||||||
|
return "paren.string";
|
||||||
|
}
|
||||||
|
return "paren";
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
token : "string.regex",
|
||||||
|
regex : "///",
|
||||||
|
next : "heregex"
|
||||||
|
}, {
|
||||||
|
token : "string.regex",
|
||||||
|
regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "###(?!#)",
|
||||||
|
next : "comment"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "#.*"
|
||||||
|
}, {
|
||||||
|
token : ["punctuation.operator", "text", "identifier"],
|
||||||
|
regex : "(\\.)(\\s*)(" + illegal + ")"
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\."
|
||||||
|
}, {
|
||||||
|
token : ["keyword", "text", "language.support.class",
|
||||||
|
"text", "keyword", "text", "language.support.class"],
|
||||||
|
regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?"
|
||||||
|
}, {
|
||||||
|
token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token),
|
||||||
|
regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex
|
||||||
|
},
|
||||||
|
functionRule,
|
||||||
|
{
|
||||||
|
token : "variable",
|
||||||
|
regex : "@(?:" + identifier + ")?"
|
||||||
|
}, {
|
||||||
|
token: keywordMapper,
|
||||||
|
regex : identifier
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\,|\\."
|
||||||
|
}, {
|
||||||
|
token : "storage.type",
|
||||||
|
regex : "[\\-=]>"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])"
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[({[]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\]})]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
}],
|
||||||
|
|
||||||
|
|
||||||
|
heregex : [{
|
||||||
|
token : "string.regex",
|
||||||
|
regex : '.*?///[imgy]{0,4}',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment.regex",
|
||||||
|
regex : "\\s+(?:#.*)?"
|
||||||
|
}, {
|
||||||
|
token : "string.regex",
|
||||||
|
regex : "\\S+"
|
||||||
|
}],
|
||||||
|
|
||||||
|
comment : [{
|
||||||
|
token : "comment",
|
||||||
|
regex : '###',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
this.normalizeRules();
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.CoffeeHighlightRules = CoffeeHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function() {};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var range = this.indentationBlock(session, row);
|
||||||
|
if (range)
|
||||||
|
return range;
|
||||||
|
|
||||||
|
var re = /\S/;
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startLevel = line.search(re);
|
||||||
|
if (startLevel == -1 || line[startLevel] != "#")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var startColumn = line.length;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var level = line.search(re);
|
||||||
|
|
||||||
|
if (level == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (line[level] != "#")
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
var next = session.getLine(row + 1);
|
||||||
|
var prev = session.getLine(row - 1);
|
||||||
|
var prevIndent = prev.search(/\S/);
|
||||||
|
var nextIndent = next.search(/\S/);
|
||||||
|
|
||||||
|
if (indent == -1) {
|
||||||
|
session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (prevIndent == -1) {
|
||||||
|
if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "start";
|
||||||
|
}
|
||||||
|
} else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
|
||||||
|
if (session.getLine(row - 2).search(/\S/) == -1) {
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
session.foldWidgets[row + 1] = "";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prevIndent!= -1 && prevIndent < indent)
|
||||||
|
session.foldWidgets[row - 1] = "start";
|
||||||
|
else
|
||||||
|
session.foldWidgets[row - 1] = "";
|
||||||
|
|
||||||
|
if (indent < nextIndent)
|
||||||
|
return "start";
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
2385
src/main/webapp/assets/ace/mode-coldfusion.js
Normal file
2385
src/main/webapp/assets/ace/mode-coldfusion.js
Normal file
File diff suppressed because it is too large
Load Diff
797
src/main/webapp/assets/ace/mode-csharp.js
Normal file
797
src/main/webapp/assets/ace/mode-csharp.js
Normal file
@@ -0,0 +1,797 @@
|
|||||||
|
ace.define('ace/mode/csharp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/csharp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/csharp'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var CSharpHighlightRules = require("./csharp_highlight_rules").CSharpHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
|
||||||
|
var CStyleFoldMode = require("./folding/csharp").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = CSharpHighlightRules;
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.$behaviour = new CstyleBehaviour();
|
||||||
|
this.foldingRules = new CStyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = "//";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
var match = line.match(/^.*[\{\(\[]\s*$/);
|
||||||
|
if (match) {
|
||||||
|
indent += tab;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/csharp";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
ace.define('ace/mode/csharp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var CSharpHighlightRules = function() {
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"variable.language": "this",
|
||||||
|
"keyword": "abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic",
|
||||||
|
"constant.language": "null|true|false"
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\/\\/.*$"
|
||||||
|
},
|
||||||
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||||
|
{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
next : "comment"
|
||||||
|
}, {
|
||||||
|
token : "string", // character
|
||||||
|
regex : /'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/
|
||||||
|
}, {
|
||||||
|
token : "string", start : '"', end : '"|$', next: [
|
||||||
|
{token: "constant.language.escape", regex: /\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},
|
||||||
|
{token: "invalid", regex: /\\./}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
token : "string", start : '@"', end : '"', next:[
|
||||||
|
{token: "constant.language.escape", regex: '""'}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex
|
||||||
|
regex : "0[xX][0-9a-fA-F]+\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.language.boolean",
|
||||||
|
regex : "(?:true|false)\\b"
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
|
||||||
|
}, {
|
||||||
|
token : "keyword",
|
||||||
|
regex : "^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\?|\\:|\\,|\\;|\\."
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[[({]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\])}]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : ".*?\\*\\/",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment", // comment spanning whole line
|
||||||
|
regex : ".+"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
||||||
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(CSharpHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.CSharpHighlightRules = CSharpHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DocCommentHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||||
|
}, {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "\\bTODO\\b"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment.doc"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getStartRule = function(start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // doc comment
|
||||||
|
regex : "\\/\\*(?=\\*)",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getEndRule = function (start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
|
||||||
|
var SAFE_INSERT_IN_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator"];
|
||||||
|
var SAFE_INSERT_BEFORE_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator", "comment"];
|
||||||
|
|
||||||
|
var context;
|
||||||
|
var contextCache = {}
|
||||||
|
var initContext = function(editor) {
|
||||||
|
var id = -1;
|
||||||
|
if (editor.multiSelect) {
|
||||||
|
id = editor.selection.id;
|
||||||
|
if (contextCache.rangeCount != editor.multiSelect.rangeCount)
|
||||||
|
contextCache = {rangeCount: editor.multiSelect.rangeCount};
|
||||||
|
}
|
||||||
|
if (contextCache[id])
|
||||||
|
return context = contextCache[id];
|
||||||
|
context = contextCache[id] = {
|
||||||
|
autoInsertedBrackets: 0,
|
||||||
|
autoInsertedRow: -1,
|
||||||
|
autoInsertedLineEnd: "",
|
||||||
|
maybeInsertedBrackets: 0,
|
||||||
|
maybeInsertedRow: -1,
|
||||||
|
maybeInsertedLineStart: "",
|
||||||
|
maybeInsertedLineEnd: ""
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var CstyleBehaviour = function() {
|
||||||
|
this.add("braces", "insertion", function(state, action, editor, session, text) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (text == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '{' + selected + '}',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "}");
|
||||||
|
return {
|
||||||
|
text: '{}',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
|
||||||
|
return {
|
||||||
|
text: '{',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == '}') {
|
||||||
|
initContext(editor);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == "\n" || text == "\r\n") {
|
||||||
|
initContext(editor);
|
||||||
|
var closing = "";
|
||||||
|
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
|
||||||
|
closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === '}') {
|
||||||
|
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
|
||||||
|
if (!openBracePos)
|
||||||
|
return null;
|
||||||
|
var next_indent = this.$getIndent(session.getLine(openBracePos.row));
|
||||||
|
} else if (closing) {
|
||||||
|
var next_indent = this.$getIndent(line);
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var indent = next_indent + session.getTabString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: '\n' + indent + '\n' + next_indent + closing,
|
||||||
|
selection: [1, indent.length, 1, indent.length]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("braces", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
} else {
|
||||||
|
context.maybeInsertedBrackets--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '(' + selected + ')',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, ")");
|
||||||
|
return {
|
||||||
|
text: '()',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ')') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '[' + selected + ']',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "]");
|
||||||
|
return {
|
||||||
|
text: '[]',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ']') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '"' || text == "'") {
|
||||||
|
initContext(editor);
|
||||||
|
var quote = text;
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: quote + selected + quote,
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var leftChar = line.substring(cursor.column-1, cursor.column);
|
||||||
|
if (leftChar == '\\') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tokens = session.getTokens(selection.start.row);
|
||||||
|
var col = 0, token;
|
||||||
|
var quotepos = -1; // Track whether we're inside an open quote.
|
||||||
|
|
||||||
|
for (var x = 0; x < tokens.length; x++) {
|
||||||
|
token = tokens[x];
|
||||||
|
if (token.type == "string") {
|
||||||
|
quotepos = -1;
|
||||||
|
} else if (quotepos < 0) {
|
||||||
|
quotepos = token.value.indexOf(quote);
|
||||||
|
}
|
||||||
|
if ((token.value.length + col) > selection.start.column) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
col += tokens[x].value.length;
|
||||||
|
}
|
||||||
|
if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
|
||||||
|
if (!CstyleBehaviour.isSaneInsertion(editor, session))
|
||||||
|
return;
|
||||||
|
return {
|
||||||
|
text: quote + quote,
|
||||||
|
selection: [1,1]
|
||||||
|
};
|
||||||
|
} else if (token && token.type === "string") {
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == quote) {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == selected) {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CstyleBehaviour.isSaneInsertion = function(editor, session) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
|
||||||
|
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
|
||||||
|
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
iterator.stepForward();
|
||||||
|
return iterator.getCurrentTokenRow() !== cursor.row ||
|
||||||
|
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.$matchTokenType = function(token, types) {
|
||||||
|
return types.indexOf(token.type || token) > -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
|
||||||
|
context.autoInsertedBrackets = 0;
|
||||||
|
context.autoInsertedRow = cursor.row;
|
||||||
|
context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
|
||||||
|
context.autoInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isMaybeInsertedClosing(cursor, line))
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = cursor.row;
|
||||||
|
context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
|
||||||
|
context.maybeInsertedLineEnd = line.substr(cursor.column);
|
||||||
|
context.maybeInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
|
||||||
|
return context.autoInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.autoInsertedRow &&
|
||||||
|
bracket === context.autoInsertedLineEnd[0] &&
|
||||||
|
line.substr(cursor.column) === context.autoInsertedLineEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
|
||||||
|
return context.maybeInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.maybeInsertedRow &&
|
||||||
|
line.substr(cursor.column) === context.maybeInsertedLineEnd &&
|
||||||
|
line.substr(0, cursor.column) == context.maybeInsertedLineStart;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing = function() {
|
||||||
|
context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
|
||||||
|
context.autoInsertedBrackets--;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing = function() {
|
||||||
|
if (context) {
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(CstyleBehaviour, Behaviour);
|
||||||
|
|
||||||
|
exports.CstyleBehaviour = CstyleBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/csharp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var CFoldMode = require("./cstyle").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, CFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.usingRe = /^\s*using \S/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRangeBase = this.getFoldWidgetRange;
|
||||||
|
this.getFoldWidgetBase = this.getFoldWidget;
|
||||||
|
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var fw = this.getFoldWidgetBase(session, foldStyle, row);
|
||||||
|
if (!fw) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
if (/^\s*#region\b/.test(line))
|
||||||
|
return "start";
|
||||||
|
var usingRe = this.usingRe;
|
||||||
|
if (usingRe.test(line)) {
|
||||||
|
var prev = session.getLine(row - 1);
|
||||||
|
var next = session.getLine(row + 1);
|
||||||
|
if (!usingRe.test(prev) && usingRe.test(next))
|
||||||
|
return "start"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fw;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var range = this.getFoldWidgetRangeBase(session, foldStyle, row);
|
||||||
|
if (range)
|
||||||
|
return range;
|
||||||
|
|
||||||
|
var line = session.getLine(row);
|
||||||
|
if (this.usingRe.test(line))
|
||||||
|
return this.getUsingStatementBlock(session, line, row);
|
||||||
|
|
||||||
|
if (/^\s*#region\b/.test(line))
|
||||||
|
return this.getRegionBlock(session, line, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getUsingStatementBlock = function(session, line, row) {
|
||||||
|
var startColumn = line.match(this.usingRe)[0].length - 1;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
var endRow = row;
|
||||||
|
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
if (/^\s*$/.test(line))
|
||||||
|
continue;
|
||||||
|
if (!this.usingRe.test(line))
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = session.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getRegionBlock = function(session, line, row) {
|
||||||
|
var startColumn = line.search(/\s*$/);
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
var startRow = row;
|
||||||
|
|
||||||
|
var re = /^\s*#(end)?region\b/
|
||||||
|
var depth = 1
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var m = re.exec(line);
|
||||||
|
if (!m)
|
||||||
|
continue;
|
||||||
|
if (m[1])
|
||||||
|
depth--;
|
||||||
|
else
|
||||||
|
depth++;
|
||||||
|
|
||||||
|
if (!depth)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var endRow = row;
|
||||||
|
if (endRow > startRow) {
|
||||||
|
var endColumn = line.search(/\S/);
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
814
src/main/webapp/assets/ace/mode-css.js
Normal file
814
src/main/webapp/assets/ace/mode-css.js
Normal file
@@ -0,0 +1,814 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var WorkerClient = require("../worker/worker_client").WorkerClient;
|
||||||
|
var CssBehaviour = require("./behaviour/css").CssBehaviour;
|
||||||
|
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = CssHighlightRules;
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.$behaviour = new CssBehaviour();
|
||||||
|
this.foldingRules = new CStyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
var match = line.match(/^.*\{\s*$/);
|
||||||
|
if (match) {
|
||||||
|
indent += tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");
|
||||||
|
worker.attachToDocument(session.getDocument());
|
||||||
|
|
||||||
|
worker.on("csslint", function(e) {
|
||||||
|
session.setAnnotations(e.data);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("terminate", function() {
|
||||||
|
session.clearAnnotations();
|
||||||
|
});
|
||||||
|
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/css";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index";
|
||||||
|
var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";
|
||||||
|
var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero";
|
||||||
|
var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow";
|
||||||
|
var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace";
|
||||||
|
|
||||||
|
var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))";
|
||||||
|
var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b";
|
||||||
|
var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b";
|
||||||
|
|
||||||
|
var CssHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"support.function": supportFunction,
|
||||||
|
"support.constant": supportConstant,
|
||||||
|
"support.type": supportType,
|
||||||
|
"support.constant.color": supportConstantColor,
|
||||||
|
"support.constant.fonts": supportConstantFonts
|
||||||
|
}, "text", true);
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
push : "comment"
|
||||||
|
}, {
|
||||||
|
token: "paren.lparen",
|
||||||
|
regex: "\\{",
|
||||||
|
push: "ruleset"
|
||||||
|
}, {
|
||||||
|
token: "string",
|
||||||
|
regex: "@.*?{",
|
||||||
|
push: "media"
|
||||||
|
}, {
|
||||||
|
token: "keyword",
|
||||||
|
regex: "#[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "variable",
|
||||||
|
regex: "\\.[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "string",
|
||||||
|
regex: ":[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "constant",
|
||||||
|
regex: "[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
caseInsensitive: true
|
||||||
|
}],
|
||||||
|
|
||||||
|
"media" : [{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
push : "comment"
|
||||||
|
}, {
|
||||||
|
token: "paren.lparen",
|
||||||
|
regex: "\\{",
|
||||||
|
push: "ruleset"
|
||||||
|
}, {
|
||||||
|
token: "string",
|
||||||
|
regex: "\\}",
|
||||||
|
next: "pop"
|
||||||
|
}, {
|
||||||
|
token: "keyword",
|
||||||
|
regex: "#[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "variable",
|
||||||
|
regex: "\\.[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "string",
|
||||||
|
regex: ":[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
token: "constant",
|
||||||
|
regex: "[a-z0-9-_]+"
|
||||||
|
}, {
|
||||||
|
caseInsensitive: true
|
||||||
|
}],
|
||||||
|
|
||||||
|
"comment" : [{
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : "pop"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment"
|
||||||
|
}],
|
||||||
|
|
||||||
|
"ruleset" : [
|
||||||
|
{
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "\\}",
|
||||||
|
next: "pop"
|
||||||
|
}, {
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
push : "comment"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
||||||
|
}, {
|
||||||
|
token : ["constant.numeric", "keyword"],
|
||||||
|
regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric",
|
||||||
|
regex : numRe
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex6 color
|
||||||
|
regex : "#[a-f0-9]{6}"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex3 color
|
||||||
|
regex : "#[a-f0-9]{3}"
|
||||||
|
}, {
|
||||||
|
token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],
|
||||||
|
regex : pseudoElements
|
||||||
|
}, {
|
||||||
|
token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],
|
||||||
|
regex : pseudoClasses
|
||||||
|
}, {
|
||||||
|
token : ["support.function", "string", "support.function"],
|
||||||
|
regex : "(url\\()(.*)(\\))"
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
|
||||||
|
}, {
|
||||||
|
caseInsensitive: true
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(CssHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.CssHighlightRules = CssHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
var CssBehaviour = function () {
|
||||||
|
|
||||||
|
this.inherit(CstyleBehaviour);
|
||||||
|
|
||||||
|
this.add("colon", "insertion", function (state, action, editor, session, text) {
|
||||||
|
if (text === ':') {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (token && token.value.match(/\s+/)) {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
}
|
||||||
|
if (token && token.type === 'support.type') {
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === ':') {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!line.substring(cursor.column).match(/^\s*;/)) {
|
||||||
|
return {
|
||||||
|
text: ':;',
|
||||||
|
selection: [1, 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("colon", "deletion", function (state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected === ':') {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (token && token.value.match(/\s+/)) {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
}
|
||||||
|
if (token && token.type === 'support.type') {
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||||||
|
if (rightChar === ';') {
|
||||||
|
range.end.column ++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("semicolon", "insertion", function (state, action, editor, session, text) {
|
||||||
|
if (text === ';') {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === ';') {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
oop.inherits(CssBehaviour, CstyleBehaviour);
|
||||||
|
|
||||||
|
exports.CssBehaviour = CssBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
|
||||||
|
var SAFE_INSERT_IN_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator"];
|
||||||
|
var SAFE_INSERT_BEFORE_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator", "comment"];
|
||||||
|
|
||||||
|
var context;
|
||||||
|
var contextCache = {}
|
||||||
|
var initContext = function(editor) {
|
||||||
|
var id = -1;
|
||||||
|
if (editor.multiSelect) {
|
||||||
|
id = editor.selection.id;
|
||||||
|
if (contextCache.rangeCount != editor.multiSelect.rangeCount)
|
||||||
|
contextCache = {rangeCount: editor.multiSelect.rangeCount};
|
||||||
|
}
|
||||||
|
if (contextCache[id])
|
||||||
|
return context = contextCache[id];
|
||||||
|
context = contextCache[id] = {
|
||||||
|
autoInsertedBrackets: 0,
|
||||||
|
autoInsertedRow: -1,
|
||||||
|
autoInsertedLineEnd: "",
|
||||||
|
maybeInsertedBrackets: 0,
|
||||||
|
maybeInsertedRow: -1,
|
||||||
|
maybeInsertedLineStart: "",
|
||||||
|
maybeInsertedLineEnd: ""
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var CstyleBehaviour = function() {
|
||||||
|
this.add("braces", "insertion", function(state, action, editor, session, text) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (text == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '{' + selected + '}',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "}");
|
||||||
|
return {
|
||||||
|
text: '{}',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
|
||||||
|
return {
|
||||||
|
text: '{',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == '}') {
|
||||||
|
initContext(editor);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == "\n" || text == "\r\n") {
|
||||||
|
initContext(editor);
|
||||||
|
var closing = "";
|
||||||
|
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
|
||||||
|
closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === '}') {
|
||||||
|
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
|
||||||
|
if (!openBracePos)
|
||||||
|
return null;
|
||||||
|
var next_indent = this.$getIndent(session.getLine(openBracePos.row));
|
||||||
|
} else if (closing) {
|
||||||
|
var next_indent = this.$getIndent(line);
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var indent = next_indent + session.getTabString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: '\n' + indent + '\n' + next_indent + closing,
|
||||||
|
selection: [1, indent.length, 1, indent.length]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("braces", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
} else {
|
||||||
|
context.maybeInsertedBrackets--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '(' + selected + ')',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, ")");
|
||||||
|
return {
|
||||||
|
text: '()',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ')') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '[' + selected + ']',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "]");
|
||||||
|
return {
|
||||||
|
text: '[]',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ']') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '"' || text == "'") {
|
||||||
|
initContext(editor);
|
||||||
|
var quote = text;
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: quote + selected + quote,
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var leftChar = line.substring(cursor.column-1, cursor.column);
|
||||||
|
if (leftChar == '\\') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tokens = session.getTokens(selection.start.row);
|
||||||
|
var col = 0, token;
|
||||||
|
var quotepos = -1; // Track whether we're inside an open quote.
|
||||||
|
|
||||||
|
for (var x = 0; x < tokens.length; x++) {
|
||||||
|
token = tokens[x];
|
||||||
|
if (token.type == "string") {
|
||||||
|
quotepos = -1;
|
||||||
|
} else if (quotepos < 0) {
|
||||||
|
quotepos = token.value.indexOf(quote);
|
||||||
|
}
|
||||||
|
if ((token.value.length + col) > selection.start.column) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
col += tokens[x].value.length;
|
||||||
|
}
|
||||||
|
if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
|
||||||
|
if (!CstyleBehaviour.isSaneInsertion(editor, session))
|
||||||
|
return;
|
||||||
|
return {
|
||||||
|
text: quote + quote,
|
||||||
|
selection: [1,1]
|
||||||
|
};
|
||||||
|
} else if (token && token.type === "string") {
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == quote) {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == selected) {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CstyleBehaviour.isSaneInsertion = function(editor, session) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
|
||||||
|
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
|
||||||
|
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
iterator.stepForward();
|
||||||
|
return iterator.getCurrentTokenRow() !== cursor.row ||
|
||||||
|
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.$matchTokenType = function(token, types) {
|
||||||
|
return types.indexOf(token.type || token) > -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
|
||||||
|
context.autoInsertedBrackets = 0;
|
||||||
|
context.autoInsertedRow = cursor.row;
|
||||||
|
context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
|
||||||
|
context.autoInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isMaybeInsertedClosing(cursor, line))
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = cursor.row;
|
||||||
|
context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
|
||||||
|
context.maybeInsertedLineEnd = line.substr(cursor.column);
|
||||||
|
context.maybeInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
|
||||||
|
return context.autoInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.autoInsertedRow &&
|
||||||
|
bracket === context.autoInsertedLineEnd[0] &&
|
||||||
|
line.substr(cursor.column) === context.autoInsertedLineEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
|
||||||
|
return context.maybeInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.maybeInsertedRow &&
|
||||||
|
line.substr(cursor.column) === context.maybeInsertedLineEnd &&
|
||||||
|
line.substr(0, cursor.column) == context.maybeInsertedLineStart;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing = function() {
|
||||||
|
context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
|
||||||
|
context.autoInsertedBrackets--;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing = function() {
|
||||||
|
if (context) {
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(CstyleBehaviour, Behaviour);
|
||||||
|
|
||||||
|
exports.CstyleBehaviour = CstyleBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
2396
src/main/webapp/assets/ace/mode-curly.js
Normal file
2396
src/main/webapp/assets/ace/mode-curly.js
Normal file
File diff suppressed because it is too large
Load Diff
491
src/main/webapp/assets/ace/mode-d.js
Normal file
491
src/main/webapp/assets/ace/mode-d.js
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/d', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/d_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var DHighlightRules = require("./d_highlight_rules").DHighlightRules;
|
||||||
|
var FoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = DHighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "/\\+";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
this.$id = "ace/mode/d";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/d_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywords = (
|
||||||
|
"this|super|import|module|body|mixin|__traits|invariant|alias|asm|delete|"+
|
||||||
|
"typeof|typeid|sizeof|cast|new|in|is|typedef|__vector|__parameters"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordControls = (
|
||||||
|
"break|case|continue|default|do|else|for|foreach|foreach_reverse|goto|if|" +
|
||||||
|
"return|switch|while|catch|try|throw|finally|version|assert|unittest|with"
|
||||||
|
);
|
||||||
|
|
||||||
|
var types = (
|
||||||
|
"auto|bool|char|dchar|wchar|byte|ubyte|float|double|real|" +
|
||||||
|
"cfloat|creal|cdouble|cent|ifloat|ireal|idouble|" +
|
||||||
|
"int|long|short|void|uint|ulong|ushort|ucent|" +
|
||||||
|
"function|delegate|string|wstring|dstring|size_t|ptrdiff_t|hash_t|Object"
|
||||||
|
);
|
||||||
|
|
||||||
|
var modifiers = (
|
||||||
|
"abstract|align|debug|deprecated|export|extern|const|final|in|inout|out|" +
|
||||||
|
"ref|immutable|lazy|nothrow|override|package|pragma|private|protected|" +
|
||||||
|
"public|pure|scope|shared|__gshared|synchronized|static|volatile"
|
||||||
|
);
|
||||||
|
|
||||||
|
var storages = (
|
||||||
|
"class|struct|union|template|interface|enum|macro"
|
||||||
|
);
|
||||||
|
|
||||||
|
var stringEscapesSeq = {
|
||||||
|
token: "constant.language.escape",
|
||||||
|
regex: "\\\\(?:(?:x[0-9A-F]{2})|(?:[0-7]{1,3})|(?:['\"\\?0abfnrtv])|" +
|
||||||
|
"(?:u[0-9a-fA-F]{4})|(?:U[0-9a-fA-F]{8}))"
|
||||||
|
};
|
||||||
|
|
||||||
|
var builtinConstants = (
|
||||||
|
"null|true|false|"+
|
||||||
|
"__DATE__|__EOF__|__TIME__|__TIMESTAMP__|__VENDOR__|__VERSION__|"+
|
||||||
|
"__FILE__|__MODULE__|__LINE__|__FUNCTION__|__PRETTY_FUNCTION__"
|
||||||
|
);
|
||||||
|
|
||||||
|
var operators = (
|
||||||
|
"/|/\\=|&|&\\=|&&|\\|\\|\\=|\\|\\||\\-|\\-\\=|\\-\\-|\\+|" +
|
||||||
|
"\\+\\=|\\+\\+|\\<|\\<\\=|\\<\\<|\\<\\<\\=|\\<\\>|\\<\\>\\=|\\>|\\>\\=|\\>\\>\\=|" +
|
||||||
|
"\\>\\>\\>\\=|\\>\\>|\\>\\>\\>|\\!|\\!\\=|\\!\\<\\>|\\!\\<\\>\\=|\\!\\<|\\!\\<\\=|" +
|
||||||
|
"\\!\\>|\\!\\>\\=|\\?|\\$|\\=|\\=\\=|\\*|\\*\\=|%|%\\=|" +
|
||||||
|
"\\^|\\^\\=|\\^\\^|\\^\\^\\=|~|~\\=|\\=\\>|#"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.$keywords = this.createKeywordMapper({
|
||||||
|
"keyword.modifier" : modifiers,
|
||||||
|
"keyword.control" : keywordControls,
|
||||||
|
"keyword.type" : types,
|
||||||
|
"keyword": keywords,
|
||||||
|
"keyword.storage": storages,
|
||||||
|
"punctation": "\\.|\\,|;|\\.\\.|\\.\\.\\.",
|
||||||
|
"keyword.operator" : operators,
|
||||||
|
"constant.language": builtinConstants
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
var identifierRe = "[a-zA-Z_\u00a1-\uffff][a-zA-Z\\d_\u00a1-\uffff]*\\b";
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{ //-------------------------------------------------------- COMMENTS
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\/\\/.*$"
|
||||||
|
},
|
||||||
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||||
|
{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
next : "star-comment"
|
||||||
|
}, {
|
||||||
|
token: "comment.shebang",
|
||||||
|
regex: "^\s*#!.*"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\/\\+",
|
||||||
|
next: "plus-comment"
|
||||||
|
}, { //-------------------------------------------------------- STRINGS
|
||||||
|
onMatch: function(value, currentState, state) {
|
||||||
|
state.unshift(this.next, value.substr(2));
|
||||||
|
return "string";
|
||||||
|
},
|
||||||
|
regex: 'q"(?:[\\[\\(\\{\\<]+)',
|
||||||
|
next: 'operator-heredoc-string'
|
||||||
|
}, {
|
||||||
|
onMatch: function(value, currentState, state) {
|
||||||
|
state.unshift(this.next, value.substr(2));
|
||||||
|
return "string";
|
||||||
|
},
|
||||||
|
regex: 'q"(?:[a-zA-Z_]+)$',
|
||||||
|
next: 'identifier-heredoc-string'
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : '[xr]?"',
|
||||||
|
next : "quote-string"
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : '[xr]?`',
|
||||||
|
next : "backtick-string"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : "[xr]?['](?:(?:\\\\.)|(?:[^'\\\\]))*?['][cdw]?"
|
||||||
|
}, { //-------------------------------------------------------- RULES
|
||||||
|
token: ["keyword", "text", "paren.lparen"],
|
||||||
|
regex: /(asm)(\s*)({)/,
|
||||||
|
next: "d-asm"
|
||||||
|
}, {
|
||||||
|
token: ["keyword", "text", "paren.lparen", "constant.language"],
|
||||||
|
regex: "(__traits)(\\s*)(\\()("+identifierRe+")"
|
||||||
|
}, { // import|module abc
|
||||||
|
token: ["keyword", "text", "variable.module"],
|
||||||
|
regex: "(import|module)(\\s+)((?:"+identifierRe+"\\.?)*)"
|
||||||
|
}, { // storage Name
|
||||||
|
token: ["keyword.storage", "text", "entity.name.type"],
|
||||||
|
regex: "("+storages+")(\\s*)("+identifierRe+")"
|
||||||
|
}, { // alias|typedef foo bar;
|
||||||
|
token: ["keyword", "text", "variable.storage", "text"],
|
||||||
|
regex: "(alias|typedef)(\\s*)("+identifierRe+")(\\s*)"
|
||||||
|
}, { //-------------------------------------------------------- OTHERS
|
||||||
|
token : "constant.numeric", // hex
|
||||||
|
regex : "0[xX][0-9a-fA-F_]+(l|ul|u|f|F|L|U|UL)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d[\\d_]*(?:(?:\\.[\\d_]*)?(?:[eE][+-]?[\\d_]+)?)?(l|ul|u|f|F|L|U|UL)?\\b"
|
||||||
|
}, {
|
||||||
|
token: "entity.other.attribute-name",
|
||||||
|
regex: "@"+identifierRe
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : operators
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\?|\\:|\\,|\\;|\\.|\\:"
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[[({]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\])}]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"star-comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken: 'comment'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"plus-comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : "\\+\\/",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken: 'comment'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"quote-string" : [
|
||||||
|
stringEscapesSeq,
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : '"[cdw]?',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken: 'string'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"backtick-string" : [
|
||||||
|
stringEscapesSeq,
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : '`[cdw]?',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken: 'string'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"operator-heredoc-string": [
|
||||||
|
{
|
||||||
|
onMatch: function(value, currentState, state) {
|
||||||
|
value = value.substring(value.length-2, value.length-1);
|
||||||
|
var map = {'>':'<',']':'[',')':'(','}':'{'};
|
||||||
|
if(Object.keys(map).indexOf(value) != -1)
|
||||||
|
value = map[value];
|
||||||
|
if(value != state[1]) return "string";
|
||||||
|
state.shift();
|
||||||
|
state.shift();
|
||||||
|
|
||||||
|
return "string";
|
||||||
|
},
|
||||||
|
regex: '(?:[\\]\\)}>]+)"',
|
||||||
|
next: 'start'
|
||||||
|
}, {
|
||||||
|
token: 'string',
|
||||||
|
regex: '[^\\]\\)}>]+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"identifier-heredoc-string": [
|
||||||
|
{
|
||||||
|
onMatch: function(value, currentState, state) {
|
||||||
|
value = value.substring(0, value.length-1);
|
||||||
|
if(value != state[1]) return "string";
|
||||||
|
state.shift();
|
||||||
|
state.shift();
|
||||||
|
|
||||||
|
return "string";
|
||||||
|
},
|
||||||
|
regex: '^(?:[A-Za-z_][a-zA-Z0-9]+)"',
|
||||||
|
next: 'start'
|
||||||
|
}, {
|
||||||
|
token: 'string',
|
||||||
|
regex: '[^\\]\\)}>]+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"d-asm": [
|
||||||
|
{
|
||||||
|
token: "paren.rparen",
|
||||||
|
regex: "\\}",
|
||||||
|
next: "start"
|
||||||
|
}, {
|
||||||
|
token: 'keyword.instruction',
|
||||||
|
regex: '[a-zA-Z]+',
|
||||||
|
next: 'd-asm-instruction'
|
||||||
|
}, {
|
||||||
|
token: "text",
|
||||||
|
regex: "\\s+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'd-asm-instruction': [
|
||||||
|
{
|
||||||
|
token: 'constant.language',
|
||||||
|
regex: /AL|AH|AX|EAX|BL|BH|BX|EBX|CL|CH|CX|ECX|DL|DH|DX|EDX|BP|EBP|SP|ESP|DI|EDI|SI|ESI/i
|
||||||
|
}, {
|
||||||
|
token: 'identifier',
|
||||||
|
regex: '[a-zA-Z]+'
|
||||||
|
}, {
|
||||||
|
token: 'string',
|
||||||
|
regex: '".*"'
|
||||||
|
}, {
|
||||||
|
token: 'comment',
|
||||||
|
regex: '//.*$'
|
||||||
|
}, {
|
||||||
|
token: 'constant.numeric',
|
||||||
|
regex: '[0-9.xA-F]+'
|
||||||
|
}, {
|
||||||
|
token: 'punctuation.operator',
|
||||||
|
regex: '\\,'
|
||||||
|
}, {
|
||||||
|
token: 'punctuation.operator',
|
||||||
|
regex: ';',
|
||||||
|
next: 'd-asm'
|
||||||
|
}, {
|
||||||
|
token: 'text',
|
||||||
|
regex: '\\s+'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
||||||
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
||||||
|
};
|
||||||
|
|
||||||
|
DHighlightRules.metaData = {
|
||||||
|
comment: 'D language',
|
||||||
|
fileTypes: [ 'd', 'di' ],
|
||||||
|
firstLineMatch: '^#!.*\\b[glr]?dmd\\b.',
|
||||||
|
foldingStartMarker: '(?x)/\\*\\*(?!\\*)|^(?![^{]*?//|[^{]*?/\\*(?!.*?\\*/.*?\\{)).*?\\{\\s*($|//|/\\*(?!.*?\\*/.*\\S))',
|
||||||
|
foldingStopMarker: '(?<!\\*)\\*\\*/|^\\s*\\}',
|
||||||
|
keyEquivalent: '^~D',
|
||||||
|
name: 'D',
|
||||||
|
scopeName: 'source.d'
|
||||||
|
};
|
||||||
|
oop.inherits(DHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.DHighlightRules = DHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DocCommentHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||||
|
}, {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "\\bTODO\\b"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment.doc"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getStartRule = function(start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // doc comment
|
||||||
|
regex : "\\/\\*(?=\\*)",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getEndRule = function (start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
1021
src/main/webapp/assets/ace/mode-dart.js
Normal file
1021
src/main/webapp/assets/ace/mode-dart.js
Normal file
File diff suppressed because it is too large
Load Diff
169
src/main/webapp/assets/ace/mode-diff.js
Normal file
169
src/main/webapp/assets/ace/mode-diff.js
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/diff_highlight_rules', 'ace/mode/folding/diff'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules;
|
||||||
|
var FoldMode = require("./folding/diff").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = HighlightRules;
|
||||||
|
this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i");
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.$id = "ace/mode/diff";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/diff_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DiffHighlightRules = function() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [{
|
||||||
|
regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$",
|
||||||
|
token: "punctuation.definition.separator.diff",
|
||||||
|
"name": "keyword"
|
||||||
|
}, { //diff.range.unified
|
||||||
|
regex: "^(@@)(\\s*.+?\\s*)(@@)(.*)$",
|
||||||
|
token: [
|
||||||
|
"constant",
|
||||||
|
"constant.numeric",
|
||||||
|
"constant",
|
||||||
|
"comment.doc.tag"
|
||||||
|
]
|
||||||
|
}, { //diff.range.normal
|
||||||
|
regex: "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$",
|
||||||
|
token: [
|
||||||
|
"constant.numeric",
|
||||||
|
"punctuation.definition.range.diff",
|
||||||
|
"constant.function",
|
||||||
|
"constant.numeric",
|
||||||
|
"punctuation.definition.range.diff",
|
||||||
|
"invalid"
|
||||||
|
],
|
||||||
|
"name": "meta."
|
||||||
|
}, {
|
||||||
|
regex: "^(\\-{3}|\\+{3}|\\*{3})( .+)$",
|
||||||
|
token: [
|
||||||
|
"constant.numeric",
|
||||||
|
"meta.tag"
|
||||||
|
]
|
||||||
|
}, { // added
|
||||||
|
regex: "^([!+>])(.*?)(\\s*)$",
|
||||||
|
token: [
|
||||||
|
"support.constant",
|
||||||
|
"text",
|
||||||
|
"invalid"
|
||||||
|
]
|
||||||
|
}, { // removed
|
||||||
|
regex: "^([<\\-])(.*?)(\\s*)$",
|
||||||
|
token: [
|
||||||
|
"support.function",
|
||||||
|
"string",
|
||||||
|
"invalid"
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
regex: "^(diff)(\\s+--\\w+)?(.+?)( .+)?$",
|
||||||
|
token: ["variable", "variable", "keyword", "variable"]
|
||||||
|
}, {
|
||||||
|
regex: "^Index.+$",
|
||||||
|
token: "variable"
|
||||||
|
}, {
|
||||||
|
regex: "^\\s+$",
|
||||||
|
token: "text"
|
||||||
|
}, {
|
||||||
|
regex: "\\s*$",
|
||||||
|
token: "invalid"
|
||||||
|
}, {
|
||||||
|
defaultToken: "invisible",
|
||||||
|
caseInsensitive: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DiffHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.DiffHighlightRules = DiffHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(levels, flag) {
|
||||||
|
this.regExpList = levels;
|
||||||
|
this.flag = flag;
|
||||||
|
this.foldingStartMarker = RegExp("^(" + levels.join("|") + ")", this.flag);
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var start = {row: row, column: line.length};
|
||||||
|
|
||||||
|
var regList = this.regExpList;
|
||||||
|
for (var i = 1; i <= regList.length; i++) {
|
||||||
|
var re = RegExp("^(" + regList.slice(0, i).join("|") + ")", this.flag);
|
||||||
|
if (re.test(line))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var l = session.getLength(); ++row < l; ) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
if (re.test(line))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (row == start.row + 1)
|
||||||
|
return;
|
||||||
|
return Range.fromPoints(start, {row: row - 1, column: line.length});
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
2425
src/main/webapp/assets/ace/mode-django.js
Normal file
2425
src/main/webapp/assets/ace/mode-django.js
Normal file
File diff suppressed because it is too large
Load Diff
360
src/main/webapp/assets/ace/mode-dot.js
Normal file
360
src/main/webapp/assets/ace/mode-dot.js
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
ace.define('ace/mode/dot', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/matching_brace_outdent', 'ace/mode/dot_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var DotHighlightRules = require("./dot_highlight_rules").DotHighlightRules;
|
||||||
|
var DotFoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = DotHighlightRules;
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.foldingRules = new DotFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = ["//", "#"];
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
var endState = tokenizedLine.state;
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);
|
||||||
|
if (match) {
|
||||||
|
indent += tab;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/dot";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
ace.define('ace/mode/dot_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/doc_comment_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||||
|
|
||||||
|
var DotHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywords = lang.arrayToMap(
|
||||||
|
("strict|node|edge|graph|digraph|subgraph").split("|")
|
||||||
|
);
|
||||||
|
|
||||||
|
var attributes = lang.arrayToMap(
|
||||||
|
("damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z").split("|")
|
||||||
|
);
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
token : "comment",
|
||||||
|
regex : /\/\/.*$/
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : /#.*$/
|
||||||
|
}, {
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
merge : true,
|
||||||
|
regex : /\/\*/,
|
||||||
|
next : "comment"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : "'(?=.)",
|
||||||
|
next : "qstring"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '"(?=.)',
|
||||||
|
next : "qqstring"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric",
|
||||||
|
regex : /[+\-]?\d+(?:(?:\.\d*)?(?:[eE][+\-]?\d+)?)?\b/
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : /\+|=|\->/
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : /,|;/
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : /[\[{]/
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : /[\]}]/
|
||||||
|
}, {
|
||||||
|
token: "comment",
|
||||||
|
regex: /^#!.*$/
|
||||||
|
}, {
|
||||||
|
token: function(value) {
|
||||||
|
if (keywords.hasOwnProperty(value.toLowerCase())) {
|
||||||
|
return "keyword";
|
||||||
|
}
|
||||||
|
else if (attributes.hasOwnProperty(value.toLowerCase())) {
|
||||||
|
return "variable";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "text";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : ".*?\\*\\/",
|
||||||
|
merge : true,
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment", // comment spanning whole line
|
||||||
|
merge : true,
|
||||||
|
regex : ".+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qqstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : '[^"\\\\]+',
|
||||||
|
merge : true
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : "\\\\$",
|
||||||
|
next : "qqstring",
|
||||||
|
merge : true
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '"|$',
|
||||||
|
next : "start",
|
||||||
|
merge : true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : "[^'\\\\]+",
|
||||||
|
merge : true
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : "\\\\$",
|
||||||
|
next : "qstring",
|
||||||
|
merge : true
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : "'|$",
|
||||||
|
next : "start",
|
||||||
|
merge : true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DotHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.DotHighlightRules = DotHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DocCommentHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||||
|
}, {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "\\bTODO\\b"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment.doc"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getStartRule = function(start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // doc comment
|
||||||
|
regex : "\\/\\*(?=\\*)",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getEndRule = function (start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
2789
src/main/webapp/assets/ace/mode-ejs.js
Normal file
2789
src/main/webapp/assets/ace/mode-ejs.js
Normal file
File diff suppressed because it is too large
Load Diff
986
src/main/webapp/assets/ace/mode-erlang.js
Normal file
986
src/main/webapp/assets/ace/mode-erlang.js
Normal file
@@ -0,0 +1,986 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/erlang', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/erlang_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var ErlangHighlightRules = require("./erlang_highlight_rules").ErlangHighlightRules;
|
||||||
|
var FoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = ErlangHighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "%";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
this.$id = "ace/mode/erlang";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/erlang_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var ErlangHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = { start:
|
||||||
|
[ { include: '#module-directive' },
|
||||||
|
{ include: '#import-export-directive' },
|
||||||
|
{ include: '#behaviour-directive' },
|
||||||
|
{ include: '#record-directive' },
|
||||||
|
{ include: '#define-directive' },
|
||||||
|
{ include: '#macro-directive' },
|
||||||
|
{ include: '#directive' },
|
||||||
|
{ include: '#function' },
|
||||||
|
{ include: '#everything-else' } ],
|
||||||
|
'#atom':
|
||||||
|
[ { token: 'punctuation.definition.symbol.begin.erlang',
|
||||||
|
regex: '\'',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.symbol.end.erlang',
|
||||||
|
regex: '\'',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.escape.erlang',
|
||||||
|
'constant.other.symbol.escape.erlang',
|
||||||
|
'punctuation.definition.escape.erlang',
|
||||||
|
'constant.other.symbol.escape.erlang',
|
||||||
|
'constant.other.symbol.escape.erlang' ],
|
||||||
|
regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' },
|
||||||
|
{ token: 'invalid.illegal.atom.erlang', regex: '\\\\\\^?.?' },
|
||||||
|
{ defaultToken: 'constant.other.symbol.quoted.single.erlang' } ] },
|
||||||
|
{ token: 'constant.other.symbol.unquoted.erlang',
|
||||||
|
regex: '[a-z][a-zA-Z\\d@_]*' } ],
|
||||||
|
'#behaviour-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.behaviour.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.behaviour.erlang',
|
||||||
|
'keyword.control.directive.behaviour.erlang',
|
||||||
|
'meta.directive.behaviour.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.behaviour.erlang',
|
||||||
|
'entity.name.type.class.behaviour.definition.erlang',
|
||||||
|
'meta.directive.behaviour.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.behaviour.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(behaviour)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ],
|
||||||
|
'#binary':
|
||||||
|
[ { token: 'punctuation.definition.binary.begin.erlang',
|
||||||
|
regex: '<<',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.binary.end.erlang',
|
||||||
|
regex: '>>',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.separator.binary.erlang',
|
||||||
|
'punctuation.separator.value-size.erlang' ],
|
||||||
|
regex: '(,)|(:)' },
|
||||||
|
{ include: '#internal-type-specifiers' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.structure.binary.erlang' } ] } ],
|
||||||
|
'#character':
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.character.erlang',
|
||||||
|
'punctuation.definition.escape.erlang',
|
||||||
|
'constant.character.escape.erlang',
|
||||||
|
'punctuation.definition.escape.erlang',
|
||||||
|
'constant.character.escape.erlang',
|
||||||
|
'constant.character.escape.erlang' ],
|
||||||
|
regex: '(\\$)(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' },
|
||||||
|
{ token: 'invalid.illegal.character.erlang',
|
||||||
|
regex: '\\$\\\\\\^?.?' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.character.erlang',
|
||||||
|
'constant.character.erlang' ],
|
||||||
|
regex: '(\\$)(\\S)' },
|
||||||
|
{ token: 'invalid.illegal.character.erlang', regex: '\\$.?' } ],
|
||||||
|
'#comment':
|
||||||
|
[ { token: 'punctuation.definition.comment.erlang',
|
||||||
|
regex: '%.*$',
|
||||||
|
push_:
|
||||||
|
[ { token: 'comment.line.percentage.erlang',
|
||||||
|
regex: '$',
|
||||||
|
next: 'pop' },
|
||||||
|
{ defaultToken: 'comment.line.percentage.erlang' } ] } ],
|
||||||
|
'#define-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.define.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'keyword.control.directive.define.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'entity.name.function.macro.definition.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'punctuation.separator.parameters.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(,)',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\))(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.directive.define.erlang' } ] },
|
||||||
|
{ token: 'meta.directive.define.erlang',
|
||||||
|
regex: '(?=^\\s*-\\s*define\\s*\\(\\s*[a-zA-Z\\d@_]+\\s*\\()',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.define.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\))(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'text',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'text',
|
||||||
|
'keyword.control.directive.define.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'text',
|
||||||
|
'entity.name.function.macro.definition.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.definition.parameters.begin.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\()',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.parameters.erlang' ],
|
||||||
|
regex: '(\\))(\\s*)(,)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.parameters.erlang', regex: ',' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ token: 'punctuation.separator.define.erlang',
|
||||||
|
regex: '\\|\\||\\||:|;|,|\\.|->' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.directive.define.erlang' } ] } ],
|
||||||
|
'#directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.erlang',
|
||||||
|
'keyword.control.directive.erlang',
|
||||||
|
'meta.directive.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\(?)',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\)?)(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.directive.erlang' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'meta.directive.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.erlang',
|
||||||
|
'keyword.control.directive.erlang',
|
||||||
|
'meta.directive.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\.)' } ],
|
||||||
|
'#everything-else':
|
||||||
|
[ { include: '#comment' },
|
||||||
|
{ include: '#record-usage' },
|
||||||
|
{ include: '#macro-usage' },
|
||||||
|
{ include: '#expression' },
|
||||||
|
{ include: '#keyword' },
|
||||||
|
{ include: '#textual-operator' },
|
||||||
|
{ include: '#function-call' },
|
||||||
|
{ include: '#tuple' },
|
||||||
|
{ include: '#list' },
|
||||||
|
{ include: '#binary' },
|
||||||
|
{ include: '#parenthesized-expression' },
|
||||||
|
{ include: '#character' },
|
||||||
|
{ include: '#number' },
|
||||||
|
{ include: '#atom' },
|
||||||
|
{ include: '#string' },
|
||||||
|
{ include: '#symbolic-operator' },
|
||||||
|
{ include: '#variable' } ],
|
||||||
|
'#expression':
|
||||||
|
[ { token: 'keyword.control.if.erlang',
|
||||||
|
regex: '\\bif\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-expression-punctuation' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.if.erlang' } ] },
|
||||||
|
{ token: 'keyword.control.case.erlang',
|
||||||
|
regex: '\\bcase\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-expression-punctuation' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.case.erlang' } ] },
|
||||||
|
{ token: 'keyword.control.receive.erlang',
|
||||||
|
regex: '\\breceive\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-expression-punctuation' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.receive.erlang' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.control.fun.erlang',
|
||||||
|
'text',
|
||||||
|
'entity.name.type.class.module.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.module-function.erlang',
|
||||||
|
'text',
|
||||||
|
'entity.name.function.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.function-arity.erlang' ],
|
||||||
|
regex: '\\b(fun)(\\s*)(?:([a-z][a-zA-Z\\d@_]*)(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*)(\\s*)(/)' },
|
||||||
|
{ token: 'keyword.control.fun.erlang',
|
||||||
|
regex: '\\bfun\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'text',
|
||||||
|
regex: '(?=\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.separator.clauses.erlang',
|
||||||
|
regex: ';|(?=\\bend\\b)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-function-parts' } ] },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.fun.erlang' } ] },
|
||||||
|
{ token: 'keyword.control.try.erlang',
|
||||||
|
regex: '\\btry\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-expression-punctuation' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.try.erlang' } ] },
|
||||||
|
{ token: 'keyword.control.begin.erlang',
|
||||||
|
regex: '\\bbegin\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-expression-punctuation' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.begin.erlang' } ] },
|
||||||
|
{ token: 'keyword.control.query.erlang',
|
||||||
|
regex: '\\bquery\\b',
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.control.end.erlang',
|
||||||
|
regex: '\\bend\\b',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.query.erlang' } ] } ],
|
||||||
|
'#function':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.function.erlang',
|
||||||
|
'entity.name.function.definition.erlang',
|
||||||
|
'meta.function.erlang' ],
|
||||||
|
regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.terminator.function.erlang',
|
||||||
|
regex: '\\.',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: [ 'text', 'entity.name.function.erlang', 'text' ],
|
||||||
|
regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()' },
|
||||||
|
{ token: 'text',
|
||||||
|
regex: '(?=\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.separator.clauses.erlang',
|
||||||
|
regex: ';|(?=\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#parenthesized-expression' },
|
||||||
|
{ include: '#internal-function-parts' } ] },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.function.erlang' } ] } ],
|
||||||
|
'#function-call':
|
||||||
|
[ { token: 'meta.function-call.erlang',
|
||||||
|
regex: '(?=(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*(?:\\(|:\\s*(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*\\())',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.parameters.end.erlang',
|
||||||
|
regex: '\\)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'entity.name.type.class.module.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.module-function.erlang',
|
||||||
|
'text',
|
||||||
|
'entity.name.function.guard.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.definition.parameters.begin.erlang' ],
|
||||||
|
regex: '(?:(erlang)(\\s*)(:)(\\s*))?(is_atom|is_binary|is_constant|is_float|is_function|is_integer|is_list|is_number|is_pid|is_port|is_reference|is_tuple|is_record|abs|element|hd|length|node|round|self|size|tl|trunc)(\\s*)(\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'text', regex: '(?=\\))', next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.parameters.erlang', regex: ',' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'entity.name.type.class.module.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.module-function.erlang',
|
||||||
|
'text',
|
||||||
|
'entity.name.function.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.definition.parameters.begin.erlang' ],
|
||||||
|
regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'text', regex: '(?=\\))', next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.parameters.erlang', regex: ',' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ defaultToken: 'meta.function-call.erlang' } ] } ],
|
||||||
|
'#import-export-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.import.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.import.erlang',
|
||||||
|
'keyword.control.directive.import.erlang',
|
||||||
|
'meta.directive.import.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.import.erlang',
|
||||||
|
'entity.name.type.class.module.erlang',
|
||||||
|
'meta.directive.import.erlang',
|
||||||
|
'punctuation.separator.parameters.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(import)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.import.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\))(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-function-list' },
|
||||||
|
{ defaultToken: 'meta.directive.import.erlang' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'meta.directive.export.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.export.erlang',
|
||||||
|
'keyword.control.directive.export.erlang',
|
||||||
|
'meta.directive.export.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(export)(\\s*)(\\()',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.export.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\))(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-function-list' },
|
||||||
|
{ defaultToken: 'meta.directive.export.erlang' } ] } ],
|
||||||
|
'#internal-expression-punctuation':
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.separator.clause-head-body.erlang',
|
||||||
|
'punctuation.separator.clauses.erlang',
|
||||||
|
'punctuation.separator.expressions.erlang' ],
|
||||||
|
regex: '(->)|(;)|(,)' } ],
|
||||||
|
'#internal-function-list':
|
||||||
|
[ { token: 'punctuation.definition.list.begin.erlang',
|
||||||
|
regex: '\\[',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.list.end.erlang',
|
||||||
|
regex: '\\]',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'entity.name.function.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.function-arity.erlang' ],
|
||||||
|
regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(/)',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.separator.list.erlang',
|
||||||
|
regex: ',|(?=\\])',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.structure.list.function.erlang' } ] } ],
|
||||||
|
'#internal-function-parts':
|
||||||
|
[ { token: 'text',
|
||||||
|
regex: '(?=\\()',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.separator.clause-head-body.erlang',
|
||||||
|
regex: '->',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'punctuation.definition.parameters.begin.erlang',
|
||||||
|
regex: '\\(',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.parameters.end.erlang',
|
||||||
|
regex: '\\)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.parameters.erlang', regex: ',' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ token: 'punctuation.separator.guards.erlang', regex: ',|;' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ token: 'punctuation.separator.expressions.erlang',
|
||||||
|
regex: ',' },
|
||||||
|
{ include: '#everything-else' } ],
|
||||||
|
'#internal-record-body':
|
||||||
|
[ { token: 'punctuation.definition.class.record.begin.erlang',
|
||||||
|
regex: '\\{',
|
||||||
|
push:
|
||||||
|
[ { token: 'meta.structure.record.erlang',
|
||||||
|
regex: '(?=\\})',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'variable.other.field.erlang',
|
||||||
|
'variable.language.omitted.field.erlang',
|
||||||
|
'text',
|
||||||
|
'keyword.operator.assignment.erlang' ],
|
||||||
|
regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')|(_))(\\s*)(=|::)',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.separator.class.record.erlang',
|
||||||
|
regex: ',|(?=\\})',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' } ] },
|
||||||
|
{ token:
|
||||||
|
[ 'variable.other.field.erlang',
|
||||||
|
'text',
|
||||||
|
'punctuation.separator.class.record.erlang' ],
|
||||||
|
regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)((?:,)?)' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.structure.record.erlang' } ] } ],
|
||||||
|
'#internal-type-specifiers':
|
||||||
|
[ { token: 'punctuation.separator.value-type.erlang',
|
||||||
|
regex: '/',
|
||||||
|
push:
|
||||||
|
[ { token: 'text', regex: '(?=,|:|>>)', next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'storage.type.erlang',
|
||||||
|
'storage.modifier.signedness.erlang',
|
||||||
|
'storage.modifier.endianness.erlang',
|
||||||
|
'storage.modifier.unit.erlang',
|
||||||
|
'punctuation.separator.type-specifiers.erlang' ],
|
||||||
|
regex: '(integer|float|binary|bytes|bitstring|bits)|(signed|unsigned)|(big|little|native)|(unit)|(-)' } ] } ],
|
||||||
|
'#keyword':
|
||||||
|
[ { token: 'keyword.control.erlang',
|
||||||
|
regex: '\\b(?:after|begin|case|catch|cond|end|fun|if|let|of|query|try|receive|when)\\b' } ],
|
||||||
|
'#list':
|
||||||
|
[ { token: 'punctuation.definition.list.begin.erlang',
|
||||||
|
regex: '\\[',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.list.end.erlang',
|
||||||
|
regex: '\\]',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.list.erlang',
|
||||||
|
regex: '\\||\\|\\||,' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.structure.list.erlang' } ] } ],
|
||||||
|
'#macro-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.ifdef.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.ifdef.erlang',
|
||||||
|
'keyword.control.directive.ifdef.erlang',
|
||||||
|
'meta.directive.ifdef.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.ifdef.erlang',
|
||||||
|
'entity.name.function.macro.erlang',
|
||||||
|
'meta.directive.ifdef.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.ifdef.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(ifdef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' },
|
||||||
|
{ token:
|
||||||
|
[ 'meta.directive.ifndef.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.ifndef.erlang',
|
||||||
|
'keyword.control.directive.ifndef.erlang',
|
||||||
|
'meta.directive.ifndef.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.ifndef.erlang',
|
||||||
|
'entity.name.function.macro.erlang',
|
||||||
|
'meta.directive.ifndef.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.ifndef.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(ifndef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' },
|
||||||
|
{ token:
|
||||||
|
[ 'meta.directive.undef.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.undef.erlang',
|
||||||
|
'keyword.control.directive.undef.erlang',
|
||||||
|
'meta.directive.undef.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.undef.erlang',
|
||||||
|
'entity.name.function.macro.erlang',
|
||||||
|
'meta.directive.undef.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.undef.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(undef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' } ],
|
||||||
|
'#macro-usage':
|
||||||
|
[ { token:
|
||||||
|
[ 'keyword.operator.macro.erlang',
|
||||||
|
'meta.macro-usage.erlang',
|
||||||
|
'entity.name.function.macro.erlang' ],
|
||||||
|
regex: '(\\?\\??)(\\s*)([a-zA-Z\\d@_]+)' } ],
|
||||||
|
'#module-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.module.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.module.erlang',
|
||||||
|
'keyword.control.directive.module.erlang',
|
||||||
|
'meta.directive.module.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.module.erlang',
|
||||||
|
'entity.name.type.class.module.definition.erlang',
|
||||||
|
'meta.directive.module.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.module.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(module)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ],
|
||||||
|
'#number':
|
||||||
|
[ { token: 'text',
|
||||||
|
regex: '(?=\\d)',
|
||||||
|
push:
|
||||||
|
[ { token: 'text', regex: '(?!\\d)', next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.float.erlang',
|
||||||
|
'punctuation.separator.integer-float.erlang',
|
||||||
|
'constant.numeric.float.erlang',
|
||||||
|
'punctuation.separator.float-exponent.erlang' ],
|
||||||
|
regex: '(\\d+)(\\.)(\\d+)((?:[eE][\\+\\-]?\\d+)?)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.binary.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.binary.erlang' ],
|
||||||
|
regex: '(2)(#)([0-1]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-3.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-3.erlang' ],
|
||||||
|
regex: '(3)(#)([0-2]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-4.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-4.erlang' ],
|
||||||
|
regex: '(4)(#)([0-3]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-5.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-5.erlang' ],
|
||||||
|
regex: '(5)(#)([0-4]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-6.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-6.erlang' ],
|
||||||
|
regex: '(6)(#)([0-5]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-7.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-7.erlang' ],
|
||||||
|
regex: '(7)(#)([0-6]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.octal.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.octal.erlang' ],
|
||||||
|
regex: '(8)(#)([0-7]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-9.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-9.erlang' ],
|
||||||
|
regex: '(9)(#)([0-8]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.decimal.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.decimal.erlang' ],
|
||||||
|
regex: '(10)(#)(\\d+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-11.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-11.erlang' ],
|
||||||
|
regex: '(11)(#)([\\daA]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-12.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-12.erlang' ],
|
||||||
|
regex: '(12)(#)([\\da-bA-B]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-13.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-13.erlang' ],
|
||||||
|
regex: '(13)(#)([\\da-cA-C]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-14.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-14.erlang' ],
|
||||||
|
regex: '(14)(#)([\\da-dA-D]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-15.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-15.erlang' ],
|
||||||
|
regex: '(15)(#)([\\da-eA-E]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.hexadecimal.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.hexadecimal.erlang' ],
|
||||||
|
regex: '(16)(#)([\\da-fA-F]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-17.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-17.erlang' ],
|
||||||
|
regex: '(17)(#)([\\da-gA-G]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-18.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-18.erlang' ],
|
||||||
|
regex: '(18)(#)([\\da-hA-H]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-19.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-19.erlang' ],
|
||||||
|
regex: '(19)(#)([\\da-iA-I]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-20.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-20.erlang' ],
|
||||||
|
regex: '(20)(#)([\\da-jA-J]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-21.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-21.erlang' ],
|
||||||
|
regex: '(21)(#)([\\da-kA-K]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-22.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-22.erlang' ],
|
||||||
|
regex: '(22)(#)([\\da-lA-L]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-23.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-23.erlang' ],
|
||||||
|
regex: '(23)(#)([\\da-mA-M]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-24.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-24.erlang' ],
|
||||||
|
regex: '(24)(#)([\\da-nA-N]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-25.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-25.erlang' ],
|
||||||
|
regex: '(25)(#)([\\da-oA-O]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-26.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-26.erlang' ],
|
||||||
|
regex: '(26)(#)([\\da-pA-P]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-27.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-27.erlang' ],
|
||||||
|
regex: '(27)(#)([\\da-qA-Q]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-28.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-28.erlang' ],
|
||||||
|
regex: '(28)(#)([\\da-rA-R]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-29.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-29.erlang' ],
|
||||||
|
regex: '(29)(#)([\\da-sA-S]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-30.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-30.erlang' ],
|
||||||
|
regex: '(30)(#)([\\da-tA-T]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-31.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-31.erlang' ],
|
||||||
|
regex: '(31)(#)([\\da-uA-U]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-32.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-32.erlang' ],
|
||||||
|
regex: '(32)(#)([\\da-vA-V]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-33.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-33.erlang' ],
|
||||||
|
regex: '(33)(#)([\\da-wA-W]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-34.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-34.erlang' ],
|
||||||
|
regex: '(34)(#)([\\da-xA-X]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-35.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-35.erlang' ],
|
||||||
|
regex: '(35)(#)([\\da-yA-Y]+)' },
|
||||||
|
{ token:
|
||||||
|
[ 'constant.numeric.integer.base-36.erlang',
|
||||||
|
'punctuation.separator.base-integer.erlang',
|
||||||
|
'constant.numeric.integer.base-36.erlang' ],
|
||||||
|
regex: '(36)(#)([\\da-zA-Z]+)' },
|
||||||
|
{ token: 'invalid.illegal.integer.erlang',
|
||||||
|
regex: '\\d+#[\\da-zA-Z]+' },
|
||||||
|
{ token: 'constant.numeric.integer.decimal.erlang',
|
||||||
|
regex: '\\d+' } ] } ],
|
||||||
|
'#parenthesized-expression':
|
||||||
|
[ { token: 'punctuation.section.expression.begin.erlang',
|
||||||
|
regex: '\\(',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.section.expression.end.erlang',
|
||||||
|
regex: '\\)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.expression.parenthesized' } ] } ],
|
||||||
|
'#record-directive':
|
||||||
|
[ { token:
|
||||||
|
[ 'meta.directive.record.erlang',
|
||||||
|
'punctuation.section.directive.begin.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'keyword.control.directive.import.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'punctuation.definition.parameters.begin.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'entity.name.type.class.record.definition.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'punctuation.separator.parameters.erlang' ],
|
||||||
|
regex: '^(\\s*)(-)(\\s*)(record)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)',
|
||||||
|
push:
|
||||||
|
[ { token:
|
||||||
|
[ 'punctuation.definition.class.record.end.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'punctuation.definition.parameters.end.erlang',
|
||||||
|
'meta.directive.record.erlang',
|
||||||
|
'punctuation.section.directive.end.erlang' ],
|
||||||
|
regex: '(\\})(\\s*)(\\))(\\s*)(\\.)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-record-body' },
|
||||||
|
{ defaultToken: 'meta.directive.record.erlang' } ] } ],
|
||||||
|
'#record-usage':
|
||||||
|
[ { token:
|
||||||
|
[ 'keyword.operator.record.erlang',
|
||||||
|
'meta.record-usage.erlang',
|
||||||
|
'entity.name.type.class.record.erlang',
|
||||||
|
'meta.record-usage.erlang',
|
||||||
|
'punctuation.separator.record-field.erlang',
|
||||||
|
'meta.record-usage.erlang',
|
||||||
|
'variable.other.field.erlang' ],
|
||||||
|
regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\.)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')' },
|
||||||
|
{ token:
|
||||||
|
[ 'keyword.operator.record.erlang',
|
||||||
|
'meta.record-usage.erlang',
|
||||||
|
'entity.name.type.class.record.erlang' ],
|
||||||
|
regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.class.record.end.erlang',
|
||||||
|
regex: '\\}',
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#internal-record-body' },
|
||||||
|
{ defaultToken: 'meta.record-usage.erlang' } ] } ],
|
||||||
|
'#string':
|
||||||
|
[ { token: 'punctuation.definition.string.begin.erlang',
|
||||||
|
regex: '"',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.string.end.erlang',
|
||||||
|
regex: '"',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.escape.erlang',
|
||||||
|
'constant.character.escape.erlang',
|
||||||
|
'punctuation.definition.escape.erlang',
|
||||||
|
'constant.character.escape.erlang',
|
||||||
|
'constant.character.escape.erlang' ],
|
||||||
|
regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' },
|
||||||
|
{ token: 'invalid.illegal.string.erlang', regex: '\\\\\\^?.?' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.placeholder.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'constant.other.placeholder.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'constant.other.placeholder.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'constant.other.placeholder.erlang',
|
||||||
|
'constant.other.placeholder.erlang' ],
|
||||||
|
regex: '(~)(?:((?:\\-)?)(\\d+)|(\\*))?(?:(\\.)(?:(\\d+)|(\\*)))?(?:(\\.)(?:(\\*)|(.)))?([~cfegswpWPBX#bx\\+ni])' },
|
||||||
|
{ token:
|
||||||
|
[ 'punctuation.definition.placeholder.erlang',
|
||||||
|
'punctuation.separator.placeholder-parts.erlang',
|
||||||
|
'constant.other.placeholder.erlang',
|
||||||
|
'constant.other.placeholder.erlang' ],
|
||||||
|
regex: '(~)((?:\\*)?)((?:\\d+)?)([~du\\-#fsacl])' },
|
||||||
|
{ token: 'invalid.illegal.string.erlang', regex: '~.?' },
|
||||||
|
{ defaultToken: 'string.quoted.double.erlang' } ] } ],
|
||||||
|
'#symbolic-operator':
|
||||||
|
[ { token: 'keyword.operator.symbolic.erlang',
|
||||||
|
regex: '\\+\\+|\\+|--|-|\\*|/=|/|=/=|=:=|==|=<|=|<-|<|>=|>|!|::' } ],
|
||||||
|
'#textual-operator':
|
||||||
|
[ { token: 'keyword.operator.textual.erlang',
|
||||||
|
regex: '\\b(?:andalso|band|and|bxor|xor|bor|orelse|or|bnot|not|bsl|bsr|div|rem)\\b' } ],
|
||||||
|
'#tuple':
|
||||||
|
[ { token: 'punctuation.definition.tuple.begin.erlang',
|
||||||
|
regex: '\\{',
|
||||||
|
push:
|
||||||
|
[ { token: 'punctuation.definition.tuple.end.erlang',
|
||||||
|
regex: '\\}',
|
||||||
|
next: 'pop' },
|
||||||
|
{ token: 'punctuation.separator.tuple.erlang', regex: ',' },
|
||||||
|
{ include: '#everything-else' },
|
||||||
|
{ defaultToken: 'meta.structure.tuple.erlang' } ] } ],
|
||||||
|
'#variable':
|
||||||
|
[ { token: [ 'variable.other.erlang', 'variable.language.omitted.erlang' ],
|
||||||
|
regex: '(_[a-zA-Z\\d@_]+|[A-Z][a-zA-Z\\d@_]*)|(_)' } ] }
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
ErlangHighlightRules.metaData = { comment: 'The recognition of function definitions and compiler directives (such as module, record and macro definitions) requires that each of the aforementioned constructs must be the first string inside a line (except for whitespace). Also, the function/module/record/macro names must be given unquoted. -- desp',
|
||||||
|
fileTypes: [ 'erl', 'hrl' ],
|
||||||
|
keyEquivalent: '^~E',
|
||||||
|
name: 'Erlang',
|
||||||
|
scopeName: 'source.erlang' }
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(ErlangHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.ErlangHighlightRules = ErlangHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
279
src/main/webapp/assets/ace/mode-forth.js
Normal file
279
src/main/webapp/assets/ace/mode-forth.js
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/forth', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/forth_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var ForthHighlightRules = require("./forth_highlight_rules").ForthHighlightRules;
|
||||||
|
var FoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = ForthHighlightRules;
|
||||||
|
this.foldingRules = new FoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "(?<=^|\\s)\\.?\\( [^)]*\\)";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
this.$id = "ace/mode/forth";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/forth_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var ForthHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = { start: [ { include: '#forth' } ],
|
||||||
|
'#comment':
|
||||||
|
[ { token: 'comment.line.double-dash.forth',
|
||||||
|
regex: '(?:^|\\s)--\\s.*$',
|
||||||
|
comment: 'line comments for iForth' },
|
||||||
|
{ token: 'comment.line.backslash.forth',
|
||||||
|
regex: '(?:^|\\s)\\\\[\\s\\S]*$',
|
||||||
|
comment: 'ANSI line comment' },
|
||||||
|
{ token: 'comment.line.backslash-g.forth',
|
||||||
|
regex: '(?:^|\\s)\\\\[Gg] .*$',
|
||||||
|
comment: 'gForth line comment' },
|
||||||
|
{ token: 'comment.block.forth',
|
||||||
|
regex: '(?:^|\\s)\\(\\*(?=\\s|$)',
|
||||||
|
push:
|
||||||
|
[ { token: 'comment.block.forth',
|
||||||
|
regex: '(?:^|\\s)\\*\\)(?=\\s|$)',
|
||||||
|
next: 'pop' },
|
||||||
|
{ defaultToken: 'comment.block.forth' } ],
|
||||||
|
comment: 'multiline comments for iForth' },
|
||||||
|
{ token: 'comment.block.documentation.forth',
|
||||||
|
regex: '\\bDOC\\b',
|
||||||
|
caseInsensitive: true,
|
||||||
|
push:
|
||||||
|
[ { token: 'comment.block.documentation.forth',
|
||||||
|
regex: '\\bENDDOC\\b',
|
||||||
|
caseInsensitive: true,
|
||||||
|
next: 'pop' },
|
||||||
|
{ defaultToken: 'comment.block.documentation.forth' } ],
|
||||||
|
comment: 'documentation comments for iForth' },
|
||||||
|
{ token: 'comment.line.parentheses.forth',
|
||||||
|
regex: '(?:^|\\s)\\.?\\( [^)]*\\)',
|
||||||
|
comment: 'ANSI line comment' } ],
|
||||||
|
'#constant':
|
||||||
|
[ { token: 'constant.language.forth',
|
||||||
|
regex: '(?:^|\\s)(?:TRUE|FALSE|BL|PI|CELL|C/L|R/O|W/O|R/W)(?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'constant.numeric.forth',
|
||||||
|
regex: '(?:^|\\s)[$#%]?[-+]?[0-9]+(?:\\.[0-9]*e-?[0-9]+|\\.?[0-9a-fA-F]*)(?=\\s|$)'},
|
||||||
|
{ token: 'constant.character.forth',
|
||||||
|
regex: '(?:^|\\s)(?:[&^]\\S|(?:"|\')\\S(?:"|\'))(?=\\s|$)'}],
|
||||||
|
'#forth':
|
||||||
|
[ { include: '#constant' },
|
||||||
|
{ include: '#comment' },
|
||||||
|
{ include: '#string' },
|
||||||
|
{ include: '#word' },
|
||||||
|
{ include: '#variable' },
|
||||||
|
{ include: '#storage' },
|
||||||
|
{ include: '#word-def' } ],
|
||||||
|
'#storage':
|
||||||
|
[ { token: 'storage.type.forth',
|
||||||
|
regex: '(?:^|\\s)(?:2CONSTANT|2VARIABLE|ALIAS|CONSTANT|CREATE-INTERPRET/COMPILE[:]?|CREATE|DEFER|FCONSTANT|FIELD|FVARIABLE|USER|VALUE|VARIABLE|VOCABULARY)(?=\\s|$)',
|
||||||
|
caseInsensitive: true}],
|
||||||
|
'#string':
|
||||||
|
[ { token: 'string.quoted.double.forth',
|
||||||
|
regex: '(ABORT" |BREAK" |\\." |C" |0"|S\\\\?" )([^"]+")',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'string.unquoted.forth',
|
||||||
|
regex: '(?:INCLUDE|NEEDS|REQUIRE|USE)[ ]\\S+(?=\\s|$)',
|
||||||
|
caseInsensitive: true}],
|
||||||
|
'#variable':
|
||||||
|
[ { token: 'variable.language.forth',
|
||||||
|
regex: '\\b(?:I|J)\\b',
|
||||||
|
caseInsensitive: true } ],
|
||||||
|
'#word':
|
||||||
|
[ { token: 'keyword.control.immediate.forth',
|
||||||
|
regex: '(?:^|\\s)\\[(?:\\?DO|\\+LOOP|AGAIN|BEGIN|DEFINED|DO|ELSE|ENDIF|FOR|IF|IFDEF|IFUNDEF|LOOP|NEXT|REPEAT|THEN|UNTIL|WHILE)\\](?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'keyword.other.immediate.forth',
|
||||||
|
regex: '(?:^|\\s)(?:COMPILE-ONLY|IMMEDIATE|IS|RESTRICT|TO|WHAT\'S|])(?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'keyword.control.compile-only.forth',
|
||||||
|
regex: '(?:^|\\s)(?:-DO|\\-LOOP|\\?DO|\\?LEAVE|\\+DO|\\+LOOP|ABORT\\"|AGAIN|AHEAD|BEGIN|CASE|DO|ELSE|ENDCASE|ENDIF|ENDOF|ENDTRY\\-IFERROR|ENDTRY|FOR|IF|IFERROR|LEAVE|LOOP|NEXT|RECOVER|REPEAT|RESTORE|THEN|TRY|U\\-DO|U\\+DO|UNTIL|WHILE)(?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'keyword.other.compile-only.forth',
|
||||||
|
regex: '(?:^|\\s)(?:\\?DUP-0=-IF|\\?DUP-IF|\\)|\\[|\\[\'\\]|\\[CHAR\\]|\\[COMPILE\\]|\\[IS\\]|\\[TO\\]|<COMPILATION|<INTERPRETATION|ASSERT\\(|ASSERT0\\(|ASSERT1\\(|ASSERT2\\(|ASSERT3\\(|COMPILATION>|DEFERS|DOES>|INTERPRETATION>|OF|POSTPONE)(?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'keyword.other.non-immediate.forth',
|
||||||
|
regex: '(?:^|\\s)(?:\'|<IS>|<TO>|CHAR|END-STRUCT|INCLUDE[D]?|LOAD|NEEDS|REQUIRE[D]?|REVISION|SEE|STRUCT|THRU|USE)(?=\\s|$)',
|
||||||
|
caseInsensitive: true},
|
||||||
|
{ token: 'keyword.other.warning.forth',
|
||||||
|
regex: '(?:^|\\s)(?:~~|BREAK:|BREAK"|DBG)(?=\\s|$)',
|
||||||
|
caseInsensitive: true}],
|
||||||
|
'#word-def':
|
||||||
|
[ { token:
|
||||||
|
[ 'keyword.other.compile-only.forth',
|
||||||
|
'keyword.other.compile-only.forth',
|
||||||
|
'meta.block.forth',
|
||||||
|
'entity.name.function.forth' ],
|
||||||
|
regex: '(:NONAME)|(^:|\\s:)(\\s)(\\S+)(?=\\s|$)',
|
||||||
|
caseInsensitive: true,
|
||||||
|
push:
|
||||||
|
[ { token: 'keyword.other.compile-only.forth',
|
||||||
|
regex: ';(?:CODE)?',
|
||||||
|
caseInsensitive: true,
|
||||||
|
next: 'pop' },
|
||||||
|
{ include: '#constant' },
|
||||||
|
{ include: '#comment' },
|
||||||
|
{ include: '#string' },
|
||||||
|
{ include: '#word' },
|
||||||
|
{ include: '#variable' },
|
||||||
|
{ include: '#storage' },
|
||||||
|
{ defaultToken: 'meta.block.forth' } ] } ] }
|
||||||
|
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
ForthHighlightRules.metaData = { fileTypes: [ 'frt', 'fs', 'ldr' ],
|
||||||
|
foldingStartMarker: '/\\*\\*|\\{\\s*$',
|
||||||
|
foldingStopMarker: '\\*\\*/|^\\s*\\}',
|
||||||
|
keyEquivalent: '^~F',
|
||||||
|
name: 'Forth',
|
||||||
|
scopeName: 'source.forth' }
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(ForthHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.ForthHighlightRules = ForthHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
1001
src/main/webapp/assets/ace/mode-ftl.js
Normal file
1001
src/main/webapp/assets/ace/mode-ftl.js
Normal file
File diff suppressed because it is too large
Load Diff
159
src/main/webapp/assets/ace/mode-gherkin.js
Normal file
159
src/main/webapp/assets/ace/mode-gherkin.js
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/gherkin', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/gherkin_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var GherkinHighlightRules = require("./gherkin_highlight_rules").GherkinHighlightRules;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = GherkinHighlightRules;
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.lineCommentStart = "#";
|
||||||
|
this.$id = "ace/mode/gherkin";
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
var space2 = " ";
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
|
||||||
|
console.log(state)
|
||||||
|
|
||||||
|
if(line.match("[ ]*\\|")) {
|
||||||
|
indent += "| ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
if (line.match("Scenario:|Feature:|Scenario\ Outline:|Background:")) {
|
||||||
|
indent += space2;
|
||||||
|
} else if(line.match("(Given|Then).+(:)$|Examples:")) {
|
||||||
|
indent += space2;
|
||||||
|
} else if(line.match("\\*.+")) {
|
||||||
|
indent += "* ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/gherkin_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})";
|
||||||
|
|
||||||
|
var GherkinHighlightRules = function() {
|
||||||
|
this.$rules = {
|
||||||
|
start : [{
|
||||||
|
token: 'constant.numeric',
|
||||||
|
regex: "(?:(?:[1-9]\\d*)|(?:0))"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "#.*$"
|
||||||
|
}, {
|
||||||
|
token : "keyword",
|
||||||
|
regex : "Feature:|Background:|Scenario:|Scenario\ Outline:|Examples:|Given|When|Then|And|But|\\*",
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line """ string start
|
||||||
|
regex : '"{3}',
|
||||||
|
next : "qqstring3"
|
||||||
|
}, {
|
||||||
|
token : "string", // " string
|
||||||
|
regex : '"',
|
||||||
|
next : "qqstring"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "@[A-Za-z0-9]+",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "<.+>"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\| ",
|
||||||
|
next : "table-item"
|
||||||
|
}, {
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\|$",
|
||||||
|
next : "start"
|
||||||
|
}],
|
||||||
|
"qqstring3" : [ {
|
||||||
|
token : "constant.language.escape",
|
||||||
|
regex : stringEscape
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line """ string end
|
||||||
|
regex : '"{3}',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken : "string"
|
||||||
|
}],
|
||||||
|
"qqstring" : [{
|
||||||
|
token : "constant.language.escape",
|
||||||
|
regex : stringEscape
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : "\\\\$",
|
||||||
|
next : "qqstring"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '"|$',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
defaultToken: "string"
|
||||||
|
}],
|
||||||
|
"table-item" : [{
|
||||||
|
token : "string",
|
||||||
|
regex : "[A-Za-z0-9 ]*",
|
||||||
|
next : "start"
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
oop.inherits(GherkinHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.GherkinHighlightRules = GherkinHighlightRules;
|
||||||
|
});
|
||||||
892
src/main/webapp/assets/ace/mode-glsl.js
Normal file
892
src/main/webapp/assets/ace/mode-glsl.js
Normal file
@@ -0,0 +1,892 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
ace.define('ace/mode/glsl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp', 'ace/mode/glsl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var CMode = require("./c_cpp").Mode;
|
||||||
|
var glslHighlightRules = require("./glsl_highlight_rules").glslHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
|
||||||
|
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = glslHighlightRules;
|
||||||
|
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.$behaviour = new CstyleBehaviour();
|
||||||
|
this.foldingRules = new CStyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, CMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.$id = "ace/mode/glsl";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules;
|
||||||
|
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
|
||||||
|
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = c_cppHighlightRules;
|
||||||
|
|
||||||
|
this.$outdent = new MatchingBraceOutdent();
|
||||||
|
this.$behaviour = new CstyleBehaviour();
|
||||||
|
|
||||||
|
this.foldingRules = new CStyleFoldMode();
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.lineCommentStart = "//";
|
||||||
|
this.blockComment = {start: "/*", end: "*/"};
|
||||||
|
|
||||||
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||||
|
var tokens = tokenizedLine.tokens;
|
||||||
|
var endState = tokenizedLine.state;
|
||||||
|
|
||||||
|
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||||
|
return indent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == "start") {
|
||||||
|
var match = line.match(/^.*[\{\(\[]\s*$/);
|
||||||
|
if (match) {
|
||||||
|
indent += tab;
|
||||||
|
}
|
||||||
|
} else if (state == "doc-start") {
|
||||||
|
if (endState == "start") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
var match = line.match(/^\s*(\/?)\*/);
|
||||||
|
if (match) {
|
||||||
|
if (match[1]) {
|
||||||
|
indent += " ";
|
||||||
|
}
|
||||||
|
indent += "* ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indent;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkOutdent = function(state, line, input) {
|
||||||
|
return this.$outdent.checkOutdent(line, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(state, doc, row) {
|
||||||
|
this.$outdent.autoOutdent(doc, row);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/c_cpp";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
||||||
|
ace.define('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b"
|
||||||
|
|
||||||
|
var c_cppHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywordControls = (
|
||||||
|
"break|case|continue|default|do|else|for|goto|if|_Pragma|" +
|
||||||
|
"return|switch|while|catch|operator|try|throw|using"
|
||||||
|
);
|
||||||
|
|
||||||
|
var storageType = (
|
||||||
|
"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" +
|
||||||
|
"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" +
|
||||||
|
"class|wchar_t|template"
|
||||||
|
);
|
||||||
|
|
||||||
|
var storageModifiers = (
|
||||||
|
"const|extern|register|restrict|static|volatile|inline|private:|" +
|
||||||
|
"protected:|public:|friend|explicit|virtual|export|mutable|typename"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordOperators = (
|
||||||
|
"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" +
|
||||||
|
"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace"
|
||||||
|
);
|
||||||
|
|
||||||
|
var builtinConstants = (
|
||||||
|
"NULL|true|false|TRUE|FALSE"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.$keywords = this.createKeywordMapper({
|
||||||
|
"keyword.control" : keywordControls,
|
||||||
|
"storage.type" : storageType,
|
||||||
|
"storage.modifier" : storageModifiers,
|
||||||
|
"keyword.operator" : keywordOperators,
|
||||||
|
"variable.language": "this",
|
||||||
|
"constant.language": builtinConstants
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\d\\$_\u00a1-\uffff]*\\b";
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [
|
||||||
|
{
|
||||||
|
token : "comment",
|
||||||
|
regex : "\\/\\/.*$"
|
||||||
|
},
|
||||||
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||||
|
{
|
||||||
|
token : "comment", // multi line comment
|
||||||
|
regex : "\\/\\*",
|
||||||
|
next : "comment"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : '["].*\\\\$',
|
||||||
|
next : "qqstring"
|
||||||
|
}, {
|
||||||
|
token : "string", // single line
|
||||||
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
||||||
|
}, {
|
||||||
|
token : "string", // multi line string start
|
||||||
|
regex : "['].*\\\\$",
|
||||||
|
next : "qstring"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // hex
|
||||||
|
regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "constant.numeric", // float
|
||||||
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword", // pre-compiler directives
|
||||||
|
regex : "#\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\b",
|
||||||
|
next : "directive"
|
||||||
|
}, {
|
||||||
|
token : "keyword", // special case pre-compiler directive
|
||||||
|
regex : "(?:#\\s*endif)\\b"
|
||||||
|
}, {
|
||||||
|
token : "support.function.C99.c",
|
||||||
|
regex : cFunctions
|
||||||
|
}, {
|
||||||
|
token : keywordMapper,
|
||||||
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator",
|
||||||
|
regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"
|
||||||
|
}, {
|
||||||
|
token : "punctuation.operator",
|
||||||
|
regex : "\\?|\\:|\\,|\\;|\\."
|
||||||
|
}, {
|
||||||
|
token : "paren.lparen",
|
||||||
|
regex : "[[({]"
|
||||||
|
}, {
|
||||||
|
token : "paren.rparen",
|
||||||
|
regex : "[\\])}]"
|
||||||
|
}, {
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comment" : [
|
||||||
|
{
|
||||||
|
token : "comment", // closing comment
|
||||||
|
regex : ".*?\\*\\/",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "comment", // comment spanning whole line
|
||||||
|
regex : ".+"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qqstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"',
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '.+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qstring" : [
|
||||||
|
{
|
||||||
|
token : "string",
|
||||||
|
regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'",
|
||||||
|
next : "start"
|
||||||
|
}, {
|
||||||
|
token : "string",
|
||||||
|
regex : '.+'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"directive" : [
|
||||||
|
{
|
||||||
|
token : "constant.other.multiline",
|
||||||
|
regex : /\\/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other.multiline",
|
||||||
|
regex : /.*\\/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other",
|
||||||
|
regex : "\\s*<.+?>",
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other", // single line
|
||||||
|
regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]',
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other", // single line
|
||||||
|
regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']",
|
||||||
|
next : "start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "constant.other",
|
||||||
|
regex : /[^\\\/]+/,
|
||||||
|
next : "start"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
||||||
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(c_cppHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.c_cppHighlightRules = c_cppHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var DocCommentHighlightRules = function() {
|
||||||
|
|
||||||
|
this.$rules = {
|
||||||
|
"start" : [ {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||||
|
}, {
|
||||||
|
token : "comment.doc.tag",
|
||||||
|
regex : "\\bTODO\\b"
|
||||||
|
}, {
|
||||||
|
defaultToken : "comment.doc"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getStartRule = function(start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // doc comment
|
||||||
|
regex : "\\/\\*(?=\\*)",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DocCommentHighlightRules.getEndRule = function (start) {
|
||||||
|
return {
|
||||||
|
token : "comment.doc", // closing comment
|
||||||
|
regex : "\\*\\/",
|
||||||
|
next : start
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
|
var MatchingBraceOutdent = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.checkOutdent = function(line, input) {
|
||||||
|
if (! /^\s+$/.test(line))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return /^\s*\}/.test(input);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.autoOutdent = function(doc, row) {
|
||||||
|
var line = doc.getLine(row);
|
||||||
|
var match = line.match(/^(\s*\})/);
|
||||||
|
|
||||||
|
if (!match) return 0;
|
||||||
|
|
||||||
|
var column = match[1].length;
|
||||||
|
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||||
|
|
||||||
|
if (!openBracePos || openBracePos.row == row) return 0;
|
||||||
|
|
||||||
|
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||||
|
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$getIndent = function(line) {
|
||||||
|
return line.match(/^\s*/)[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(MatchingBraceOutdent.prototype);
|
||||||
|
|
||||||
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
|
||||||
|
var SAFE_INSERT_IN_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator"];
|
||||||
|
var SAFE_INSERT_BEFORE_TOKENS =
|
||||||
|
["text", "paren.rparen", "punctuation.operator", "comment"];
|
||||||
|
|
||||||
|
var context;
|
||||||
|
var contextCache = {}
|
||||||
|
var initContext = function(editor) {
|
||||||
|
var id = -1;
|
||||||
|
if (editor.multiSelect) {
|
||||||
|
id = editor.selection.id;
|
||||||
|
if (contextCache.rangeCount != editor.multiSelect.rangeCount)
|
||||||
|
contextCache = {rangeCount: editor.multiSelect.rangeCount};
|
||||||
|
}
|
||||||
|
if (contextCache[id])
|
||||||
|
return context = contextCache[id];
|
||||||
|
context = contextCache[id] = {
|
||||||
|
autoInsertedBrackets: 0,
|
||||||
|
autoInsertedRow: -1,
|
||||||
|
autoInsertedLineEnd: "",
|
||||||
|
maybeInsertedBrackets: 0,
|
||||||
|
maybeInsertedRow: -1,
|
||||||
|
maybeInsertedLineStart: "",
|
||||||
|
maybeInsertedLineEnd: ""
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var CstyleBehaviour = function() {
|
||||||
|
this.add("braces", "insertion", function(state, action, editor, session, text) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (text == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '{' + selected + '}',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "}");
|
||||||
|
return {
|
||||||
|
text: '{}',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
|
||||||
|
return {
|
||||||
|
text: '{',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == '}') {
|
||||||
|
initContext(editor);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (text == "\n" || text == "\r\n") {
|
||||||
|
initContext(editor);
|
||||||
|
var closing = "";
|
||||||
|
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
|
||||||
|
closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar === '}') {
|
||||||
|
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
|
||||||
|
if (!openBracePos)
|
||||||
|
return null;
|
||||||
|
var next_indent = this.$getIndent(session.getLine(openBracePos.row));
|
||||||
|
} else if (closing) {
|
||||||
|
var next_indent = this.$getIndent(line);
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var indent = next_indent + session.getTabString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: '\n' + indent + '\n' + next_indent + closing,
|
||||||
|
selection: [1, indent.length, 1, indent.length]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("braces", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '{') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||||||
|
if (rightChar == '}') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
} else {
|
||||||
|
context.maybeInsertedBrackets--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '(' + selected + ')',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, ")");
|
||||||
|
return {
|
||||||
|
text: '()',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ')') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("parens", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '(') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ')') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: '[' + selected + ']',
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||||||
|
CstyleBehaviour.recordAutoInsert(editor, session, "]");
|
||||||
|
return {
|
||||||
|
text: '[]',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (text == ']') {
|
||||||
|
initContext(editor);
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
|
||||||
|
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing();
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("brackets", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && selected == '[') {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == ']') {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
|
||||||
|
if (text == '"' || text == "'") {
|
||||||
|
initContext(editor);
|
||||||
|
var quote = text;
|
||||||
|
var selection = editor.getSelectionRange();
|
||||||
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: quote + selected + quote,
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var leftChar = line.substring(cursor.column-1, cursor.column);
|
||||||
|
if (leftChar == '\\') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tokens = session.getTokens(selection.start.row);
|
||||||
|
var col = 0, token;
|
||||||
|
var quotepos = -1; // Track whether we're inside an open quote.
|
||||||
|
|
||||||
|
for (var x = 0; x < tokens.length; x++) {
|
||||||
|
token = tokens[x];
|
||||||
|
if (token.type == "string") {
|
||||||
|
quotepos = -1;
|
||||||
|
} else if (quotepos < 0) {
|
||||||
|
quotepos = token.value.indexOf(quote);
|
||||||
|
}
|
||||||
|
if ((token.value.length + col) > selection.start.column) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
col += tokens[x].value.length;
|
||||||
|
}
|
||||||
|
if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
|
||||||
|
if (!CstyleBehaviour.isSaneInsertion(editor, session))
|
||||||
|
return;
|
||||||
|
return {
|
||||||
|
text: quote + quote,
|
||||||
|
selection: [1,1]
|
||||||
|
};
|
||||||
|
} else if (token && token.type === "string") {
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
if (rightChar == quote) {
|
||||||
|
return {
|
||||||
|
text: '',
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||||||
|
initContext(editor);
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == selected) {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CstyleBehaviour.isSaneInsertion = function(editor, session) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
|
||||||
|
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
|
||||||
|
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
iterator.stepForward();
|
||||||
|
return iterator.getCurrentTokenRow() !== cursor.row ||
|
||||||
|
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.$matchTokenType = function(token, types) {
|
||||||
|
return types.indexOf(token.type || token) > -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
|
||||||
|
context.autoInsertedBrackets = 0;
|
||||||
|
context.autoInsertedRow = cursor.row;
|
||||||
|
context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
|
||||||
|
context.autoInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
if (!this.isMaybeInsertedClosing(cursor, line))
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = cursor.row;
|
||||||
|
context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
|
||||||
|
context.maybeInsertedLineEnd = line.substr(cursor.column);
|
||||||
|
context.maybeInsertedBrackets++;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
|
||||||
|
return context.autoInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.autoInsertedRow &&
|
||||||
|
bracket === context.autoInsertedLineEnd[0] &&
|
||||||
|
line.substr(cursor.column) === context.autoInsertedLineEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
|
||||||
|
return context.maybeInsertedBrackets > 0 &&
|
||||||
|
cursor.row === context.maybeInsertedRow &&
|
||||||
|
line.substr(cursor.column) === context.maybeInsertedLineEnd &&
|
||||||
|
line.substr(0, cursor.column) == context.maybeInsertedLineStart;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.popAutoInsertedClosing = function() {
|
||||||
|
context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
|
||||||
|
context.autoInsertedBrackets--;
|
||||||
|
};
|
||||||
|
|
||||||
|
CstyleBehaviour.clearMaybeInsertedClosing = function() {
|
||||||
|
if (context) {
|
||||||
|
context.maybeInsertedBrackets = 0;
|
||||||
|
context.maybeInsertedRow = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
oop.inherits(CstyleBehaviour, Behaviour);
|
||||||
|
|
||||||
|
exports.CstyleBehaviour = CstyleBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||||
|
if (commentRegex) {
|
||||||
|
this.foldingStartMarker = new RegExp(
|
||||||
|
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||||
|
);
|
||||||
|
this.foldingStopMarker = new RegExp(
|
||||||
|
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.openingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||||
|
|
||||||
|
if (range && !range.isMultiLine()) {
|
||||||
|
if (forceMultiline) {
|
||||||
|
range = this.getSectionRange(session, row);
|
||||||
|
} else if (foldStyle != "all")
|
||||||
|
range = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldStyle === "markbegin")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[1])
|
||||||
|
return this.closingBracketBlock(session, match[1], row, i);
|
||||||
|
|
||||||
|
return session.getCommentFoldRange(row, i, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSectionRange = function(session, row) {
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var startIndent = line.search(/\S/);
|
||||||
|
var startRow = row;
|
||||||
|
var startColumn = line.length;
|
||||||
|
row = row + 1;
|
||||||
|
var endRow = row;
|
||||||
|
var maxRow = session.getLength();
|
||||||
|
while (++row < maxRow) {
|
||||||
|
line = session.getLine(row);
|
||||||
|
var indent = line.search(/\S/);
|
||||||
|
if (indent === -1)
|
||||||
|
continue;
|
||||||
|
if (startIndent > indent)
|
||||||
|
break;
|
||||||
|
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||||
|
|
||||||
|
if (subRange) {
|
||||||
|
if (subRange.start.row <= startRow) {
|
||||||
|
break;
|
||||||
|
} else if (subRange.isMultiLine()) {
|
||||||
|
row = subRange.end.row;
|
||||||
|
} else if (startIndent == indent) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define('ace/mode/glsl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules;
|
||||||
|
|
||||||
|
var glslHighlightRules = function() {
|
||||||
|
|
||||||
|
var keywords = (
|
||||||
|
"attribute|const|uniform|varying|break|continue|do|for|while|" +
|
||||||
|
"if|else|in|out|inout|float|int|void|bool|true|false|" +
|
||||||
|
"lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|" +
|
||||||
|
"mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|" +
|
||||||
|
"samplerCube|struct"
|
||||||
|
);
|
||||||
|
|
||||||
|
var buildinConstants = (
|
||||||
|
"radians|degrees|sin|cos|tan|asin|acos|atan|pow|" +
|
||||||
|
"exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|" +
|
||||||
|
"min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|" +
|
||||||
|
"normalize|faceforward|reflect|refract|matrixCompMult|lessThan|" +
|
||||||
|
"lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|" +
|
||||||
|
"not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|" +
|
||||||
|
"texture2DProjLod|textureCube|textureCubeLod|" +
|
||||||
|
"gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|" +
|
||||||
|
"gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|" +
|
||||||
|
"gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|" +
|
||||||
|
"gl_DepthRangeParameters|gl_DepthRange|" +
|
||||||
|
"gl_Position|gl_PointSize|" +
|
||||||
|
"gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData"
|
||||||
|
);
|
||||||
|
|
||||||
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
"variable.language": "this",
|
||||||
|
"keyword": keywords,
|
||||||
|
"constant.language": buildinConstants
|
||||||
|
}, "identifier");
|
||||||
|
|
||||||
|
this.$rules = new c_cppHighlightRules().$rules;
|
||||||
|
this.$rules.start.forEach(function(rule) {
|
||||||
|
if (typeof rule.token == "function")
|
||||||
|
rule.token = keywordMapper;
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(glslHighlightRules, c_cppHighlightRules);
|
||||||
|
|
||||||
|
exports.glslHighlightRules = glslHighlightRules;
|
||||||
|
});
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user