/// <summary>
        /// JavaScript callback. Reads the specified file content and returns it as string.
        /// </summary>
        public InternalHandle Read(
            V8Engine engine,
            bool isConstructCall,
            InternalHandle self,
            params InternalHandle[] args)
        {
            if (args.Length != 3)
            {
                this.TraceError("IEmmetFile read called with invalid number of arguments.");
                return engine.CreateValue(false);
            }

            string targetFilePath = args[0].AsString;
            int chunkSize = args[1].AsInt32;
            ObjectHandle callback = args[2];

            if (!File.Exists(targetFilePath))
            {
                this.TraceError($"Emmet requested file {targetFilePath} that does not exist.");
                callback.StaticCall(engine.CreateValue(true), engine.CreateNullValue());

                return engine.CreateValue(false);
            }

            char[] buf = new char[chunkSize];
            FileStream stream = File.OpenRead(targetFilePath);
            using (StreamReader reader = new StreamReader(stream))
            {
                chunkSize = reader.ReadBlock(buf, 0, chunkSize);
            }

            string retVal = new string(buf, 0, chunkSize);
            callback.StaticCall(engine.CreateValue(false), engine.CreateValue(retVal));

            return engine.CreateValue(true);
        }
 /// <summary>
 /// JavaScript callback. Returns current editor's file path.
 /// </summary>
 public InternalHandle GetFilePath(
     V8Engine engine,
     bool isConstructCall,
     InternalHandle self,
     params InternalHandle[] args)
 {
     // As of version 1.3 this callback is required only for actions with external images that we don't
     // support.
     return engine.CreateNullValue();
 }
        /// <summary>
        /// JavaScript callback. Asks user to enter something.
        /// </summary>
        public InternalHandle Prompt(
            V8Engine engine,
            bool isConstructCall,
            InternalHandle self,
            params InternalHandle[] args)
        {
            string input = _editor.Prompt();
            if (string.IsNullOrWhiteSpace(input))
                return engine.CreateNullValue();

            return engine.CreateValue(input);
        }
 /// <summary>
 /// JavaScript callback. Returns current output profile name (see profile module). In most cases,
 /// this method should return <code>null</code> and let Emmet guess best profile name for current
 /// syntax and user data. In case you’re using advanced editor with access to syntax scopes (like
 /// Sublime Text 2), you can return syntax name for current scope. For example, you may return
 /// `line` profile when editor caret is inside string of programming language.
 /// </summary>
 public InternalHandle GetProfileName(
     V8Engine engine,
     bool isConstructCall,
     InternalHandle self,
     params InternalHandle[] args)
 {
     // Let Emmet engine detect profile
     return engine.CreateNullValue();
 }